大多数写过 AI 应用的人,都见过那个安静到让人发慌的瞬间。会议室里,Agent 应该调用工具完成下单,屏幕上却不断弹出同一个错误;生成式搜索应该给出答案,结果输出了一段和问题完全无关的文本。演示者一边点鼠标一边解释“这可能是环境问题”,台下客户手机屏幕的亮光则慢慢暗下去。
在一个被反复描述为“千亿赛道”的大模型应用领域,这种场景并不罕见。它足够尴尬,却远比“模型答错一题”更值得重视。一次现场翻车的背后,往往不是某个模型能力不够,而是整个工程链路没有为不确定性做好准备。这条赛道真正有意思的地方,不在海报上的参数,而在落地时的各种意外。谁能把意外处理得足够体面,谁才有资格谈规模化。
1. 为什么最被看好的赛道,反而最容易当众翻车
1.1 预期跑在工程前面
大模型应用被称作千亿赛道,是因为资本市场、行业报告和产品发布会共同把想象力抬高到了“几乎所有软件都值得重做一遍”的程度。这个预期本身没有错,问题在于它把团队的交付节奏也一起拖快了。
很多团队在这样的预期里,会不自觉地压缩掉最不该压缩的环节。本来应该用一个星期做输入边界梳理,被压缩成一天;本来应该建立回归评测集,被临时省略;本来应该准备兜底话术和降级策略,因为“模型通常不会出错”而搁置。等到公开演示或客户试用时,这些被省略的部分就会集中回来索取成本。
一个项目从“能跑”到“能演示”到“能交付”,中间隔着的不是界面是否好看,而是异常处理是否完整。但千亿赛道的叙事太有吸引力,会让团队产生一种错觉:既然趋势足够大,只要先把演示做出来,后面的工程问题自然会在规模化过程中被解决。真实情况恰好相反,演示阶段没暴露的问题,往往会在最不合适的时间点暴露出来。
1.2 演示不是测试,但演示暴露的是测试没有覆盖的问题
有些团队会反驳:我们的演示流程在测试环境明明跑过很多次。听起来合理,但里面的漏洞在于,演示环境和测试环境对“不确定性”的容忍度完全不同。
测试环境允许失败,允许重新执行,允许在页面里看日志。公开演示则要求一次成功,要求结果符合预期,要求在几秒钟内给出“合理”的反馈。换句话说,演示是一个比测试更严苛的工程场景,但很多团队却用比测试更低的标准来准备它。
更麻烦的是,大模型应用本身就带有概率性。同一个提示词、同一个温度参数、同一批上下文,在不同时间执行可能得到不完全一样的结果。测试时跑十次有九次成功,不代表演示的那一次一定落在九次里。如果团队连“输出概率分布”这个概念都没有纳入测试设计,那翻车就不是概率问题,而是必然问题。
1.3 “社死”不是模型的锅,而是系统默认了一切都会成功
如果你把一次现场事故的录像逐帧拆开看,会发现真正导致局面的往往不是模型答错,而是系统在模型答错之后没有任何反应。
模型输出异常时,前端照常渲染;Agent 调用工具失败时,没有超时熔断;外部应用返回了一段非预期结构,解析逻辑直接抛异常。整个系统从设计之初就默认模型会给出正确结果,默认外部服务会稳定返回,默认用户的输入会符合格式预期。当这些默认失效,系统没有降级、没有提示、没有重试,只有空白页面或一串堆栈。
“社死”的本质,不是某个环节失败,而是整条链路缺少对失败的预期。大家盯着模型生成结果,却忘了模型生成结果之前和之后的每一步,才是演示安全的真正边界。
2. 被“社死”的并不是模型,而是工程系统的隐形缺口
2.1 真正缺的是“可控层”
很多团队说自己在做大模型应用,实际上只是在调用大模型 API,然后把返回值直接拼进业务逻辑。这样写 demo 很快,但离“应用”还有相当远的距离。
我建议在模型和你自己的业务代码之间,明确增加一个“可控层”。这个层负责四件事:一是校验输入,二是约束模型输出格式,三是定义失败时的兜底行为,四是记录完整的调用轨迹。没有这个层,模型输出就像一条没装水管的河流,流向哪里全凭心情;有了这个层,模型的能力才被装进你定义的容器里。
“可控层”听起来是一个架构概念,实际落地时可以从很小的地方开始。比如在调用模型之前先检查用户输入长度;在返回结果之前用正则或 JSON Schema 校验格式;如果校验失败,不是把模型输出直接抛给用户,而是触发一次修正重试,或者返回固定的安抚话术。这些代码不复杂,但它们决定了应用是“用了 AI 的软件”,还是“一个被 AI 拿捏的壳”。
2.2 评测靠人工感觉,等于没有评测
大模型应用和传统软件一个很大的区别,就是传统软件的输出是确定性的,可以用断言来判断对错;而模型输出是自然语言,很难用“等不等于”来判断。
于是很多团队退回到最原始的方式:让几个人试用,然后凭感觉说“效果还行”。这种方法在前期可以快速获得直观感受,但一旦进入迭代阶段,就会带来两个问题:第一,你无法判断某次改动到底让效果变好了还是变差了;第二,你无法在对外发布之前知道自己会不会翻车。
一个更可执行的路径,是建立一个小而精的评测集。找 50 到 100 条有代表性的输入,覆盖正常场景、边界场景和错误场景,然后为每条输入定义“可接受输出”的标准。这个标准不一定要是唯一答案,可以是几个关键词、一个结构要求、一段符合事实的描述。每次改动后,把评测集跑一遍,统计通过率。看起来麻烦,但它其实是在给不确定性建立计量单位。
没有计量单位,就没有质量管理;没有质量管理,“社死”就只是时间问题。
2.3 没有降级策略、回退机制和兜底话术
一次现场演示中,模型服务恰好超时,这是可能的;外部接口恰好限流,这也是可能的。面对这些情况,强依赖单一路径的系统会直接空白或报错,而设计良好的系统会切换到备用路径。
降级策略至少要考虑三层。第一层是重试,比如模型调用超时后,用更低的温度参数再试一次;第二层是换路,比如主模型不可用时,切换到备用模型或规则引擎;第三层是收尾,如果所有路径都失败,至少要给用户一个明确反馈:“当前服务繁忙,请稍后再试”,而不是让页面白在那里。
在演示场景里,兜底话术更重要。面对客户,一句“这块我们当前版本还没覆盖,但路线图里已经规划了”远比“程序报错了我们看看”更体面。这不是掩饰问题,而是让团队有机会在压力下冷静定位,而不是被现场情绪推着走。
3. 一次顺利演示背后的完整工程准备
3.1 从需求拆解到最小可验证流程
假设你要向客户演示一个“企业知识库智能问答助手”,现场流程大概是:用户提问,系统检索知识库片段,模型基于片段生成回答。看起来很简单,但可以拆成更多验证点:
- 用户输入问题后,系统能否在 2 秒内完成检索?
- 检索到的片段是否和目标问题相关?
- 模型是否严格基于片段回答,而不是胡编?
- 回答格式是否清晰,是否包含引用来源?
- 如果知识库中没有相关内容,系统会怎么回答?
- 如果模型服务超时,页面显示什么?
每一个问题都应该有明确验收标准,而不是“应该差不多”。我见过的演示翻车,绝大多数不是倒在复杂的多 Agent 协作上,而是倒在这些最基础的问题上。先把最小链路按“一定能成功”的标准跑通,再谈花活。
3.2 演示安全配置:温度、超时、重试和固定样例
为了让现场演示更稳定,可以在正式展示之前做一轮“演示专用配置”。
第一个参数是模型温度。大部分生成任务中,温度太高会让输出更有“创造性”,但也会带来不可控。演示场景通常可以把温度调低,比如设置为 0 到 0.3,让输出更接近确定答案。这样做不会让模型变聪明,但会显著减少“同一问题两次回答差异过大”的观感。
第二个参数是超时。模型调用不能无限等下去。建议在网关层设置明确超时时间,比如 15 到 20 秒。超过阈值就触发重试或兜底。否则一旦模型服务出现抖动,现场就是一片空白等待,气氛会越来越尴尬。
第三个策略是准备一个“固定演示样例”。提前把要演示的问题、期望答案和可能的输出路径准备好,在正式演示前用脚本跑通 20 次,确认稳定。不是说演示时必须伪造结果,而是确保你选的这条演示路径经过了充分验证,而不是临时从生产环境里抽一条来碰运气。
3.3 观察度:日志、Trace 和现场可观测性
很多团队在演示前后最缺的不是技术,而是“知道发生了什么”。
设想一下:现场演示时,模型返回了明显错误的答案。如果没有日志和链路追踪,团队只能反复点击浏览器刷新,无法定位问题在检索层、提示词层还是生成层。但如果提前接入了完整的日志链路,情况就完全不同——现场会提示“检索结果为空”,或“模型调用超时”,或“输出格式校验失败”,团队可以快速判断哪一步出了问题。
这背后其实是一个观念转变:不要把大模型调用当成一个黑盒,而要把它当成一个可观测的普通服务。记录 prompt、记录模型响应时间、记录输出长度、记录重试次数、记录错误类型。这些数据在演示现场是救命稻草,在日常迭代里则是优化依据。
4. 避免“社死”的四层检查清单
4.1 第一层:输入边界和提示词是否可控
演示前先检查:用户可能输入什么格式?会不会有极端长文本、空输入、错别字、敏感词?问句里包含了无关背景,提示词是否能正确引导模型忽略?提示词是否写死了某个时间、某个版本、某个内部用语?
常见错误是提示词里写“你是 XX 公司专属助手”,但演示时用户问了一个该公司没有业务的问题,模型开始胡编。此时应当让提示词明确“如果问题不在知识范围内,请直接说不知道”,而不是强迫模型输出。
4.2 第二层:模型参数和重试策略是否设置
检查温度、top_p、max_tokens 是否符合场景。问答类场景温度不宜过高;代码生成类场景可能需要更长输出。重试策略要避免两个极端:完全不重试导致一次失败就崩,以及无限重试导致现场卡住。通常 2 到 3 次重试,搭配递增退避,已经足够应对偶发抖动。
4.3 第三层:业务流程和兜底是否覆盖
检查模型输出之后有没有做验证。如果是 JSON 输出,是否做了解析校验?如果解析失败,是直接报错还是重新生成?如果外部工具调用失败,是否有备用方案?如果 Agent 在某个步骤卡住,是否有超时中断?
这一层最容易忽略,但恰恰是“看起来不 AI”却能救命的部分。你把模型看作系统中的一个不稳定组件,围绕它设计防御,就不容易出大问题。
4.4 第四层:呈现方式和应急预案是否就绪
演示不是把软件扔到大屏幕上就结束。要提前规划:如果答案不满意,演示者能不能优雅地换一个问题?如果网络断了,有没有本地录制的备用视频?如果现场有人提问了一个覆盖不到的方向,团队能不能用“当前版本聚焦在 X 方向,Y 方向在路线图里”来回应?
这些不是技术问题,但它们决定了一个团队的专业度。技术团队经常忽略呈现层,于是辛苦构建的工程能力,被一次糟糕的现场体验全部抵消。
5. 从“避免演示翻车”到“建立可信赖的 AI 应用”
5.1 建立回归评测体系,而不是永远“试一下”
演示翻车后,很多团队的改进方式是“下次多准备几个样例”。这没有错,但还远远不够。
更根本的改进是建立回归评测体系。每修复一个问题,就往评测集里加一条对应的回归用例。每调整一次提示词、模型或检索策略,就全量跑一遍评测集,观察通过率变化。这样,你不再靠运气和临场发挥来保证质量,而是靠一套可持续运行的验证机制。
初期不需要很复杂。一个 CSV 文件,三列数据:输入、期望行为、通过标准。十个人每天跑一遍也行。等积累到数百条,它的价值就会超过任何人的“我觉得”。评测集不是一次性的,它要跟着系统演进持续更新。
5.2 灰度发布和持续监控
一次演示翻车,往往不是演示本身的问题,而是生产系统从不稳定到稳定的过程中,缺少了验证缓冲。传统软件行业常见的灰度发布,同样适用于大模型应用。
先让 5% 的用户看到新版本,观察错误率和用户反馈;确认稳定后再扩大到 50%、100%。同时要持续监控关键指标:平均响应时间、超时比例、空回比例、输出格式错误比例。这些指标比“用户感觉好不好”更容易快速发现问题。
很多团队不敢这样做的原因是新功能需要尽早全量发布,但这种心态最终会付出更高代价。千亿赛道不缺想象力,缺的是耐心。
5.3 把失败样本纳入日常迭代
大模型应用有一种独特的学习方式:你每次遇到失败,都应该把它记录成一个可复用的样本,而不是当个 bug 修复完就忘掉。
比如模型给了一个事实性错误答案,你把问题补充进评测集,同时调整提示词或检索逻辑。比如 Agent 在一次流程中死循环,你把流程日志保存下来,设计一个超时熔断。让失败样本本身成为流程的一部分,比“下次小心一点”更可靠。
这是工程复用思维在 AI 应用时代的具体体现。你没有办法避免每次失败,但你可以让每次失败都变成下一次迭代的输入。
6. 给团队和个人的三点冷静建议
6.1 把一个演示流程跑通 100 次
这里的“跑通”不是点击一次成功,而是连续执行 100 次,统计成功率和失败模式。你会发现很多在单次运行中看不到的规律:偶发超时、输出格式不稳定、外部依赖抖动。这些规律才是生产系统真正要面对的问题。
如果 100 次里有 10 次失败,不要急着说“概率挺低”,要在向客户展示之前,把这 10 次的失败原因全部搞清楚。要么修复,要么准备应对话术。千亿赛道的故事总在讲“可能”,但交付时用户只关心“确定”。
6.2 把“错误”也设计进产品体验
好的大模型应用不是永远不出错,而是出错时依然像一个可用的产品。模型说“不知道”比说错更好;页面提示“服务繁忙”比转圈 30 秒更好;系统在不确定时请求用户确认,比自作主张执行更安全。
把“错误”当成一种正常状态来设计,而不是临时补丁。这要求团队对产品交互有更细颗粒度的思考:当模型输出缺少关键信息时,前端如何展示?当检索结果为空时,应该引导用户换一种问法还是给出固定说明?当 Agent 需要用户确认时,交互语言怎么既自然又不令人困惑?
这些问题都不是核心算法问题,但它们决定了用户会不会信任这个 AI 产品。
6.3 不要用“未来会变好”掩盖今天的不确定性
大模型技术在快速进步,很多曾经的困难可能会被新版本模型自然解决。但“未来会变好”不应该成为今天省略工程建设的理由。
你在今天对抗随机性的每一点投入,都会在明天变成产品信任的基础。温度参数再调低一点,评测集再多一条,兜底逻辑再补一层,日志再详细一点,这些都不是性感的成就,但它们决定了你能否在未来的某个关键现场仍然保持体面。
千亿赛道从来不缺聚光灯下的宣言,缺的是那些在无人关注时刻反复打磨确定性的人。
如果你正打算在下一场演示里展示你的 AI 应用,我建议今天下班前只做一件事:把演示流程按最坏情况跑一遍。断开网络,看看会怎样;把模型 API 的 Key 停掉,看看会怎样;提前输入一个明显不在知识库里的问题,看看会怎样。你会发现,这些让人“社死”的瞬间,其实都可以通过工程手段提前预演。预演得多了,真正的现场反而会变得平淡——而平淡,恰恰是千亿赛道最稀缺的可靠感。