LLM Agent并行推理优化:基于KV Cache复用的工作流加速实践 1. 项目概述从“串行思考”到“并行合成”的范式跃迁最近在折腾大语言模型LLM驱动的智能体Agent工作流时我遇到了一个几乎所有从业者都会头疼的瓶颈推理延迟。一个典型的复杂任务比如让Agent分析一份商业报告、生成摘要、同时提炼关键数据并给出建议往往需要调用LLM多次。每次调用模型都要从零开始“思考”重新计算整个上下文这个过程不仅耗时而且计算资源消耗巨大。更让人沮丧的是很多任务中的子步骤其实是相对独立、可以并行执行的但传统的“调用-等待-再调用”串行模式硬生生把它们变成了一个漫长的队列。这让我开始思考有没有可能像现代CPU的多核并行计算一样让LLM Agent的工作流也能实现真正的“并行合成”不是简单地把多个请求扔给API然后等结果那只是客户端并发而是在模型推理的潜在空间Latent Space内部就让不同任务分支的计算同时进行。这就是“Towards Direct Latent-Space Synthesis for Parallel Branches in LLM-Agent Workflows”这个标题背后所指向的核心愿景。它不是一个具体的工具而是一种架构思想和优化方向旨在突破当前LLM Agent系统在效率和实时性上的天花板。简单来说我们想实现的是给定一个复杂的用户指令Agent能将其拆解成多个可并行的子任务例如理解指令、检索知识、规划步骤、执行工具调用。然后不是按顺序一个个处理而是尝试在单次模型前向传播Forward Pass中或者通过极高效的机制同时为这些分支生成所需的“思维”内容即潜在状态最后再整合输出。这听起来有点像“一心多用”但对Transformer架构的LLM而言挑战巨大因为其注意力机制和自回归生成本质上是顺序的。背后的驱动力非常现实在需要低延迟、高吞吐的交互场景中如实时对话助手、复杂数据分析Agent、游戏NPC每一秒的等待都在消耗用户的耐心和企业的算力成本。并行合成如果实现意味着更快的响应、更低的成本以及处理更复杂工作流的能力。这篇文章我就结合自己的实践和近期社区的一些前沿探索来深度拆解这个方向涉及的核心技术、可行路径以及那些“坑”。2. 核心挑战与现有方案瓶颈在深入探讨“直接潜在空间合成”之前我们必须先搞清楚为什么现有的常规方法做不到或者做不好。2.1 传统串行工作流的效率瓶颈目前主流的LLM Agent框架如LangChain、LlamaIndex以及各类自研框架其工作流本质上是围绕LLM的API调用组织的。一个典型的规划-执行-反思循环如下规划阶段用户输入 - LLM分析 - 生成任务列表或思维链CoT。执行阶段对于每个任务可能涉及工具调用LLM生成调用某工具的请求如搜索、计算、查询数据库。等待工具返回这是一个I/O等待CPU/GPU空闲。处理结果工具结果返回后再次调用LLM将结果整合进上下文决定下一步。反思与汇总所有子任务完成后最后一次调用LLM进行总结和最终输出。问题显而易见高延迟每次LLM调用都有网络往返如果使用云端API和模型推理的时间累加后非常可观。重复计算每次调用模型都需要重新编码整个历史对话和上下文计算大量的注意力Attention即使很多上下文在多次调用中是重复的。资源闲置在等待工具返回或网络响应时宝贵的GPU计算资源处于空闲状态。并行困难即使我们同时发起多个LLM调用客户端并发对于同一个模型实例而言请求仍然是在队列中顺序处理的除非部署多个副本但这又增加了成本和状态同步的复杂度。2.2 KV Cache的启示与局限要理解“潜在空间合成”必须先提KV CacheKey-Value缓存。这是当前LLM推理加速的一项关键技术。在自回归生成中模型在生成第t个token时需要基于之前所有t-1个token的隐藏状态来计算注意力。KV Cache的作用就是缓存这些历史token在注意力层中的Key和Value向量这样在生成下一个token时就无需重新计算之前所有token的隐藏状态只需计算新token的并更新缓存。这带来了巨大的速度提升。那么一个很自然的想法是能否利用或改造KV Cache来服务多个并行的推理分支比如为工作流中不同的并行任务分支维护各自独立的KV Cache然后在一次前向传播中同时更新它们挑战在于注意力机制的干扰标准Transformer的注意力是在单个序列上定义的。多个分支的KV Cache如果混合在一个注意力计算中会产生信息交叉干扰导致输出混乱。这就像试图让一个人同时听两段不同的故事并分别复述极易串台。位置编码的冲突绝对或相对位置编码与序列中的具体位置绑定。并行分支的token可能处于不同的逻辑位置如何在一个统一的物理序列中安排它们的位置编码是个难题。动态与静态上下文工作流中有些上下文是全局共享的如用户初始指令有些是分支独立的如某个工具调用的结果。如何让共享上下文被所有分支高效利用同时隔离分支私有上下文需要精巧的设计。2.3 现有“伪并行”方案的不足社区已经有一些尝试来缓解并行问题但离“直接潜在空间合成”还有距离客户端并发Concurrent Client Calls如前所述这只是并发请求模型内部仍是串行处理且加剧了队列拥堵。任务批处理Batching将多个独立、同质的请求打包成一个批次进行前向传播。这提高了GPU利用率但要求请求高度相似同样的提示词模板并不适用于一个工作流内动态产生的、异质的子任务。推测解码Speculative Decoding用一个“小模型”快速草拟多个可能的后续token再由“大模型”并行验证。这加速了单个序列的生成但并未解决多个逻辑任务分支的并行问题。有向无环图DAG调度像LangGraph这样的框架允许将工作流定义为DAG调度器可以并发执行没有依赖关系的节点。但这依然是在任务调度层面的并行每个节点内的LLM调用仍然是独立的、串行的计算单元。瓶颈从“工作流逻辑”转移到了“LLM计算”本身。因此我们需要更底层的、模型推理层面的创新。3. 实现“直接潜在空间合成”的技术路径探析“直接潜在空间合成”是一个前沿方向目前尚无成熟的标准方案但可以从几个研究思路和工程技巧上窥见可能的实现路径。3.1 路径一基于修改注意力机制的并行解码这是最接近“直接合成”理想的方法需要对模型架构或推理过程进行修改。核心思想扩展注意力机制使其能同时处理多个逻辑序列。可以想象为让模型具备“多视线”能力。多头注意力分组将注意力头进行分组不同的组负责处理不同分支的上下文。例如在一个拥有32个注意力头的层中指定前16个头处理分支A的KV Cache后16个头处理分支B的KV Cache。在计算注意力时通过掩码Mask确保各组只关注自己所属分支的上下文并在前向传播的最后将各组的输出进行融合例如通过一个轻量的门控网络。这需要修改模型代码和推理内核。前缀缓存与条件生成为每个并行分支分配一个独特的“前缀标识符”可学习的向量或特殊的token。在生成开始时将这些前缀连同共享上下文一起输入模型并缓存其对应的KV状态。在后续为各分支生成时在查询Query中附带该分支的前缀信息通过注意力机制模型可以学会将查询与对应前缀的KV Cache关联起来从而实现上下文隔离下的条件生成。这类似于为不同对话角色分配不同前缀的技术。实操心得这类方法通常需要对开源模型如Llama、Qwen的推理代码进行深度定制甚至修改模型架构。对于大多数团队来说研发门槛极高。一个更实际的切入点是研究并尝试集成学术界相关论文的开源实现例如关注“Multi-Query Parallel Decoding”、“Conditional Computation”或“Mixture of Experts for Multi-Task”等方向的工作。3.2 路径二高效利用KV Cache的“状态复用”策略在不改动模型架构的前提下通过极致的工程优化来模拟并行效果。核心思想最大化共享上下文的利用率最小化重复计算让串行调用“看起来”很快。共享上下文持久化识别出工作流中所有分支都依赖的“根上下文”如系统指令、用户原始问题。在第一次LLM调用时完整计算这部分上下文的KV Cache并将其持久化在内存中。后续所有针对不同分支的LLM调用都复用这份缓存只需计算分支独有的新提示词部分的KV Cache。这需要能精细控制KV Cache输入范围的推理引擎支持如vLLM、TGI都提供了相关API。增量生成与缓存拼接对于顺序依赖但可增量生成的分支采用“生成-缓存-扩展”的策略。例如分支A需要生成一段分析分支B需要基于A的结果进行总结。可以先生成A缓存其全部KV Cache。当生成B时将B的提示词直接拼接在A的缓存之后模型只需计算B提示词相对于A缓存的新注意力并生成B的内容。这避免了为生成B而重新编码A和其提示词。配置示例概念性伪代码# 假设使用支持KV Cache操作的推理引擎 from inference_engine import LLMEngine engine LLMEngine(modelqwen-7b) shared_prompt 你是一个分析助手。请基于以下报告{report} task_a_prompt 总结核心观点。 task_b_prompt 提取关键数据指标。 # 第一次调用计算并保存共享上下文的Cache shared_output, shared_kv_cache engine.generate_with_cache(shared_prompt) # 为任务A生成复用shared_kv_cache只计算task_a_prompt的新部分 output_a, kv_cache_a engine.generate_with_cache(task_a_prompt, prefix_kv_cacheshared_kv_cache) # 为任务B生成同样复用shared_kv_cache output_b, kv_cache_b engine.generate_with_cache(task_b_prompt, prefix_kv_cacheshared_kv_cache) # 此时output_a和output_b的生成都避免了重复编码shared_prompt3.3 路径三Agent层面的预测与预计算这是一种在更高抽象层结合了预测性执行的策略。核心思想让Agent具备一定的“预见性”提前触发可能需要的并行计算。思维树Tree of Thoughts的并行展开在规划阶段不只生成一个线性思维链而是同时生成多个可能的后续思考方向分支。利用LLM的批处理能力一次性为这些分支生成若干步的“思考”。然后由一个评估器快速筛选出最有希望的分支继续深入。这样并行性体现在了对未来可能性的同步探索上。工具调用的预取Prefetching当LLM生成的内容中高概率指向某个工具调用时例如出现“搜索”、“查询”等关键词可以在LLM继续生成后续内容的同时异步地发起该工具调用。等LLM完整生成出工具调用的具体参数时工具调用的结果可能已经返回或即将返回从而隐藏了I/O延迟。这需要Agent框架能够解析中间生成token并进行预测。注意事项预测性执行是一把双刃剑。预计算或预取可能出错导致计算资源浪费计算了没用的分支或逻辑错误使用了错误的预取结果。需要设计可靠的验证和回滚机制。通常这适用于那些工具调用模式相对固定、延迟代价很高的场景。4. 实战构建一个支持“状态复用”的简易并行Agent工作流理论说了很多我们来点实际的。我将演示如何利用vLLM引擎和LangGraph框架构建一个最大化KV Cache复用、模拟并行效率的Agent系统。这个例子将实现一个报告分析Agent它能“并行”地执行总结和提取数据两个任务。4.1 环境准备与工具选型为什么选vLLM和LangGraphvLLM以其高效的PagedAttention和灵活的KV Cache管理闻名。它提供了prefix_caching等高级特性允许我们精确地复用之前请求的KV Cache这是实现“状态复用”策略的基石。LangGraph它用图Graph来定义Agent工作流节点代表步骤边代表依赖。它天然支持基于依赖关系的并发执行能很好地表达我们任务中的并行分支。部署与安装启动vLLM服务我们首先在本地或服务器上启动一个vLLM服务加载一个合适的模型如Qwen1.5-7B-Chat。# 使用Docker是最简单的方式 docker run --runtime nvidia --gpus all \ -v ~/.cache/huggingface:/root/.cache/huggingface \ -p 8000:8000 \ --name vllm-server \ vllm/vllm-openai:latest \ --model Qwen/Qwen1.5-7B-Chat \ --served-model-name Qwen-7B-Chat \ --api-key token-abc123 \ --max-model-len 8192 \ --enable-prefix-caching # 关键启用前缀缓存这条命令启动了vLLM服务并开启了--enable-prefix-caching这是复用KV Cache的关键。Python环境准备pip install langgraph langchain-openai我们需要安装LangGraph和兼容OpenAI API的客户端因为vLLM提供了与OpenAI兼容的API接口。4.2 定义支持KV Cache复用的LLM客户端普通的OpenAI客户端不会处理缓存。我们需要一个能记住并传递“缓存种子”的智能客户端。import asyncio from typing import Optional, Dict, Any from langchain_openai import ChatOpenAI from pydantic import BaseModel, Field class CachedOpenAIClient: 一个支持会话级KV Cache复用的OpenAI客户端包装器。 def __init__(self, base_url: str, api_key: str, model: str): # 使用LangChain的ChatOpenAI但指向我们的vLLM服务器 self.llm ChatOpenAI( base_urlbase_url, api_keyapi_key, modelmodel, temperature0.1, max_tokens1024, ) # 用于存储共享上下文的缓存ID由vLLM的prefix_caching特性返回 self.shared_context_cache_id: Optional[str] None self.shared_context_text: str async def generate_with_shared_context(self, task_prompt: str, shared_context: str) - str: 生成内容并尽可能复用共享上下文的KV Cache。 策略如果共享上下文变了就重新计算并缓存如果没变就复用。 if shared_context ! self.shared_context_text: # 共享上下文更新了需要重新计算 self.shared_context_text shared_context full_prompt f{shared_context}\n\n现在请执行以下任务{task_prompt} # 首次调用vLLM会在内部计算并缓存shared_context部分的KV response await self.llm.ainvoke(full_prompt) # 注意vLLM的OpenAI API默认可能不会返回缓存ID这里为演示逻辑。 # 实际中你可能需要根据vLLM的扩展API或响应头来获取和管理cache_id。 # 此处我们简化逻辑用文本一致性来模拟。 self.shared_context_cache_id fcache_{hash(shared_context)} print(f[INFO] 计算并缓存了新的共享上下文Cache ID: {self.shared_context_cache_id}) else: # 共享上下文未变复用缓存 # 在真实vLLM API调用中你可能需要通过类似extra_body参数传递cached_strings或prefix_id # 例如使用 openai.Completion.create(..., extra_body{cached_strings: [shared_context]}) full_prompt f[复用缓存{self.shared_context_cache_id[:8]}...]\n{task_prompt} response await self.llm.ainvoke(full_prompt) print(f[INFO] 复用了共享上下文缓存 {self.shared_context_cache_id[:8]}... 来生成任务) return response.content # 初始化客户端 client CachedOpenAIClient( base_urlhttp://localhost:8000/v1, api_keytoken-abc123, modelQwen-7B-Chat )4.3 构建LangGraph并行工作流我们定义一个图其中“总结观点”和“提取数据”是两个可以并行的节点。from langgraph.graph import StateGraph, END from typing import TypedDict, Annotated import operator # 定义工作流状态 class AgentState(TypedDict): 图的状态流。 report: str # 输入的报告文本 shared_context: str # 共享的系统指令和报告 summary: Annotated[str, operator.add] # 汇总结果使用add进行合并 key_metrics: Annotated[str, operator.add] final_output: str # 构建图 builder StateGraph(AgentState) # 1. 准备共享上下文节点 def prepare_shared_context(state: AgentState): 构造所有并行任务都需要的共享提示词。 system_instruction 你是一个专业的商业分析助手。请仔细阅读以下报告并准确、简洁地回答问题。报告内容如下 shared_ctx f{system_instruction}\n\n{state[report]} return {shared_context: shared_ctx} # 2. 并行任务节点A总结核心观点 async def summarize_core_viewpoints(state: AgentState): shared_ctx state[shared_context] task_prompt 请用不超过200字总结这份报告的核心观点和主要结论。 result await client.generate_with_shared_context(task_prompt, shared_ctx) return {summary: f## 核心观点总结\n{result}\n} # 3. 并行任务节点B提取关键指标 async def extract_key_metrics(state: AgentState): shared_ctx state[shared_context] task_prompt 请以清晰的条目列出报告中出现的关键数据指标及其数值如增长率、市场份额、用户数等。 result await client.generate_with_shared_context(task_prompt, shared_ctx) return {key_metrics: f## 关键数据指标\n{result}\n} # 4. 结果合成节点 def synthesize_final_output(state: AgentState): 将并行任务的结果整合成最终报告。 final f{state[summary]}\n{state[key_metrics]}\n---\n**分析完成** return {final_output: final} # 添加节点到图 builder.add_node(prepare_context, prepare_shared_context) builder.add_node(summarize, summarize_core_viewpoints) builder.add_node(extract_metrics, extract_key_metrics) builder.add_node(synthesize, synthesize_final_output) # 设置边 builder.set_entry_point(prepare_context) builder.add_edge(prepare_context, summarize) builder.add_edge(prepare_context, extract_metrics) # summarize和extract_metrics是并行的它们都完成后再进入synthesize builder.add_edge(summarize, synthesize) builder.add_edge(extract_metrics, synthesize) builder.add_edge(synthesize, END) # 编译图 graph builder.compile()4.4 运行与效果评估现在我们可以运行这个工作流来处理一份报告。# 模拟一份简单的报告 sample_report 2024年第一季度公司产品X在北美市场销售额达到520万美元环比增长18%市场份额提升至12.5%。 用户活跃度DAU保持稳定在150万左右。然而营销成本同比上升了22%主要投放在社交媒体渠道。 报告预测下一季度通过优化广告投放策略有望将获客成本降低15%。 # 初始化状态 initial_state AgentState(reportsample_report, summary, key_metrics, final_output, shared_context) # 异步执行图 async def run_workflow(): final_state await graph.ainvoke(initial_state) print(最终输出) print(final_state[final_output]) print(\n--- 调试信息 ---) print(f共享上下文文本前100字符: {final_state[shared_context][:100]}...) # 在实际运行中你可以通过监控vLLM服务器的日志或使用其metrics端点来观察缓存命中情况。 # 运行 import asyncio asyncio.run(run_workflow())预期输出与效果[INFO] 计算并缓存了新的共享上下文Cache ID: cache_1234567890... [INFO] 复用了共享上下文缓存 cache_1234... 来生成任务 [INFO] 复用了共享上下文缓存 cache_1234... 来生成任务 最终输出 ## 核心观点总结 报告显示公司产品X在Q1北美市场表现强劲销售额达520万美元环比增长18%市场份额增至12.5%。用户活跃度稳定。但营销成本上升22%报告预计下季度通过优化策略可降低获客成本15%。 ## 关键数据指标 - 销售额520万美元北美市场Q1 - 环比增长率18% - 市场份额12.5% - 日活跃用户DAU约150万 - 营销成本同比增长率22% - 预期获客成本降低15%下一季度 --- **分析完成**关键观察点日志分析prepare_context节点后共享上下文被计算并缓存。随后summarize和extract_metrics两个节点几乎同时被触发由LangGraph调度。从日志看它们都打印了“复用了共享上下文缓存”这表明在理想情况下且vLLM配置得当两个任务在调用LLM时复用了同一份共享上下文的KV Cache避免了重复编码长达数百token的报告文本。性能提升假设报告文本有500个token系统指令50个token。在传统串行调用中两个任务总计需要编码(50050任务A提示词)(50050任务B提示词)的token。而在我们的策略下共享的550个token只被编码了一次。虽然两个LLM调用仍然是顺序发生的除非服务端支持真正的并行请求处理但每个调用内部的计算量显著减少整体延迟得以降低。资源节约减少了GPU的FLOPs浮点运算次数在按token计费或计算资源紧张的场景下能直接降低成本。5. 深入排查常见问题与优化技巧在实际部署这类优化方案时你会遇到各种意料之外的问题。下面是我踩过的一些坑和总结的排查思路。5.1 KV Cache复用失效或效果不佳问题现象开启了--enable-prefix-caching但监控发现缓存命中率低延迟没有明显改善。排查清单可能原因排查方法解决方案提示词细微差异对比前后请求的prompt。即使是空格、换行符、标点的差异也可能被模型视为不同前缀。对共享上下文进行标准化处理如去除首尾空格、统一换行符。使用确定的模板字符串。vLLM配置问题检查vLLM启动参数确保--enable-prefix-caching已设置。查看vLLM日志确认缓存功能已启用。确保使用最新版vLLM。考虑调整--block-size等参数但需测试。请求参数不一致temperature,top_p,max_tokens等生成参数如果变化可能影响缓存逻辑。对于需要复用缓存的请求尽量保持生成参数一致。将可变参数放在共享上下文之后的部分。模型本身限制某些模型架构或版本对前缀缓存的支持不完善。测试不同模型如Llama 3, Qwen 2。查阅vLLM官方文档的模型兼容性列表。缓存管理策略vLLM的缓存可能因内存压力被驱逐。增加--gpu-memory-utilization或使用更快的GPU如H100提供更大缓存空间。监控缓存命中率指标。实操心得缓存是否生效最直接的验证方式是对比Token生成速度。使用vLLM的metrics端点或详细日志观察第二个及后续请求的time_to_first_token首token时间和tokens_per_second每秒生成token数。如果复用成功time_to_first_token会显著缩短因为跳过了对共享上下文的重编码计算。5.2 并行任务间的信息污染问题现象当多个任务复用同一份上下文缓存时任务B的输出中似乎包含了任务A的指令或内容片段。原因分析这通常是因为注意力掩码Attention Mask设置不当。即使KV Cache被复用了如果在新请求的生成过程中模型仍然能“看到”之前其他任务的生成结果因为它们也在KV Cache里就会导致交叉干扰。解决方案精确的提示词工程在每个任务的提示词末尾使用明确的终止符或指令来划分边界例如“【任务开始】...【任务结束】”。并在新任务的提示词中强调“请忽略之前的所有其他任务内容只关注当前指令”。使用系统角色隔离在共享上下文中为不同任务分配不同的“虚拟角色”。例如在系统指令中说明“当看到‘[SUMMARY]’开头时你扮演总结者当看到‘[DATA]’开头时你扮演数据提取员。”然后在各自的任务提示词前加上对应的前缀。模型层面的隔离高级如果自行修改推理代码可以为不同任务使用不同的注意力掩码物理上隔绝KV Cache之间的注意力计算。但这需要深厚的模型工程能力。5.3 动态工作流中的缓存管理复杂度问题现象工作流非常动态分支数量、依赖关系在运行时才能确定难以预先规划缓存策略。应对策略采用分层缓存和惰性计算策略。分层缓存设立多级缓存。L1全局静态上下文如系统指令、Agent人格定义。生命周期最长。L2会话级上下文如本次对话的历史。随着对话轮次更新。L3任务级上下文如当前查询相关的检索结果。任务完成后可丢弃。惰性计算不急于在开始时计算所有可能用到的上下文。而是当工作流执行到某个节点明确需要某段上下文时再检查缓存中是否存在。如果不存在则计算并存入缓存如果存在则复用。这需要框架维护一个全局的缓存管理器。简化实现思路class KVCacheManager: def __init__(self): self.cache_store {} # key: hash(context_text), value: cache_id_or_embedding def get_or_compute(self, context_text: str, compute_fn) - str: key hash_context(context_text) if key in self.cache_store: return self.cache_store[key] else: result compute_fn(context_text) # 调用LLM计算 self.cache_store[key] result return result将这个管理器集成到你的Agent框架中让每个需要LLM的节点都通过它来获取上下文。5.4 衡量并行化带来的真实收益不要盲目追求“并行”。增加复杂度总会带来开销。你需要衡量端到端延迟降低多少使用压测工具对比优化前后的p99延迟。吞吐量提升多少在固定资源下每秒能处理多少个工作流成本变化如何减少了总token计算量但引入了缓存管理开销。算一算账单是增是减。复杂度与维护成本新的架构是否让代码更难调试团队新成员能否快速理解一个简单的经验法则是对于共享上下文很长500 tokens且并行分支较多3的工作流这类优化通常能带来正收益。对于短上下文或简单线性工作流收益可能不明显甚至为负。6. 未来展望与进阶思考“直接潜在空间合成”这条路还很长。目前的实践更多是“高效的串行”或“缓存复用”离真正的、模型内部的并行推理还有差距。未来的突破可能来自以下几个方向模型架构革新研究者正在探索专门为并行任务设计的Transformer变体如并行解码Transformer、条件计算模块等这些架构原生支持多路上下文处理。硬件与编译协同随着AI专用硬件如NPU和编译技术如TVM, MLIR的发展或许能实现更细粒度的计算图调度将不同分支的计算映射到不同的计算单元上同时执行。MoE混合专家模型的天然优势MoE模型本身由多个专家网络组成不同专家可以处理不同性质的任务。如何将工作流的并行分支路由到不同的专家是一个极具潜力的方向。标准化与框架支持希望未来的LLM推理引擎和Agent框架能原生提供更强大的并行原语比如直接定义并行分支、自动管理分支间的缓存与隔离让应用开发者无需关心底层细节。作为一线的实践者我的体会是在现有技术条件下将“状态复用”策略做到极致并结合任务DAG的合理拆分已经是提升复杂Agent工作流性能的最有效手段之一。它不需要等待下一代模型利用好vLLM、TGI等现代推理引擎的特性就能获得立竿见影的收益。开始动手优化你的Agent吧从分析一个最耗时的任务链路开始识别出其中可复用的上下文你会惊讶于简单的缓存策略所能带来的改变。