
最近这大半年我有个特别直观的感受身边聊 AI Agent 的团队从大厂到创业公司从做客服的到做内容运营的几乎全在谈。但真到了把 Agent 接进生产环境让它下地干活这一步很多人就卡住了。模型不够聪明吗也不是。更多是不知道怎么把 Agent 从能跑通的 Demo变成一个能顶住并发、出错了能自己修、线上行为还能被监控的工程系统。我整理过不少 Agent 的工程实现笔记最后留下的核心其实就两条主线Agent 是由什么组成的以及搭建一个可靠 Agent 时你要做哪些关键选择。前者我管它叫七要素后者是七个决策点。把这套思路理解透不管你是用 Python 的 FastAPI LangGraph还是 Java 的 Spring AI甚至用低代码平台拖拽搭建心里都会有个清晰的谱。这篇文章我就照着这两条线把工程实现这件事掰开揉碎讲清楚。1. 先拆解七要素Agent 到底是什么由什么组成我见过太多人把 Agent 当成一个会调函数的聊天机器人结果一路照着这个思路做下去越做越别扭。其实 Agent 是一个完整的闭环系统拆开来看至少有七个组成要素在起作用。缺了任何一块系统要么不聪明要么不听话要么跑两天就崩。1.1 任务目标Agent 的地基画错了后面全歪很多人做 Agent 喜欢把目标写得很宏大比如帮我分析业务数据自动处理用户问题。问题在于这种目标太模糊。模型接到这种任务它的规划能力再强也没用因为成功是什么样都没定义清楚。工程上第一步就是把目标收敛成可执行的、能被自动校验的任务描述。我举个例子。同样是客服场景差的 Agent 目标是回答用户问题好一点的是根据售后工单内容输出问题分类、紧急程度和建议回复话术格式为 JSON。后者为什么好因为它明确了输入、输出格式、评价维度。输出格式为 JSON这几个字直接决定了后面工具调用、结果校验、评估体系怎么做。目标写不清楚Agent 后端所有组件的接口就都没法定。这里我要提醒的是目标不是写一次就完了。Agent 跑在生产环境后目标是会漂移的——用户的问题类型在变、业务规则在变。所以目标这一要素建议以系统配置而不是硬编码的形式存在最好能放到配置中心里随时可以调整提示词里的任务描述和约束条件。1.2 规划与推理让 Agent 学会分步走而不是一步到位模型直接回答简单问题没问题但真实任务从来都是多步骤的。比如查一下这个客户上个月的订单量再对比年初目标最后写一段摘要。Agent 要做的不是一口气输出答案而是把它拆成三个动作查数据、对比计算、生成摘要。这个拆解过程就是规划。工程实现里规划大致有两条技术路线。一条是让模型边做边想走一步看一步业内管这叫 ReAct也就是推理 行动循环模型观察反馈决定下一步做什么执行完再观察结果循环下去。另一条是先规划后执行让模型先把完整方案的步骤列出来再逐个执行这就是 Plan-and-Execute 的套路。我的经验是简单任务用 ReAct 就够了自然、灵活模型的推理成本也低。但任务一旦涉及多个外部系统调用甚至涉及并行操作我强烈建议引入 Plan-and-Execute。因为 ReAct 的缺点是路径不可控模型可能绕来绕去而先规划的好处是你可以提前校验步骤比如判断某一步要不要人工审批或者某几步能不能合并。说白了规划质量决定了 Agent 的天花板。1.3 记忆系统Agent 的短期上下文与长期知识存哪记忆是 Agent 最容易被忽略、但实际最影响体验的要素。没有记忆的 Agent每次对话都是第一次见面做完一个任务下个任务又开始失忆。工程上要把记忆拆成至少三层第一层是短期记忆也就是当前任务上下文。它受限于大模型的上下文窗口。处理方式很简单就是拼 Prompt。但这里面有个工程细节——上下文里哪些内容必须保留哪些可以压缩成摘要。我见过有的团队把整个对话历史原封不动全塞进去结果对话超过十轮以后Prompt 变成几千个 token钱花得多模型还容易注意力涣散。第二层是长期记忆一般放到向量数据库里。Agent 可以把已完成任务的结论、用户偏好、业务规则做 embedding存进向量库下次遇到相似问题就检索出来放进上下文。这层记忆解决的是跨会话复用知识的问题。选型上开源的、托管的都行关键看你有没有运维向量库的能力。第三层是业务记忆就是写进你们自己业务数据库的数据。比如这个工单已经被处理过这个客户上次赔偿的标准是什么。这一层记忆往往是最可靠的因为它来自业务系统本身而不是模型推导。1.4 工具使用Agent 的手脚就是 API 调用没有工具的 Agent 只能输出文字有了工具的 Agent 才能改变世界——这句话我说过很多次。工具要素的本质是把 Agent 与外部系统连接起来常见的包括查数据库、调第三方 API、发邮件、操作内部系统、执行脚本等等。工程上工具接入的基础设施是 Function Calling / Tool Calling。简单说你先把工具注册成一套 JSON Schema描述清楚函数名、用途、参数。模型在推理过程中如果判断需要调用某个功能就会按这个 Schema 输出一个结构化的调用意图你的代码再据此执行真正的函数。这里有两个特别容易被坑的地方。第一个是工具描述写得草率。很多人写工具描述就是查询客户信息模型根本不知道什么时候该用、参数该怎么填。你要写的是当用户咨询订单状态、物流信息时调用参数 customerId 是用户在CRM系统中的唯一编号。描述越具体模型选错工具的概率越低。第二个是工具返回的容错。工具总会失败要么超时要么返回格式不对你的 Agent 循环必须区分工具调用失败重试工具业务失败让用户换个问法工具不存在礼貌拒绝这几种情况。1.5 环境感知与反馈Agent 不能闭着眼睛干活Agent 执行完一个动作之后需要知道结果如何。比如我让 Agent 去调一个查询接口它得知道接口返回了 200 还是 500返回的数据长什么样。这就是反馈也就是 Agent 对环境变化的感知。反馈看起来简单但在工程实现中要做很多处理。一是要把工具返回的原始内容做格式化让它能被模型理解。不是直接把整个 JSON 丢给模型就行要提取关键字段、限制长度、标记错误类型。二是要处理反馈的延迟。真实世界有很多异步操作比如你发了一个工作任务对方系统要 5 分钟才处理完Agent 不能傻等着这时候就需要任务队列和状态回调机制。我之前做过一个自动化运营 Agent它要给外部平台发活动配置对方接口是异步的。一开始我们直接同步等待结果经常超时。后来改为把任务提交后存个任务 ID轮询结果接口超时了就告诉用户任务已提交稍后可以查状态。这个体验差异是巨大的而且这是用工程手段补足了模型本身感知不了异步反馈的短板。1.6 行动执行落地动作必须可控、可回滚行动是 Agent 改变外部环境的最后一步。有的行动是只读的查个数据、做次搜索风险低。有的行动是写操作改数据、发消息、扣款风险高。工程上对两类行动的态度必须不同。对只读行动你可以让 Agent 相对自由地调用。但对写操作我建议加上三个机制权限校验、人工确认、操作审计。权限校验是控制 Agent 能调用哪些工具、操作哪些范围人工确认是让关键操作必须停留在一个待审批的状态由人点击确认后才真正执行操作审计是把每一次行动记录到日志里。这就叫可控的 Agent。很多人第一阶段只追求 Agent 聪明我追求的是聪明且不做傻事。另外行动执行要考虑幂等性。Agent 经常出现重试的情况如果执行的是一个创建订单的操作你重试一次就创建一个新订单那代价就大了。比较稳妥的做法是在工具设计时带上一个幂等键每次重试使用同一个 key服务端识别到相同 key 就不再重复创建。1.7 反思与迭代Agent 要能从错误中自己爬出来最后一个要素是反思。模型在长任务里犯错误几乎不可避免关键看系统有没有容错和自愈机制。最低级的做法是让用户发现错误后重新描述任务。好一点的是 Agent 在执行失败后把错误信息反馈给自己重新规划下一步。再往上就是构建一个独立的评判环节让系统对 Agent 的输出做质量检查。我把反思分成三个层次。第一层是重试工具调用失败就换个方法重试比如格式错误就修正参数。第二层是改路径Agent 发现当前方案走不通就回到规划阶段重新制定计划。第三层是离线反思把线上失败的案例沉淀下来定期分析改进提示词、工具说明甚至微调模型。反思机制看起来很美好但在工程实现里一定要控制节奏否则 Agent 会在失败路径上反复横跳token 消耗暴涨。我给自己的标准是同一轮任务里最多允许 Agent 反思三次超过就转人工。2. 七个决策点工程落地时绕不开的选择七要素解决的是Agent 由什么组成但这个回答还是抽象的。真正做工程时每个要素背后都是一个具体的技术选型问题。我把这些选型问题归纳成七个决策点。这七个决策点基本决定了一个 Agent 项目的最终面貌和踩坑程度。2.1 决策点一Agent 架构模式怎么选架构模式说白了就是你的 Agent 是一个还是多个、怎么协作。我把常见模式分成四类你可以按任务特征去套。第一种是单 Agent 自由模式。一个 Agent 处理所有环节用 ReAct 循环反复调用工具完成任务。优点是实现简单、token 消耗少、路径灵活。缺点是复杂任务容易失控。适合任务类型单一、步骤不超过十步的场景。第二种是流水线模式。把任务拆成固定的几个阶段每个阶段由一个环节负责阶段之间顺序执行。比如先分类再提取关键要素最后生成回复。优点是每个环节的输入输出都可控适合流程稳定的业务。第三种是路由分发模式。一个总控 Agent 收到用户请求后判断任务类型分发给不同的子 Agent。比如一个子 Agent 负责售后一个子 Agent 负责营销咨询。这种模式在客服系统里很常用。第四种是层级协作模式。主 Agent 负责任务拆分、调度子 Agent 各自干活并把结果返回。这是最接近团队的架构适合复杂综合项目但调度成本高、失败定位难。我的建议是从单 Agent 起步不要一上来就上多 Agent 协作。多 Agent 通信带来的复杂度爆炸往往是新人容易误判的点。我见过一个团队四五个 Agent 互相发消息结果跑出来一团乱麻最后排查了半天才发现是某个子 Agent 把消息格式传错了。2.2 决策点二用编排框架还是自己写状态机第二个决策点是技术选型层面最现实的问题。市面上的 Agent 编排框架已经很成熟了但到底该不该用用在哪个环节是很多团队争论的焦点。Python 生态里LangChain 和 LangGraph 是主流。LangChain 偏组件库LangGraph 更适合做有状态、可追踪的编排流程。我个人在真正上生产时更倾向于 LangGraph因为它把 Agent 循环建模成一张图每个节点是一个处理函数每条边是转移条件。节点之间传递状态你可以随时插入人工干预节点、条件判断节点而且每一步的状态都能落到存储里方便追踪。Java 生态的 Spring AI 也在快速跟进 Agent 相关能力。如果你所在团队是 Java 技术栈用它作为统一的模型访问层 简单编排是很合理的不一定要跨语言去接 Python 服务。还有 Rust 也有自己的 Agent 生态不过目前成熟度总体来说还不算高更适合对性能和控制力有极致要求的团队自己拼。那我建议你怎么选核心看三条团队语言栈、可控性要求、调试能力。低代码平台比如扣子在原型验证和轻量业务里很香能快速搭出应用。但一旦涉及复杂的权限、合规、私有化部署我还是建议自研编排或用开源框架毕竟低代码平台的黑盒问题会在后期非常折磨人。如果你只是搭一个内部工具低代码完全够用没必要非走代码路线。自研状态机和用框架怎么权衡我的判断标准很简单如果 Agent 的流程里面有超过两层条件分支、状态共享、人工审批节点你就别再手写状态机了。自己写容易写完后要维护、要扩展、要可视化追踪就难了。框架的意义不只是省事更是提供了一套现成的人类可读的状态流描述能力。2.3 决策点三记忆方案怎么设计记忆这个话题理念上很好理解落到工程实现上常常是灾难。很多团队把记忆等同于把对话丢进向量库做出来效果却很差因为没搞清楚记忆是分层的也没设计好读写时机。先说短期记忆。工程上最关键的是控制长度。你可以给上下文设定一个预算值比如最多保留最近 8 轮对话溢出后把前面的内容做一次摘要。摘要本身要花 token但这个成本是值得的不然上下文爆炸的时候模型会忘记最早的关键信息。另一个技巧是压缩工具返回——工具结果进入上下文之前先按长度截断或结构化成简短摘要。再说长期记忆。这一层常见技术栈是 embedding 模型 向量数据库。工程上要仔细设计什么时候写入记忆。我建议分两类一类是用户主动表达的关键信息比如我只想看到汇总数据这种要存另一类是 Agent 自己推理出的中间结论要非常谨慎因为推理可能有误误存下去会形成记忆污染导致后面每次对话都带着错误假设。我踩过这个坑——Agent 把一次失败推测当成事实存了下来结果之后的会话它一直沿着错误方向走。我的做法是中间结论不进长期记忆只有用户确认过的、或者来自业务数据的事实才进。向量库选型方面你可以用云服务也可以用开源组件本地部署。前期数据量不大两者差距不大数据量大且对延迟敏感建议本地部署把检索时间压到百毫秒级。另外不要只做 Top-K 检索加上重排序环节能明显提升命中质量。2.4 决策点四工具调用走 Function Calling 还是 MCP工具接入曾经是最繁琐的一环。早期每个工具都要适配一遍你给模型描述清楚再写一套解析逻辑。后来 Function Calling 成了标准模型在训练时就能按格式输出结构化调用参数这是当前最稳妥的主流方案。但工程界永远在迭代。MCPModel Context Protocol的出现就是想解决工具接入的长尾问题。它本质上是一个标准协议把工具的能力暴露成一个统一的接口。只要 Agent 框架支持 MCP Client它就能接入任意符合协议的 MCP Server不用为每个系统单独定制。比如你的数据平台、文件服务、搜索系统都可以各自封装成 MCP ServerAgent 自动发现和使用。我的态度是务实两看。如果你们的工具数量少于十个团队也都有动手改代码的能力直接用 Function Calling 每次适配就够了简单直接。但如果你面对的是遗留系统繁多、每种系统都有几十个接口的环境MCP 是值得押注的方向至少它让你把工具适配工作从N 乘 M变成了N 加 M。当然MCP 还在快速演进协议本身、Server 端实现都有不少坑建议先在非核心工具上试点。这里我还想强调一个工程细节工具描述的体积控制。工具一多把所有工具的 Schema 都塞进 Prompttoken 开销是惊人的。工程上可以给工具做分组和懒加载——不让 Agent 一次看到所有工具而是先用一个粗颗粒度的工具列表让模型选类再加载该类下的具体工具。2.5 决策点五并发和 Token 预算怎么管很多做 Agent 的新人会问AI Agent 怎么扛并发。这个问题问对了一半。传统服务的并发瓶颈在数据库连接和 CPU但 Agent 服务的并发瓶颈主要是在模型推理和 token 成本上。模型推理接口的并发能力、token 配额、计费这些都是有上限的你需要从架构层面去设计消峰。先说并发策略。Agent 任务往往是长耗时操作一个任务可能要调用模型好几轮每轮几秒甚至几十秒。如果直接同步接口等待并发一上来线程池很快被打满。工程上的解法是异步化加队列把 Agent 任务提交到一个任务队列由多个 worker 并发消费每个 worker 负责一个 Agent 实例的完整循环。任务执行进度可以写到 Redis 或数据库里前端通过轮询或 WebSocket 实时看到进度。这套设计我在实际线上系统里验证过简单有效。再说 token 管理。token 是什么意思这个疑问经常出现在第一次接触大模型 API 的开发者口中。Token 可以理解为模型读写文字的最小计费单位。在 Agent 场景里token 不只是成本更是延迟的决定因素。Prompt 越长推理时间越长费用越高。所以要给你的 Agent 流程设置 token 预算每个模型调用的单轮上限、每次任务的累计上限。超了预算就强制截断、转人工或者重新规划。我在项目里还会做 token 的按任务计费把成本分摊到每个请求上便于监控。还有流式输出的问题。Agent 中间步骤往往没必要等全部完成再返回。把大模型流式输出接到 HTTP 流里用户能看到打字机效果体验提升很显著同时也不会占用过多连接资源。2.6 决策点六可靠性兜底怎么做Agent 是概率系统这句话一定要刻在脑子里。同一个用户问题今天问和明天问输出可能不一样。这就意味着你做可靠性设计时不能像传统软件一样指望代码没 bug 就稳定。你预设的条件再多模型也可能给出你预期的外部行为再加上外部工具的故障整个系统的不确定性很大。Reliability 的工程要点是假设系统每分每秒都可能出错然后设计恢复路径。我的可靠性检查清单大概是这样的第一超时控制。每一次模型调用、工具调用都要设置合理超时比如模型推理三十秒没返回就断开重试工具调用十秒没响应就报错降级。没有超时的服务一旦上游抖动就是雪崩。第二重试与退避。对网络抖动类的错误做重试是有效的但要加退避策略不能瞬间打爆重试。重试次数要设上限并记录到日志里。第三降级路径。降级的意思是当 Agent 核心能力不可用时有备选方案。比如模型服务挂了及时返回系统繁忙请稍后再试而不是让用户干等。甚至可以切换到一个规则引擎的兜底脚本确保基础服务不中断。第四人工接管。涉及资金、客户投诉、法律风险的决策必须设置人工审批节点。Agent 输出一个决策建议但真正执行前要有人确认。这个人在回路的机制看起来不酷但它保证了 Agent 落地时的安全边界。第五输出校验。模型输出的 JSON 经常出现字段缺失或格式错误。要有一个专门的校验层解析失败时尝试自动修复比如修正括号、补齐缺失字段修复不了就重试一次或转人工。这里别硬编码解析建议用 JSON Schema 校验代码可维护性会好很多。2.7 决策点七可观测性和评估体系怎么做聊到 Agent 的都会问效果怎么样但能说清楚的团队不多。因为 Agent 的效果不是一个指标能衡量的它的好坏分散在推理质量、工具使用、流程效率等多个层面。工程团队必须从一开始就埋好观测点。可观测性方面我推荐给每个 Agent 任务生成一个统一的 trace ID。整个任务过程中每次模型调用、工具调用、状态转移、耗时、token 消耗都要以这个 ID 为单位记录下来。你既可以在 LangSmith、Langfuse 这类平台上看可视化链路也可以自建一张数据表存原始日志。我更喜欢自建因为能把自己关心的指标做成报表。但如果你团队没有充裕时间直接用 Langfuse 这类开源方案会快很多。评估方面要有一组固定的测试集。我从项目中沉淀的经验是至少准备二十个标准用户问题涵盖典型任务、边界情况和失败案例。每次改动提示词、换模型、调整工具之后都跑一遍这组测试对比前后效果。没有训练集的 Agent 迭代就是在岸上瞎开船。另外要追踪的指标有任务成功率、平均完成步数、模型调用次数、工具调用失败率、单任务 token 成本、用户显式反馈的满意度。这些指标不是给你看的是给 Agent 做体检用的。某个指标异常飙升往往意味着系统的某个环节出了问题。3. 一个完整的工程实现案例说了这么多理论和决策点我再用一个实际项目来说明怎么把这些东西串起来。这个项目是个售后工单分类 Agent需求很简单用户在页面上提交一段问题描述Agent 负责判断问题类型、紧急程度并给出一段回复建议。技术栈我选的是 FastAPI 做 HTTP 服务LangGraph 做编排Redis 做任务队列PostgreSQL 存业务数据。为什么选 FastAPI因为异步支持和类型提示好后面接 Redis 队列、WebSocket 都很顺。为什么用 LangGraph因为它的状态流转可视化在做这个多步骤流程时帮了大忙。核心编排是一个三节点的图。第一个节点是意图识别把用户问题分类成硬件故障软件问题退换货其他。第二个节点是信息补充如果分类结果缺关键信息比如硬件型号、订单号Agent 会主动向用户追问。第三个节点是生成答复调用大模型根据分类和补充信息从知识库中检索相关答案生成回复建议。工具方面我给 Agent 注册了两个工具一个查订单信息一个查技术文档知识库。两个工具都走 Function Calling描述写得非常细。查订单工具的说明里明确了只有当用户提供订单号或手机号时才可调用参数 orderId 为纯数字customerPhone 为 11 位手机号。这样模型基本不会乱传参。记忆方面短期记忆中我会强制保留三个会话内状态当前分类结果、已追问的信息、用户原始问题。这三条是生成最终回复的必要条件。长期记忆我没有在第一个版本就加因为业务目标是尽可能分类准确知识内容官方文档变动很快存长期记忆反而容易过期。可靠性上我给三个模型调用节点都设置了三十秒超时工具调用十秒超时。LangGraph 里我加了一个条件转移如果模型连续两次生成无意义的工具调用就中断循环转给客服人工处理。并发的话前端提交任务后我把任务信息放进 Redis 队列FastAPI 立刻返回一个任务 ID。后台有十个 worker 进程消费队列每个 worker 里跑一个 LangGraph 实例。对于工单分类这种任务来说这个并发模型已经能扛住相当大的流量了。下面是关键代码的示意我用 Python 伪代码展示核心逻辑# graph 定义简化但保留关键结构 from langgraph.graph import StateGraph, END class AgentState(TypedDict): user_input: str category: str missing_fields: list order_info: dict reply: str attempts: int def node_classify(state: AgentState) - dict: # 调用大模型做意图分类 return {category: llm_classify(state[user_input])} def node_ask_for_info(state: AgentState) - dict: # 检查分类是否缺失关键信息缺则生成追问 missing find_missing_fields(state[category], state[user_input]) return {missing_fields: missing} def node_solve(state: AgentState) - dict: # 检索知识库 调用订单工具 生成回复 knowledge search_knowledge(state[category]) order_info call_order_tool(state[user_input]) return {reply: llm_generate_reply(state, knowledge, order_info)} builder StateGraph(AgentState) builder.add_node(classify, node_classify) builder.add_node(ask_info, node_ask_for_info) builder.add_node(solve, node_solve) builder.add_edge(classify, ask_info) builder.add_conditional_edges( ask_info, lambda state: solve if not state[missing_fields] else ask_info ) builder.add_edge(solve, END)这段代码里最关键的工程点是条件转移。Decision 节点的存在让 Agent 不再是一条路走到黑而是能判断信息够了就往下走不够就继续追问。LangGraph 把这种分支逻辑表达得非常清楚比自己在循环里写状态判断要直观得多。实际跑起来后我又加了一个兜底环节如果 Agent 最终给出的回复置信度低我们让模型在输出时带上置信度字段系统自动把回复标记为仅供参考并由人工客服二次审核后再发给用户。这其实就是刚刚说的人在回路在售后服务这种场景里宁可让回复慢一点也不能让用户看到不专业的答案。4. 常见问题与排查技巧实录Agent 项目上线之后可以说是问题天天有每天都新鲜。我把自己在实际运维中踩过的坑和排查经验整理成了一份清单希望帮大家少走弯路。4.1 Agent 陷入死循环prompt 消耗异常暴涨这是 Agent 项目最常见的翻车现场。表现是任务一直不结束模型反复调用同一个工具或者反复输出格式错误的结果。原因主要有三种一是工具反馈太模糊模型不知道失败的原因二是条件分支设计有缺陷没有终止路径三是 max 迭代次数没设置或者设置太大。排查思路是看 trace 日志找最近的几次模型输出看看它在哪个环节开始原地打转。解决手段有三个设置最大迭代次数我一般限制在十次以内在工具返回里强制携带错误的结构化信息在编排图里增加最终的兜底节点一旦达到最大步数就结束并转人工。4.2 token 消耗暴涨成本失控很多团队上 Agent 的兴奋期一过看到账单就冷静了。token 暴涨通常不是单次调用的问题而是累积效应。比如每次工具返回都完整塞入上下文每轮对话都携带完整历史工具的 Schema 一次性全加载。我给的优化路径是这样的第一步把工具输出的内容改为精简版只看关键字段第二步给对话历史做滚动窗口加摘要而不是全量拼接第三步工具 Schema 按需加载先让模型选类别再加载具体工具第四步设置单任务 token 上限和报警。4.3 模型输出的 JSON 经常解析失败模型就算用了 Function Calling 和结构化输出也避免不了出错。尤其在输入文本较长、逻辑复杂时输出 JSON 可能截断、缺少字段、甚至出现标点错误。我的做法是写一个解析兼容层先尝试标准 JSON 解析失败后用正则提取最外层的大括号片段再解析还不行就调用一次轻量模型做修复最后还失败就走重试或转人工。另外把模型输出接一个 JSON Schema 校验器每个字段的类型、枚举值都严格校验避免脏数据进入下游系统。4.4 多 Agent 协作时互相干扰、职责混乱多 Agent 架构看起来高级跑起来容易变成三个和尚没水喝。常见问题包括多个子 Agent 同时修改同一个状态字段导致覆盖总控 Agent 调度消息格式不统一某个子 Agent 失败后其他 Agent 还在继续推进任务。如果你已经决定用多 Agent请务必做到三点第一做好状态隔离每个子 Agent 只能修改自己负责的状态片段第二通信消息约定严格的接口格式最好用 Pydantic 这类模型做校验第三设置全局超时任何 Agent 路线跑超时整个任务进入降级流程。但说实话我依然建议大多数场景先用单 Agent复杂度低很多。4.5 测试集缺失每次改动心里发虚Agent 是概率系统没有测试集就敢改提示词基本等于盲改。一个很小的提示词变化可能在大部分 case 上没问题但恰好撞坏一个边缘场景。我的习惯是从项目第一天就开始积累测试用例。每次线上遇到一个处理不好的问题就把它的输入、预期输出、错误原因记录到测试集里。版本迭代时跑全量测试集对比前后输出差异再决定是否发布。这个工作不性感但它是 Agent 持续迭代的定心丸。我在最初做 Agent 的时候一度追求让模型表现得像人后来发现那是方向错了。工程实现的目标不是让 Agent 更像人而是让 Agent 在复杂、多变、不可控的真实环境里稳定地、可预期地、安全地完成业务目标。想明白了这一点很多决策点的优先级自然就清楚了——你会明白人工干预不是能力不足的妥协而是工程系统安全边界的一部分。如果再让我补一句经验我会说Agent 不是一个模型加十个工具它是一套完整的、有生命周期管理的业务系统。你用七要素去审视它的结构拿七个决策点去权衡它的工程方案再靠一步步沉淀测试与日志去打磨这套方法论虽然不华丽但在我的实战经历里它比任何花哨的架构都扛得住生产流量。