从零开始做AI工程,我还真有不少话想说。这几年带过不少项目,也见过太多团队把大把预算砸进去,最后却卡在"模型也跑了、指标也刷了、就是上不了线"的尴尬境地。大家往往把AI工程等同于训练模型,但实际上,从你拿到一个业务问题,到系统真正稳定地跑在线上,中间隔着数据、评估、部署、监控一整条链路。这篇文章我想从零完整梳理一遍AI工程落地的核心环节,把我踩过的坑、验证过的思路尽量讲透,给正在入坑或准备入坑的同行一些参考。
1. 先盘清楚:你要解决的是AI问题,还是工程问题
很多项目死掉,死因不是技术不行,是一开始就把问题定义错了。我见过团队花三个月做图像识别,最后发现客户的核心痛点是单据录入效率,而这个问题用OCR加上几行正则就能解决,根本不需要深度学习。所以我建议所有项目启动前,先花一到两周做一次"问题边界审查"。
1.1 判断真问题和伪问题的三个标准
第一个标准:这个任务人类做起来是不是也需要"经验判断"。如果规则明确、逻辑固定,比如根据订单金额计算折扣、根据时间戳排序,那用传统程序解决就好。AI的介入,恰恰应该是那些"说不清规则但能举出例子"的任务——比如判断一段客服对话是否包含投诉意图、识别图片里的产品瑕疵、总结一份合同的关键风险条款。
第二个标准:错误容忍度有多高。AI系统一定会犯错,这是概率本质决定的。如果业务场景要求100%准确,那AI就不该成为唯一决策层,而应该作为辅助工具,把人工放在审核闭环里。
第三个标准:有没有数据基础。AI不是无中生有,它需要从数据里学规律。如果一个业务场景连历史样本都凑不齐,那模型再先进也是空中楼阁。这个阶段就要想清楚数据从哪里来、有多大、质量如何。
1.2 先跑通端到端最小链路,再谈优化
我的习惯是,任何AI项目都先做一个"最小可行链路"——花最少的资源,把从输入到输出的完整通路打通。哪怕这个版本的模型效果只有60分,哪怕中间很多步骤是手工补的,也要先让整个管线转起来。
这么做有三个好处。第一,它能尽早暴露数据格式、接口协议、业务方预期之间的错位,这些坑拖得越久代价越大。第二,它能给团队一个非常具体的讨论对象,比起抽象的方案文档,能跑的Demo才是最好的需求确认工具。第三,它让"效果指标"有了基准线,后续所有优化都是在这个基线上迭代,而不是凭感觉乱调。
我自己常用的做法是,先人工准备二三十个真实场景的样例,用现成的基座模型接口跑一遍,看输出形态和业务方的预期是否匹配。这个阶段的代码质量不重要,重要的是快速验证可行性和暴露问题。等确认方向没跑偏,再回头补工程化的东西。
2. 数据工程:AI项目最容易被低估的环节
一旦进入正式开发阶段,第一个拦路虎就是数据。我见过太多团队在模型上投入了80%的精力,最后却被数据质量拖垮。数据工程在整个AI项目里的工作量占比,长期被严重低估。
2.1 数据采集和清洗的实操方法
采集数据的第一个原则是"靠近真实场景"。如果用线上真实流量训练,要特别注意采样偏差——比如只取了表现好的用户数据,忽略了沉默用户,模型上线后对这类人群会系统性失效。如果用人工构造数据,就要设计足够多样的模板,避免模型学到单一模式。
清洗阶段有几个容易被忽略的细节。一是去重要去到"语义级",比如"我要退货"和"我寻思这不退货不行啊"表面文本完全不同,但业务意图一致。二是时间敏感字段要特别小心,很多业务数据带有强时效性,训练集和线上服务的数据分布如果时间跨度太大,效果会明显衰减。三是异常值处理,不能只看数值分布,还要结合业务逻辑判断——用户年龄200岁这种脏数据丢起来不心疼,但把"用户没登录"和"用户是新客"混在一起,就会污染模型对用户意图的理解。
2.2 数据标注:钱要花在刀刃上
数据标注是AI工程里最烧钱也最容易被糊弄的一环。很多人以为标注就是找一堆人点鼠标,实际上高质量的标注是门技术活。
我给团队定的标准是"标注规范先行"。先编写详细的标注指南,不只是定义"什么是正面样本",还要给出边界情况和反例。比如标注客服对话的意图时,"用户说'太慢了'算不算投诉"这种问题,标注规范里必须有明确答案,否则十个人能标出十种结果。然后是标注质量抽检机制,我一般按5%到10%的比例抽检,用一致率指标来衡量标注质量,低于90%就说明规范还有缺口,需要返工。
另外我强烈建议做"预标注+人工修正"的策略。先用一个粗模型或规则引擎做初标,人工只需要改错和补漏。这比从零开始标注能节省40%以上的时间,而且标注质量反而更高——因为人看到候选答案后再判断,比凭空想象要稳定得多。
2.3 数据版本管理是硬需求
数据跟代码一样需要版本管理。很多团队代码库管理得井井有条,数据却散落在各个成员的硬盘群里,模型训练完了都不知道这版模型吃了什么数据。这个问题在项目复盘或问题回溯时会被无限放大。
我的做法是给数据集建立一个清单,记录五个要素:数据来源、采集时间、清洗规则、样本数量、标注版本。每次实验前先锁定数据版本,训练脚本里记录本次使用的数据哈希值。这看起来麻烦,但一旦模型线上表现异常,你需要回查训练数据时,就会感谢当初自己做了这件事。
3. 模型选型与训练策略:不盲目炼丹
模型环节是整个AI工程里"看起来很热闹"的部分。很多人一上来就想训练自己的大模型,或者拿各种SOTA结构到处试。但我的经验是,模型选型的第一原则是"够用就好",第二原则是"与部署环境匹配"。
3.1 先问自己三个问题
选模型前,先回答三个问题:任务的数据规模有多大?推理时的时延和成本预算有多少?设备是云端还是边缘端?
数据量小(几千到几万条样本),首选基座模型加微调或任务适配,而不是从零训练。基座模型已经在海量通用数据上学会了语言规律和知识,你的少量垂直数据只是帮它"调方向"。这就像找一个知识渊博的大学生,你只需要告诉他公司内部的具体规范,而不是重新教他语文和数学。
推理时延和成本往往决定了模型规模的上限。很多场景对响应速度极其敏感,一个动辄几十亿参数的模型在CPU上跑,延迟奔着几秒去,业务方根本接受不了。这个时候,要么选用更小的模型,要么做蒸馏压缩,要么调整架构——把重计算放到离线,在线只跑轻量部分。
最后是部署环境。如果边缘端设备只有2G内存,那就别选大模型;如果云端有GPU集群,那可以考虑更强大的模型。模型参数量不是越大越好,能在目标硬件上跑起来才是真的好。
3.2 微调还是模板工程?决策逻辑别搞反
每次项目里都有人问:这个场景是用Prompt工程解决,还是微调一个模型?我的决策逻辑是分层的。
第一层,看任务复杂度。如果任务能用清晰的规则描述,比如从文本里抽取固定格式的时间、地点信息,直接用结构化Prompt加上解析逻辑就够,不需要微调。如果任务需要"感受"业务特有的微妙语义,比如识别行业合同里的风险条款,这类规则说不清但样例可定义的任务,才值得考虑微调。
第二层,看样例数量。一般认为,低于500条高质量样例,微调的收益不稳定,优先考虑Prompt工程加示例增强;超过2000条,微调的效果会明显拉开差距。但是中间的灰色地带,我建议先做Prompt工程跑基线,再对比微调,用数据说话。
第三层,看长期演进。如果业务规则会频繁调整,Prompt工程的优势就很大,因为改动一个模板比重新训练部署一个模型快得多。如果业务意图相对稳定,微调的效果和稳定性会更好。
3.3 训练流程里的三个细节
真正进入训练阶段,有几个细节值得拎出来说。
第一,验证集的划分要贴近线上分布。很多人用随机划分,但这会让模型在"同分布"评估里表现虚高。我习惯按时间划分——取最后一周的数据做验证集,能更真实反映模型面对未来数据的能力。
第二,Loss曲线不是全部。训练损失降下来了,不代表模型在你的业务指标上就合格。每个任务必须在训练时就盯着业务指标,比如意图识别的F1值、生成的格式正确率。我见过模型Loss很好看,但生成结果总是多一句废话的,因为训练目标本身就和业务目标有偏差。
第三,深度学习里的"随机性"问题比大家想象中严重。同样的代码,改一下随机种子,结果能差一两个点。所以训练结束后,至少要跑三个不同随机种子做稳定性验证,取效果中位数的那份模型作为最终产物,而不是挑最好的那份——最好的那份很可能是运气,不是实力。
4. Prompt工程:它是系统的一部分,不是全部
当前AI热词里,Prompt Engineering被提到了一个很高的位置。但我想说的是,Prompt工程确实是AI落地的重要技能,但它不是魔法,更不是万能钥匙。它的定位应该是"调用模型能力时的接口设计方法论"。
4.1 结构化的Prompt模板设计
我写Prompt的习惯是把它当API文档来写,而不是当一句话来写。一个工程级的Prompt,最起码要包含五个部分:角色设定、任务描述、输入数据的Schema、输出格式约束、边界情况说明。
角色设定不是花架子,它给模型提供了一个"先验概率分布"。告诉模型"你是一名客服质检专家"和直接说"分析以下对话",模型的后续表现差异非常明显,因为模型会按照角色习惯调用对应的知识结构。
任务描述要写"做什么"和"不做什么",负面约束往往比正面描述更重要。比如总结会议纪要时,加上"不要输出行动项之外的建议,不要杜撰参会者没说过的话",能显著减少模型自由发挥的情况。
输出格式约束这块,我踩过的坑最多。模型吐JSON格式时经常出现多一个逗号、字段名飘忽的现象。我的做法是给一个完整的JSON示例,并在模板末尾再次强调严格遵循给定格式。实践下来,示例比描述格式规则管用得多。
4.2 上下文窗口是稀缺资源,要精打细算
现在很多模型支持长上下文,但用满上下文窗口往往意味着更高的成本和更慢的响应。更关键的是,上下文越长,模型越容易"迷失在中间"——核心指令放在长文本的哪个位置,直接影响遵循效果。
我的经验是,把系统指令放在最前面,关键约束在开头和结尾各强调一遍,中间放参考资料。参考资料也要做裁剪,不是所有检索到的内容都值得塞进去,相关性不够的内容反而是噪音。可以做一个简单的相关性过滤,只保留得分高的前几段,效果和成本都能兼顾。
4.3 Prompt的版本管理,别忽视
Prompt是会"腐化"的。业务方今天提出要增加一种输出字段,明天调整了分类标准,几轮迭代下来,Prompt可能已经变成了一个谁都不敢动的"祖传咒语"。
我在项目里会为Prompt建一个版本库,每个版本记录三样东西:模板内容、相应的评测通过率、业务方的变更需求。任何改动都走"改版本、跑评测、再上线"的流程,这样既能验证每次修改的效果,也能在效果退化时快速回滚。这个习惯让我避免了很多"改了Prompt之后效果波动,但不知道是哪次改动引起的"的困境。
5. Harness Engineering:把评估从玄学变成工程
这几年AI领域有一个词越来越高频——Harness Engineering。我理解它的核心是:把模型能力的测评体系工程化,让"这版模型到底行不行、比上一版强在哪、弱在哪"变成可量化、可追溯的客观结论。这也是我从项目里学到最痛的一课:不把评估体系建好,项目就是一团糨糊。
5.1 评估集怎么建才能反映真实业务
评估集建设和训练数据集建设是两套思路。训练数据追求量大面广,评估数据追求"能暴露问题"。我建议评估集里至少包含四类样本:常见的核心场景、极少但高价值的边角场景、历史上模型犯过错的困难样本、业务上的刚变更区域。
一个很有效的办法是做"对抗性评估集"。意识到模型可能在哪个环节出错,就专门构造这个方向的测试用例。比如客服意图识别系统,我故意构造"用户反问句表达的投诉""一句话里包含两个意图"这些刁钻输入。这类样本可能只有几十条,但它们在评测体系里的权重,远比几百条常规样本更有参考价值。
评估集的比例也要刻意设计。真实业务里90%是常规请求,但如果评估集也按这个比例配,模型即使常规场景做得很好,也难以发现它在长尾场景里的系统性缺陷。我一般会把长尾场景的比例人为抬高到30%左右,逼迫模型在这个方向上有足夠的表现。
5.2 评估指标别只看一个数
很多人汇报效果时喜欢说"准确率95%",但这个数字在业务方那边几乎没有意义。准确率掩盖的信息太多了:分类任务的样本不均衡下,模型把所有样本判成大类就能拿到高准确率;生成任务的"准确率"本身就无法定义。
我的做法是每个任务建立一套多点位的指标体系。分类任务至少看精确率、召回率、F1,并分别看每个类别的表现,不能只看加权平均。生成任务要拆两层:底层是格式正确率(能否解析出合法JSON、是否包含完整字段),上层才是语义贴合分(用一套rubric打分,或请业务方人工打分)。这套指标挂在每次实验报告里,哪项掉了就专项分析,而不是笼统地说"效果变差了"。
5.3 回归测试和上线门禁
模型迭代最大的噩梦是"改好了一个方向,搞坏了另外三个"。应对方案就是建立自动化回归测试。每次模型或Prompt变更,都把全量评估集跑一遍,看变更前后每个类别指标的变化。这一套流程跑顺之后,模型迭代就从"凭感觉"变成了"看报告"。
再进一步,我会把关键指标做成上线门禁——用CI的机制来卡模型发布。评估集里设几个绝对指标(比如投诉意图识别召回率不得低于90%),任何新版本如果触发红线,直接拒绝发布。这个机制在团队协作时尤其重要,它让"行不行"不再是某个人说了算,而是由数据客观裁决。
6. 模型部署与服务化:最后一段路常被忽视
模型训练完只是起点,真正让AI产生价值的是部署和服务化。很多团队在实验室里效果很好,一上生产就被打回原形,问题往往出在工程化不够。
6.1 推理服务的架构选型
部署方案的选择,本质是延迟、吞吐和成本的三方权衡。我习惯把需求列成一个表格,再选方案:
| 需求特征 | 推荐方案 | 理由 |
|---|---|---|
| 并发量高、无状态 | 容器化加水平扩展 | 弹性好,单点故障影响小 |
| 单次请求延迟极敏感 | 模型量化(INT8/INT4)+ 专用推理服务 | 显著降低单次推理耗时 |
| 边缘端轻量部署 | ONNX等中间格式转换 | 跨平台运行,占用资源少 |
| 超大模型 | 单机多卡或分布式推理 | 依靠并行切分承载超大参数 |
这里有个经验是"先量化再优化"。很多模型部署后延迟高,优先做权重量化(从FP16到INT8通常能提速2至3倍,效果损失在可接受范围),而不是立刻换更贵的硬件。量化后如果还满足不了需求,再考虑切分服务或架构调整。
6.2 上线前必须做的四类联调
模型部署不是把权重文件加载进去就完的。上线前至少要过四道联调关卡。
输入输出联调:确认前端传过来的数据格式和模型预期完全一致。这听起来很基础,但我在多个项目里遇到过一个典型的坑——线上请求里多了一个空字符串字段,模型直接把它当有效输入解析,结果行为变得诡异。
超时处理:设定合理的推理超时时间。模型推理不是数据库查询,GPU排队、突发流量都能让延迟飙升,没有超时保护的服务会把故障传导到上游。
降级方案:模型挂了或者效果不佳时,系统要怎么兜底。最简单的降级是回退到规则引擎或让请求走人工处理,哪怕慢一点也不能让用户面对一个"报错崩溃"的系统。
日志埋点:记录请求的输入、输出、模型版本、推理耗时、置信度。没有这些日志,线上出了任何问题你都是睁眼瞎。
6.3 线上监控和灰度发布
模型上线后的监控,比训练时的那些指标重要一百倍。因为线上的数据分布永远不会和训练集完全一致,模型的效果会随着时间衰减,这被称为数据漂移。我建议至少盯三个监控纬度:业务指标(比如转化率、处理成功率)、推理质量指标(从抽样的日志里人工评估输出质量)、输入分布指标(关键字段的分布变化)。任何一个指标出现明显波动,都值得立即拉响警报。
灰度发布是我必做的流程。先把5%的流量切到新模型,跑一天观察指标,如果稳定再逐步放量到30%、50%,全量。如果新模型效果不达标,立刻回滚到旧版本。这个流程成本不高,却能避免"新模型有问题但已经影响全部线上用户"的惨剧。我见过团队模型评估集跑分很高,直接全量上线,结果当天就被线上用户拍出各种边界问题,最后花了两倍时间补救。
7. 回看整个链条:一个典型案例的复盘
我拿一个曾经做过的客服工单分类项目来复盘整条链路,这样大家能更直观地看到每个环节是怎么串起来的。
这个项目的业务目标是自动判断客服工单的类型标签,并给出对应的处理优先级。最初的方案讨论时,有人提出直接上一个大规模语言模型做零样本分类。我否决了这个方案,原因很直接:工单文本里业务黑话太多,零样本分类在关键类别上的召回率只有六成左右,根本达不到上线要求,而且逐条调用大模型的成本不可控。
重新规划后,我们走了这样一条路。数据环节,拉取了近一年的历史工单,清洗后按时间划分训练集和验证集,并重点收集了那些"被客服转交过两次以上"的疑难工单作为困难样本。评估集专门构造了"客户情绪激动但意图清晰"和"一句话包含多个工单类型"这两类对抗样本。模型环节,第一版用基座模型跑结构化Prompt基线,把准确率拉到80%;然后在这个基线上收集Prompt跑偏的样本,补充了大概2000条高质量标注数据做微调,最终把准确率提到了93%以上。部署环节,模型用量化后的版本跑在CPU容器上,单次推理耗时才320毫秒,完全满足业务需要。同时在代码里埋了推理日志和输入分布监控,设置了关键类别的召回率作为上线门禁。
整个项目下来,真正花在"模型训练"上的时间只占三成,剩下的七成全部消耗在数据治理、评估体系建设和部署联调上。这个比例不是个案,是AI工程项目的常态。每次有朋友问我"搞AI是不是就是训练模型",我都会拿这个项目举例——训练只是水面上的一小块,水面下才是决定成败的绝大部分工程。
如果非要用一句话总结我这些年的体会,那就是:AI落地,模型能力是上限,工程能力是下限。把下限尽可能抬高,项目才有了确定性可言。这个领域的变化快,今天的新模型明天可能就过时了,但"以工程思路做AI"这件事本身,永远不会过时。