☰
从Demo到生产:Agent工程化的可靠性、可观测性与成本治理实践
2026/10/18 7:18:50 网站建设 项目流程

先说一个这两年做下来感受最深的事:Agent领域最不缺的,是那种能在一场精心安排的demo里惊艳全场的“玩具”;最缺的,是能扔进生产环境里、从早到晚稳定干活、出了故障还能复盘追责的“生产力工具”。把这个题目拆开看,就是从技术炫技走向工程交付的完整过程,里面全是细节和妥协。这篇文章我把从一个工单处理Agent的demo到真正上线过程中,踩过的坑、验证过的做法和一些工程化思路串起来讲,适合正在把Agent往真实业务里落的团队,也适合那些刚做完demo、不知道该往哪一步走的开发者。

1. 为什么多数Agent项目停在“玩具”阶段

1.1 “看得过眼”和“靠得住”是两条赛道

如果要用一句话概括玩具级Agent和生产级Agent的区别,我会说:前者评价“灵不灵”,后者评价“稳不稳”。

一个demo阶段的Agent,跑通了就欢呼雀跃;跑崩了也无所谓,重来一次就行。可一旦进入生产环境,评价维度完全变了——同一个任务执行一百次,能不能保证九十九次符合预期?面对脏数据、超时、限流、用户乱写一通的需求时,系统还能不能兜住?昨天的行为记录能不能完整回溯?权限边界是不是足够清晰?

我习惯用一个类比:demo Agent像一位面试表现惊艳的候选人,简历亮眼、谈吐有趣、现场题解得漂亮。生产级Agent则像是这位候选人正式入职之后,能不能每天按时汇报、按流程走审批、不出越权事故、在出问题时说得清楚自己当时为什么这么做。面试表现和日常绩效,完全是两套评价体系。

拿我们做过的一个工单处理Agent来说,demo阶段用二十条精选工单测试,准确率接近满分。但到了真实业务里,工单里夹杂着错别字、emoji、多诉求、口语化表达、甚至同一句话里包含退换货和发票两个意图,原先“一把梭”式的Agent就开始自由发挥,生成的回复看着合理,实则不一定合规。那一刻我心里清楚,这已经不是一个提示词能解决的问题了,而是整个系统的设计哲学需要换挡。

1.2 三个典型的“玩具化”特征

我复盘了手头几个项目,发现停步不前的Agent项目高度相似,基本都有下面三个特征。

第一,评估靠感觉,不靠数据。团队对着十几条精心挑选的测试用例,让Agent跑一遍,肉眼看一下输出“挺合理”,就认为效果达标。一旦任务量上到每天几千条,输入分布之广早就超出那十几条样本覆盖的范围,结果必然失控。生产级Agent要有自己的“金标测试集”和“回归机制”,每次改动代码或提示词,都要跑一遍完整的回归测试,用数字说话,而不是靠拍脑袋。

第二,运行环境是“温室”环境。demo阶段的下游服务都是健康的、稳定的、响应快的,接口文档整整齐齐,参数传进去就能拿到预期结果。生产环境的真实接口,超时是常态,限流是常态,返回结构变异也是常态;甚至上游系统周五下午四点半挂掉,第二天才有人发现。玩具级Agent没有考虑任何异常路径,生产级Agent的代码里一半以上都在处理“意外”。

第三,完全没有兜底设计。LLM是概率模型,输出天然不稳定,这不是bug,而是属性。玩具级Agent直接拿LLM的原始输出当最终结果,不校验、不重试、不回退;生产级Agent必须在模型外面套一层确定性机制——规则校验、重试策略、降级方案、兜底话术,才能让这个概率系统在真实世界里表现得像一个确定性系统。

2. 工业化要跨过的四道坎

2.1 可靠性:用“确定性骨架”约束“非确定性组件”

做Agent工业化,最核心的一个认知转变是:不要试图让LLM变得更聪明,而是要让系统在LLM犯傻的时候不至于崩。追求的对象不是模型的“灵性”,而是整体系统的“稳态”。

怎么理解?LLM负责的是那些需要理解力、推理力和语义生成的环节,比如识别用户意图、从非结构化文本里抽取信息、生成自然语言回复。这些工作交给它很合适。但在它周围,必须有一圈确定性的工程约束,比如任务状态机、输入输出Schema校验、业务规则引擎、重试与降级策略。

举一个实操中的例子。我们的工单Agent在拆解之后,流程变成了这样:工单进来,先由LLM做意图归类和信息抽取,但输出必须符合严格的JSON Schema;抽取结果交给规则引擎做合法性校验,比如订单号格式对不对、用户查的订单是否属于该账号;校验通过才允许调用业务接口;拿到业务接口的确定性返回值后,再由LLM生成面向用户的最终话术。

这个设计里,LLM始终只在“理解和表达”这两层工作,所有具有业务副作用的动作,都不由它直接触发。每个步骤之间都有校验和兜底:LLM抽取结果不合格,就返回错误信号并触发一次带错误上下文的重新抽取;校验不通过,就走规则逻辑返回给用户重新补充信息,绝不往下游传脏数据。

打个比方,这就像给Agent装上一副制度化的“工作台”——它可以在工作台里自由发挥,但工作台的边界、桌上的工具、每一步操作的记录都是预先严格定义好的。确定性框架覆盖LLM不确定性带来的风险,LLM的灵活性又把确定性规则覆盖不到的长尾场景接住。这就是我理解的Agent可靠性设计的第一性原理。

2.2 可观测性:让Agent的黑盒变成白盒

Agent工业化之前,调试基本靠“跑一遍看结果”。工业化之后,这根本不成立。生产环境里你必须随时回答几个问题:这个Agent刚才做了什么?它为什么这么做?这一个任务花了多少钱?哪个环节耗时最长?昨天和今天的输出差异为什么这么大?

这一系列问题指向的都是可观测性。传统软件的日志、监控、追踪体系必须完整搬到Agent场景,而且粒度要更细。我的做法是,把Agent每一次运行的完整轨迹,以结构化日志的形式记录下来。每个节点都记录:任务ID、节点名称、触发的模型或规则引擎、输入内容、输出内容、工具调用参数与返回码、耗时、token消耗量、重试次数、错误信息。

以这个工单Agent为例,一次完整处理产生的日志可能有几十行,按task_id聚合之后,就能还原出这条工单从进入系统到最终回复的完整时间线。无论Agent最后给出了一个多离谱的结果,我们都能回放整个决策过程,定位是哪个环节出了问题——是意图识别错了?信息抽取漏了关键字段?校验逻辑过于严格?还是上游系统返回了异常数据?没有这套追踪能力,生产环境里的Agent就是一个只会惹祸的“黑箱”,没有任何团队敢让它承担核心业务。

这里最容易被忽视的是“模型决策理由”的记录。大模型API通常可以要求返回reasoning或原始输出,把这条信息落到日志里,对后面的错误复盘和prompt迭代帮助极大。你拿着“这个Agent把投诉单误判成咨询单”去查,如果能看到模型当时给出的分类依据,很快就能知道是提示词边界不清,还是上下文里缺了关键信息。

2.3 成本与性能:算得清账才上得了线

Agent工业化一个很现实的问题,是token成本。demo阶段一天跑几十次实验,几百个token无所谓;生产环境每天几千个任务,每个任务多塞几千个token进去,成本立刻变成一笔不可忽视的运营开销。

成本模型其实很简单:单次任务成本 = 输入token数 × 单价 + 输出token数 × 单价。但“输入token数”这个东西,极其容易被放大。最常见的原因有三类:一是把整个对话历史原封不动地塞进上下文,任务跑得越长,历史越膨胀,输入token翻倍甚至翻几倍;二是提示词里堆了大量根本用不到的背景信息和案例,每次调用都在“重复付费”;三是失败重试时重复提交相同的大段上下文,双重消耗。

我们的做法,首先是给每个Agent任务设定“token预算上限”,跑到上限就直接熔断,转人工处理,绝不允许一笔任务无限消耗下去。其次是压缩上下文——长对话只保留关键信息的结构化摘要,不再把原始历史全部灌进去;固定的提示词模板做精简化处理,把那些“讲道理”的描述换成更紧凑的指令;类似的查询命中缓存时,直接返回相似结果或模板话术,避免每次重新调用模型。

模型分层也很有用。任务难度有高低,没必要所有请求都使用最贵的大模型。简单意图识别、文本分类这类任务,用一个轻量模型就能搞定,成本大幅下降;只有最复杂的那部分任务才调用大模型。我们实测下来,单纯这一项,整体模型成本能降到原来的三分之一左右。预算控制这件事,本质就是不做无谓的调用、不做重复的付费、不让一个单位的工作负载消耗超过它本应消耗的资源。

2.4 安全与权限:给Agent戴上镣铐

安全是整个工业化里最没有商量余地的部分。demo阶段的Agent可以畅所欲言、随意调用一切工具;生产环境里的Agent则必须遵循最小权限原则——它只能访问完成自身任务所必需的资源,只能执行自身职责范围内的操作,一切具有副作用的高风险动作,都要有审批和审计链路。

以工单Agent为例,查物流、查订单状态这类只读操作,可以放权给它自动执行;但涉及退款、修改订单、发送补偿券这类会产生实际业务后果的操作,绝不能让它自由发挥。我们的方案是嵌入“人在回路”机制:Agent提出建议动作和参数,提交到一个待审批队列,由人工确认后再执行。系统层面上,所有Agent执行过的操作都会落审计日志,包含操作人(或“Agent”)、动作类型、参数、结果、触发原因,做到全过程可追溯。

另一个容易忽略的点是Agent与外部系统交互时的数据边界。Agent在处理用户工单时,可能会读取用户信息、订单数据、客服历史,如果不能做好数据隔离,存在严重的越权数据暴露风险。我们的做法是在设计工具接口的时候,就把用户身份信息作为显式参数传入,后端接口校验当前会话主体的数据访问权限。Agent本身没有独立的数据访问凭证,它只能以当前任务关联的用户身份去调用接口,天然限制了信息访问范围。

安全建设还有一个实操层面的细节:不要在Agent的系统提示词里写入密钥、令牌或任何内部敏感信息。真实案例里有人把数据库连接串写在prompt里,模型被诱导输出后造成了严重事故。所有凭据都放在工具层,由服务端注入,LLM永远不该接触到它们,这是底线。

3. 重构实录:一个工单Agent的工业化改造

3.1 边界先行:先定义“不做什么”

我们的工单Agent大概在两轮迭代后,被业务方公开“表扬”过一次——“你写的这个Agent,比我们某些新来的客服还靠谱”。但这种话听听就好,真正让我决定对系统动刀的,是后来连续出了三次低级失误:一次把未发货订单的极速退款信息说成已退款,一次在工单包含两个诉求时只处理了后一个,还有一次编造了一个根本不存在的补偿方案。

复盘结论很明确:问题不在模型能力,而在任务边界模糊。于是我们把“这个Agent到底负责什么”和“这个Agent绝对不做什么”两件事同时写下来。明确的边界是:单意图工单的意图识别、信息抽取、只读查询、标准话术生成。明确不做的包括:任何涉及资金操作的决定、任何需要跨部门协调才能回答的问题、任何无法从现有业务接口拿到确定性依据的推断。这个边界最终以文字形式沉淀在系统设计文档里,也变成了一系列硬性的代码约束。

这步做完,整个系统的改造才有了基准线。后面的流程再造、权限控制、评估体系建设,全是围绕这个边界展开的。如果你的Agent还处于“什么都想让它干”的状态,我建议先停下来,把“不做什么”写清楚。因为边界一旦模糊,后续所有工程质量建设都会找不到锚点。

3.2 流程再造:从自由发挥到状态机

demo版本的结构很简单:用户工单文本直接塞给LLM,让它给出分类、抽取信息、生成回复。结构看着轻巧,实际用起来问题百出,最大的问题是Agent在一个prompt里同时承担太多任务,任何一个环节出了偏差,都很难定位到具体是哪一步。

重构之后,我们把处理流程拆解为五个阶段,每个阶段有独立的输入输出和校验规则:

  1. 意图识别阶段:判断工单属于咨询、退换货、投诉还是其他类型。
  2. 信息抽取阶段:从工单中抽取订单号、商品名称、用户诉求等结构化字段。
  3. 规则校验阶段:校验抽取结果是否完整,订单号是否符合格式,请求的资源是否在用户权限范围内。
  4. 业务执行阶段:调用订单查询接口获取业务系统的确定性数据。
  5. 话术生成阶段:基于业务数据生成给用户的最终回复,并做敏感词和合规过滤。

这个结构的关键,是把LLM从“全知全能”的位置上拉下来,让它只在第一步、第二步和第五步发挥作用;第三步和第四步交给确定性的代码逻辑。期间还引入了状态机来管理整个流程的流转。每个阶段有明确的成功条件和失败分支:抽取字段不全就触发补充询问,校验不过就转人工,业务接口异常就重试三次后降级。

用状态机还有一个好处:系统行为变得可预测了。以前“Agent在中间某个环节突然自由发挥”的问题彻底消失,因为状态机不允许它跳到不该跳的节点。每一步要么走到下一步,要么走兜底分支,不存在“飘了”的空间。

3.3 人在回路:高风险动作必须有人确认

流程再造之后,Agent的能力边界已经收敛了很多,但仍有一步关键的天花板没有突破——对于“退款”“补偿”“修改订单”这类高影响操作,到底要不要让Agent自动执行?

我们的决策是:绝不让它自动执行。不是不信任模型,而是这类操作一旦出错,给用户带来的体验损失和给公司带来的资金风险,远超自动化带来的效率收益。Agent的职责是准备充分的背景信息和建议方案,然后把决定权交给人类。

具体机制是这样实现的:当规则引擎识别到工单诉求涉及退款或补偿时,Agent进入“待审批”状态。它会把用户诉求、关联订单信息、建议操作金额、依据说明打包成一条审批请求,发送到人工审批队列。业务人员只需在后台页面里查看Agent整理好的上下文,一键批准或驳回。批准后,系统自动执行退款流程,并记录执行结果。

这个设计在效率和安全性之间找到了平衡点。Agent把原本需要人工花几分钟去查资料、翻记录的准备工作全部做完了,人工要做的只是一个“判断和批准”的动作。上线后,客服团队处理这类工单的时长明显缩短,同时因为每一步都有审核记录,权责清晰,出了争议也有据可查。

人在回路不是对Agent能力的不信任,而是对生产系统责任归属的根本要求。一个没有人类复核节点的自动决策系统,在业务上是不成立的——至少在现阶段,业务方不会为一个“可能会错但不知道错在哪来”的系统背书。

3.4 评估体系:用金标集卡住每一次改动

Agent系统的一个长期隐患,是“改一处,坏一片”。上一个版本对某类工单的识别很准,改了一版prompt之后,这类工单的准确率掉得悄无声息,而且只有在真实流量中才会暴露。所以,评估体系的建设,比模型本身更值得花时间。

我们做的第一件事,是建了一个金标测试集:从历史真实工单中筛选出200条样本,人工标注标准答案,覆盖常见意图、罕见意图、多意图工单、信息不全工单和对抗性输入。每一条评价标准都明确定义——分类结果是否一致、抽取字段是否完整、生成话术中的事实性信息是否与业务系统一致。

第二件事,是建立评估流水线。任何改动,无论改prompt、改模型版本还是改流程代码,都必须先跑一遍金标集,输出分维度指标对比,和基线版本做差异分析。指标我只重点关注五个:意图分类准确率、关键字段抽取覆盖率、工具调用成功率、输出格式合规率、话术事实一致性。

第三件事,是从金标集的“数量正确”升级到“分布正确”。最初200条全是个例,模型记住套路就能拿高分,后来我们把金标集按真实工单分布加权,常见场景占多数,长尾场景保底覆盖。还真在长尾场景里抓住过一次回归:一版prompt优化让“多诉求工单”的识别准确率提升了8%,却让“仅包含发票诉求”的识别率降了12%。要不是金标集里故意保留了这类样本,这个问题会直接漏到生产环境。从此,评估回归在我们这儿就是一条硬规矩:没有跑评估,就不允许上线。

4. 生产环境踩坑实录与排查方法

4.1 工具参数幻觉:Agent编造入参怎么办

有一次生产环境出现了一个诡异现象:某个用户工单原话说的是“帮我查一下订单”,Agent生成的查单指令却带上了几个并不存在的筛选字段,业务接口收到后直接报了参数错误。更麻烦的是,Agent发现报错后,居然尝试修改参数继续重试,结果自然是继续报错。

排查后确认,根因是模型在生成工具参数时产生了“幻觉”——它根据问题语境天然补全了一些它以为存在的参数,但这些参数在真实接口中根本不存在。这类问题暴露了Agent的一个固有弱点:它会对输入做“合理化推断”,而不会老老实实地只使用它掌握的信息。

解决办法分两层。第一层是在工具定义层面做严格的参数Schema约束,字段必须是接口真实支持的枚举值或格式,同时不允许模型自行添加未定义字段。第二层是工具层做输入校验,一旦发现参数格式不合法,立刻返回标准的错误信息,并告诉Agent“参数X非法,可用的枚举值只有A、B、C”,引导它在后续重试中回到正确路径。从那以后,参数幻觉导致的错误率大幅下降。经验是:工具返回错误信息时,一定要附上“正确用法”,否则模型的下一步行为依然不可控。

4.2 上下文膨胀:token成本悄悄翻倍

系统刚上线的前两个月,成本走势图上出现了一根缓慢但持续向上攀升的曲线。一开始以为是任务量增加,但单任务的平均成本也在涨。查日志后发现了真凶:我们的工作流在每次迭代中,都会把前一步的完整输出拼接到下一步的上下文中。任务复杂时,经过三四步的拼接,输入token已经翻了好几倍。

更隐蔽的是对话历史的累积。一些用户会在一个工单里来回追问,Agent每次生成回复都要带上此前全部历史信息。追问到第十个来回时,仅历史记录就占了近万的输入token。成本就是这样一点一点堆上去的。

解决办法是三层组合拳:第一层,历史消息在超过一定条数后,用结构化摘要替换原始记录,保留关键事件和结论,丢掉无关细节;第二层,每个节点的输出只传递结构化字段,不把整段生成文本回灌给下一节点;第三层,对单任务的累计token设置预警阈值,超过阈值自动转人工。改造之后,单任务的平均token消耗降了超过40%,成本曲线终于回归了正常斜率。

4.3 重试风暴:Agent把下游服务打爆了

一次大的生产事故,发生在某个下游订单查询接口响应变慢的时候。我们的Agent检测到接口超时,触发了重试逻辑。但重试逻辑没有退避机制——第一次超时立刻重试,第二次超时又立刻重试。几十个并发工单同时进来,每个都在高频重试,直接把下游接口打到限流熔断,下游一熔断,Agent重试得更加频繁,形成了典型的“重试风暴”。

当时第一反应是怪接口不稳定,但排查到一半就明白了,真正的锅在重试策略。接口本身只是在高峰期正常波动,是我们的系统把这个波动放大成了宕机。

修复方案是三层:第一层,指数退避,重试间隔按指数递增,并加入随机抖动,避免所有实例在同一时刻重试;第二层,熔断器,对下游接口的连续失败次数设一个阈值,触发熔断后直接降级为人流通话术,不再调用该接口;第三层,重试次数上限,任何工具调用重试不得超过三次,超过则按失败路径处理。这三层上线后,“Agent把下游打爆”这个安全隐患基本绝迹了。血的教训就是:Agent系统对外部系统的调用,必须像访问一个随时会挂的服务那样去设计,而不是像访问一个永远健康的测试桩。

4.4 版本漂移:模型升级导致不兼容

还有一次比较折腾的问题:我们把某个底层模型从旧版本升级到新版本后,金标集主指标表面上没有明显退化,但一段时间后业务侧反馈回复风格“变了味”——事实没错,但表达更啰嗦,还偶尔冒出一些以前没有的口头禅式用语。

追踪到模型层才发现,新版模型在提示词遵循能力上更强,但也产生了自己的“语言风格偏好”,这些偏好通过我们提示词里描述性语言传给了输出。其实这是模型升级后常见的行为漂移:即使同一个提示词,在不同模型版本上的表现就是会不一样,而且差异往往不在标准指标上,而在微妙的语义和风格层面。

从此我们定了几条规矩:一是生产环境锁定模型版本,不允许无故升级;二是每次模型升级必须完整跑金标集回归,除了事实指标还要人工抽看输出风格;三是在提示词层面尽可能使用“命令式”描述,少用“类似于”“就像”这类带风格引导的词。最后一条虽然听着玄学,但实操下来确实能降低模型自作主张的空间。

4.5 常见问题速查表

现象根因排查路径解决手段
Agent编造不存在的工具参数模型输出幻觉查工具调用日志,比对参数Schema严格Schema约束,校验失败返回错误示例
单任务token消耗异常上涨上下文无节制拼接按task_id查token消耗明细结构化摘要替代历史原文,节点间只传必要字段
下游接口被打满重试无退避、无限重试查重试次数与时间分布指数退避+随机抖动+熔断+重试上限
模型升级后行为突变不同版本模型对prompt响应不同对比升级前后日志锁定版本,升级必跑金标集与人工抽检
同一任务多步处理结果互相矛盾节点间缺乏信息对齐查看各节点输出与校验层日志增加节点间的Schema校验,冲突即转人工

这些坑每一个都对应着一笔真实的时间成本。好在它们都集中在前两次上线周期里,踩完之后,整个系统的工程底座才算真正立住了。

最后聊几句我的个人体会。Agent工业化这件事,本质上是一种“驯化”的过程——不是要把模型的灵性磨掉,而是给灵性划定活动范围。模型在范围里可以自由发挥,范围之外,则是规则、校验、审批、监控和审计共同织成的防护网。我见过很多团队花大力气优化prompt、调模型参数,希望让Agent变得“更聪明”,效果却常常不如花同样的精力去加固工程底座。因为聪明是随机的,可靠才是可以被设计的。我自己经历完这一轮改造后,最大的变化是:评估一个Agent方案时,首先看的不是它的demo效果,而是它处理失败路径、记录过程日志、约束权限边界的方式。如果你也在把Agent往生产环境里推,我的建议是先做一个哪怕很笨的闭环——一个校验、一层审计、一条兜底逻辑,让系统跑起来之后再逐步放开自由度。这条路不性感,但它是Agent从玩具变成生产力工具唯一的路径。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询