商用智能体开发这件事,真正动起手来才会发现,最难的从来不是把大模型接进来跑通一个对话,而是让它在一个真实业务场景里稳定、可控、可计费地持续干活。我前后参与过几个从零起步的智能体项目,有的做客服分流,有的做内部流程自动化,也有的直接面向外部用户收费。踩过的坑从提示词漂移、工具调用死循环,到成本失控、上线后无人敢维护,几乎每一类都遇到过。这篇就把这套从0到1的完整路径拆开讲清楚:一个商用智能体到底由哪些部分组成,每个部分为什么这样设计,哪些地方最容易翻车,以及我实际验证过、可以直接抄作业的做法。不管你是刚接触智能体的开发者,还是准备把demo推向生产的技术负责人,下面这些内容应该都能对上你的实际处境。
1. 先把“商用”两个字拆开看:它和demo的本质差别
很多人做智能体的第一反应是选模型、写提示词、接几个工具,跑通一个能回答问题的流程就以为成了。这套东西做demo没问题,但一旦挂上“商用”两个字,评价标准就完全变了。我在项目里总结下来,商用智能体和demo的差别集中在四个维度,理解这四个维度,后面所有的技术选型和架构设计才有依据。
1.1 稳定性优先于聪明程度
demo追求的是“偶尔惊艳”,商用追求的是“持续不崩”。一个智能体哪怕只有百分之几的概率输出离谱内容,放到每天几千上万次调用的业务里,就是每天几十上百次事故。所以商用智能体的第一设计原则是收敛输出空间,而不是无限放大模型能力。具体做法包括:把开放式生成尽量转成结构化输出、给工具调用加上严格的参数校验、对高风险动作设置人工确认环节。我见过一个项目,模型能力很强,但因为没做输出约束,用户随便一句话就能诱导它编造退款政策,最后只能回炉重做。
1.2 可观测性决定能不能运维
demo跑完就结束了,商用智能体上线才是开始。你必须能回答这些问题:这次回答为什么这么生成?调用了哪些工具?花了多少token?哪一步耗时最长?如果答不上来,出了问题就只能靠猜。所以从第一天起就要把全链路日志设计进去,包括输入、模型原始输出、工具调用参数与返回、最终响应、耗时与成本。这不是锦上添花,是运维的命根子。
1.3 成本必须可预测
商用意味着有人为调用付费或者有预算约束。智能体的成本不像传统接口那样固定,它受输入长度、输出长度、工具调用轮数、重试次数多重影响,波动很大。我吃过一次亏:一个流程因为工具返回格式不对,模型反复重试,单次请求的token消耗翻了七八倍,月底账单直接超标。所以成本控制要落到架构层:设置最大轮数、最大token、超时熔断,并且按业务维度做成本归集。
1.4 边界清晰才敢交付
商用智能体最怕“什么都能聊”。业务方要的是一个在特定范围内可靠干活的助手,不是一个无所不知的聊天机器人。所以要在系统层面明确它能做什么、不能做什么、遇到边界外的问题怎么优雅兜底。这个边界不是靠提示词里写一句“你只回答XX问题”就能守住的,需要配合意图识别、路由分流、兜底话术多层保障。
把这四点想明白,你就不会一上来就纠结用哪个模型,而是先想清楚系统骨架。下面这张表是我用来快速对齐团队认知的对照,实际项目里很有用:
| 维度 | demo做法 | 商用做法 |
|---|---|---|
| 输出 | 自由生成 | 结构化约束 + 校验 |
| 日志 | 打印调试 | 全链路可观测 |
| 成本 | 不关心 | 预算 + 熔断 + 归集 |
| 边界 | 提示词口头约束 | 多层路由 + 兜底 |
| 失败处理 | 报错即可 | 降级 + 重试 + 人工兜底 |
2. 智能体的骨架:把“大脑、手脚、记忆、护栏”分开设计
一个能商用的智能体,我习惯把它拆成四层来看:决策层(大脑)、执行层(手脚,也就是工具)、记忆层(上下文与知识)、治理层(护栏与观测)。这四层分开设计的好处是,任何一层出问题都能独立定位和替换,而不是牵一发动全身。很多项目做不下去,就是因为一开始把这几层揉在一个大提示词里,后期完全没法维护。
2.1 决策层:模型不是越强越好,而是匹配任务
选模型这件事,我的经验是按任务分层选型,而不是全系统用一个最强模型。一个典型商用智能体的调用可以分成几类:意图识别与路由、复杂推理与规划、工具参数生成、结果润色。这几类对模型能力的要求差别很大。意图识别用一个小而快的模型完全够用,成本可能只有大模型的几十分之一;真正需要强推理的只有规划那一步。我做过一个对比,把路由和参数生成换成轻量模型后,整体成本降了六成多,效果几乎没变化。
具体选型时我会看几个指标:首token延迟、结构化输出(尤其是JSON模式)的稳定性、工具调用(function calling)的规范程度、上下文窗口大小、单价。延迟对交互式场景是硬指标,用户等三秒和等八秒的体验天差地别。结构化输出稳定性则直接决定后面解析代码要不要写一堆容错。这里没有万能答案,但有一个原则:先用中等能力模型跑通全流程,再针对瓶颈环节单独升级,而不是一上来堆最强模型。
2.2 执行层:工具设计比模型能力更影响成败
工具(也就是智能体能调用的外部函数或接口)的设计质量,往往比模型本身更决定智能体好不好用。我见过太多项目,模型没问题,但工具描述写得含糊、参数设计反人类,导致模型频繁调错。工具设计的核心是让模型“一看就懂、一调就对”。具体有几条硬经验:
- 工具名和描述要写清楚“什么时候用、什么时候不用”,而不是只写功能。比如一个查询订单的工具,描述里要明确“用户询问订单状态、物流进度时使用;用户要修改地址时不要用此工具”。
- 参数尽量少、类型明确、枚举值给全。参数越多,模型填错的概率越高。
- 返回值要结构化且精简。返回一大坨原始数据,既浪费token又干扰模型判断,最好在工具内部就做裁剪和摘要。
- 每个工具都要有明确的失败返回格式,让模型知道“这次调用失败了,该怎么处理”,而不是抛一个异常让整个流程崩掉。
下面是一个工具定义的示意,重点看描述和参数约束的写法:
{ "name": "query_order_status", "description": "查询订单的当前状态与物流进度。仅当用户明确询问某个订单的状态、发货情况或物流位置时调用。若用户要修改收货地址或申请退款,请勿调用本工具。", "parameters": { "type": "object", "properties": { "order_id": { "type": "string", "description": "订单编号,通常为纯数字,长度12到18位" } }, "required": ["order_id"] } }2.3 记忆层:短期上下文和长期知识要分开管
记忆这块最容易混淆。智能体需要的“记忆”其实分两种:一种是当前对话的短期上下文,另一种是跨会话的长期知识(比如业务规则、产品文档、用户历史偏好)。这两者的管理方式完全不同。短期上下文靠对话历史拼接,但要注意长度控制和裁剪策略,不能无限往上下文里塞;长期知识则要靠检索增强(RAG)从知识库里按需取。
短期上下文我一般会做三件事:保留最近若干轮完整对话、对更早的对话做摘要压缩、把关键实体(如订单号、用户身份)单独抽出来结构化保存。这样既控制了token,又不丢关键信息。长期知识库则要注意切分粒度和召回质量,切得太碎丢上下文,切得太粗召回不准,这个后面单独讲。
2.4 治理层:护栏不是可选项
治理层包括输入过滤、输出审核、权限控制、限流熔断、审计日志。这一层在demo里通常被忽略,但在商用里是底线。举个具体例子:智能体如果具备调用“发起退款”这类写操作工具的能力,就必须有权限校验和二次确认,绝不能模型说退就退。护栏的设计原则是默认拒绝、显式放行,也就是高风险动作必须经过明确授权路径,而不是靠模型自觉。
3. 从需求到可运行:一条能落地的开发主线
骨架想清楚之后,真正动手要有一条清晰的主线,否则很容易陷入“今天调提示词、明天换模型”的循环。我实际项目里用的主线大致是:场景收敛 → 任务拆解 → 工具与知识准备 → 编排实现 → 评测调优。这条线每一步都有明确的产出物,避免空转。
3.1 场景收敛:把“万能助手”砍成一个具体任务
第一步也是最容易被跳过的一步,是把场景收敛到一个足够具体的任务。业务方往往一上来就说“我要一个智能客服”,这时候要追问:它主要处理哪几类问题?每类问题的标准处理流程是什么?哪些必须转人工?把这些问清楚,你才能定义出智能体的输入输出边界。我一般会产出一份“任务清单”,列出它要覆盖的具体任务、每个任务的输入、期望输出、失败兜底方式。这份清单就是后面所有开发和评测的依据。
收敛场景还有个好处是能快速判断可行性。有些任务看起来适合智能体,实际做下来发现规则明确、变化少,用传统流程引擎反而更稳更便宜;有些任务看似简单,但涉及大量非结构化判断,才真正需要模型。这个判断做在前面,能省掉大量无效开发。
3.2 任务拆解:把大目标拆成模型能执行的步骤
一个复杂任务直接丢给模型,效果往往不稳定。我的做法是把它拆成若干可验证的小步骤,每一步的输入输出都明确。比如“处理用户退款申请”可以拆成:识别意图 → 提取订单信息 → 校验退款资格 → 生成处理建议 → 执行或转人工。拆解之后,每一步可以单独选模型、单独评测、单独加护栏。拆到什么粒度合适?我的经验是每一步都能用一个明确的成功标准判断对错,如果一步里包含多个判断,就继续拆。
拆解时还要注意步骤之间的依赖关系和数据传递。有些步骤可以并行,有些必须串行,编排层要能表达这种关系。这里不一定要上复杂的编排框架,早期用代码里的顺序调用加条件分支就够,过度设计反而拖慢进度。
3.3 工具与知识准备:先保证“有得用、用得对”
工具和知识是智能体的“手脚”和“参考书”。工具准备的关键是接口稳定、语义清晰,前面讲过设计原则,这里补充一点:工具要先于智能体独立测试通过。我习惯先用脚本把每个工具单独调通,确认参数、返回、异常都符合预期,再交给智能体去调用。否则智能体调不通时,你分不清是模型的问题还是工具的问题。
知识准备则是把业务文档、FAQ、规则整理成可检索的形态。这里有个常被忽略的点:知识库要定期更新和版本管理。业务规则一变,知识库不更新,智能体就会一本正经地给出过时答案,这种错误比答不上来更危险。
3.4 编排实现:控制流要显式,不要全交给模型
编排层决定智能体怎么在“思考”和“行动”之间循环。常见的做法是让模型自己决定下一步调什么工具,这叫自主规划。自主规划灵活,但不可控,容易死循环或跑偏。商用场景我更倾向于混合编排:主干流程用代码写死,只在局部环节让模型自主决策。比如整体流程是“识别意图 → 按意图走对应分支”,分支内部再让模型决定调哪个工具。这样既有灵活性,又有确定性。
编排里必须显式设置几个硬约束:最大循环轮数(防止无限调用工具)、单步超时、总超时、token预算。这些约束不是限制模型发挥,而是保证系统在异常时能及时止损。我一般把最大轮数设在5到8轮之间,具体看任务复杂度,超过就强制走兜底。
3.5 评测调优:没有评测集,调优就是盲人摸象
这是商用和demo分水岭最明显的一步。demo靠手动试几个问题觉得“挺聪明”就上线了,商用必须有评测集。评测集要覆盖:正常任务、边界情况、对抗性输入(诱导越界、注入指令)、工具失败场景。每个用例标注期望行为,跑完自动打分。有了评测集,你换模型、改提示词、调工具才有客观依据,否则全是感觉。
评测集的建设是个持续过程,上线后要把真实badcase不断补进去。我一般会维护一个“回归集”,每次改动前跑一遍,确保没把之前修好的问题又改回去。这个习惯救过我好几次。
4. 提示词与工具调用的那些坑:我踩过的具体问题
前面讲的是骨架和主线,这一节讲实操里最容易翻车的细节。这些坑我在不同项目里反复见到,写出来希望能帮你少走弯路。
4.1 提示词越长越稳?恰恰相反
新手常有的误区是把所有规则、示例、注意事项全塞进系统提示词,觉得写得越全模型越听话。实际测试下来,提示词过长反而会稀释关键指令的权重,模型容易顾此失彼。我的经验是分层组织提示词:系统提示词只放角色定位和最核心的几条铁律,具体任务的规则放到对应步骤的提示里,示例按需动态注入而不是全量常驻。这样既控制了长度,又让每条指令在它该生效的地方生效。
还有一个细节:指令的表述要具体、可执行,避免模糊词。比如“回答要友好”这种指令模型很难稳定执行,改成“回答开头先确认用户问题,结尾提供下一步操作建议”就具体得多。能用结构化格式约束的,就别用自然语言描述。
4.2 工具调用死循环:根因往往在返回格式
工具调用死循环是高频问题:模型调一个工具,拿到结果觉得不对,再调一次,反复循环直到超轮数。表面看是模型“固执”,根因通常是工具返回的信息让模型无法判断成功与否。比如工具失败时返回一个空对象,模型不知道是“没查到”还是“出错了”,就会重试。解决办法是让工具返回明确的成功/失败标识和原因说明,模型拿到清晰信号就不会瞎试。再配合最大轮数兜底,基本能控住。
4.3 结构化输出解析失败:留好降级路径
要求模型输出JSON是常见做法,但模型偶尔会输出带多余文字、格式不规范的JSON,导致解析失败。除了在提示词里强调格式,更要在代码层做容错:先尝试严格解析,失败后尝试提取JSON片段,再失败就走降级逻辑(比如返回默认结构或转人工)。千万不要假设模型一定输出合法JSON,这个假设在生产环境迟早被打破。
4.4 上下文污染:历史对话里的错误会被放大
多轮对话里,如果前面某一轮模型给出了错误信息,后面它会倾向于延续这个错误,这叫上下文污染。缓解办法包括:在关键节点对历史做摘要时剔除明显错误、对关键事实以结构化字段为准而不是依赖对话历史、在检测到用户纠正时显式重置相关上下文。这个问题没有一劳永逸的解法,但做好这几点能明显降低发生概率。
5. 上线之后:监控、成本与持续迭代
智能体上线不是终点。真正决定它能不能长期创造价值的,是上线后的运维和迭代能力。这一块往往被低估,我见过不少项目上线即巅峰,之后因为没人管、成本失控、效果退化而慢慢被弃用。
5.1 监控要看哪些指标
监控不能只看“有没有报错”。我一般会盯这几类指标:任务成功率(按任务类型分)、平均响应延迟、工具调用成功率与平均轮数、token消耗分布、兜底触发率、用户主动转人工率。其中兜底触发率和转人工率特别能反映智能体的真实能力边界,这两个指标上升往往意味着知识库过时或场景发生了变化。把这些指标做成看板,按天看趋势,异常时能快速定位到具体环节。
5.2 成本控制的几个抓手
成本控制要落到具体机制上,光靠“注意节省”没用。我的做法是:按业务线或用户维度做token归集,设置日/月预算阈值,超阈值告警甚至限流;对长上下文做裁剪和摘要;对高频简单请求走轻量模型;对重试和循环设置硬上限。这几条组合起来,成本基本可控。另外要定期分析token消耗的分布,往往少数几类请求占了大部分成本,针对性优化这几类收益最大。
5.3 迭代节奏:小步快跑 + 回归验证
智能体的迭代不适合大版本一次性上线。我的经验是小步快跑:每次只改一个变量(一个提示词、一个工具、一个模型),改完跑回归集,确认没有退化再上线。这样出问题时容易定位是哪个改动引起的。同时建立badcase收集机制,把线上真实问题持续补进评测集,形成闭环。这个节奏看起来慢,实际比大改大回滚要快得多。
6. 几个容易被忽视但很关键的设计取舍
最后聊几个我在项目里反复权衡过的设计取舍,这些点没有标准答案,但想清楚能少走很多弯路。
6.1 自主规划还是固定流程
前面提过混合编排,这里展开说取舍逻辑。自主规划适合任务开放、步骤不固定的场景,比如信息检索类助手;固定流程适合步骤明确、容错要求高的场景,比如订单处理。判断标准是:任务的成功路径是否高度可预测。可预测就用固定流程,不可预测才交给模型自主规划。很多项目失败是因为在高度可预测的场景里用了自主规划,结果引入大量不确定性。
6.2 单智能体还是多智能体
多智能体(多个角色分工协作)听起来很美,但实际落地复杂度高,通信开销大,调试困难。我的建议是能用单智能体加清晰的任务拆解解决,就不要上多智能体。只有当任务确实需要不同专业角色、且这些角色之间有明确协作关系时,多智能体才有价值。早期项目用单智能体加工具组合,往往能达到八成效果,维护成本低得多。
6.3 自建还是用现成平台
现成平台能快速起步,但定制能力和数据可控性受限;自建灵活但工作量大。我的判断是看两点:一是业务对数据流向和定制深度的要求,二是团队是否有持续维护的能力。对大多数商用场景,我倾向于核心编排和治理层自建,把模型调用和基础能力用成熟服务,这样既可控又不至于从零造轮子。
6.4 人工兜底不是失败,是设计的一部分
很多团队把转人工当成智能体能力不足的表现,想尽办法降低转人工率。我的看法相反:合理的转人工是商用智能体的必要设计。有些问题就是超出智能体能力边界,硬扛只会带来更差的体验。关键是把转人工做得平滑——转之前把上下文、已收集信息、建议处理方式一并交给人工,让人工接手时不用从头问起。这个体验做好了,用户不会觉得是智能体不行,反而觉得整个服务很顺。
7. 我在实际项目里沉淀下来的几条硬经验
做了几个项目下来,有几条经验是反复验证有效的,写在这里供参考。第一,先跑通再优化,不要过早追求完美架构。早期用最简单的代码把主流程跑通,拿到真实反馈后再重构,比一开始设计一套复杂框架要快得多。第二,评测集要早于优化开始建。没有评测集,所有优化都是拍脑袋,建评测集这件事越早做收益越大。第三,把不确定性显式化。智能体天然有不确定性,与其假装它很确定,不如在系统里显式处理不确定性——该兜底兜底,该确认确认,该转人工转人工。第四,文档和日志一样重要。智能体的行为逻辑分散在提示词、工具、编排代码里,不写清楚,换个人接手基本抓瞎。我习惯在每个关键决策点写清楚“为什么这么做”,这比事后补文档有用得多。
这套东西不是一次就能搭好的,它更像是一个持续打磨的过程。每上一个新场景,都会暴露新的边界问题,也都会让整套方法论更扎实一点。真正把它跑起来的团队,往往不是技术最强的,而是最愿意在稳定性和可运维性上下功夫的。