
最近在技术社群里被问得最多的一类问题不是“Agent怎么实现”而是“Agent的工程实现到底包含哪些东西”。看过一堆惊艳的Demo之后大家普遍卡在同一个地方概念都懂但真到动笔写代码不知道整个系统该由哪些部分组成也不知道第一步该选什么。AI Agent不是写一个会调API的脚本而是在不确定环境里自主决策的一套运行时系统。为了把这件事说透我习惯把Agent拆成两层来看一层是“七要素”描述Agent运行时缺一不可的骨架另一层是“七个决策点”描述你动手实现时必须做的关键取舍。这套拆法来自我这些年做Agent项目的共同验证不一定是最标准的教科书定义但每个要素和每个决策点都有明确的落地位置照着画一遍自己心里就有数了。这篇文章就是给准备上手Agent的工程师、已经用框架但搞不懂原理的人以及要做技术选型的同学一条可参照的路线图。1. AI Agent 不是魔法是一套“循环 边界”的运行时系统1.1 Agent 和普通程序的本质区别在于“不确定性”写普通程序时输入、逻辑、输出都是确定的每一行代码都知道下一步该做什么整个流程是一条明显写死的路径。Agent完全不是这个玩法。Agent底层的LLM是一个概率模型同一个提示词温度调高一点输出就可能完全两样工具返回的结果也可能和预期不符接口可能超时网页可能改版第三方服务可能抽风。如果Agent没有一套机制来兜住这些不确定因素那它就是一个三秒一崩的玩具。这套机制就是“循环”。Agent需要反复执行“决策→执行→观察→再决策”这条链路直到任务完成或者达到终止条件。我常跟朋友打一个比方普通程序是在铁轨上跑的火车路线早就铺好了Agent是路况未知时的出租车司机知道目的地但每一步往哪开、要不要绕路、遇到堵车怎么办都要根据实时情况动态决定。铁路很稳但你永远指望不了一辆火车帮你处理突发的封路出租车灵活但你得给它一套判断和兜底的规则否则它也只会原地打转。也正因为Agent本质上是“循环 边界”工程上最关心的就不再是单次Prompt写得好不好而是这套循环怎么驱动、怎么终止、怎么在面对错误时自恢复。1.2 和 RAG、工作流的边界在哪里很多人把RAG当成Agent的“平替”或者把工作流当成“低配版Agent”这两个理解都偏差了。RAG解决的是“让模型能查资料”的问题本质是增强输入——给模型更多相关知识减少胡说八道。工作流解决的是“把固定步骤编排起来”的问题本质是预定义路径——顺序、分支、条件全部提前画好。而Agent解决的是“在一个开放任务里自主选择工具、调整计划、应对环境反馈”的问题本质是闭环自治。打个实际的比方。做一个“生成周报”的功能数据源固定、模板固定用工作流就够了上Agent纯属浪费。但如果你要做的是“市场调研Agent”用户只丢来一句“帮我看看今年新能源汽车市场怎么样”任务里没有固定步骤你甚至不知道它会需要哪几个数据源、哪些指标、什么格式这时候就必须上Agent让它自己去拆目标、选工具、查资料、组织结论。不过要强调一句现实里的生产系统几乎都是混合体。外层用工作流把大流程固定住内层在真正需要动态决策的节点插一个Agent这是非常健康的设计。不要一上来就追求“全Agent化”那只会给自己增加不必要的调试成本。1.3 为什么必须拆成“七要素”和“七个决策点”两个七我之前带过一个小团队接手一个已经跑通的Agent项目代码里什么都混在一起工具调用逻辑散落在提示词里记忆管理靠拼命塞上下文终止条件全靠模型自觉。结果每次改需求都像拆炸弹。后来我把Agent运行时拆成七个清楚的组成部分再梳理设计时必须做的七个选择整个项目才变得可维护、可测试、可演进。七要素管的是“运行时缺了什么”属于结构问题目标怎么被理解、计划怎么生成、工具怎么暴露、记忆怎么存取、上下文怎么组织、主循环怎么转、安全边界怎么兜。七个决策点管的是“动手时选什么”属于取舍问题用工作流还是Agent、单Agent还是多Agent、用ReAct还是Plan-Execute、配多少工具、记忆做多深、预算怎么控、评估怎么做。要素和决策点是一一咬合的关系——你在构造每个要素时几乎都会在某个决策点上做选择。下面我先把七要素讲透再逐个拆七个决策点。2. 七要素从目标理解到安全边界Agent 的运行时骨架下面这张表先把七个要素拉一个全景后面逐个展开要素工程职责常见落地位置目标理解与任务分解把模糊需求变成可检验的分步任务入口解析模块、任务Schema规划与推理决定任务路线和每一步的行动规划器、推理循环工具与技能封装定义Agent影响外部世界的受控出口工具注册表、Skill库记忆系统保存并检索短期、长期信息上下文窗口、向量库、数据库上下文与状态管理组织每次模型调用时能看到的资料上下文构建器、状态对象执行与观察循环驱动决策-执行-观察的主循环Agent Loop / Harness安全与边界控制控制权限、拦截风险、留审计日志工具守卫、审批节点、审计2.1 目标理解与任务分解把“模糊的话”变成“可检验的活”用户说“帮我研究一下新能源汽车市场”这不算一个任务定义。它缺少目标范围、时间窗口、产出格式、数据来源要求。如果你让Agent直接去做它大概率会发散——可能查了一堆国外数据可能输出一篇没有重点的杂烩更可能在某个环节突然“觉得做完了”而用户根本不知道发生了什么。我在工程里会先做一次目标解析把这句话转成结构化对象至少包含四个字段目标、约束、产出物、验收标准。一个典型的任务Schema长这样{ goal: 输出2024年中国新能源汽车市场分析报告, constraints: [ 数据来源需标注, 只分析乘用车市场, 篇幅3000字以内 ], deliverable: Markdown格式报告, acceptance_criteria: [ 包含市场规模数据, 包含TOP5厂商及份额对比, 包含同比增速分析 ] }这段Schema的价值在于它把“做完”变成了“能被检验”。Agent在循环的每一轮都可以拿当前产出对照验收标准知道自己还差哪一项。没有验收标准的Agent就像没有终点的出租车司机只会越开越茫然。这一步看似简单却是我见过最多项目漏掉的部分。2.2 规划与推理生成路线的人和每步判断的人规划负责“拆路线”推理负责“走一步看一步”。两者经常被混在一起说但在工程实现里它们是两个可以分离的模块。规划器可以在一开始就把任务拆成一个粗略计划比如“先收集数据再分析厂商最后生成报告”推理则发生在主循环的每一轮决定当前这一步该调用哪个工具、看了结果后下一步往哪走。业界常见的实现模式有三种ReAct是边想边做每一轮输出思考和行动观察结果后继续Plan-Execute是先生成完整计划再逐步执行中途遇到问题再修订计划Reflection是执行完一轮之后让Agent自己反思、找出改进点再重新尝试。这三种模式不是谁取代谁而是适用场景不同具体怎么选我在第三个决策点里详细说。这里有个很实用的工程建议计划要“粗”不要细。把计划拆到“第1步查数据、第2步写报告”这个粒度就够了拆到“第1步打开浏览器、第2步输入关键词、第3步点击搜索按钮”这个粒度Agent会变得极其僵硬一旦环境里某个按钮变了整个计划就废了。2.3 工具与技能封装Agent 影响外部世界的唯一出口工具是Agent能力的边界。一个只有搜索功能的Agent永远只能查资料一个加了写文件工具的Agent才可能帮你生成报告。工具本质上是一个“受控的副作用出口”所有对真实世界的操作——发请求、读写文件、调API——都应该收敛到工具层而不是让模型自己拼系统命令或者裸调外部接口。工具定义通常包含四样东西名称、描述、参数Schema、返回格式。我见过太多人把工具描述写得极其敷衍比如“搜索互联网”模型不知道什么时候该用、什么时候不该用、参数怎么填。一个合格的工具描述应该让模型清楚“何时用、何时不用、参数含义、返回什么”比如{ name: search_web, description: 在互联网搜索关键词返回前5条结果的标题、链接和摘要。适合查找事实、资料、最新新闻。当需要获取网页全文时应使用fetch_webpage。, parameters: { type: object, properties: { query: { type: string, description: 搜索关键词尽量具体建议包含实体名称和时间范围例如2024年中国新能源汽车销量 } }, required: [query] } }最近社区里很流行讲Skills技能这个概念本质上是把多步操作封装成“宏”。比如“把网页保存成Markdown”如果每次都让模型现场拆成“打开链接→读取内容→剔除广告→转换格式→保存文件”它会做得很不稳定但如果你把它封装成一个名为“save_page_as_markdown”的工具输入URL直接输出文件路径模型就只需要做一次决策。工具是原子操作技能是组合动作两者的边界取决于你想要模型操多少心。我的建议是固定、重复、多步的操作尽量封装成技能模型每少做一次决策系统就少一分出错的概率。2.4 记忆系统别把硬盘当内存用记忆在我眼里分三层。第一层是工作记忆是本次运行里的临时变量和中间结果通常用状态对象维护。第二层是短期记忆是当前上下文里的对话历史和工具调用记录也就是模型“这几天发生的事”。第三层是长期记忆是跨会话沉淀下来的知识比如用户偏好、历史结论、之前的项目资料一般放在向量库或结构化数据库里按需检索。长期记忆最常见的实现是向量库把文本切片、Embedding成向量、存进去每次需要时做相似度检索取回top-k条相关片段。很多项目一上来就建向量库、拼命灌文档结果每次模型调用都塞进去几千token的相关内容成本上去不说模型反而被不相关的“相关文档”干扰。记忆的价值不在于存了多少而在于取的时候能不能滤掉噪声。按需取、按相关性取、按新鲜度取这三条优先级比存储本身重要得多。2.5 上下文与状态管理管理模型的工作台面记忆解决的是“有什么资料可以用”上下文解决的是“这一次调用模型时能读什么”。上下文窗口就是模型的工作台面台面上堆太多东西模型反而抓不住重点。工程上必须管好三件事放什么进去、放多少、按什么顺序放。放什么进去意味着你要做筛选——哪些历史轮次值得保留、哪些工具结果要原样保留、哪些要压缩成摘要放多少意味着你要有token预算——系统提示词占多少、工具定义占多少、历史占多少每条都是算出来的按什么顺序放意味着近期信息优先当前任务优先长期记忆剪裁后靠后。同时我还用一个状态对象记录Agent当前进度比如计划进行到第几步、哪些任务已完成、哪些工具结果已经看过了agent_state { plan: [解析需求, 检索市场数据, 生成报告], completed: [解析需求], current_step: 检索市场数据, context_budget: 8000, fail_count: 0, history_summary: 用户需要一份新能源汽车市场报告已完成需求解析正在收集数据 }这样做的价值在于模型不需要从一大段历史里推理“我到底到哪一步了”我们把进度直接告诉它省token也省出错概率。我实际项目里有个很土但有效的经验每一轮工具返回都先做摘要再写回上下文只保留关键数字和结论。这个习惯能省掉30%到50%的token消耗。2.6 执行与观察循环大家都叫它 Agent Harness七要素中最容易被混淆的就是这个执行循环。社区里经常听到的Agent Harness指的就是这一层——它是整个系统的发动机驱动着LLM不停转圈。循环每一步做五件事组装上下文、请求模型、解析输出、执行动作、记录观察然后判断要不要继续。一个最简主循环长这样def run_agent(task, tools, max_iterations20): state init_state(task) for i in range(max_iterations): context build_context(state, tools) response llm(context, tools) if response.is_final_answer(): return response.answer observation execute_tool(response.action, tools) state.update(observation) if state.fail_count 3: return 任务中止连续失败次数过多 if not validate_progress(state): return 任务中止检测到无进展循环 return 任务中止达到最大轮数终止条件是这个循环里最容易被忽略的部分。没有显式终止条件的Agent可能一直输出“让我再查一下”永远不给你最终答案。我在工程里至少会设四类终止信号模型主动给出Final Answer、达到最大轮数、连续失败超过阈值、检测到无进展循环比如连续三轮调用同一个工具、参数完全一样。这四类信号任何一个触发都必须让Agent停下来并给出当前状态。2.7 安全与边界控制所有风险都集中在有执行权的那一刻一个能调用工具的Agent本质是一个拥有“执行权”的AI。所有危险都隐藏在“它真的能干什么”这句话里。我习惯用三层防护来做安全边界。工具层做校验参数白名单、路径合法性检查、返回内容过滤所有工具的入参和出参都要过一道守卫。系统层做隔离给Agent最小权限的临时凭证让它只能访问任务需要的工作目录跑在受限环境里。流程层做审批对删除类、发消息类、支付类等敏感操作加一个“人工确认”节点——Agent先输出拟执行的动作和理由用户点击确认后系统才真正调用。审计日志是这三层里最容易被忽略的一层。每一个工具调用无论成功失败都要记录参数、结果、触发原因、耗时。否则一旦Agent在无人值守时做了一个越界动作你连回放现场的能力都没有。安全不是安全团队单独的事是Agent开发者每天都要碰的左手规则。3. 七个决策点动手之前你必须在这几个岔路口做选择七要素告诉你运行时缺了什么但真正让人卡壳的是动手时的选择。同样的一个需求A组用LangGraph做成了一个多Agent系统B组用三条代码加一个循环就做完了两个都能跑但代价和维护复杂度完全不同。决策点没有绝对的对错关键是判断依据。我按项目经验整理出七个绕不开的选择决策点可选方向核心判断依据1. 编排范式工作流 / Agent / 混合任务路径是否固定2. 单体结构单Agent / 多Agent任务能否自然分治协作代价是否可控3. 规划策略ReAct / Plan-Execute / Reflection环境反馈速度与任务可预测性4. 工具配置少量大工具 / 大量小工具模型选择准确率与维护成本5. 记忆方案无状态 / 短期 / 长期是否需要跨会话知识6. 模型与预算能力优先 / 成本优先延迟、成本、上下文约束7. 评估方式离线回归 / 在线观测是否具备持续迭代的条件3.1 决策一编排范式——工作流、Agent 还是混合判断标准就一条这个任务的路径是固定的还是开放的固定重复的任务比如每天从数据库拉数据、套模板生成报表直接工作流确定性高出了问题好定位开放任务比如“调研一个陌生领域”“分析一份非结构化文档”路径不固定需要Agent动态决策。现实中绝大多数有价值的场景是混合流程固定、节点开放。比如“先收集用户输入再让Agent分析最后走固定的审批流程”这种结构比纯Agent更稳也比纯工作流更聪明。给一个很直接的建议不要一上来就全Agent化。把确定的部分写成代码或工作流只在真正需要动态决策的环节里插入Agent节点。Agent用得越克制系统越可控。3.2 决策二单 Agent 还是多 Agent多Agent听起来很酷但它的本质是用上下文隔离换专注度。把一个大任务拆成研究员Agent和写作Agent好处是每个Agent的上下文都能保持干净不会因为既查资料又写文章而互相污染。什么时候值得这样拆任务可以自然切成多个专业角色、角色之间的结果能清晰交接、单个上下文窗口确实装不下的时候。但多Agent最大的坑也在这里如果底层用的是同一个模型所谓“角色隔离”在模型眼里其实只是提示词不同。一旦角色之间的通信协议没设计好——消息格式不一致、交接标准不明确、冲突没人裁决——就会出现甩锅和重复劳动。我见过一个双Agent项目两个Agent在同一个问题上反复交换意见来回六轮没有进展最后查日志发现它们只是用不同的措辞在重复对方的话。单Agent做不到的事多Agent不一定能解决它只是把一个问题换成了另一组问题通信、协调、仲裁。3.3 决策三规划策略——ReAct、Plan-Execute 还是 ReflectionReAct是默认起点边想边做每轮输出一句思考、一个动作观察结果后继续。它适合环境反馈快、信息随时变化的场景比如搜索、问答、查数。Plan-Execute是先生成完整计划再逐步执行适合任务结构比较清晰、可以提前拆解的工作比如批量生成报告、数据处理流水线。Reflection是执行完成后加一轮“自我审视”让Agent找出漏洞并改进适合对质量要求高的创作类任务比如写文章、做方案。我的经验是先ReAct跑通不要过度设计。如果发现模型反复回头修改同一个计划、每轮都在重新规划下一步再引入显式规划器如果发现交付质量不稳定再加Reflection环节。规划策略不是越复杂越好越复杂的策略意味着越多的地方可能出错。3.4 决策四工具的数量与粒度——少而精永远比多而杂强工具不是越多越好。LLM在选择工具时候选列表越长选择准确率越低。我实测下来20个工具以内模型选得比较准超过30个就开始频繁选错该用搜索的时候调用网页抓取该写文件的时候调了发邮件。工具数量上来之后描述占用的token也会飙升系统提示词可能从1500 token膨胀到5000 token把真正重要的任务指令挤掉。粒度上建议“原子工具 组合技能”混合。基础能力做成最小工具比如“搜索网页”“读取链接”“写文件”高频多步操作封装成技能比如“将网页保存为Markdown”“生成周报草稿”。模型需要做的决策越少系统越稳定。我每次给Agent加新工具前都会问一个问题这个功能是不是已有的某个技能的变体如果是优先扩展现有技能而不是新增一个工具。3.5 决策五记忆方案——无状态、短期还是长期如果你的Agent是一次性的比如“给我总结这段文本”无状态就够了每次调用独立干净利落。如果你希望Agent能接着上一轮聊、能记住用户上一轮说过“我不喜欢太长的答案”那就要短期记忆——把最近的对话和工具历史放进上下文。如果是跨会话需要比如“每次都要基于团队的知识库来回答”那才引入长期记忆用向量库或数据库做检索增强。很多项目一上来就上向量库其实大部分场景根本用不上。判断依据是这个Agent是否需要在多次会话之间共享知识如果没有短期记忆甚至无状态记忆就够了省下的成本相当可观。即便用长期记忆也建议按需检索而不是每次把整个资料库塞进上下文。3.6 决策六模型与上下文预算——成本是设计出来的模型选型要平衡能力、延迟、成本三个约束。能力差一点但延迟低、价格低的小模型配上一套高质量工具常常比大模型裸跑更实用。最关键的是要建立上下文预算意识。给你的Agent定一个初始分配方案比如9000 token的预算占用项预估值系统提示词角色与任务规则1500工具定义10-20个工具3500历史摘要滚动压缩后2000当前任务与中间结果1000预留输出空间1000预算用满时先裁历史摘要再裁工具描述顺序不要反。系统提示词里的安全约束和任务边界永远不会被裁剪。上下文预算做得越细你的成本越可控做得越随意等月底账单出来再分析就晚了。3.7 决策七评估与可观测性——没有指标就没法迭代没有评估的Agent项目只能靠肉眼和运气。我自己的做法是维护一份离线评估集20到50个黄金任务每次改完代码跑一遍回归主要看两个指标任务成功率和单位任务平均token成本。指标退步了说明这次改动引入问题指标进步了才敢往线上放。上线之后看在线指标任务成功率、工具误用率、平均轮数、终止原因分布。如果Agent总是“任务未完成”退出的大概率是终止条件写得太紧或者工具设计有问题如果经常出现“工具执行失败”优先检查工具稳定性而不是模型智商。Agent项目的迭代速度取决于观测能力日志记录得越全定位问题越快这是前期投入最值钱的部分。4. 主流框架与这套骨架的对应关系选型参考4.1 LangChain / LangGraph最接近“自组装七要素”的框架LangGraph把Agent建模成状态图节点是操作边是流转循环靠条件边实现。这种模型和七要素里的“执行与观察循环”非常贴合你能显式地控制终止条件、状态更新、分支逻辑而不是让框架替你藏起来。代价是学习曲线比较陡抽象层多版本变动也快刚上手时容易迷失在概念里。适合场景你需要精细控制循环、计划、状态愿意投入学习成本做长期深度定制的项目。LangChain生态大工具和集成最多遇到问题基本都能搜到答案这本身就是选它的一个理由。4.2 Dify / Coze平台化路线最快跑到 MVP这类平台把RAG、Agent、工作流都做成了可视化组件拖拽配置就能上线。如果你是快速验证想法、让业务人员一起参与搭建或者没有太大定制需求这类平台的效率确实很高。它在七要素上的覆盖偏向“封装好的一站式方案”上下文管理、记忆、工具编排基本都内置了你只需要配置和编排。局限也很明显复杂逻辑受平台能力限制想突破平台封装做细粒度控制会比较棘手。适合快速MVP不适合做高度差异化的Agent核心系统。4.3 CrewAI / MetaGPT两种多 Agent 协作思路CrewAI围绕“角色、任务、过程”做抽象适合流程化分工比如一个Agent负责收集资料、一个Agent负责整理、一个Agent负责审核。MetaGPT模拟软件公司的协作流程产品经理、架构师、工程师各有分工适合做复杂项目拆解的演示与研究。两者都把多Agent通信协议做了一层封装比你自己写通信省事但底层终究是同一个模型在扮演不同角色协作质量依然依赖你定义的交接物和裁决机制。要我说多Agent框架的上限很高下限也很低。搭得好的多Agent系统确实能处理单Agent装不下的任务搭得不好就是多个Agent互相传染错误。如果你对单Agent实现都还没有把握先别急着上多Agent。4.4 什么时候该自己写循环自己实现Agent循环并没有那么可怕。尤其是当你只有两三个工具、循环逻辑简单、对延迟和成本敏感的时候直接写一个几十行的主循环比套一个重型框架更可控。判断标准其实很朴素如果框架的抽象让你在调试循环时多花了三倍时间或者一个简单的“调工具失败后换个策略”都要翻文档查半天那这个框架对你来说就是负担。下面这张选型对照表可以帮你快速定位方案七要素覆盖程度适合场景主要局限LangChain / LangGraph高需自己组装深度定制、复杂循环、长期项目学习曲线陡、抽象层多Dify / Coze中封装式覆盖快速MVP、业务方协同、轻定制复杂逻辑受平台限制CrewAI / MetaGPT中高偏多Agent协作角色分工、流程化协作多Agent通信设计成本高自研循环全控工具少、延迟敏感、逻辑简单需要自己维护和迭代如果你对性能和并发有特别苛刻的要求社区里也有不少非Python技术栈的实现方向但整体生态还在早期。现阶段生产项目我更推荐Python或TypeScript的成熟框架等团队跑通了逻辑再去折腾性能优化不迟。5. 从 Demo 到生产我实际踩过的四个坑与补救办法5.1 坑一工具调用失败后Agent 不会自己爬起来我第一版Agent对接过一个第三方接口偶发超时。工具抛异常后我把异常字符串原样塞回给模型结果模型下一轮又调用同一个工具又超时反复三次Token烧掉一万多任务还没结果。这种“反复踩同一个坑”的现象本质上是因为失败信息没有给模型决策的抓手。之后我做了三件事。第一前置重试调工具前先用指数退避重试两次第二失败信息结构化不让模型看一堆Traceback而是直接告诉它“调用xxx失败原因是超时建议检查参数或换一个工具”第三失败计数连续失败超过阈值就终止或切换策略。核心代码长这样def call_with_retry(func, max_retries2): for attempt in range(max_retries 1): try: result func() if result[success]: return result except Exception as e: if attempt max_retries: return { success: False, error: str(e), suggestion: 检查参数是否合理或考虑换一个工具 } time.sleep(0.5 * (2 ** attempt))一个能自恢复的Agent不一定有多聪明但一定不会在同一块石头上绊倒三次。5.2 坑二上下文无限膨胀Token 成本失控上下文膨胀是Agent项目最常见的慢性病。工具返回的原文、搜索结果的整页内容、历史对话全部堆进上下文三轮之后请求token就到了几千十轮之后直接破万。更隐蔽的问题是塞进去大量低质量内容模型反而抓不到重点。我的补救方式有三层。第一层工具返回加摘要器搜索结果只保留标题加一句摘要网页正文压缩成要点列表第二层历史对话滚动压缩每轮结束时把前面的内容压成一小段摘要第三层工具描述按需加载高频用的工具描述放在最前面冷门工具放在后面必要时裁剪掉。这套组合拳打下来我项目里的模型调用成本直接降了四成而且任务成功率没有下降因为模型看到的上下文更干净了。5.3 坑三循环死锁模型一直在原地打转比工具失败更头疼的是“假进展”模型每一轮都在调用工具也确实有返回结果但始终没有朝最终答案推进。定位这种问题特别费劲因为日志里到处都是正常的工具调用记录只是没有一条在往任务终点走。我到现在还会在循环里保留两个信号。一个是“重复动作检测”如果模型连续三轮调用同一个工具且参数完全一致直接判定为原地打转强制它换策略。另一个是“无进展轮次上限”记录计划里completed列表如果你连续五轮都没有新任务完成就触发降级——要么让模型做一次反思重新规划要么让用户介入。Agent可以慢但不能病恹恹地原地绕圈。5.4 坑四安全边界被低估Agent 做出预期外的动作有一次我给Agent配了一个读取本地文件的工具为了图省事直接把整个用户目录的读取权限都给了它。日志里没什么严重事故但我看到它尝试读取过一些和任务完全不相关的文件这说明权限给得太宽了它已经开始“好奇地到处看”了。一个能调用工具的模型它会探索边界这件事在工程上必须当默认前提来处理。现在的规范是每一条工具授权都按单个任务给最小权限临时凭证用完了就吊销所有危险动作——删除、发送、写入公共区域、调用付费接口——都走人工审批节点每一步工具调用都记录审计日志。权限最小化原则不是安全团队的要求而是Agent项目能不能长期稳定运行的基本功。5.5 坑五可观测性不足出问题只能靠猜Agent和普通程序不一样普通程序出Bug可以打断点Agent出问题你要回放的是“模型在每一轮看到了什么、想了什么、做了什么”。没有结构化日志这些问题永远回答不了。我在每个Agent项目里都会约定一套统一的追踪字段{ trace_id: abc123, round: 3, model: gpt-4o-mini, prompt_tokens: 4120, completion_tokens: 356, tool: search_web, tool_args: {query: 2024年中国新能源汽车市场规模}, tool_status: success, latency_ms: 430, retry_count: 0 }这套字段的价值在线上故障排查时才会体现出来。当某个Agent任务失败率突然升高你先看终止原因分布再拉对应trace_id看每一轮的工具调用和模型输出五分钟内基本能把问题范围缩小到“工具坏了”“模型选错工具”还是“上下文被污染”。Agent本身是个概率系统你没法保证它永远正确但你可以保证它出错的时候你能快速看清全过程。回头看Agent的工程实现里最容易被低估的恰恰不是模型能力而是边界定义。循环写得再漂亮没有清晰的目标解析和安全边界它也只是在高效地做错误的事。七要素和七个决策点不是一套需要背下来的理论而是一张检查清单动手前过一遍你知道系统缺什么上线前过一遍你知道风险在哪儿。我自己的项目能一次次收敛问题、稳定迭代靠的也是这份清单。