做 AI 应用开发这几年,我越来越觉得圈子里有个很有意思的现象:很多人一上来就想搞“全自动智能体”,结果项目跑了两三周就推倒重来。我自己也经历过这个阶段,反复对照 Anthropic 那篇《Building Effective Agents》读了不下十遍,它最核心也最反直觉的论点其实很简单——绝大多数业务场景根本不需要“智能体”,设计一个明确固定的工作流往往效果更好、成本更低、还容易排查问题。这篇文章就是我结合这份架构笔记、加上自己实际工程的踩坑经验,把“智能体到底怎么做才有效”这件事彻底讲清楚,适合正在搭建 AI 功能、却对 agent 架构一头雾水的开发者和产品经理。
1. 先弄明白:Anthropic 笔记里说的“智能体”到底指什么
1.1 智能体和工作流:最容易被忽略的核心区分
Anthropic 那篇笔记开篇就撕开了一个关键概念:**工作流(workflow)和智能体(agent)**是两码事。
工作流是预先定义好的代码路径,就像流水生产线——零件从 A 工位传到 B 工位,每一步做什么、下一步去哪,完全由工程师提前画好。LLM 在这个系统里只是某一站上的工人,负责完成这块固定任务,但不决定整个流水线怎么改。
智能体则不一样。它是一个由模型动态指导自身流程的系统,模型可以根据当前上下文、中间结果、工具返回的信息,自己决定下一步调用哪个工具、往哪个方向走,甚至中途推翻自己之前的判断。就像你雇了一个能独立做决定的员工,他只领大方向,具体怎么执行由他自己临场应变。
这个区分为什么重要?因为它决定了你的系统复杂度和成本下限。很多中文社区文章把“工作流”和“智能体”混为一谈,好像加了 LoRA 微调、接了模型 API,就算“智能体”了。实际上如果任务本身是固定的,比如“每天定时抓取新闻、用固定模板总结、发到群里”,你根本不需要智能体,一个 prompt chaining 工作流就能解决,还便宜、稳定、一目了然。
注意:判断标准不是“有没有用大模型”,而是“系统的下一步动作由谁决定”。代码决定下一步,就是工作流;模型决定下一步,才是智能体。
1.2 按复杂度划分的三层计算架构
Anthropic 笔记把大模型应用分成三层,这个分层框架对我帮助极大:
- 第一层:纯语言模型 API 调用。输入一段文本,返回一段文本。常见于翻译、摘要、分类这些单点任务。这个层次没有“流程”概念,属于最基础的 LLM 能力。
- 第二层:LLM 增强工具的工作流。模型调用搜索、代码解释器、结构化输出等工具,完成单个任务里的多个步骤。典型例子是 RAG(检索增强生成)——先检索文档再总结,这个过程中的“检索”就是工具调用。
- 第三层:自主智能体。模型在循环中连续决策,动态决定调用哪些工具、按什么顺序调用、何时终止。典型例子是处理一个复杂客服请求时,模型自动判断需要查订单表、看退货政策、生成退款单、最后写回复。
实际项目里,我见过太多团队一上来就直奔第三层。真实情况是,绝大多数任务停留在第一、二层反而更稳。Anthropic 自己也说得很直白:能用工作流解决的就别上智能体,能用基础 prompt 解决的就别搞复杂工作流。这不是技术倒退,而是工程成熟度的体现。
2. 五种工作流模式:大多数场景的正确答案
2.1 提示链:把复杂任务拆成一串固定步骤
Anthropic 笔记里最推荐、也是最容易被低估的模式是提示链(Prompt Chaining)。它的核心思想极简:把一个复杂任务拆成若干子任务,每个子任务由一次独立的 LLM 调用完成,前一步的输出作为后一步的输入,中间可以插入代码校验、格式过滤等确定性逻辑。
举个例子,我做过一个招投标文件分析系统。客户给的标书往往几十上百页,直接让它“总结并提出报价策略”效果很差。用提示链拆开以后是这样的:
- 第一步:抽取标书里的关键字段(项目名称、预算、投标截止日期、资质要求),这一步要求模型只做抽取,以 JSON 输出;
- 代码检查:用正则和 schema 校验 JSON 字段是否完整,缺了就返回第一步重做,最多重试两次;
- 第二步:基于抽取结果,生成初步报价分析和风险提示;
- 第三步:把第二步结果和客户的历史偏好模板合并,生成最终投标策略文本。
每一步模型的任务都特别纯粹,反而更容易调优。如果某一步效果差,你只需要针对那一小步优化 prompt,或者补充示例,不用动整个系统。这就是提示链最大的好处——可控、可观测、可定位问题。
2.2 路由、并行、编排与评估优化:各有各的适用场景
除了提示链,Anthropic 笔记还总结了四种模式,我把它们的核心逻辑和应用场景整理一下:
| 模式 | 核心逻辑 | 典型场景 | 我的经验备注 |
|---|---|---|---|
| 路由 | 先用分类器判断任务类型,再分发给不同的专长子 prompt | 客服系统先判断“退款问题”还是“技术问题”,分别走不同流程 | 路由失败会造成雪崩,分类器的准确率必须单独评测 |
| 并行化 | 同时分发多个子任务,结果汇总或投票 | 代码安全审查同时用多个模型检查不同漏洞类型,最后汇总;或让多个模型生成方案后投票选最优 | 投票模式成本较高,但能显著降低单点幻觉 |
| 编排者-执行者 | 一个主模型拆解任务,委派给多个专用子代理执行,最后汇总结果 | 数据分析任务:主模型先规划需要哪些图表和结论,再派给专门的 RAG、SQL 查询、Python 执行子代理 | 主模型的规划能力决定上限,这个模式适合任务边界动态变化的场景 |
| 评估者-优化者 | 一个模型生成方案,另一个模型负责批评打分,把反馈迭代回生成器 | 文案优化:生成器写营销文案,评估者从转化率、合规、用户偏好等维度打分,循环多轮 | 循环轮次要限死,否则 token 成本失控,建议最多 3 轮 |
路由模式我印象最深刻的一个案例是知识库问答机器人。早期我试图用一个通用长 prompt 处理所有问题,结果产品、技术、售后三个领域的回答质量互相拖累。后来换成一个轻量分类模型先判断用户问题属于哪个领域,再路由到三个各自优化过的子 prompt 上,整体效果提升非常明显。这个模式本质是把“模型擅长什么”拆成粒度更细的单元,让每个单元内聚度最高。
并行化模式里,投票方案最值得一讲的做法是:不直接让模型“给答案”,而是让 3-4 个不同 prompt/温度参数的模型分别生成答案,再用一个评审模型挑最佳答案。我测过很多场景,这种方式在“知识密集型但事实性要求高”的问题上,准确率提升能达到 15% 以上。代价是 token 开销直接乘以四五倍,所以只适合高价值决策场景,别每个用户请求都这么干。
编排者-执行者模式适合任务本身没有固定流程、但拆解后每个子任务相对独立的情况。我做过一个“智能测试报告分析”系统:主模型拿到 QA 团队上传的测试日志后,自主决定是否需要查询历史缺陷库、是否跑一段统计脚本、是否只抽取特定模块的用例结果,然后委派给不同的执行代理并行处理。这种动态编排与纯粹固定工作流的区别在于:整个执行路径不是预设的,完全由主模型根据日志内容临时判断。
评估者-优化者模式在生成类任务里特别有用。我最常用的落地方式是:生成器是 GPT-4 等主力模型,评估者是一个用打分卡约束的轻量模型,从“准确性、完整性、风格一致性”三个维度给初稿打分,并在反馈里明确指出问题点,生成器再修订。这个过程跑两轮,效果通常比一次性生成好很多,尤其是处理“多约束、高要求”的商业文案。
2.3 选型判断:一张表帮你在工作和智能体之间做决策
很多读者会问:说了一堆模式,那到底什么时候选哪个?我基于实践总结了一个简单的决策顺序,可以当检查表用:
- 如果任务是单点输入输出,先尝试纯 prompt,不搞任何链路;
- 如果任务有几个固定步骤,且每一步都可能出错,用提示链;
- 如果任务有几类明显不同的子任务,用路由分开处理;
- 如果子任务之间没有依赖,可以并行,用并行化;
- 如果任务比较复杂但子任务边界清晰,用编排者-执行者;
- 如果任务的难点在于“怎么判断好还是不好”,用评估者-优化者;
- 只有当上面的方案都覆盖不了,或者任务的执行路径本身就未知、需要模型临场探索时,才考虑上真正的自主智能体。
这个顺序的本质是“从确定性最高、成本最低的方案开始”。我见过太多反例:团队直接把 Agent 框架套在一个固定流程的需求上,结果调试成本爆炸,最后退回工作流才稳定。记住 Anthropic 原话的意思——在合适的場景里用工作流,比强行做 agent 更“智能”。
3. 自主智能体:agentic loop 与工具设计
3.1 agentic loop 的运行机制:环境循环与模型循环
如果工作流是“把路线画好再走”,那么智能体就是“边走边看、边决策”。Anthropic 笔记里虽然没有用这个术语,但业界普遍把自主智能体的运行机制称为agentic loop。
我自己的理解,agentic loop 由两个循环构成:
- 模型循环:LLM 根据当前对话历史、用户目标和可用工具描述,生成下一个动作(调用或停止)。这个循环发生在模型内部,每轮决策都依赖上一轮观察到的结果。
- 环境循环:模型选定的动作在外部真实环境中执行,比如查数据库、改文件、调 API、发请求,然后环境把执行结果返回给模型,模型再基于新状态继续决策。
这两个循环反复交替,就是智能体持续“工作”的过程。用一个人力类比:员工抬头看目标(模型循环),然后低头干活、看工作台结果(环境循环),再抬头判断下一步。
实操层面,agentic loop 的最小伪代码大概是:
messages = [{"role": "user", "content": task}] for step in range(max_steps): response = client.messages.create( model="claude-3-5-sonnet", max_tokens=2000, tools=tool_schemas, messages=messages ) messages.append(response) if response.stop_reason == "tool_use": # 执行工具调用,把真实结果追加回消息队列 tool_result = execute_tool(response.tool_calls) messages.append(tool_result) continue if response.stop_reason == "end_turn": break这里有三个细节极其关键:
- max_steps / max_tokens 必须限制。没有终止条件的智能体是灾难——模型可能陷入反复调用同一个工具的无限循环。我一般按任务复杂度设 10-30 步上限,超过就强制中止并输出当前进度摘要。
- 工具调用结果必须真实追加回上下文。有些初版实现把工具结果只作为“中间变量”,没有完整注入 messages,导致模型下一轮决策缺失关键信息,表现断断续续。
- 显式记录每一步的状态与 token 消耗。我自己会给 agentic loop 每一步写结构化日志:这步模型想了什么、调了什么工具、拿到了什么结果、消耗了多少 input/output token。没有这些日志,后面调试就是无头苍蝇。
3.2 工具是智能体的“手”:从 API 调用走向 MCP
一个智能体没有工具,就像诸葛亮没有羽扇和地图,全靠脑子硬想。Anthropic 笔记反复强调“augmented LLM”这个理念——通过工具使用、检索、记忆等方式增强模型能力,才能让模型真正做事。
工具设计的核心心得,我总结成三条:
- 工具接口要窄而明确。每个工具只做一件事,参数尽量少且语义清晰。我做过一个反面教材,把“查询订单信息”和“取消订单”做成一个大工具,模型经常误用,出现不该取消时取消订单的严重事故。拆成两个工具后问题立刻消失。
- 工具描述要写“何时用、何时不要用”。模型选择工具依赖的是工具描述,描述写不清楚,能力再强也白搭。经验是给每个工具写清楚适用条件和反例,比如“当用户要求退款时使用本工具;若订单尚未支付,则不要调用退款接口,先调用查询工具”。
- 安全工具要预设确认权限。凡涉及删除、转账、上线、发送消息等敏感操作,工具调用应触发人工确认环节,或者至少走二次校验。这个在 Anthropic 笔记里叫“guardrails”,我的经验是宁可多确认一次,也不要省这一步导致生产事故。
MCP(Model Context Protocol,模型上下文协议)是 Anthropic 提出的标准化协议,它把工具、资源、提示词统一成标准接口,让智能体像 USB 设备一样即插即用地访问外部能力。最近社区讨论热度极高,我实际体验下来,它最大的价值在于生态互通——同一个 MCP 服务器写的工具描述和入参格式,可以同时服务多种模型和应用,不用为每个产品单独造一套工具管理逻辑。
但需要注意,MCP 不是银弹。它解决的是接口标准化问题,没有解决模型能力问题。工具本身设计得再标准,如果模型推理能力不行,调用链设了也难出效果。
3.3 安全护栏:智能体不能没有刹车
这是 Anhtropic 笔记里我最重视的一部分,也是容易被忽视的部分。智能体的自主性越强,潜在风险就越大。
安全护栏至少要做三层:
- 工具级别的护栏:敏感操作必须人工确认。这层通常通过权限系统实现,比如只允许智能体在特定环境里执行删除操作,或强制执行“不直接调用,而是生成待确认单据”的模式。
- 行为级别的护栏:对 agentic loop 的每一步做规则检查,例如检测是否重复调用同一个工具 N 次、是否在用户明确拒绝后仍继续某种操作、是否尝试访问越权资源。这部分既要写在系统 prompt 里,也要在代码里做实时的规则拦截。
- 输出级别的护栏:最终输出在大规模发布前要做内容审核。比如客服机器人生成的回复要先过一个敏感词和合规过滤器,防止模型走偏。
我在生产系统里最常用的一个落地方式是:把敏感操作的执行权从智能体手里剥出来,智能体只生成“操作建议单”,由人工审核或后置的确定性代码审核后统一执行。这听起来很笨,但确实是最稳的工程实践——尤其在金融、医疗这些合规要求高的行业里。
4. 实操落地:从简单需求开始构建智能体的完整路径
4.1 阶段一:先用工具增强的 LLM,别急着上自主循环
很多人头脑里的“智能体”一上来就是全自主循环。实际上,我落地的第一条建议是:先做一个工具增强的 LLM,把它跑稳,再考虑上循环。
所谓“工具增强的 LLM”,就是你定义好几个工具,让模型在单个会话里能调用它们,但不要让它自动决定反复循环。形态上更像是一次“带工具的对话”:用户问一个问题,模型可能需要调两次工具,然后直接给出最终答案。
这个阶段检验的重点是:
- 工具本身的质量(返回值格式、错误处理、延迟)
- 工具描述是否足够精准,让模型能在正确时机唤起正确的工具
- 模型对工具返回结果的理解和利用程度
我做过一个“智能工单分类与派发”项目,第一个版本就停留在这一层:模型根据工单内容,判断类别、优先级、推荐处理人,所有查询员工数据和历史工单的操作都是工具调用,但是一个会话只做一轮判断加一次工具查询,然后输出结果。就这么一个“简单得不像智能体”的服务,上线后人工客服的转派准确率从 73% 提升到了 91%,远远超过预期。
心得:很多业务问题不需要复杂智能体,只需要“LLM + 合适工具 + 合理 prompt”。先把这个基础组合打磨好,比盲目上自主循环的价值大得多。
4.2 阶段二:设计清晰的子任务划分与工作流
当单个带工具对话搞不定时,才进入第二阶段:把任务拆分,设计工作流或模式组合。
这个阶段的实操流程,我总结为五步:
- 流程梳理:与业务方确认完整处理流程,明确每个节点的输入、输出、成功判定标准。这一步是工程性最强的环节,AI 只是其中一部分。
- 任务拆解:把流程中的决策点找出来,哪些是规则就能判断,哪些需要 LLM 判断,哪些需要工具执行。
- 模式选型:按第二节的顺序,为每个决策点选择合适的模式。多个模式可以嵌套,比如路由里套一个并行化。
- 接口定义:为 LLM 与系统交互定义清晰的输入输出格式,建议统一用 JSON Schema,并做严格校验。
- 单点调优:对每个 LLM 调用点单独评测和调优,不要等到串起来才发现问题。
我举一个工作流嵌套的例子:一个“客户投诉智能处理”系统用了三层结构。第一层用路由判断投诉类型(物流、质量、售后等),第二层对“质量投诉”启动并行化——同时调用图片识别工具和订单查询工具,第三层用评估者-优化者模式生成最终回复,确保语气和合规性。每一层单独测试的时候效果都很好,串起来以后需要重点调试的是层与层之间的上下文传递,这块一定要用结构化字段做中间状态,别靠模型自由发挥。
4.3 阶段三:上了 agentic loop 之后怎么控制局面
只有当任务确实“无固定路径”时,才建议进入自主智能体阶段。我遇到的最典型适用场景是:用户问题描述的形态和解决路径完全不可预测,比如“帮我规划这次市场活动的执行方案”和“帮我查一下上季度所有异常订单的原因并出个报告”——这两种问题要走的工具链完全不同。
上了 agentic loop 以后,我强烈建议你做好四件事:
- 限定工作空间:给智能体一个沙箱环境,读写文件、执行命令、调外部 API 都限制在该范围内,防止越权。
- 加状态快照:每一步都记录 model 输出、tool call、tool result 的完整快照。这样万一发现行为异常,可以回放定位是哪一步开始跑偏。
- 强制步骤上限和 token 上限:我常用的配置是 max_steps=15,input token 每步 20K 封顶,output token 每步 4K。设这个上限的主要目的是控制成本,其次才是防死循环。
- 留“人审”入口:在关键动作节点(发邮件、确认订单、改库存)预留人工确认钩子。
控制局面的底层逻辑是:智能体的自由度越大,系统的不确定性越大,就需要用更强的确定性机制来兜底。这两个不矛盾,而是互补的。
5. 评测与调试:智能体质量怎么保证
5.1 给智能体建评测集:三个层次缺一不可
工作流还可以靠“人肉看几个案例”来验收,自主智能体绝对不能这么做——它的状态空间太大,根本不可能人肉覆盖。Anthropic 笔记里明确指出:没有评测(evals),智能体开发就是盲人摸象。
我把评测分为三个层次:
- 单元评测:针对单个工具调用或单个 LLM 输出点,验证“在给定输入下,模型是否选对了工具、输出格式是否正确、内容是否准确”。这个层次用固定测试集就能做,是开发期间效率最高的反馈。
- 流程评测:针对完整工作流或 agentic loop,验证“给定一个业务场景,系统是否能走到成功的结束状态”。需要准备端到端案例集,比如模拟 50 个不同类型的客服请求,看系统是否都正确走到“结单”状态。
- 体验评测:验证输出质量是否符合用户预期。通常用“专家评分 + 用户抽查”的方式,这个层次很难完全自动化,但可以通过问卷和反馈闭环持续做。
我自己的经验,给 agent 建评测集比给普通 LLM 功能建评测集要“动态”很多。因为智能体的路径不是固定的,评测集不仅要记录输入和期望最终输出,还要记录可接受的行为路径。比如“用户问退款,智能体调用了订单查询、退款计算两个工具,最终给出正确退款金额”,算通过。但如果它绕了七、八个不相关步骤才出结果,即使最终答案正确,也不算好。这种标准需要在评测集里明确写出来。
5.2 调试技巧:状态回放、token 追踪与失败聚类
调试生产级智能体的过程,和调试普通代码差别很大。不能用断点一句一句停,因为每步都是动态生成的。我这里分享三个调试思路:
- 状态回放。每一次 agent 运行都记录完整 trace,包括每一步的输入输出 token、工具调用参数、工具返回结果、模型内部思考过程(如果有)。当用户反馈“回答不对劲”时,你能够把 trace 拉出来,一步步看到底是哪一步决策出了问题。这个成本最高,但收益也最大。
- token 追踪。在 agentic loop 里,token 消耗不集中在单次调用,而是分散在十几步里。你一定要有按用户会话、按步骤维度的 token 统计,否则月底账单吓死人。我见过一次智能体测试任务,因为工具返回结果太大,每一轮都把一大段文本循环塞回上下文,结果单次任务消耗了 100 万 token。后来我在工具返回前加了结果摘要,把上下文压缩到原来的十分之一,费用立刻降下来。
- 失败聚类。把生产环境里所有失败案例按“错误类型”聚合,而不是按“case”单个分析。常见类型有:工具选择错误、参数构造错误、循环死循环、上下文遗忘、输出格式非法。先统计高频类型的占比,再针对性修 prompt 或约束逻辑,事半功倍。
这个环节最大的价值在于:它让你从“相信模型的能力”转向“建立对系统行为的监控和理解”。没有可观测性,就没有可控性。
6. 常见误区与我的踩坑经验
6.1 拿到设计稿先别动手:先过一遍八条检查清单
我把踩坑经验沉淀成八条检查清单,每次做智能体设计稿时先过一遍:
- 这个任务真的需要“模型决策下一步”吗?还是固定工作流就够?
- 任务的工具边界是什么?需要哪些外部权限?哪些不该放给模型?
- 有没有在关键动作点上预留人工确认入口?
- 工具调用结果会不会过大?有没有做摘要截断?
- agentic loop 的步数、token 上限设了吗?
- 评测集覆盖了主要行为路径吗?
- 有没有对每一步做 trace 日志?
- 如果模型在中间步骤失败,系统有没有降级回退方案?
其中第八条最容易忽略。我见过很多智能体设计稿里完全没提“模型调用失败”“工具超时”这些故障场景,上线后才知道问题。补救办法其实简单:每个调用点加 try-except,失败后给出用户可理解的提示,或走人工兜底渠道。
6.2 多个容易翻车的细节
翻车点一:不加终止条件的循环。模型会反复生成工具调用请求,尤其当工具返回的信息没有有效推进任务时,更容易原地打转。我个人项目里最高纪录是一个测试 agent 连续调了同一搜索工具 46 次,才因为 token 爆掉停下来。
翻车点二:工具返回原始数据直接塞回上下文。数据库查询返回 2000 行记录、API 返回完整 JSON,这些一股脑塞给模型,不仅浪费 token,还容易让模型“迷失”在大量噪音里抓不住重点。正确做法是先用代码把返回结果做结构化摘要,比如“共命中 153 条记录,其中 12 条指向库存不足,汇总如下...”,再把摘要注入上下文。
翻车点三:过度相信模型的“计划能力”。LLM 在很多工作中擅长“一步到位”,但不太擅长做长期规划。如果你把一个复杂项目交给 agent 全权处理,它往往会表面很有条理,实际越执行越偏。我的解决方法是“把大任务切成小决策循环”:每 3-5 步强制回一次人类或系统检查点,确认方向没错再继续。
翻车点四:忽略“失败路径”的评测。客服场景里用户乱骂、重复提问、包含非法字符,这些场景也要进评测集。模型在正常逻辑下表现不错,但在异常输入下可能原形毕露,要么死循环,要么输出荒谬内容。这类边界测试越早做越好。
当前智能体开发最大的误区就是把“选中一个智能体框架”当成全部。框架只是脚手架,真正的价值在你的任务定义、工具设计、评测体系这些硬功夫上。我自己从第一个失控的 agent 项目里学到的教训就是:复杂不是目的,稳定可控才是。先把工作流玩透,再谨慎地迈入自主智能体的领域,这个路线对绝大多数团队都适用。