AI 项目从 Demo 到上线,中间到底差了什么
补档说明:本文属于「AI 工程落地周记」系列,计划发布时间为 2025-01-24 21:30。当前先保留为草稿,后续补充真实案例、代码片段和复盘细节后再发布。
我发现 AI 项目最容易产生错觉的阶段,就是 Demo 成功之后。团队通常会在那一刻异常兴奋:模型能答、流程能跑、页面也有了,于是大家很自然地认为“离上线不远了”。可真正做过几轮交付之后就会知道,从 Demo 到上线,中间隔着的不是几个小优化,而是一整层工程现实。
Demo 的目标是证明“这件事有可能”;上线的目标是证明“这件事在真实流量、真实错误、真实业务约束下还能稳定工作”。前者看效果,后者看系统。
所以我现在评估一个 AI 项目,往往不会问“Demo 是否惊艳”,而是问:这个功能在失败时会发生什么,在高峰时会发生什么,在知识变旧时会发生什么,在模型波动时会发生什么,在业务追责时又该怎么解释。
Demo 阶段通常解决了什么
大多数 Demo 至少能帮团队回答三件事:
1. 模型能力够不够
例如能不能完成总结、抽取、分类、问答、改写、生成草稿等核心任务。
2. 交互是否成立
用户输入这种问题,系统给出这种结果,业务方是否愿意接受这种产品形态。
3. 投入是否值得继续
做一轮样例之后,大致能看出这个方向是不是完全没戏。
这三件事都很重要,但它们依然是“可行性验证”,不是“生产能力验证”。
真正缺的通常不是效果,而是这 7 个层面
1. 输入和上下文没有被标准化
Demo 里常常用的是精心挑过的样本,用户问题相对干净,上下文也比较完整。但上线之后会出现:
- 用户输入不完整
- 夹杂口语、省略和错别字
- 多轮上下文断裂
- 同一问题在不同入口表达完全不同
如果没有输入清洗、意图识别、上下文补全和兜底逻辑,模型即使本身能力够,也会被脏输入拖垮。
2. 输出没有契约
很多 Demo 只要求“看起来答对了”,上线后才发现结果要进入数据库、表单、搜索索引、审批流、工单系统。这时最先出问题的就是输出格式。
所以从 Demo 到上线,一定要补上结果契约:
- 返回哪些字段
- 字段类型是什么
- 缺字段怎么办
- 枚举值怎么约束
- 校验失败后怎么回退
只要输出没有契约,AI 功能就只能停留在展示层,进不了业务层。
3. 观测缺失
很多团队上线前最容易忽略的是日志。结果功能一旦出现波动,大家只能靠截图和口头描述排查。
我现在会把这些信息当成最低配:
- 请求 ID
- 用户输入摘要
- 命中的 Prompt/模型版本
- 检索到的上下文片段
- 工具调用过程
- 结构化校验结果
- 最终返回内容
- 耗时与错误类型
没有这些信息,AI 项目会非常难维护。
4. 评估没有闭环
Demo 阶段大家通常凭感觉说“这次效果不错”。但上线需要的是可持续评估,而不是一次性的主观印象。
至少要建立三种机制:
- 样本集:固定一批代表性问题
- 指标:正确率、拒答率、格式通过率、耗时、成本
- 回收:线上失败样本定期归档
只有这样,你才能知道一次改 Prompt、换模型、改检索策略,到底是进步了还是退步了。
5. 回退路径没有设计
AI 功能不是传统接口,波动性更大,所以更需要明确回退路径。
例如:
- 模型超时时返回什么
- 检索为空时返回什么
- 输出校验失败时返回什么
- 高风险动作是否必须转人工
真正能上线的 AI 项目,不是“永远正确”,而是“出错时也不至于把用户和系统一起带沟里”。
6. 版本管理不完整
Prompt 改一版、模型换一个、知识库重建一次,效果都可能变。Demo 阶段这种变化没关系;上线之后,如果没有版本记录,后续根本无法回放问题。
我会要求至少能追踪:
- Prompt 版本
- 模型版本
- 检索索引版本
- 样本集版本
- 上线时间点
这样才能知道“是哪一次变更把结果弄坏了”。
7. 组织协作没跟上
很多 AI 项目最后不是死在技术上,而是死在协作上。
比如:
- 业务方以为 AI 能完全替代人工
- 研发以为模型波动可以接受
- 运营以为内容质量问题归研发管
- 风控和法务太晚才介入
一个真正上线的 AI 项目,必须提前把责任边界说清楚:谁定义目标、谁审核结果、谁负责异常、谁决定回滚。
我会怎么拆 Demo 到上线的路径
如果让我从头带一个 AI 功能,我一般会拆成四步:
第一步:功能可行
目标是确认模型能不能完成核心任务。这个阶段允许手工补数据、手工看结果,重点是判断方向值不值得继续。
第二步:接口可接
把输入、输出、工具调用、错误返回这些基础契约定下来。做到这一层,功能才能接进系统。
第三步:链路可观测
补日志、埋点、样本回收、版本记录。做到这一层,功能才具备维护条件。
第四步:业务可托管
补人审、回退、灰度、权限、运营流程。做到这一层,才算真的能上线。
很多项目最大的问题,是第一步做完就想直接跳到第四步。
一个最小上线清单
下面这张清单,是我最近更常用的“上线前自查”:
- 输入是否有异常兜底
- 输出是否有结构化校验
- 是否能追踪 Prompt/模型版本
- 是否记录失败样本
- 是否有超时和降级策略
- 是否有人工审核或人工接管路径
- 是否有灰度发布能力
- 是否清楚单次调用成本
- 是否定义了成功指标
- 是否准备好了回滚方案
只要这个清单有一半空着,我一般不会建议直接放生产。
一个更接近生产的示意
async function handleAiTask(input, user) {
const traceId = createTraceId()
const normalized = normalizeInput(input)
try {
const context = await loadContext(normalized)
const result = await callModel({
promptVersion: 'v3',
model: 'main-model',
input: normalized,
context,
})
const checked = validateResult(result)
if (!checked.ok) {
return fallbackToHuman(traceId, checked.reason)
}
await saveLog({ traceId, normalized, checked })
return checked.data
} catch (error) {
await saveErrorLog({ traceId, error: String(error) })
return fallbackReply()
}
}
这段代码没有炫技,但它比很多 Demo 更接近生产,因为它考虑了:
- 输入标准化
- 版本可追踪
- 输出校验
- 异常记录
- 人工兜底
我最常见到的三个误区
1. 只看效果,不看波动
一轮演示表现很好,不代表线上 1000 次请求都稳。
2. 只看模型,不看系统
很多问题最后都不是模型层的问题,而是检索、规则、权限、超时、缓存或日志的问题。
3. 只想着自动化,不想着接管
AI 功能越靠近业务主流程,越应该先设计“接管路径”,而不是只设计“自动化路径”。
总结
AI 项目从 Demo 到上线,中间差的从来不是“再改一版 Prompt”这么简单。真正的差距,在于你有没有把它从一个展示能力,变成一个有契约、有评估、有回退、有责任边界的系统能力。
Demo 证明模型能做事;上线证明团队能把这件事托住。后者,往往比前者难得多。
