做智能体应用这几年,我见过太多项目的轨迹高度相似:先花一周做一个让所有人都觉得惊艳的Demo,再花三个月试图把它变成一套稳定、可控、敢上生产的系统——中间踩的坑,远比最初那个Demo带给你的兴奋感多得多。到了2026年,智能体工程的核心已经不是“能不能做出来”,而是“从Demo到生产,到底缺什么、怎么补、怎么保证AI系统可靠”。这篇文章不讲花哨的概念,只把我在多个项目里反复踩过、验证过的经验收敛成10个核心维度,按落地顺序完整过一遍,适合正在把原型往生产推的开发者、技术负责人和产品同学参考。
1. 先看清差距:Demo与生产之间到底隔着什么
1.1 “能跑”与“可靠”之间,没有模糊地带
做Demo考验的是模型的潜力,做生产考验的是系统的确定性。这是我做了几年智能体之后最深的体会。在Demo阶段,你只需要让模型在精心挑选的几条正常路径上表现亮眼,甚至只需要一个渲染得不错的聊天界面,就能让围观者觉得“AI真强”。但生产环境完全是另一回事:用户不会按你的样例提问,网络会抖动,第三方工具会返回意想不到的数据,模型会偶尔抽风,业务方还会在上线第二天要求你把某项指标从90%拉到99%。
这个差距不是靠把提示词调细就能抹平的。它要求我们彻底换一套工作方式,从“以模型为中心”变成“以系统为中心”。模型只是这套系统里的一颗大脑,而大脑周围的记忆、工具、编排、评估、观测、成本、安全,每一项都直接决定系统能不能活下来。我用下面这张表总结过两者的差异,每次做方案设计的时候都会拿出来对照一遍。
| 对比维度 | Demo阶段 | 生产阶段 |
|---|---|---|
| 目标 | 证明能力可行 | 持续稳定地交付价值 |
| 路径 | 覆盖少数正常场景 | 覆盖长尾、边界、异常场景 |
| 评估方式 | 口头反馈、拍脑袋 | 量化指标、回归集、线上监控 |
| 出错代价 | 演示失败,重来一次 | 用户流失、资损、信任崩塌 |
| 可排查性 | 现场重跑一遍 | 全链路日志、链路追踪、可重放 |
| 成本 | 几乎不考虑 | 每任务成本、预算上限、降本优化 |
| 迭代方式 | 改提示词看效果 | 版本化、灰度、自动回滚 |
1.2 智能体工程的10个核心维度全景
经常有人问我,做生产级智能体到底要看哪些方面?我这两年把问题收敛成了10个维度:目标定义与需求拆解、模型选型、提示词设计、记忆管理、工具接入、编排决策、评估体系、可观测性、性能成本、安全加固。
它们不是平行罗列的关系,而是层层递进的。最底层是“定义层”:目标拆解和模型选型,回答的是做什么、用什么做;中间是“能力层”:提示词、记忆、工具、编排,回答的是这个Agent到底如何处理任务;最上层是“运营层”:评估、观测、性能、安全,回答的是怎么保证它长期可靠。少了任何一层,系统都只是脆弱的原型。
2. 需求与地基:先把目标拆明白,再谈模型选型
2.1 维度1:目标定义与需求拆解——别让“万能助手”毁了你的项目
我见过最多的一类失败项目,起步方式惊人地一致:“我们要做一个万能智能助手,什么都能答,什么都能办。”听到这种需求,第一反应不该是兴奋,而是警惕。因为“什么都能干”往往意味着“什么都干不精”,也意味着你根本没有可以设计的评测标准。
正确的做法是把模糊目标拆成可验证的任务原型。我总结了一套四步拆解法:先列场景清单,把用户可能提的需求全部写下来;然后做任务分级,区分出核心链路、扩展链路和低优先级场景;接着为每个核心链路定义量化指标;最后明确边界条件,哪些情况第一版不做。
以“日程管理助手”为例。需求不是“用自然语言管日程”,而是“用户说‘帮我约周五下午三点和同事开会’时,系统能创建日程,并在冲突时给出提示”。对应的指标可以是:意图识别准确率不低于95%,任务完整成功率不低于90%,冲突提醒准确率不低于90%,端到端时延P95小于3秒。边界也很明确:第一版不处理跨时区换算,不接多人协作审批。
我自己踩过一个很深的坑:某项目第一版想把问答、任务提醒、数据分析全接上,结果每个环节都脆弱,一天改三次还稳不下来。后来狠心砍到一条核心链路加两条扩展链路,系统稳定性立刻上来。做Agent和做产品一样,少即是多,先跑通再扩宽。
2.2 维度2:模型选型逻辑——不是越强越好,而是算得过来账
模型选型这块,很多团队踩的坑是“无脑选能力最强的模型”。在实际工程里,模型选型要同时看四个能力:推理强度、结构化输出质量、工具调用准确率、上下文长度。但真正决定选择的,往往是成本和延迟预算。一个生产系统要考虑的是每调用一次模型花多少钱、P95延迟能不能扛住,而不只是跑分有多漂亮。
我习惯把Agent系统里的模型调用位置拆开看:规划器需要强推理能力,用大模型;实体抽取、意图分类这类单一任务,用小模型就够;总结压缩如果对时效要求高,可以单独用一个中等模型。不要一个模型打全场。
下面是我常用的选型参考:
| 任务环节 | 难度 | 推荐策略 | 原因 |
|---|---|---|---|
| 任务规划与拆解 | 高 | 强推理大模型 | 一步错步步错,规划质量决定上限 |
| 工具调用决策 | 中高 | 对工具调用支持好的模型 | 参数生成准确率直接决定任务成败 |
| 实体抽取/分类 | 低 | 专精小模型 | 成本低、延迟低、可控性高 |
| 文本总结 | 中 | 中档模型 | 在质量和成本之间取平衡 |
我给某公司做过一个工单处理系统,最初所有环节都用同一个最强模型,成本高且时延不稳定。后来改成大模型做意图规划和结果总结,独立小模型做工单分类和关键词抽取,成本下降了约70%,整体准确率反而因为分工明确而提升了。
最后强调一句:不要只看模型榜单,一定要拿自己的评测集跑。榜单上的分数是别人的数据分布,你的业务场景才是真正的裁判。而且模型配置一定要做成可替换的组件,不要写死在代码里,今天用A模型,明天换B模型,应该只改一个配置项。
3. 让Agent懂规矩:提示词、记忆和工具
3.1 维度3:提示词与指令设计——把“写作文”变成“写代码”
很多人对提示词的理解还停留在“跟模型说点好话,让它听话”。在智能体工程里,提示词不是用来聊天的,它是系统指令的一部分,直接决定模型能不能稳定输出机器可解析的结果。所以我在项目里把提示词当代码管理:版本化、可回滚、每次改动必须跑回归测试。
一套合格的Agent系统提示词,至少应该包含五个要素:角色定义、任务目标、约束规则、输出格式、少样本示例。尤其是输出格式,几乎每个生产级Agent都要走结构化输出,让模型吐JSON,再交给下游处理。但模型有时候会在JSON外面加解释文字,直接导致解析失败。解决办法是三层兜底:强制指定输出格式并提供Schema;用代码校验模型输出;校验失败时自动重试一两次,仍然失败则走人工兜底。
我贴一个简化版提示词骨架,给你找找感觉:
你是日程管理助手的规划模型。 你的任务:解析用户请求并输出JSON。 输出JSON必须符合以下Schema: {"intent": "create_meeting|query_meeting|cancel_meeting", "params": {...}, "needs_confirmation": false} 规则: 1. 时间需要标准化为ISO 8601格式。 2. 缺少必要参数时,needs_confirmation必须为true,并在params里列出缺少项。 3. 不要推测用户没有给出的信息。 示例: 用户:帮我约下周五下午三点开会 输出:{"intent": "create_meeting", "params": {"title": "会议", "start_time": "2026-03-20T15:00:00"}, "needs_confirmation": false}这里我想特别强调一个容易被忽略的问题:提示词里的语义歧义。我曾经写过一句“如果用户没指定会议室,默认使用A会议室”,结果模型把“默认值”理解成了所有会议都该用A会议室,测试集上根本看不出来,上线后被用户投诉了好几次。这种问题靠肉眼很难发现,只能靠覆盖边界的评测集去抓。
3.2 维度4:记忆与管理——上下文窗口不是记忆库
模型本身是记不住对话历史的,每次调用都是“无状态”的。所谓记忆,本质上是我们把历史信息加工后重新喂给模型。很多人犯的第一个错误,是以为上下文窗口越大越好,于是把所有历史都塞进去。这会让成本直线上升,而且信息太多反而干扰模型判断,造成所谓的“上下文迷失”。
我一般把Agent的记忆分成四层管理。
| 记忆类型 | 存储载体 | 更新时机 | 典型用途 |
|---|---|---|---|
| 短期对话上下文 | 会话状态管理器 | 每一轮更新 | 当前多轮任务的状态保持 |
| 长期用户画像 | 结构化数据库 | 任务完成后更新 | 个性化推荐、偏好记忆 |
| 知识库语义记忆 | 向量库 | 离线索引、实时检索 | 事实问答、资料查询 |
| 程序任务状态 | 状态机/状态存储 | 每一步更新 | 多步任务执行进度 |
举一个很常见的例子:电商购物助手如果记不住用户上次退货的原因,用户每次都得重新讲一遍背景,体验断崖式下跌。而有长期记忆的系统,会在用户再次发起退货时主动说“上次您反馈尺码偏小,这次是否需要换大一码?”这种体验差异,是短期上下文窗口解决不了的。
实现上要注意几点:对话超过一定轮数后触发摘要压缩;向量检索只取TopK相关内容;敏感信息在入记忆库之前必须脱敏;同时要给用户提供“查看记忆、删除记忆”的入口。记忆能力如果没有治理,迟早变成合规风险和技术债。
3.3 维度5:工具接入与函数调用——给Agent配一副好手脚
Agent的大脑能力再强,没有工具也只是一个“嘴炮选手”。函数调用就是让模型基于用户意图去调用外部系统能力,比如查天气、订会议室、操作数据库。工具定义得好不好,直接决定模型能不能正确使用它。
一个标准的工具定义通常包含四部分:名称、描述、参数Schema、返回格式。名称要表意清晰,描述要写清楚“什么时候该用这个工具”,参数Schema要严格,返回格式要统一。我下面给一个示例:
{ "name": "create_meeting", "description": "创建一个日程会议。适用于用户需要安排会议、预约会议室、添加日程等场景。", "parameters": { "type": "object", "properties": { "title": { "type": "string", "description": "会议标题" }, "start_time": { "type": "string", "description": "会议开始时间,ISO 8601格式" }, "attendees": { "type": "array", "items": { "type": "string" }, "description": "参会人邮箱列表" } }, "required": ["title", "start_time"] } }工具调用这一环有几个高频事故,我逐一踩过:一是工具描述写得太含糊,模型不知道该不该调;二是参数命名有歧义,模型生成值不对;三是外部接口超时或返回异常,Agent直接卡死;四是调用不具备幂等性,同一个操作被执行了两次,用户多扣了一笔钱。
我的建议是:所有工具返回统一为{status, data, error}结构;超时和异常要触发重试,但重试前必须确认操作是否已生效;涉及资金、权限、删除类的操作,强制要求模型走用户二次确认。工具多了之后,还要做分组路由,先让模型选择“日历域”“订单域”“客服域”,再选择具体工具,不要把几十个工具一次性全灌进上下文,效果会明显更好。
4. 从“想”到“做”:编排与决策循环
4.1 维度6:编排模式怎么选——固定工作流还是自由规划
模型单次调用是“一锤子买卖”,让它直接输出最终答案,它没有机会根据中间结果纠正自己。这也是为什么生产级Agent一定要有编排:把一次大任务拆成多次小调用,每次调用之后观察结果,再决定下一步做什么。这个过程本质上是给Agent装上了“试错”的能力。
目前主流的编排模式有四种,我简单做下对比:
| 模式 | 工作方式 | 适用场景 | 优点 | 风险 |
|---|---|---|---|---|
| 固定工作流 | 按预先定义的步骤依次执行 | 任务路径稳定、规则明确 | 可控、易评测、成本低 | 灵活性差 |
| 单模型ReAct | 模型边思考边调用工具 | 中等复杂、需要动态调整 | 灵活、实现简单 | 容易跑偏或死循环 |
| Plan-Execute | 先规划任务清单再逐步执行 | 多步骤、可预先拆解 | 结构清晰、可追踪 | 计划一旦出错,后面全错 |
| 多Agent协作 | 多个Agent分工协作 | 工种界限清晰的大任务 | 并行度高、专业性强 | 协调成本高、难排查 |
我的建议是:第一版能用固定工作流就用固定工作流,哪怕流程长一点也没关系。等验证了核心价值,再逐步引入动态规划。很多团队一上来就追求Agent自由发挥,结果就像把刚拿到驾照的人直接扔上高速,翻车是大概率事件。
4.2 一个可落地的Agent主循环实现骨架
理论知识说再多,不如直接看代码。下面是我在多个项目里反复用过的一个Agent主循环骨架,简化后贴出来:
async def run_agent(task, tools, max_steps=8): plan = await planner(task) context = [("user", task), ("plan", plan)] for step in range(max_steps): action = await decide_next_action(context, tools) if action["type"] == "finish": return build_answer(context) result = await call_tool(action) context.append(("action", action)) context.append(("result", result)) if should_summarize(context): context = await compress_context(context) return fallback_message(context)这段代码看着简单,但每一行背后都是取舍。planner负责把用户任务拆成步骤清单,它是Agent的“战略层”;decide_next_action根据当前上下文从工具列表里选一个动作,是“战术层”;call_tool做安全校验后真正执行外部调用,是“执行层”;should_summarize判断上下文是否太长,如果太大就把前面的历史压缩成摘要,这是“记忆层”;最后如果超过max_steps还没完成,直接走fallback_message,这是“兜底层”。
max_steps这个参数我特别想强调。没有它,Agent可能会在一个错误方向上一路狂飙,把预算烧光。设置上限之后,哪怕系统变笨了,也只是完成不了任务,而不是制造失控事故。
4.3 防止Agent“一条道走到黑”:步数控制与兜底逻辑
有经验的工程师在设计Agent时,一定会把最多的心思花在“失败路径怎么走”上。模型顺利完成任务人人都会写,但模型失败时系统怎么反馈,才是决定用户体验的关键。
兜底逻辑不能只是一句冷冰冰的“抱歉,我无法完成”。更好的做法是把系统已经完成的部分同步给用户,并给出下一步选项:“我已经帮您确定了会议时间,但参会人的邮箱还缺少两个,您能补充一下吗?或者我可以先为您创建会议,稍后再添加参会人。”这样用户的坏体验会小很多。
兜底触发的同时,系统一定要把完整的上下文、执行步骤、失败原因记录下来,作为复盘素材。这个记录比任何线上监控都珍贵,因为它直接告诉你模型是在哪一步开始跑偏的。我见过太多团队只关注“成功率”这个数字,却不关心失败发生在哪个环节,结果永远在同一个坑里反复掉进去。
5. 上线前必须回答的两个问题:怎么度量、怎么排查
5.1 维度7:评估体系建设——没有度量就没有生产
不做评估的Agent,和没有仪表盘的飞机差不多。Demo阶段大家可以凭感觉说“还不错”,生产环境必须用数据说话。
我一般把评估分成三层来做。第一层是离线回归集,就是把一批标准任务、边界任务、恶意输入和多轮对话场景全部固化下来,每次改动提示词、模型或工具都跑一遍,防止“修一个bug引入两个新bug”。第二层是线上监控,对真实流量的结果做抽样标注,持续跟踪指标变化。第三层是用户反馈,把“点赞”“点踩”“转人工”这类信号回传,形成闭环。
核心指标建议至少看这六个:
| 指标 | 定义 | 一个合理目标参考 |
|---|---|---|
| 任务完整成功率 | 从头到尾完成的占比 | 核心链路≥90% |
| 工具调用准确率 | 调用的工具和参数是否正确 | ≥95% |
| 幻觉率 | 生成内容是否有事实性错误 | 越低越好,高危场景趋近于0 |
| 端到端时延 | 用户请求到回复的时间 | P95 < 3秒 |
| 单任务成本 | 完成一个任务的平均花费 | 根据业务预算定 |
| 转人工率 | 用户主动要求人处理的比例 | 越低越好 |
自动评估现在常用规则校验加“大模型评委”组合。但用大模型当评委也要小心,它本身有偏好偏差,必须定期用人工标注结果去校准它。我遇到过评审模型给某个结果打了高分,人工一看发现答非所问,后来把评审标准改成“按事实点逐条扣分”,一致性才上来。
还有一点提醒:评测集不是一劳永逸的。业务会变、用户表达会变,旧案例会“腐烂”,评测集每季度至少更新一次。
5.2 维度8:可观测性与AgentOps——把每一步都留下证据
我第一版做智能体时,日志里只记了最终回答,结果线上出问题后整个团队像瞎子摸象,根本不知道模型为什么那么回答。后来我把所有中间步骤全部结构化记录下来,定位问题的效率翻了不止一倍。
一个Agent任务从进门到出门,至少要记录:trace_id、session_id、当前步数、模型输入、模型输出、选择的动作、工具调用参数、工具返回结果、token用量、延迟、成本。下面是一个简化日志结构:
{ "trace_id": "0ac9f12e", "session_id": "s_8871", "step": 2, "action": "create_meeting", "tool_params": { "title": "周会", "start_time": "2026-03-20T15:00:00" }, "tool_result": { "status": "ok", "event_id": "e_123" }, "llm_usage": { "prompt_tokens": 3412, "completion_tokens": 208 }, "latency_ms": 812, "cost_rmb": 0.012 }有了这些日志,你能做三件很有价值的事。第一,把线上失败的trace导出,在本地沙箱里重放,还原当时的每一步;第二,按“步骤”而不是按“消息”看耗时分布,找到瓶颈是模型还是工具;第三,给每一条trace打上成本标签,找出哪些任务正在烧钱。
监控告警至少要覆盖四个信号:任务成功率下跌、空响应率上升、工具错误率升高、单任务成本异常增长。这几个信号一出现就马上告警,不要等用户投诉。
我自己有一次非常典型的排障经历:线上成功率从91%掉到82%,第一版系统只有最终答案日志,根本查不出原因。补上全链路日志之后,发现是一个第三方工具改了返回字段结构,Agent解析失败导致整条链路崩了。定位时间从两天缩到了两小时。没有观测,就没有生产。
6. 持久战:成本、性能与安全加固
6.1 维度9:性能与成本调优——可靠还要用得起
智能体的成本结构跟普通接口完全不同。一个普通后端请求成本是几分之一厘,而一个Agent任务可能要调用多次模型,每次调用都在烧钱。我做过一个粗略测算:假设日活1万用户,每人每天发起10个Agent任务,每个任务平均调用3次模型,规划模型每次0.05元、执行模型每次0.01元,单任务成本就是0.07元,一天的成本接近7000元。这个数字放到月维度,就是20多万。
所以成本调优不是优化项,而是生存项。我常用的优化手段有六种:
| 手段 | 思路 | 适用场景 | 注意 |
|---|---|---|---|
| 模型路由 | 简单任务走小模型 | 意图识别、分类、抽取 | 路由准确率要把控 |
| 语义缓存 | 相同或相似问题直接命中缓存 | 高频重复问答 | 缓存key要算好相似度阈值 |
| 上下文裁剪 | 只送必要信息,不送全量历史 | 长对话、大文档场景 | 别裁掉关键约束 |
| 并行工具调用 | 独立调用并发执行 | 查询多来源数据 | 注意工具限流 |
| 早期终止 | 检测到已完成立即停止循环 | 多步任务 | 终止判断要可靠 |
| 流式输出 | 边生成边返回 | 大段回复场景 | 首字延迟优化明显 |
这里我要泼一盆冷水:降本可以,但绝对不能为了省钱把评估和安全砍掉。我见过某团队为了降成本,把最大步数从8砍到3,结果任务成功率直接掉了20个百分点,用户投诉暴增,最后花在客服和补偿上的钱远超省下的算力钱。成本、质量、可靠性之间要算总账。
6.2 维度10:安全与生产加固——上线的最后一道关卡
最后一道关卡是安全,这部分我放在最后,但重要性排在最前。Agent相比传统系统多了一个新的风险面:模型可能被用户“说动”去做不合理的操作,也就是提示注入;工具参数可能被恶意构造;Agent权限过大可能造成越权。
我的安全基线有五条。第一,事实类回答必须强制引用来源,拿不到可靠来源就明确说不知道,不要编。第二,高风险动作必须二次确认,比如删除数据、转账、发消息,模型只能生成确认请求,不能直接执行。第三,Agent进程使用独立最小权限身份,不能拿着用户对话的权限去调用所有接口,要用服务账号并限制作用域。第四,用户输入与系统指令隔离,工具参数做白名单校验,只允许符合Schema的参数透传。第五,所有版本变更走灰度发布,提示词、模型、工具都绑定版本号,先切5%流量观察,指标下跌就自动回滚。
上线前一晚,我一般会拿着检查清单逐项打勾:有没有为高风险操作加二次确认?有没有把日志里的敏感字段脱敏?有没有限制Agent最大步数和成本预算?有没有灰度开关和回滚方案?有没有定义核心指标的告警阈值?每一项都能回答“是”,这版才敢发。
做智能体这两年,我最大的体会是:所谓可靠,不是某一次全部做对,而是系统在模型偶尔抽风、工具偶尔报错、用户随口乱说的情况下,依然能把损失控制住,把体验兜住。工程手段不会让模型变得完美,但可以让你在它不完美时依然睡得着觉。
最后分享一个一直在用的土办法:每次新Agent上线后的第一周,我要求自己每天手动抽查50条真实对话。不看指标,只看模型到底怎么理解用户、怎么选工具、怎么被兜底拦住。这个习惯看起来笨,但每次都帮我提前发现评测集覆盖不到的问题。智能体工程的本质,是建立一套即使智商偶尔下线、系统依然可靠的运行方式。这张10个维度的地图,希望能帮你把路走得稳一点。