Anthropic 工程博客 · 中文学习笔记Anthropic 工程笔记

    构建高效的智能体:从简单可组合的模式出发

    Building effective agents

    #1 · 模块 A 智能体设计与架构 原文发布:2024-12-19 阅读约 15 分钟 原文链接 ↗
    ⚠️ 在线原文顶部已加注:文中描述的工具生态自 2024 年 12 月以来已有很大变化,当前做法请参考 Managed Agents 相关文章与文档;正文里也出现了发表之后才推出的产品名(如 Claude Haiku 4.5、Sonnet 4.5、Claude Agent SDK),说明原文发表后修订过。本笔记以 2026-10-17 读到的在线版本为准。
    本页目录(21)
    1. 一句话总结
    2. 为什么重要
    3. 核心概念(中英对照)
    4. 方法 / 步骤
    5. 1. 先回答:要不要做智能体?
    6. 2. 关于框架的态度
    7. 3. 基础单元:增强型 LLM
    8. 4. 五种工作流模式
    9. 5. 智能体:本质是一个循环
    10. 6. 组合与定制
    11. 7. 三条核心原则
    12. 8. 附录要点(一):两个落地领域
    13. 9. 附录要点(二):给工具做“提示工程”
    14. 图解
    15. 图 1:智能体系统的分类——工作流 vs 智能体
    16. 图 2:复杂度阶梯——什么时候该往上走一级
    17. 图 3:五种工作流模式一览
    18. 图 4:自主智能体的运行循环
    19. 关键原话
    20. 实践建议
    21. 延伸阅读

    ⚠️ 原文已被更新过(见 frontmatter 中的 source_note)。本文讨论的是设计思路,具体框架和模型名可能已过时。

    一句话总结#

    做 LLM 应用别一上来就搞复杂智能体:先把单次调用做好,必要时用固定编排的“工作流”,只有在任务开放、步骤无法预知时才交给“智能体”自主决策,并且每加一层复杂度都要用效果证明它值得。

    为什么重要#

    • 它是整个工程博客的“总纲”。 后来的多智能体研究系统、长时任务 harness、评测、上下文工程等文章,都在沿用这篇定下的术语(工作流 / 智能体 / 增强型 LLM)和“简单优先”的立场。
    • 给“智能体”一个可操作的定义。 业界对 agent 的说法很混乱,这篇用一个架构上的区分把问题讲清楚:流程由代码决定还是由模型决定。
    • 提供了一套可复用的“模式词汇表”。 提示链、路由、并行化、编排者-工作者、评估者-优化者,几乎能覆盖大部分生产中的 LLM 编排需求,方便团队交流和选型。
    • 把工具设计提升到与提示词同等的地位。 提出“智能体-计算机接口(ACI)”的概念,后续《Writing effective tools for agents》一文正是对此的展开。
    • 对框架保持警惕。 提醒开发者框架的抽象层会掩盖真实的提示和响应,这对调试和成本控制都很关键。

    核心概念(中英对照)#

    中文English简要解释(笔者概括)
    智能体系统agentic system工作流和智能体的统称,泛指让 LLM 配合工具完成多步任务的系统。
    工作流workflowLLM 与工具按开发者预先写好的代码路径被编排执行,可预测、可控。
    智能体agent由 LLM 自己动态决定下一步做什么、用什么工具、何时结束。
    增强型 LLMaugmented LLM接入了检索、工具、记忆等能力的 LLM,是所有模式的基础单元。
    提示链prompt chaining把任务拆成固定的顺序步骤,上一步输出作为下一步输入,中间可插程序检查。
    关卡 / 检查点gate提示链中间用代码做的校验,不通过就中止或分流。
    路由routing先给输入分类,再交给专门的下游处理(不同提示、工具或模型)。
    并行化parallelization多个 LLM 调用同时进行,结果由程序汇总;分“分段”和“投票”两种。
    分段sectioning把任务切成互相独立的子任务并行处理。
    投票voting同一任务跑多次,用多样化结果提高置信度。
    编排者-工作者orchestrator-workers中心 LLM 根据具体输入动态拆解任务、分派给工作者 LLM,再综合结果。
    评估者-优化者evaluator-optimizer一个 LLM 生成,另一个 LLM 评估并给反馈,循环改进。
    环境反馈 / 真实情况ground truth (from the environment)智能体每一步从工具结果、代码执行等环境中拿到的真实信号,用来判断进展。
    停止条件stopping condition例如最大迭代次数,用来保证智能体可控。
    智能体-计算机接口agent-computer interface (ACI)类比人机界面(HCI),指工具的定义、参数、文档对模型是否友好。
    防呆设计poka-yoke来自制造业的概念:把接口设计得让人(或模型)很难用错。

    方法 / 步骤#

    1. 先回答:要不要做智能体?#

    原文的立场非常明确:能简单就简单。笔者把它整理成一个三级阶梯:

    1. 优化单次 LLM 调用:配合检索和上下文示例,很多应用到这一步就够了。
    2. 工作流:任务定义清晰、步骤可以预先确定时使用,换来可预测性和一致性。
    3. 智能体:任务开放、步骤数量无法预知、需要模型在大规模场景下灵活决策时才使用。

    代价要算清楚:智能体系统通常是用更高的延迟和成本换取更好的任务表现;自主性还会带来更高成本和错误累积的风险。

    2. 关于框架的态度#

    • 原文列举了若干框架(Claude Agent SDK、AWS 的 Strands Agents SDK、图形化的 Rivet 与 Vellum),承认它们能简化调用模型、定义解析工具、串联调用等底层工作。
    • 但抽象层会遮住底层的提示与响应,让调试变难,也容易诱使人加上不必要的复杂度。
    • 建议:先直接用 LLM API,很多模式几行代码就能实现;如果用框架,务必搞懂它底层做了什么——对底层的错误假设是常见的出错来源。

    3. 基础单元:增强型 LLM#

    • 让 LLM 具备检索、工具、记忆能力,并且模型能主动使用(自己生成检索词、选工具、决定记住什么)。
    • 两个实现重点:贴合具体用例定制这些能力;给 LLM 提供简单、文档清晰的接口。
    • 原文提到 MCP(Model Context Protocol)是接入第三方工具生态的一种方式。

    4. 五种工作流模式#

    模式怎么做适用条件原文举的例子(概括)
    提示链固定顺序拆步,每步处理上一步输出,可加 gate任务能干净地拆成固定子任务;用延迟换准确率(每步更简单)先写营销文案再翻译;先写大纲、检查大纲、再成文
    路由先分类,再分发到专门流程存在明显不同的类别,且分类本身能做准客服问题按类型分流;简单问题给小模型、难题给强模型
    并行化分段:独立子任务并行;投票:同一任务多次需要提速,或需要多视角 / 多次尝试提高置信度一个调用答题、另一个调用做内容审查;多个提示分别审查代码漏洞
    编排者-工作者中心 LLM 动态拆任务、分派、汇总子任务无法预先确定(与并行化的关键区别)每次要改多个文件的编码产品;多来源信息搜集
    评估者-优化者生成 → 评估反馈 → 再生成的循环有清晰评估标准,且迭代改进有可测收益;人类反馈能让结果变好、LLM 也能给出类似反馈文学翻译;需要多轮搜索的复杂检索

    笔者提示:并行化和编排者-工作者“长得很像”,区分点只有一个——子任务是写死的还是模型临场决定的。

    5. 智能体:本质是一个循环#

    • 起点:用户下指令或与用户讨论清楚任务。
    • 执行:智能体自行规划、行动;每一步都要从环境拿到真实反馈(工具结果、代码执行结果)来评估进展。
    • 人类介入:可在检查点或遇到阻碍时停下来请人确认。
    • 结束:任务完成即终止,也常设置最大迭代次数等停止条件。
    • 实现上往往很简单——就是“LLM 根据环境反馈调用工具,循环往复”;因此工具集和工具文档的设计至关重要。
    • 适用:开放式问题、步骤难以预估、无法写死路径,并且你对模型的决策有一定信任;适合在可信环境中扩展任务规模。
    • 风险控制:在沙箱环境中充分测试,并配合合适的护栏(guardrails)。
    • 原文自己的例子:解决 SWE-bench 任务的编码智能体;“computer use”参考实现。

    6. 组合与定制#

    这些模式不是教条,而是可以拼装的积木。成功的关键是测量效果、迭代实现,并且只在复杂度被证明能改善结果时才增加它。

    7. 三条核心原则#

    1. 简单(simplicity):保持智能体设计简洁。
    2. 透明(transparency):显式展示智能体的规划步骤。
    3. 精心打磨 ACI:充分的工具文档和测试。

    框架适合快速起步,进入生产后不要犹豫去减少抽象层、用基础组件构建。

    8. 附录要点(一):两个落地领域#

    原文认为智能体最有价值的任务通常同时具备:既要对话又要行动、成功标准清晰、能形成反馈回路、有有意义的人工监督。

    • 客户支持:对话流程天然 + 需要查客户数据、订单、知识库 + 退款、改工单等动作可程序化 + 成功可按“问题是否解决”衡量。原文提到有公司按“成功解决次数”计费,体现了对效果的信心。
    • 编码智能体:代码可以用自动化测试验证、可以用测试结果迭代、问题空间结构化、质量可客观衡量;但人工评审仍然关键,用来确认方案符合更大的系统要求。

    9. 附录要点(二):给工具做“提示工程”#

    • 同一个动作可以有多种表达格式(例如改文件用 diff 还是整文件重写;结构化输出把代码放 Markdown 还是 JSON),对程序是等价的,但对 LLM 的难度差别很大:写 diff 需要预先知道改动行数,代码塞进 JSON 需要大量转义。
    • 选格式的建议:
      • 给模型足够的 token 先“想一想”,避免把自己写进死胡同;
      • 格式尽量贴近模型在互联网文本里常见的样子;
      • 去掉格式负担,比如精确计数几千行、给代码做字符串转义。
    • 做好 ACI 的方法:
      • 站在模型角度看:仅凭描述和参数,能否一眼看懂怎么用?好的工具定义通常包括示例用法、边界情况、输入格式要求,以及与其他工具的明确边界;
      • 像给团队新人写 docstring 一样改参数名和描述,相似工具多时尤其重要;
      • 用大量样例输入测试模型怎么用工具,观察错误并迭代;
      • 做防呆(poka-yoke):调整参数设计,让模型更难犯错。
    • 原文案例:做 SWE-bench 智能体时,团队花在优化工具上的时间比优化整体提示还多;模型在切换出根目录后使用相对路径容易出错,于是把工具改成必须使用绝对路径,问题随之消失。

    图解#

    图 1:智能体系统的分类——工作流 vs 智能体#

    flowchart TB
        AS["智能体系统<br/>agentic systems"]
        AS --> WF["工作流 workflow<br/>代码预先决定执行路径"]
        AS --> AG["智能体 agent<br/>LLM 动态决定流程与工具"]
    
        WF --> WF1["✅ 可预测、一致"]
        WF --> WF2["适合:定义清晰、可拆解的任务"]
        AG --> AG1["✅ 灵活、可处理开放问题"]
        AG --> AG2["⚠️ 成本更高、错误可能累积"]
        AG --> AG3["适合:步骤无法预知、可信环境"]
    
        BB["基础单元:增强型 LLM<br/>augmented LLM<br/>(检索 + 工具 + 记忆)"]
        BB -.支撑.-> WF
        BB -.支撑.-> AG

    图 2:复杂度阶梯——什么时候该往上走一级#

    flowchart TD
        S([新需求]) --> L1["第 1 级:单次 LLM 调用<br/>+ 检索 + 上下文示例"]
        L1 --> Q1{"效果够了吗?<br/>(用评测衡量)"}
        Q1 -- 够了 --> DONE([停在这里,别加复杂度])
        Q1 -- 不够 --> Q2{"任务能否预先拆成<br/>固定步骤 / 固定类别?"}
        Q2 -- 能 --> L2["第 2 级:工作流<br/>提示链 / 路由 / 并行化<br/>编排者-工作者 / 评估者-优化者"]
        Q2 -- 不能,步骤无法预知 --> L3["第 3 级:智能体<br/>LLM + 工具 + 环境反馈循环"]
        L2 --> Q3{"复杂度是否带来<br/>可测量的提升?"}
        L3 --> Q3
        Q3 -- 是 --> KEEP([保留并持续迭代])
        Q3 -- 否 --> BACK([退回更简单的方案])

    图 3:五种工作流模式一览#

    flowchart LR
        subgraph P1["① 提示链 prompt chaining"]
            direction LR
            a1[输入] --> a2[LLM 1] --> g{gate<br/>程序检查}
            g -- 通过 --> a3[LLM 2] --> a4[LLM 3] --> a5[输出]
            g -- 不通过 --> a6[中止/分流]
        end
    
        subgraph P2["② 路由 routing"]
            direction LR
            b1[输入] --> r{LLM 路由器<br/>分类}
            r --> b2[专用流程 A]
            r --> b3[专用流程 B]
            r --> b4[专用流程 C]
        end
    
        subgraph P3["③ 并行化 parallelization"]
            direction LR
            c1[输入] --> c2[LLM 调用 1]
            c1 --> c3[LLM 调用 2]
            c1 --> c4[LLM 调用 3]
            c2 & c3 & c4 --> c5[程序汇总<br/>分段拼接 / 投票]
        end
    flowchart LR
        subgraph P4["④ 编排者-工作者 orchestrator-workers"]
            direction LR
            d1[输入] --> o[编排者 LLM<br/>动态拆分任务]
            o -.按需生成.-> w1[工作者 1]
            o -.按需生成.-> w2[工作者 2]
            o -.按需生成.-> w3[工作者 N]
            w1 & w2 & w3 --> sy[编排者综合结果] --> d2[输出]
        end
    
        subgraph P5["⑤ 评估者-优化者 evaluator-optimizer"]
            direction LR
            e1[输入] --> gen[生成者 LLM]
            gen -- 方案 --> ev[评估者 LLM]
            ev -- 反馈 --> gen
            ev -- 达标 --> e2[输出]
        end

    图解:编排者-工作者模式里,编排者 LLM 动态拆分任务并综合各工作者的结果;评估者-优化者模式里,生成者 LLM 出方案,评估者 LLM 给反馈,直到达标。

    图 4:自主智能体的运行循环#

    sequenceDiagram
        autonumber
        participant H as 人类用户
        participant A as 智能体(LLM)
        participant T as 工具 / 环境
        H->>A: 下达任务或讨论澄清需求
        A->>A: 规划下一步
        loop 直到完成或触发停止条件(如最大迭代次数)
            A->>T: 调用工具 / 执行代码
            T-->>A: 返回真实反馈(ground truth)
            A->>A: 评估进展,调整计划
            opt 到达检查点或遇到阻碍
                A->>H: 请求确认或补充信息
                H-->>A: 反馈
            end
        end
        A-->>H: 交付结果

    关键原话#

    “They are typically just LLMs using tools based on environmental feedback in a loop.” —— 智能体通常不过就是:LLM 根据环境反馈、在循环中调用工具。

    “you should consider adding complexity only when it demonstrably improves outcomes.” —— 只有当复杂度能被证明改善结果时,才考虑增加它。

    实践建议#

    选型 checklist

    • 先做一个只用单次调用(+检索/示例)的基线,并配套一个最小评测集;没有基线就无法判断后续复杂度是否值得。
    • 能用固定步骤描述的任务,优先用工作流;把“子任务是否可预知”作为选择并行化还是编排者-工作者的判断标准。
    • 上智能体之前,确认三件事:环境是否可信 / 可沙箱化;有没有清晰的完成标准;有没有停止条件和人工检查点。
    • 使用框架时,至少能打印出每一次实际发给模型的完整提示和收到的原始响应。

    工具(ACI)checklist

    • 让一位没参与开发的同事只看工具描述去用它,卡住的地方就是模型也会卡住的地方。
    • 工具描述里写清:用途、示例、边界情况、输入格式、与相似工具的区别。
    • 尽量消除格式负担(转义、行数计数),优先选模型“见得多”的格式。
    • 用参数设计防呆,例如强制绝对路径、用枚举代替自由文本。
    • 跑一批样例输入,统计模型用错工具的类型,针对性改名、改描述、改参数。

    笔者补充(非原文观点)

    • 把这篇的五种模式当作“画架构图的词汇”,在设计评审时先说清系统属于哪种模式(或哪几种的组合),能显著减少沟通成本。
    • 原文发表于 2024 年底,后续 Anthropic 在长时任务和托管智能体方面的文章(见下方延伸阅读)对“harness 应该做多少事”有新的反思,建议对照阅读。

    延伸阅读#

    站内笔记(按推荐顺序)

    原文中引用的官方资源


    本笔记依据 2026-10-17 抓取的在线原文撰写。原文:Anthropic,《Building effective agents》。

    进度只保存在本机浏览器,在学习路线中查看
    本页目录