
简介《如何构建有效的AI智能体》是一份面向AI应用开发者与架构师的技术报告系统梳理从设计理念到工作流落地的完整路径。内容围绕控制权分配、简约设计、增强型LLM与模块化集成展开深入区分AI工作流与智能体两种范式并结合提示词链、路由、并行化、编排者-工作者、评估者-优化者等模式给出适用场景与取舍建议帮助读者在性能、成本与灵活性之间做出合理决策避免为追求复杂而过度设计。资源为单个PDF文档约5.32MB适合对智能体系统有一定基础、希望提升系统设计能力的进阶开发者研读报告按返璞归真、模块化思维、双重范式与常用工作流等主题组织便于按需查阅。目前已有445人学习浏览内容提炼自Anthropic团队实践经验兼具设计哲学与可操作模式可作为构建生产级智能体系统的设计与选型参考。1. AI 智能体不是万能药先把控制权这事想清楚再动手2026 年再谈 AI 智能体几乎每个团队手里都捏着几个踩过坑的项目有的是把工作流包装成智能体卖了一轮有的在 AI Studio 这类可视化平台上拖了一堆节点却改不动底层效果。DeepSeek 公开训练方法之后大家更发现一个问题——模型能力从来不是瓶颈真正翻车的是系统设计。这份《如何构建有效的 AI 智能体》来自 Anthropic 团队一线实践作者 David L. 用铁轨与自动驾驶的比喻把工作流和智能体的边界讲得很透。它适合两类人准备把业务往智能体上搬的工程师以及已经被框架坑过、想回到底层逻辑的开发者。核心结论只有一个先想清楚控制权怎么分配再决定要不要引入智能体这套复杂性。下面按我的拆解顺序走一遍重点放在能直接照抄的代码骨架和真实会遇到的那几个坑。2. 工作流与智能体控制权分配决定了你要建的是哪一类系统2.1 两种范式的底层差别不在代码在控制权原文开头那个比喻我建议反复读几遍工作流像预定好的铁轨LLM 在上面跑智能体像能自主导航的车LLM 根据路况自己选路。这个比喻不是修辞而是直接对应到控制权分配。工作流把控制权交给一段预定义的流程智能体把控制权交给 LLM 本身于是两种系统长出了完全不同的行为模式。什么场景用工作流、什么场景值得上智能体不是拍脑袋定的。原报告给了一条判断主线任务是否明确定义、是否需要大规模灵活性、延迟和成本能不能接受。工作流适合“输入类别稳定、每一步做什么可预期”的任务比如客服工单分类、固定格式文档生成智能体则适合“任务边界模糊、需要模型自己判断下一步”的场景比如多源信息搜集、跨文件代码重构。控制权阶梯在原文中写得很清楚人类控制最底层AI 工作流只在预定义流程内有限自主AI 智能体才是高度自主但保留人类监督。我见过很多团队把智能体当成“比工作流更高级”的形态实际上这三者不是升级关系而是成本、延迟、失控风险依次递增的关系。控制权给得越多系统的行为就越不可预测调试成本也跟着涨。我通常建议先做一道减法这个任务如果拆成固定子步骤也能跑就先用工作流。只有当子步骤本身需要模型实时决策时才升级。一句话总结选型原则——控制权是按需分配的不是按理想分配的。2.2 场景决策清单哪些信号提示你应该留在工作流结合原报告的实践驱动方法论我整理了一张选型表每次接新项目都会按这个过一遍判断维度偏向工作流偏向智能体任务定义目标明确可拆成固定子任务目标存在但完成路径不唯一输入稳定性输入格式和类别基本固定输入高度非结构化、变化频繁延迟成本敏感度对延迟和 token 成本敏感愿意用更高成本换任务表现调试问责要求每一步可回放、可定位能接受黑匣子式决策过程工具数量工具少且调用顺序固定工具多且调用顺序取决于上下文这个表不是死的。比如客服系统一般问题走固定分类流程退款纠纷这类复杂 case 再转给智能体接管同一系统里两种形态可以共存。原报告里有一句话很关键代理系统通常用更好的任务表现来换取延迟和成本增加你要想清楚这种交换值不值得。我自己的习惯是把决策清单打印出来贴在工位上凡是连续接到三个“需求说不清、但客户明确要智能体”的项目就先拿这张表对一遍再动工。多数时候对完会发现客户真正要的是一个能自动分流的路由器外加几个写得很扎实的提示词链——这两样都属于工作流范畴。2.3 一段代码看清两类系统的本质差异为了让你对控制权差异有体感我写一个极简对比。工作流是固定管线def workflow_pipeline(raw_input): records extract_entity(raw_input) # 第一步抽取实体 checked verify_answer(records) # 第二步校验结果 return format_output(checked) # 第三步格式化输出这段代码的路径是写死的每一步做什么由开发者决定LLM 只在具体步骤内部发挥作用。如果业务逻辑调整比如要先校验再抽取改调用顺序即可系统行为完全可控。智能体版本就不一样了def agent_loop(query): history [query] done False while not done: action agent_choose_action(history) # 模型自主选择检索调用工具直接回答 if action.type answer: return action.result result execute_tool(action) # 执行模型选择的工具 history.append(result) # 把结果写回上下文继续决策这个循环里下一步做什么不由代码路径决定而是模型基于历史上下文选择。工具列表、记忆内容、检索结果都会影响它的决策。这类逻辑的调试方式完全不同工作流出问题看哪一步断了智能体出问题要看模型为什么选了那个工具、中间哪条上下文误导了它。提示如果你的业务其实只需要工作流就老老实实写固定管线。智能体循环引入的是决策不确定性不是天然的“智慧”。3. 增强型 LLM 最小骨架检索、工具调用、记忆三件套的代码实现3.1 为什么说增强是智能体的地基原报告把智能体系统的基本构建块定义得很清楚增强型 LLM。所谓增强就是在纯文本生成之外给模型接上检索、工具调用、记忆三项能力。关键在于这三样不是外挂插件是模型能主动使用的能力——模型自己决定要不要生成搜索查询、选哪个工具、把哪些信息保留下来。模块化集成是这套设计里最容易忽略的部分。原文给出的示意图里检索、工具、存储模块都是通过统一接口与中央 LLM 交互不是各接各的。这样做的价值在后期的替换成本上体现得最明显想换掉检索方案只要保持接口不变模型侧完全不用动。很多人把增强型 LLM 理解成“给模型增加功能”这个视角是错的。增加功能是你能控制它什么时候用增强能力是你把决定权交给模型。这个视角转换正是从工作流思维切到智能体思维的第一步。3.2 最小实现把三件套接进一个类里这套多应用不限于特定模型写法我自己反复用过核心思想是把三个模块做依赖注入。拉起一个最简骨架class EnhancedLLM: def __init__(self, llm_fn, retrieverNone, toolsNone, memoryNone): self.llm_fn llm_fn # 单次对话封装输入 messages 输出文本 self.retriever retriever # 检索函数接收 question返回候选文档 self.tools tools or [] # 工具注册表每一项含 name/description/function self.memory memory or [] # 会话记忆列表用于短期上下文存取 def run(self, query): context [] if self.retriever: context.append(self.retriever.search(query, top_k3)) # 检索结果拼进上下文 if self.memory: context.append(\n.join(self.memory[-5:])) # 最近 5 条记忆兜底 tools_desc [t[description] for t in self.tools] messages self._build_messages(query, context, tools_desc) return self.llm_fn(messages)关键在_build_messages这一步把系统提示、检索上下文、工具描述拼成模型能理解的结构化消息。模型看到当前工具列表后会在轮到它决策时决定调哪个工具、传什么参数。工具是否真的被执行取决于模型输出里是否包含结构化的调用意图。注意tools里的 description 字段比函数实现本身更影响效果。模型是读描述来决定“要不要用这个工具”的描述含糊工具就永远是摆设。3.3 三个模块的边界管到什么粒度才算合适先说检索模块。我建议 top_k 控制在 3 到 5 之间多了会把关键上下文冲淡。召回源如果涉及多个业务系统优先做统一的接口适配层别在模型调用里直接混多种数据结构。工具模块的核心是注册表和参数校验。每个工具注册时至少要带一个能说清“什么场景用、输入长什么样”的 description参数校验放在工具内部做而不是依赖模型的输出格式。模型经常把参数类型传错工具入口不兜底线上就是一堆难查的报错。记忆模块最容易过度设计。短期记忆用列表缓存最近若干轮对话完全够用长期记忆才需要引向量数据库。原报告强调“决定保留哪些信息”是模型能力的一部分对应到实现里就是过滤哪些记忆进上下文可以用规则先行等真的出现“记忆污染”再去考虑让模型自己选。三件套不要试图一次全做深先让主链路跑通。4. 五种工作流模式的搭建与选型从提示词链到评估者-优化者4.1 提示词链Prompt Chaining适合任务可以明确拆成 N 步的场景提示词链的逻辑是把任务拆成串行步骤每一步 LLM 调用处理前一步的输出。原文里给的例子是营销内容生成先写大纲再逐段扩写最后按语言翻译。这种模式的目标很单纯——让每个调用只专心干一件事用更多步数换准确性。def prompt_chain(initial_input, steps): current initial_input for step_name, step_prompt in steps: current llm_call(step_prompt.format(current)) # 上一步输出作为下一步输入 if not validate(step_name, current): # 中间可加程序检查即原文的门 raise ValueError(fchain failed at {step_name}) return currentsteps是一个有序列表每一项包含步骤名和提示词模板validate是程序化校验点可以在任意中间步骤拦住不符合要求的结果。这个“门”就是提示词链和工作流之间的关键差别——它让系统不只是连续调用模型而是每一步都有质量闸口。参数上你需要调的主要是两个步骤数量不要超过五步每步的提示词模板里把上一步输出占位符写清楚。4.2 路由Routing按输入类型分流避免用一套提示打天下路由工作流解决的是一个非常现实的问题一套提示词不可能在所有输入上都表现好。原文给的例子是客户服务查询分类把一般问题、退款请求、技术支持引到不同下游流程。路由本质上是关注点分离——每个分支配一套专属提示词和工具。def route_request(query): intent classify_intent(query) # 小模型或快速分类器即可 if intent refund: return refund_handler(query) # 退款专用提示词 订单查询工具 if intent support: return support_handler(query) # 技术支持专用提示词 文档检索 if intent general: return general_handler(query) # 日常问答专用提示词路由分类器不需要用太强的模型能把输入分到正确分支即可。这带来的一个实际好处是你可以把复杂、昂贵的提示词只留给小部分困难输入常见问题路由到便宜模型整体成本立刻往下走。原报告特地提到模型选择优化把简单问题路由到小模型、难问题路由到大模型正是路由的经典用法。4.3 并行化Parallelization分段处理和投票机制是两个变体并行化有两种结构容易混。第一种是分段处理把一个大任务切成互不依赖的独立子任务同时跑再汇总第二种是投票机制同一个任务跑多次拿多样输出再按规则选出高置信结果。适用场景完全不同——文档分析适合分段代码审查适合投票。from concurrent.futures import ThreadPoolExecutor def parallel_review(text, prompts): with ThreadPoolExecutor(max_workerslen(prompts)) as pool: reviews [pool.submit(llm_call, p, text) for p in prompts] results [r.result() for r in reviews] # 投票阈值可调例如超过半数的提示词认为存在漏洞才标记 flagged sum(issue in r for r in results) return flagged len(results) / 2max_workers注意别盲目调大LLM 接口的并发上限通常不是你本机的线程数设置过大会触发限流。投票阈值是一个值得花时间调参的点阈值高则漏报多阈值低则误报多做内容审核时要用历史样本把误报漏报曲线拉出来再定。4.4 编排者-工作者Orchestrator-Workers动态分解任务再综合结果这个模式是五种工作流里最接近智能体的一个区别在于“动态”二字中央编排 LLM 根据实际接收到的任务现场拆解子任务、分配工作者、汇总输出。原文给的例子是复杂编码和报告生成——任务本身无法预先拆好步骤必须在拿到需求后由模型决定怎么写。class Orchestrator: def run(self, task): plan self.plan(task) # 编排者分析任务产出子任务列表 with ThreadPoolExecutor(max_workers3) as pool: results [pool.submit(self.worker, subtask) for subtask in plan] return self.synthesize([r.result() for r in results]) def plan(self, task): # 返回结构如 [{id: 1, desc: 查找订单模块代码, worker: search}, ...] return json.loads(llm_call(f把任务拆成子任务列表: {task})) def worker(self, subtask): return llm_call(f你用{subtask[worker]}能力完成: {subtask[desc]})plan返回的必须是一段结构化 JSON子任务描述里要写清调用的角色或工具这是后面 worker 正常工作的前提。practice 里常见的问题有两个子任务粒度太粗worker 输出互相矛盾粒度太细编排 token 成本暴涨。我一般要求子任务控制在三到六个之间并且 worker 之间上下文尽量隔离。4.5 评估者-优化者Evaluator-Optimizer两个 LLM 互相兜底评估者-优化者是五种模式里形式上最重的一个模型生成另一个模型提供批评形成循环直到达到质量标准。文学翻译、创意写作这类任务很适合因为“质量好不好”这类标准没法用程序直接判断只能交给另一个模型评。def evaluate_optimize(optimizer, evaluator, criteria, max_iter5): draft optimizer.llm_call(生成初稿, criteria) for i in range(max_iter): feedback evaluator.llm_call(评估并指出问题, draft, criteria) if feedback.score 0.9: # 质量阈值按任务调整 return draft draft optimizer.llm_call(根据反馈修改, draft, feedback) return draft # 达上限也要返回避免死循环两个参数直接决定这个模式的成败max_iter和score阈值。max_iter设太大会让成本和延迟成倍增长设太小又达不到质量要求我一般从 3 开始调。score阈值要先用一批样本人工评一遍找到自然分布的边界再设定。另外注意feedback必须结构化返回分数和建议不要只给一段含糊的批评文本。这个循环最大的坑是两边来回横跳模型改了又改回原样这一条在下一章展开细说。4.6 一张选型表把五种模式钉死模式一句话原理典型场景主要风险提示词链串行步骤逐步精修文档生成、营销文案步骤间误差放大路由输入分类分派到专属提示词客服分流、模型选择分类错误全盘带偏并行化同进同出汇总结果内容审核、代码审查并发限流、结果冲突编排者-工作者动态分解、分配、汇总复杂编码、多源搜索任务粒度难控评估者-优化者生成-评估循环文学翻译、创意写作不收敛、成本高在 AI Studio 这类可视化平台上搭建工作流时我建议先把目标模式对上这张表再去看模板。平台自带的预制模板大多是提示词链加路由的组合很少有真正的编排者逻辑。模板可以用但务必导出底层代码看清每一步的调用关系否则出了问题连从哪开始排查都不知道。5. 落地避坑指南抽象层、复杂化与错误假设的五个翻车现场5.1 框架抽象层把提示词和响应封装成黑匣子现象用某个现成工作流框架跑了一阵子某个步骤输出质量突然下降你想看看到底是提示词问题还是模型问题结果框架把底层 prompt 和响应全封装在内部连日志都拿不到原始内容。原因原报告明确点过这个问题——工作流框架创建额外抽象层可能模糊底层的提示和响应增加调试难度。框架本身没有错错在你没保留底层调用链的可见性。解决任何框架都要看能否开启 raw 日志把每次调用的完整 prompt、响应、token 消耗落盘。如果不能就在框架入口加一层包装把输入输出旁路到文件。从那以后我要求项目里所有工作流必须能重放任意一次调用的完整上下文做不到这一条框架一律不用。5.2 底层机制的错误假设模型根本不理解你的工具现象工具列表里明明注册了“查询库存”函数模型在实际对话里却反复绕过它直接编答案。你检查代码工具注册、参数格式都对就是触发不了。原因绝大多数情况是工具描述写得不对。模型靠 description 判断“什么时候用这个工具”你写的是“查询库存”它不知道库存数据只覆盖某些渠道、需要先拿到商品编码。原报告提到底层机制的错误假设是开发者最容易犯的错误工具描述就是典型。解决把每个工具的 description 从“做什么”改成“在什么条件下、输入是什么、输出是什么”。我习惯给每个描述附加一段负面说明比如“仅在用户提供商品编码后调用”模型的工具选择准确率会明显提升。改完描述后一定要用历史对话样本回归验证。5.3 复杂化诱惑为了上智能体而上智能体现象一个固定流程的报表生成任务被设计成带编排者-工作者的智能体系统。上线后 token 成本是原来的五倍延迟翻了三倍生成质量却没有明显改善。原因没有先做最简单的方案直接跳到最复杂的架构。原报告专门强调寻找最简单可行的解决方案复杂的工具和框架不是必选项。工作流框架诱使增加不必要的复杂性这个问题在团队协作里尤其明显——不是技术驱动是汇报需要。解决每个新功能先按“直接调用 LLM API 必要校验”的最小形态实现跑通后再看有没有必要加路由、加并行化。我自己的规矩是没有数据证明当前形态存在瓶颈就不允许引入下一级复杂度。这个规矩拦截了我很多次想炫技的手。5.4 评估者-优化者不收敛循环两边来回横跳现象评估者-优化者模式跑到第三四轮质量分数不升反降。优化者按反馈改了评估者又批评改回去的地方两个模型在同一个问题上反复纠缠最终超时返回。原因评估者反馈缺少明确的优先级和质量锚点。原文里的评估者-优化者循环隐含前提是评估标准稳定且反馈可执行。如果反馈只写“翻译腔太重”但不指出具体哪句话、应该改成什么风格优化者就只能乱猜。另一个常见原因是max_iter给得太小还没收敛就强行截断。解决评估者的提示词里要求它按“问题类别-具体位置-修改建议”三段式结构输出同时给一条总体打分基线。优化者的修改指令里必须带上“只处理评估者列出的问题不要动其他内容”防止两边互相破坏。参数上把max_iter调到五到八轮并在每轮记录分数曲线连续两轮分数不升就提前终止。5.5 智能体失控没有刹车和护栏的任务放权现象智能体在复杂搜索任务里连续调了二十多次工具调用链条越拉越长中间几次明显是在用重复搜索填补上下文最终预算耗尽任务也没完成。原因控制权完全交给了模型却没有设硬性边界。原报告强调智能体高度自主但保留人类监督很多实现把“监督”两个字丢了。模型没有成本意识它在优化自己的任务完成度不会主动省工具调用次数。解决给智能体套三根护栏。第一根是工具调用次数上限比如单任务最多八次第二根是单次调用预算用 token 计费估算超限自动熔断第三根是人工审批点凡是要调用高风险工具发邮件、改数据库必须先等人确认。三根护栏用最朴素的装饰器或中间件就能实现不需要引入额外框架。6. 最后一步用一次端到端验证把设计目标钉死工作流和智能体折腾完最后一个动作永远是验证。我习惯把原报告的建议“从直接使用 API 开始”翻译成一次可执行的端到端检查而不是等系统全搭完再看效果。验证不是跑通一遍就完事要能回答三个问题任务完成率达标没有、延迟和成本在不在预算内、翻车的时候能不能定位到具体环节。具体操作上我每次上线前会准备一个小型验证集十个典型输入里同时覆盖成功路径和边界路径。对每个输入记录三组数据最终输出是否满足验收标准、整条调用链耗时、累计 token 消耗。这三个数字合起来直接对应原文里“权衡性能与成本”那句判断。比如做一个懂生意的智能体我会把 21 项核心商业诊断当成验收基线每项诊断都要能在验证集里跑出明确输出而不是靠一两个漂亮 demo 判断成败。验证结果出来后大概率要回到上一章的选型表重新过一次。如果延迟超标看看是不是并行化模式下并发限流如果成本超标看看路由能不能把更多请求导到小模型如果定位不到问题源头检查框架抽象层有没有挡住底层日志。这一轮微调结束后再跑一次验证集对比两次的分数和成本曲线所有调整都有数据背书。从我的血泪经验来看项目上线前最值得做的不是反复调提示词而是强制走一遍这个验证流程。我经手过的项目里凡是验证集上分数上不去就急着上线的上线后几乎都翻车了凡是先花半天跑验证、再改结构的后面基本没出过大事故。从那以后我每次接手任何智能体项目都强制自己先写验证集再写功能代码把“从简单开始、用数据决策”养成肌肉记忆。希望帮到你。本文还有配套的精品资源点击获取