很多人对AI智能体上线的流程有一个错觉:demo跑通了,上线也就顺理成章。结果一放到真实环境里,上下文丢失、工具超时、用户乱输入导致整条链路崩掉,一坑接一坑。这篇文章想讲清楚我过去在真实项目里反复验证过的一条完整路径:从需求边界定义、模型与框架选型,到开发实现、评估测试、灰度发布,再到上线后的持续迭代。无论你是在做内部效率工具,还是在做面向用户的AI助手,只要准备把智能体从Notebook变成生产服务,这条流程都值得参考。
1. 先想清楚:这个智能体到底要不要上线
1.1 从"能跑"到"能上线",差距在哪里
在Jupyter Notebook里用几百行代码把智能体跑通,和把它变成一个真正面向用户的服务,中间隔着的不是工作量,而是一整套工程思维。我见过不少团队包括我们自己,最初被模型"什么都能聊"的能力迷惑,demo阶段各种惊艳,一上生产就原形毕露。原因很朴素:demo验证的是模型潜力,上线考验的是系统在各种边界条件下依然稳定。
具体来说,demo阶段你不太会在意下面这些事:
- 用户不按常理出牌,既有多轮追问、突然改话题,也有一个词就触发错误工具调用。
- 上下文会无限增长,token成本和响应延迟随之失控。
- 模型调用的任何一个工具都可能失败:超时、参数不合法、第三方接口返回格式变化。
- 用户会尝试绕过约束,甚至故意诱导智能体执行不该做的操作。
这些问题在demo里都存在,但都被"人工盯着"掩盖了。上线意味着去掉那双手,所有异常都暴露在真实流量下。所以我判断一个智能体能不能上线的第一步,从来不是看它聪明不聪明,而是看它能不能接受"一定会出错"这个事实,并为此设计了容错机制。如果你连错误的类型都没列过,那说明它还没到上线的状态。
1.2 先把边界和验收标准写进文档
磨刀不误砍柴工。上线流程的第一步,不是选模型,不是写代码,而是把需求和边界写清楚。这个文档不需要很长,但至少回答四件事。
第一,这个智能体服务谁、解决什么问题。一句话两句话讲清楚,比如"服务客服团队的工单初步分类与回复建议"。这句话决定了后面的数据权限、模型选择、评估集来源,甚至决定了你能不能用云端模型。
第二,什么该管、什么不该管。智能体不是全能的。我强烈建议明确列一份"不处理清单":涉及用户身份变更、金额操作、敏感数据导出等,一律转人工。边界清单的好处是,评估阶段可以直接测这些负例,确保模型不越界。边界没写清的智能体,上线后一定会在某个意想不到的地方越界。
第三,任务完成形态。同样是"帮用户查订单",可能是端到端全自动,可能是半自动待人工确认,也可能只是给客服提供建议。三者的容错要求完全不同:全自动任务要求单步失败率极低;仅提供建议的任务,模型可以稍微放飞一点,但输出格式必须稳。
第四,量化验收指标。不要写"效果要好",要写"工单分类准确率不低于90%,工具调用参数错误率低于2%,超时率低于1%"。没有量化指标,后面的测试和灰度就失去依据。我会把这些指标拆成两类:能力指标(准确率、完整率、幻觉率)和工程指标(可用性、延迟、成本),两类都定了,才允许进入开发阶段。
2. 模型与框架选型:决定上线后运维难度的一半
2.1 模型能力、成本与延迟的三角取舍
模型选型直接决定系统的能力上限和运维复杂度。很多人先在demo环境用能力最强的模型跑通了,上线时才发现成本扛不住,或者因为数据安全要求根本不能把数据送出去,于是换模型,所有东西重来。我的经验是:选型要在写业务代码之前定,而且要从"数据能不能出域"开始。
如果数据合规受限,最稳妥的方案是私有化部署开源模型;如果数据可以出域,也要看清楚单次调用成本和并发下的延迟。不能只看模型榜单分数,还要看它在你的具体任务上的表现,以及它在工具调用上的稳定性。评估时候用一个小样本集跑一遍,比看任何评测榜单都有效。
我这里有三条实际用下来比较稳的原则:
- 复杂推理、长链路规划任务,用最强的商用模型。这类场景频率低但价值高,贵一点值得。
- 高频低难度任务,比如简单的信息抽取、格式改写,用中等规模的模型就够,成本能降一个数量级。
- 前置路由,不做全量强模型。用一个快的意图分类器判断复杂度,复杂任务才走大模型,简单任务走小模型或规则。
另外要注意,模型宣传的上下文长度,和实际可用长度是两回事。上下文窗口再大,超过一定长度后模型对中间信息的利用能力也会下降,同时token成本和延迟都在涨。我一般会在系统里设一个软上限:比如一个宣称支持128K上下文的模型,业务上最多用到40K到60K,剩下的留给工具返回和最终输出。
我自己选型时用的维度大致是这样:
| 维度 | 强模型 | 中等规模模型 | 私有化开源模型 |
|---|---|---|---|
| 复杂指令跟随 | 高 | 中 | 中低 |
| 工具调用稳定性 | 高 | 中 | 视微调程度 |
| 单次调用成本 | 高 | 中 | 低,但运维成本高 |
| 延迟 | 中高 | 低中 | 取决于硬件资源 |
| 数据合规 | 取决于服务方 | 取决于服务方 | 可控 |
| 适用场景 | 低频复杂任务 | 高频简单任务 | 强合规、内网环境 |
多数上线项目最终会采用混合策略,而不是押注单一模型。我在一个落地项目里就这样做过:简单FAQ用轻量模型直接回答,疑难问题才升级到强模型,整体成本大约降了一半,用户可感知的体验没有明显变化。
2.2 框架选型:自研编排还是复用生态
框架选型回答的是"谁来编排智能体的思考过程"。现在社区流行的编排框架成熟度已经挺高,能帮我们快速搭建工具调用、知识库检索、记忆等模块。但对上线来说,真正重要的其实只有三个能力:可观测、可控、可重试。
我的建议是,不要把编排逻辑全部塞进框架的默认流程里,而是自己包一层薄薄的调度层。这层调度负责:统一入口接收用户消息并绑定会话状态;管理上下文窗口,做摘要和截断;负责工具注册、调用、重试和超时;记录全链路日志和token消耗。框架解决底层协议和通用能力,调度层解决你对系统的掌控力。
智能体的主流程,本质上可以理解成一个有限状态机:在"理解用户意图—规划子步骤—调用工具—整合结果—生成回复"之间循环。每个状态都可以单独打断、重试、记录。很多线上事故,比如工具超时导致整个会话挂起,就是因为把工具调用写成了同步阻塞,又没有超时控制。
这里我特别强调工具调用要做成异步任务。真实生产环境里,工具返回可能需要几十秒,而用户请求的通道通常等不了那么久。常见做法是任务半异步:用户进来后立即返回一个"正在处理"的状态,后台任务跑完后通过回调或轮询通知。这个设计在demo里看不出价值,但用户量一上来,几乎每个长耗时工具都会考验你这一点。
框架本身选熟悉、可扩展的就行,但不要迷信框架自带的功能,尤其不要把框架的示例代码直接搬进生产。示例代码的潜台词是"一切都会成功",而生产环境的默认假设应该是"一切都会失败"。你需要在框架之上补上超时、重试、并发隔离和审计日志。
3. 开发阶段的隐藏工程:不止是写提示词
3.1 提示词、工具、知识库的"三位一体"
很多人的第一个版本是把所有逻辑塞进一个超长提示词里,让模型"你是一个智能体,你可以……"。结果上线后一动就碎。实际上开发智能体,提示词只是三位一体的一部分,另外两个是工具定义和知识库。
提示词部分,我习惯按这个结构写:
- 角色定义:一句话说明身份和服务对象。
- 任务目标:说明要完成的用户目标。
- 工作流程:告诉模型先做什么、后做什么,什么情况用什么工具。
- 硬性约束:不执行某类指令、不编造信息、不确定时怎么办。
- 输出格式:要求结构化的JSON或严格自然语言。
- 少量示例:给两个正例,一个负例。
负例很重要。只给正例,模型不知道边界在哪里;给一个"不该怎么做"的负例,比十个正例都管用。
工具定义同样重要。不要把工具描述写得过于抽象,模型是根据描述来决定要不要调用工具的。描述里要写清楚:这个工具做什么、什么时候该用、什么时候不该用、参数是什么格式、返回是什么。参数校验必须放在代码层,不能指望模型每次都给合法参数。我们的经验是,所有工具参数都过一层schema校验,不合法就返回错误信息并让模型重新修正,而不是直接崩溃。
知识库部分,如果智能体需要回答具体业务问题,RAG(检索增强生成)通常是标配。这里最容易出问题的不是embedding模型选哪个,而是切分策略。我见过一个智能体经常答不对,排查了很久才发现是文档切分太碎,一个完整事项被拆到两个切片里,检索召回的内容残缺不全。切分时尽量按章节、段落、表格等完整语义单元来,不要只按固定字符数硬切。检索侧建议做两级:先向量召回一批候选,再用一个轻量重排模型选TopK,效果比单纯向量检索稳定很多。
把这三者联调的时候,有一个顺序:先单独验证工具调用,再单独验证知识库检索,最后才验证提示词与两者的配合。如果一上来就整体调试,出了问题很难定位是提示词写错、工具返回异常,还是知识库没召回。
3.2 确定性逻辑与智能逻辑的分层设计
开发智能体最容易犯的错误是:所有事情都交给模型。虽然模型很强,但它在确定性任务上并不可靠,成本也高。我会在设计阶段就把任务分成两层:确定性逻辑和智能逻辑。
确定性逻辑用代码实现,例如参数校验、权限判断、简单意图的规则匹配、工具执行、状态流转、结果格式化。智能逻辑用模型实现,例如理解用户模糊表达、拆解复杂任务、生成自然语言回复、判断用户情绪。一个典型分法:用户消息进来后,先用规则判断是否命中直接指令(比如"查余额""退订"),命中就走代码分支,完全不调用模型;没有命中,才进入模型理解。这样处理,高频、标准的操作可以做到又快又便宜,模型只处理真正需要理解力的部分。
工作流的设计,以一个多步骤智能体为例:用户说"帮我对比这两个方案,并生成一份摘要发到邮箱"。系统先判断这是长任务,将其拆成几个子步骤:解析需求、检索方案数据、生成对比摘要、调用发邮件工具、确认后执行。每一步之间用状态管理,而不是让模型一口气完成。这个设计的收益是,任何一步失败都可以单独重试或降级,而不是让用户从头再来。
上下文管理同样是个容易出问题的地方。长期对话会让上下文越来越长,token成本上涨、延迟变高、模型遗忘前文。我建议设置这样的上下文策略:
- 近N轮消息完整保留,这是模型回复质量的基础。
- 更早的消息压缩成摘要,确保关键信息不丢。
- 工具返回超长时,只把关键信息摘要留给模型,完整数据存到外部存储。
- 会话达到一定轮数后主动提醒用户开启新会话。
这套策略上线后能让每会话token平均下降两到三成,同时稳定性更好,属于改一次就能长期受益的工程点。
4. 上线前的评估体系:别用"感觉不错"当结论
4.1 离线数据集与自动化回归
评估体系分两层:离线评估和在线验证。离线评估的核心是准备一套有标注的问题集。很多团队没做这一步就直接上线,上线后靠用户抱怨来发现问题,代价非常高。我会从目标用户的真实问题里抽样,整理出几百条交叉覆盖正常、边界、异常三种情况的问题,并给每条写好评测答案。这个答案可以是人工写的参考回复,也可以是期望的工具调用序列。
有了评估集,就可以写自动化评测。每次改动提示词、工具或知识库,都跑一遍同样的问题集,对比输出。指标上我常用这几个:
- 任务完成率:用户目标是否达成,最核心的指标。
- 工具调用正确率:需要调用工具时,是否选中了正确的工具、传了正确的参数。
- 格式正确率:输出是否符合约定的格式。
- 幻觉率:是否生成了知识库和工具结果支撑不了的内容。
这里有个容易被忽视的点:为了让评估可控,测试时要把模型温度设为0,并固定输入顺序。否则两次跑出来的结果不稳定,你就没法判断某个改动带来的收益是真还是假。虽然真实用户环境下模型一定有随机性,但离线评估阶段追求的是可复现的比较,不是好看的结果。
离线评估集也需要持续维护。每上线一段时间,从生产日志里捞badcase进行标注,补充进评估集,防止回归。我习惯让评估集规模保持在几百条:太少没有统计意义,太多又跑不过来。维护评估集本身也是一项持续投入,但它决定了整个迭代速度。
4.2 对抗测试与安全护栏
智能体比普通应用多一层风险:它会被诱导做超出边界的事。上线前一定要做专门的对抗测试,我的常规清单包括:
- 提示注入:用户尝试让模型忽略系统提示词,扮演另一个人格,套出流程外的话。
- 越权工具调用:尝试让模型调用不该调的接口,比如发送短信给任意号码、删除数据。
- 隐私探测:套取其他用户信息、内部敏感信息。
- 自相矛盾指令:同一会话里不断改规则,测试模型是否被带着走。
对抗测试不需要一次覆盖所有类型,但每种至少要有典型case加入评估集。更重要的是,要设计安全护栏,而不是期望模型自己扛住。安全护栏怎么做?我一般分四层:
- 输入侧拦截:对明显恶意、超长、异常格式的请求做规则过滤。
- 工具侧权限:每个工具单独配置授权范围,绝不复用管理员级别的凭据。
- 输出侧审计:输出前检查是否包含不应出现的信息,必要时二次确认。
- 预算封顶:每日token预算、单会话预算,超出自动熔断。
还要强调人在回路的设计。高风险动作,比如给用户退费、删除资源、发送消息,必须在智能体执行前有人工确认环节。这里需要明确的降级通道:智能体发现不确定性增高时,主动把会话转给人工,而不是硬着头皮生成答案。
安全护栏在demo阶段完全看不出来,但上线后出过事故的人,都会把它当成必须项。别等出事再补,事后补的成本要高出好几倍。
5. 灰度发布的节奏控制与回滚预案
5.1 流量灰度策略怎么定
上线第一步不是全量,而是灰度。智能体的灰度比普通接口复杂,因为你发布的不仅是代码,还是一种"行为习惯"——模型版本差异、知识库变化、提示词改动,都会直接影响用户感知。
灰度维度可以这样选:
- 按用户比例:最简单的做法,适合新上线或全面改版。
- 按特定场景:只对某类问题放开新能力,观察表现再扩大范围。
- 按功能开关:把新工具、新流程单独用开关控制,不与流量比例耦合。
我常用的节奏是:5%流量观察一天,重点看有没有明显错误和投诉;20%再观察一天,看核心指标是否稳定;50%观察半天;之后才考虑全量。这个节奏还要结合业务风险。如果是客服辅助型智能体,错了有人工兜底,节奏可以快一点;如果是全自动操作类智能体,节奏就要慢很多。
灰度期间一定要保留参照组。把老版本或"无智能体"的处理路径保留一部分,让新老方案数据对比。否则只盯着新版本看,你不知道现在的表现到底是进步还是退步。比较的指标包括:解决率、处理时长、用户满意度、转人工率。
另外,灰度一定要支持按会话维度染色。每个会话带上版本号,后续看日志、看追踪记录、触达告警时都能精确筛选。我的习惯是从入口就把版本信息写进日志和追踪字段里,否则一旦灰度了,却不知道异常来自哪个版本,排查效率会非常低。
5.2 线上监控指标和告警阈值
上线前就要把监控体系搭好,不能等上线后再补。我把智能体的监控分成两层。
业务指标层:
- 任务完成率:按会话维度统计目标达成比例。
- 用户反馈率:点赞、点踩、负面情绪识别。
- 转人工率:智能体无法处理主动转向人工的比例。
- 幻觉/修正率:输出被用户明显质疑或修正的比例。
技术指标层:
- 接口延迟:平均延迟、P95、P99。
- 错误率:模型调用失败、工具调用失败比例。
- token消耗:每会话成本和每日总量。
- 队列积压:异步任务是否有堆积。
这里我想特别强调全链路追踪。智能体的一次答复,可能经历模型调用、工具调用、知识库检索多个环节,任意一个环节出问题都会表现为整体异常。没有追踪信息,很难定位。我们的做法是请求入口生成一个请求ID,然后把它透传到模型调用、工具调用、知识库检索的所有日志里,配合统一采集,问题基本能在一分钟内定位到具体环节。
告警阈值不要只设一个简单的错误率。智能体场景我重点关注三个容易爆的点:模型调用超时比例、工具调用失败数、单会话token突增。任何一项连续5分钟超过阈值就触发告警。告警不需要追求绝对精确,宁可偶尔误报,也不要漏报关键故障。
回滚预案至少要有三层:
- 版本级回滚:把发布版本切回上一个稳定版本。
- 功能级降级:关闭新工具调用、关闭模型生成,只保留规则回复。
- 全局开关:一键把所有智能体流量切换到人工流程或静态FAQ。
这三层都要在灰度前演练一次。真到故障时再写回滚脚本,多半已经晚了。演练完之后记录整个流程的耗时,确保真出问题时能在预期时间内完成切换。
6. 上线之后:从"能用"到"好用"的持续迭代
6.1 日志分析、反馈闭环与数据回流
上线不是终点,而是第一个可用版本的开始。我见过太多团队上线后就不管了,直到用户量下降才想起看数据。持续迭代需要一个闭环:采集、分析、标注、优化、回归。
采集环节,在页面加反馈按钮是基本操作,但更好的做法是主动做行为埋点:记录用户是否修改了智能体给的答案、是否追问、是否在智能体回复后直接转向人工。这些行为比单一点赞点踩更有信号价值。一个用户什么都没点,但把智能体写的答案全部删掉重写,这本身就是强烈的反馈。
分析环节,我会定期把负面case聚类。常见几类:
- 答非所问:知识库没召回正确内容。
- 过度承诺:模型直接承诺了不该承诺的事情,比如"已经帮您退款"但实际没有执行。
- 追问卡壳:用户多轮追问后模型无法维持话题状态。
- 工具参数错误:导致执行失败。
每一类badcase都要能追踪到根源:是提示词问题、知识库问题,还是工具问题。定位之后进入优化:调整提示词、优化切分策略、扩充知识库、修正工具schema。然后重新跑离线评估集,确认没有引入回归,再走灰度流程进入生产。
数据回流不是把日志扔给标注的人就完事了。要形成标准化的标注格式,每条badcase记录用户输入、模型输出、期望输出、失败类型、所属模块。有了这个格式,才能不断扩充离线评估集,让评估体系越来越逼近真实分布。我在项目里会把标注任务拆成小批量,每周处理一批,避免堆积到下个月。
6.2 我踩过的几个坑和应对办法
分享几个上线后真实遇到的坑。第一个是工具返回内容太长导致上下文爆炸。某次我们让智能体调用一个查询接口,接口返回了上百条记录,模型把全部内容都吞进来,不仅token暴涨,后续对话质量也明显下降。应对办法很直接:工具返回截断加摘要,只保留前几条关键记录,其余折叠成统计信息返回给模型。这样既保留了必要信息,又控制了上下文长度。
第二个坑是模型会"一本正经"地调用工具但传错参数。表面上看工具调用成功了,实际传的是一个不存在的ID。排查半天才发现是模型在用户没说清楚时,自作主张补了默认值。后来我们把这个参数改成必填,缺失时触发澄清式反问,而不是让模型猜。效果立竿见影,参数错误率降了一个量级。
第三个坑是灰度期间并发导致限流。模型服务的并发上限和预期不符,本来以为够用,结果灰度比例一上调,调用量翻倍,直接把上游打满,用户侧延迟从1秒飙到10秒。后来我们把所有模型调用都包了一层限流和队列,并对长期运行的任务做并发隔离:不同优先级的任务用不同队列,避免一个批量任务占光所有资源。
第四个坑比较隐蔽:知识库更新后,智能体还在用旧的向量索引。有段时间我们更新了知识库文档,但索引没重建,导致用户问的全是最新政策,智能体却按老知识回答,错得很有自信。从此我们把索引重建做成发布流程里的一个强制步骤,并在监控里加了"知识库最后更新时间"的指标,把隐性风险变成显性监控项。
踩过这些坑之后的体会是:智能体上线最重要的不是模型多聪明,而是系统的每一层都有清晰的日志、可控的开关和明确的降级路径。只要这三个东西在,出问题都只是时间问题,而不是事故;反过来,一旦缺少任何一层,小事也会演变成事故。