Agent形态不断变化,基础设施应服务于运行本质而非追逐潮汐
2026/9/22 3:26:42 网站建设 项目流程

第一次被 Agent 折腾到半夜,是看到一个非常熟悉的报错:the agent execution provider did not respond in time。翻译成人话就是,不知道什么原因,Agent 在执行过程中没有在规定时间里回应。日志里没有任何更多细节。换框架、调提示词、改重试,它偶尔能跑通,偶尔直接卡死。后来我把问题重新想了一遍才意识到,这个报错大概率跟模型聪不聪明没有关系,而是整个执行链路缺少“过程保障”。

今天的 Agent 生态,几乎每周都会冒出几个新概念:Agent 框架、多 Agent 协作、Skill、MCP、Harness、记忆机制、编排模式。形态一天一个样,但开发者面对的问题却稳定得惊人——执行不稳定、状态会丢、工具调用不可控、出问题不知道去哪查。很多团队做 AI 应用时最难受的地方就在这里:Agent 形态一直在变,Infra 到底该追着谁建?

我的判断很直接:Infra 不能追着 Agent 形态建,而应该为开发者建。更准确地说,是为“一个带有状态、需要工具调用、需要外部资源协作的长时间运行任务”建。这个任务今天叫 Agent,以后可能换一个名字,但它底层的运行需求不会消失。

1. Agent 形态一直在变,开发者的问题却没怎么变

1.1 “Agent 又卡住了”:一次典型调试现场

在社区里见过很多类似的求助帖,报错无非是几类:

  • Agent 执行到一半被终止,提示agent terminated due to error
  • 工具调用超时,或者模型没有按预期格式返回。
  • 上下文一长,Agent 就开始“失忆”,忘记最初的任务。
  • 多 Agent 协作时,某个子任务失败,整个流程就停了。

遇到这些问题,大家的直觉通常是:换一个更强的模型,或者把提示词写得再细一点。但很多时候,真正的问题根本不在模型和提示词,而是执行链路的某一层断了。

一个传统 API 请求,失败了你只要看请求和响应,就能定位问题。Agent 不是这种一问一答的模型。它更像一个循环:接收任务、拆解步骤、调用工具、读取结果、再决定下一步。这个循环中间有大量的状态、时序和外部依赖。只要你把 Agent 放进真实项目,就必须面对这些基础设施问题。

我见过一个团队,为了“追潮流”引进了很复杂的多 Agent 框架,结果两个月都没跑出一个稳定可用的流程。最后排查下来,问题不在框架,而在最基础的地方:中间状态没有持久化、工具调用没有重试策略、日志里只有最终错误码。也就是说,框架给了他们“形”,但没有提供“运行保障”。

1.2 框架、协议、概念不断更新,为什么没有解决最基础的难受

这几年 Agent 形态演进,可以粗略分成几个阶段:

  • 最初是单 Agent 的 ReAct 循环,模型自己推理、自己决定调什么工具。
  • 然后出现任务分解,Agent 把大任务拆成小步骤,逐步执行。
  • 接着是全自主 Agent,目标一给,它可以连续跑十几轮。
  • 再后来大家发现全自主不可靠,又开始用 Workflow、Graph、状态机做可控编排。
  • 近一年,MCP 统一工具调用,Skill 做能力封装,Harness 做执行控制,概念越来越多。

每一波新概念都会带来一批新框架,但开发者的问题列表几乎没有变:

  • Agent 为什么会卡住?
  • 为什么上下文一长就丢信息?
  • 为什么工具调用失败后不知道回退?
  • 为什么多 Agent 协作结果不可控?
  • 为什么日志里只有“终止了”,没有“哪一步终止了”?

这些问题的根源不是形态选错了,而是底座缺能力。所谓底座,就是我们说的 Infra。如果只盯着 Agent 形态,会发现今天 A 框架火、明天 B 协议火,根本追不完。但如果你把视角放到运行需求上,会发现不同形态之间其实共用同一套底层能力。

2. Infra 不追形态,要为“运行的底层需求”而建

2.1 Agent Loop 的托底能力

不管 Agent 形态怎么变,剥掉外壳之后,它本质上是一个循环,通常叫 Agent Loop:

  • 接收任务和环境信息;
  • 模型推理,规划下一步;
  • 调用工具或 API;
  • 读取执行结果;
  • 把结果放回上下文,进入下一轮;
  • 直到任务完成或达到终止条件。

在这个循环里,基础设施要托底的东西其实非常固定。

首先是执行引擎。它要负责任务调度,知道哪一步依赖哪一步,支持超时、重试、断点恢复。Agent 不是一次函数调用,而是一串有依赖关系的步骤。当外部服务超时、模型返回格式异常、工具偶发失败时,执行引擎能不能在合理策略下继续或安全停止,决定了整个系统是否可靠。

其次是状态存储。Agent 在跑的过程中,会产生大量中间状态:已经完成哪些步骤、哪些结果已经拿到、当前上下文里有哪些有效信息。如果这些状态只放在内存里,进程一重启就什么都没了。很多 Agent 项目在开发环境跑得通,一上生产就崩溃,核心原因就是中间状态没有落盘。

第三是任务队列和资源管理。当多个 Agent 任务并发时,必须有队列、并发限制和资源配额,否则下游工具或模型 API 很容易被打爆。

第四是日志与追踪。每一步的输入、输出、耗时、Token 消耗,最好都能被记录和回放。

这几个能力,做一个脚本调一次模型完全不需要;但是做一个长期运行的 Agent 系统,一个都不能少。

2.2 记忆分层:短期上下文与长期存储不是一回事

Agent 记忆是经常被讨论的话题,也是被误解最多的地方。

很多人的第一反应是:记忆 = 向量数据库,把历史对话存进去,下次检索出来塞给模型。这个理解太粗糙了。在真实工程里,Agent 的记忆至少要分成三层:

第一层是短期上下文。这是模型每次调用时实际能看到的窗口,受 Token 数限制。它的核心问题是如何压缩、裁剪,以及优先保留哪些信息。一个 Agent 跑了十几轮之后,如果上下文里塞满了旧的工具结果和中间推理,很快就会超出窗口限制,或者把重要目标挤掉。

第二层是长期记忆。跨会话、跨任务的状态,比如用户偏好、项目历史、之前做出的关键决策。这一层适合用向量库或普通数据库存储,关键是检索的准确度和更新策略,而不只是“能存”。

第三层是工作记忆。这也是最容易被人忽视的。Agent 在执行当前任务时,“我已经做到哪一步了”“这个结果对应哪个子任务”,这些信息必须被保存。否则任何一次中断、超时、重试,都可能导致 Agent 从头开始,或者产生错误判断。

所以基础设施要提供的,不是一套“记忆算法”,而是一套通用的状态读写接口。让不同 Agent 框架都可以快速“存档”和“读档”,知道当前任务执行到哪个节点、哪些中间结果还在、哪些信息已经过期。这才是记忆作为基础设施的意义。

2.3 可观测性:让 Agent 的执行路径可以回放

回到开头那个报错。agent terminated due to error难查,不是因为错误信息不够细,而是它只告诉你“终止了”,没告诉你“在哪个环节终止的”。

传统后端系统,通过日志和链路追踪能还原一次请求的完整路径。Agent 任务更难,因为每一步都可能涉及一次模型调用、一次工具调用、一次上下文更新。如果这些步骤没有记录,出了问题就只能靠猜。

可观测性至少要解决三件事:

  • 链路:一次 Agent 任务从开始到结束,调用过哪些模型、哪些工具,每步耗时多少。
  • 状态:每步的输入输出是否完整,上下文占用了多少,工具返回是否符合预期。
  • 成本:每轮消耗了多少 Token、花费多少,哪一步最贵。

实际落地时,我建议从开发阶段就必须给每个 Agent 任务生成一个唯一的trace_id,然后把所有日志、工具调用记录、模型请求都跟这个 ID 绑定。

# 常见做法:启动每个 Agent 任务时生成一个唯一追踪 ID export AGENT_TRACE_ID=$(uuidgen)

这样当用户反馈“Agent 出错了”时,可以通过 trace_id 把一次任务的所有执行轨迹拉出来,按时间轴回放。你会发现,大部分问题在时间轴上就能定位:不是某一轮模型推理错了,而是某个工具调用从第 5 步开始就超时。

建议:任何 Agent 项目,上线前先确认一件事——能不能通过一个任务 ID 还原出完整的执行时间轴。如果不能,说明可观测性还没有准备好。

3. 工具、记忆、安全:比形态更容易被忽略的三块硬骨头

3.1 Skill、MCP、Harness:新概念背后的同一个小切口

很多人会纠结:Skill 和 MCP 到底有什么区别?Harness 和 Agent 又是什么关系?

可以把这几个概念放在同一个坐标系里看。

Skill,通常指的是一种能力封装。把“查询数据库”“写周报”“操作某个后台系统”这类能力整理成 Agent 可以理解和使用的方式。它偏重的是“能力本身”。

MCP,是一种让 Agent 和外部工具、数据源对接的协议。它的价值在于标准化工具调用方式,让不同 Agent 框架不需要各自实现一套对接逻辑。它偏重的是“协议”。

Harness,可以理解成 Agent 执行过程中的控制容器。它负责管理上下文、决定什么时候该停、什么时候该重试、怎么把模型输出转成可执行动作。它偏重的是“控制”。

这些概念看起来是不同层的东西,但背后有一个共同问题:工具调用层一直没有被真正标准化。每换一个 Agent 框架,工具调用逻辑可能就要重写一遍;每引入一个新协议,又要处理一遍鉴权、限流、超时、返回格式。这不是 Agent 形态的问题,而是基础设施没有把工具调用层沉淀好。

3.2 工具调用层:鉴权、限流、幂等与审计

工具调用是 Agent 连接真实世界的接口,也是风险最集中的地方。

举几个例子。

Agent 调用一个内部系统下单。如果接口不保证幂等,Agent 因为超时自动重试,就可能造成重复订单。

Agent 调用外部搜索服务。如果没有限流,一次任务可能发起上百次请求,账单和下游压力都失控。

Agent 拿到一个工具之后,它会拥有多大权限?如果工具层不能控制每个 Agent 能调用哪些工具,多 Agent 协作时,安全边界几乎等于没有。

基础设施在工具调用层要做四件事:

  1. 统一接入规范。不管上层 Agent 框架怎么变,工具都注册到同一个平台,用统一的描述格式暴露给模型。
  2. 鉴权与权限。工具所有者可以控制哪些 Agent、哪些任务能调用这个工具,这是最小权限原则的落地。
  3. 限流与配额。每个工具、每个 Agent、每个租户都有独立的调用限制,防止单个任务耗尽所有资源。
  4. 审计日志。谁调用了什么工具、传入什么参数、返回什么结果,全部记录。

其中幂等性是最容易被忽视的。Agent 执行和传统 API 调用不同,它的失败重试是常态。如果工具调用不能“幂等重放”,一次失败带来的后果可能比失败本身更严重。

# 思路示意:调用前先检查幂等键是否存在 if idempotency_key_exists(call_id): return previous_result result = call_tool(tool_name, payload, call_id=call_id) save_result(call_id, result)

幂等键可以是一个基于任务 ID、步骤 ID、工具名生成的唯一字符串。这样即使 Agent 重试,也不会重复执行副作用操作。

3.3 安全边界:Agent 越自主,越需要可控

Agent 的自主性越高,安全边界就越重要。这里说的安全,不只是外部攻击,还包括内部权限混乱。

一个常见的误区是:先让 Agent 跑起来,安全问题后面再补。但 Agent 不同于传统脚本,它是“带自主决策”的执行体。如果没有边界,它可能会在错误场景下调用不该调用的工具,或者访问不该访问的数据。

在多 Agent 协作场景里,安全边界更复杂。每个 Agent 应该只看到自己职责范围内的数据,只能调用自己被授权的工具,只能写入自己被允许的存储位置。如果在 Infra 层面不设计好这个边界,而是完全交给上层 Agent 框架,风险会很高——框架一升级,边界可能就失效了。

我比较推荐的基础设施方案是:在工具 API 网关、存储层、消息层做边界控制,而不是在 Agent 代码里写一堆 if else。这样权限模型与业务逻辑解耦,后续 Agent 怎么演化,边界都不会失效。

4. 从最小闭环到多 Agent:一套可复用的推进路径

4.1 第一步:定义输入、输出和验证标准

很多人搭 Agent 的第一步是选框架、配模型、写提示词。我更建议反过来,先回答四个问题:

  • 输入:任务从哪来?是用户文本、结构化数据,还是某个系统触发的事件?
  • 输出:Agent 最终应该产出什么?是一份回答、一份报告,还是一个操作结果?
  • 验证:怎么判断成功?有没有明确的 Success Criteria?
  • 失败:什么情况下必须停止?最大重试次数是多少?超过多少步没有进展就终止?

这四个问题不回答完,后面的一切都不可控。

如果没有验证标准,Agent 能不能算成功,会变成一个玄学问题。团队只能靠人肉看结果,时间一长,根本无法判断是模型出了问题,还是任务定义本身有问题。

4.2 第二步:跑通单 Agent 最小闭环

在真实项目和复杂编排之前,先用一个最小闭环验证基础的运行链路。

这个闭环是:

  1. 模型能理解任务并开始执行;
  2. 工具调用能成功返回结果;
  3. Agent 能基于工具结果继续下一步;
  4. 最终输出符合预期;
  5. 日志和轨迹可以被回放。

整个过程最好在沙盒或开发环境里跑,不要直接上生产。跑通过一次,只能说明流程没有断,还不能说明它稳定。需要反复跑,观察它在不同输入、不同外部状态下的表现。

提醒:不要一上来就设计复杂的多人协同流程。先让一个 Agent 在一个明确任务上连续跑 20 次不出现未预期错误,再考虑增加复杂度。

4.3 第三步:再谈记忆、工具和多 Agent

等到单个 Agent 的任务已经稳定了,再逐步增加记忆、工具、外部系统集成。

多 Agent 协作尤其要谨慎。很多团队认为多 Agent 是效率更高的形态,但多 Agent 意味着更长的链路、更多的状态同步、更复杂的错误传播。没有基础设施托底,多 Agent 就是“多个 Agent 同时出错”。

什么时候可以上多 Agent?我建议同时满足几个条件:

  • 任务能拆成多个职责清晰的子任务;
  • 子任务之间有明确的信息传递格式;
  • 每个子 Agent 都可以独立验证结果;
  • 有总控或编排者能处理子 Agent 的失败和超时。

可以按下面这个顺序推进:

阶段核心目标要建的能力验收标准
单 Agent 最小闭环跑通基础链路模型调用、工具调用、日志连续多次跑通,无未知错误
单 Agent 增强提升任务复杂度记忆、重试、状态持久化失败后可恢复,不丢状态
多 Agent 协作拆解任务、并行执行消息传递、任务编排、子 Agent 监控单个子 Agent 失败不影响全局
生产化安全稳定运行限流、审计、灰度、回滚异常可追踪,权限可控,成本可见

多 Agent 不是银弹。它更适合任务本身可以清晰拆分的场景。如果任务边界不清,强行上多 Agent,只会让问题从模型层扩散到系统和协作层。

5. 排查链路:从报错到根因的五步判断法

5.1 一个五层排查表

Agent 出问题,最忌讳的是直接猜。猜模型不好、猜提示词不对、猜框架有 bug,然后盲目改。

我一般会按一个固定顺序排查:

  1. 现象。是报错终止,还是卡住不响应?是结果错误,还是输出格式不对?
  2. 输入。任务格式是不是完整?上下文是不是超长?工具返回参数是不是符合预期?
  3. 环境。依赖版本有没有冲突?API Key 权限够不够?网络和资源配额是否正常?
  4. 参数。超时设置、重试策略、模型参数、工具选择是否合理?
  5. 工具边界。外部服务有没有限流?工具本身有没有缺陷?当前模型是否具备完成该任务的能力?

在每个环节,都有对应的优先排查点。

排查层优先检查项常见原因
现象报错类型、是否可复现配置错误、输入异常
输入上下文长度、工具返回格式Prompt 缺少约束、工具解析失败
环境依赖版本、权限、网络版本不兼容、API Key 过期
参数超时、重试、并发Agent 执行策略不合理
工具边界外部限流、服务可用性下游服务不稳定、工具有缺陷

这个顺序的核心思路是:先确定出问题的是哪一层,再决定要不要动模型和提示词。很多“模型回答不对”的问题,最后查下来是工具返回的数据里混入了错误字段,模型被误导了。

5.2 用日志和时间轴定位真正的断点

排查 Agent 问题,不要只看最终错误,要看完整时间轴。

举个例子。一次 Agent 任务,理想情况下是:

00:00.100 接收任务 00:00.300 模型推理第 1 步 00:01.200 调用工具 A 00:05.800 工具 A 超时重试 00:11.200 工具 A 第二次调用成功 00:11.500 模型推理第 2 步 00:12.000 输出最终结果

如果日志是完整时间轴,你可以很清晰地看到断点在哪。如果日志只有最终错误,你就只能盲猜。

我建议给每个 Agent 任务维护一个结构化的追踪日志,至少包含:

  • 任务 ID;
  • 每轮模型调用的时间戳、Token 消耗;
  • 每次工具调用的入参、出参、耗时、返回状态;
  • 每轮执行完成后的上下文长度;
  • 重试次数及原因;
  • 最终结果或终止原因。

有了这个时间轴之后,大部分问题都能快速定位。上下文异常增长,说明记忆压缩逻辑有问题;某一步工具调用反复超时,说明下游服务或者网络是瓶颈;模型返回多次格式错误,才需要考虑换模型或者改提示词。

6. 最后该把注意力放在哪

6.1 基础设施的客户是开发者

回到文章开头的问题:Agent 形态一天一个样,Infra 到底该为谁而建?

我的答案是:为开发者而建,不是为某个 Agent 形态而建。

这里有一个很实用的判断标准:换一个 Agent 框架的时候,有哪些东西不用重写?

如果换框架之后,工具调用逻辑不用重写,状态持久化不用重写,日志追踪不用重写,权限模型不用重写,说明 Infra 已经沉淀下来了。如果每次换框架都要从零搭一遍,说明所谓的 Infra 其实只是某个框架的附属品,而不是真正的基础设施。

好的 Infra 应该让开发者更快地发现失败、恢复失败、预防失败。它服务的用户是那些每天在调试 Agent 的工程师,而不是一个抽象的概念。Agent 形态会继续变,今天叫 ReAct,明天叫 Graph,后天可能有别的名字。但开发者面对的核心问题不会变——如何让一个复杂的、有状态的、需要工具和外部资源协作的 AI 任务,被稳定地跑起来。

6.2 下一步最该做什么

如果你现在正要开始做一个 Agent 项目,或者正在被不稳定的 Agent 流程折磨,我建议你先不要急着换框架,也不要急着学新概念。

先做一件事:拿一个真实任务,跑一个最小闭环。记录它依赖什么状态、调用哪些工具、在哪一步最容易失败。然后把记录梳理成清单:

  • 执行中断后,能不能从断点恢复?
  • 工具调用失败后,有没有重试和幂等保护?
  • 每次任务执行,能不能通过一个 trace_id 还原全过程?
  • 每个 Agent 拥有的工具和数据权限,是不是最小化的?

这些问题回答了,你会发现,Agent 形态怎么变,你都能接得住。因为真正决定一个 Agent 系统能不能跑进生产环境的,从来不是最新的概念,而是这些最基础的工程能力。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询