提到“AI engineering from scratch”,很多人的第一反应是“不就是调模型吗?但真把一个AI想法从Jupyter Notebook挪到线上,那些没人告诉你的坑比想象中多得多。我拆解过不少AI项目,也踩过不少坑,今天围绕从零构建AI工程这条主线,聊聊比算法本身更重要的事。
这篇文章不是教你装一堆框架,而是想帮你建立一套能落地的工程思维。它适合准备从零搭建AI应用的开发者,在传统软件团队负责AI功能落地的工程师,以及被“模型准确率95%”迷惑、上线后才发现问题一堆的项目负责人。读完你会明白AI工程到底在解决什么问题,技术栈怎么选,哪些坑必须先避开。我会把数据、Prompt、评估、Agent、上线运维这些环节全部串起来讲,尽量说人话,拿我自己实操过的场景做例子。
1. 为什么需要“AI工程”,而不只是写AI代码
1.1 从Jupyter Notebook到生产系统,差的不只是部署
写一个demo很容易,把demo变成稳定服务,这道坎才是工程化的开始。Notebook里的模型能跑,但没人知道数据怎么更新、输入漂移了怎么办、Prompt改了会影响多少用户。这就像在厨房做一道菜和开一家餐厅的差别——菜谱可以反复试,餐厅却要考虑供应链、出餐速度、口味一致性。AI工程就是这套“餐厅级”的管理体系。
我早期给某客户做FAQ问答机器人,demo阶段准确率不错,上线后第一周就遇到用户问“你们放假吗”时出现答非所问。原因很简单,线上提问方式和训练数据分布差异太大。如果没有工程化的数据回流和评估机制,这种问题靠拍脑袋根本发现不了。所以AI工程的核心价值不是“把模型跑起来”,而是“让模型在不确定性中持续可预期地工作”。
传统软件的逻辑是确定性的,输入相同输出必然相同;AI系统是概率性的,同样输入可能给出不同答案。这种不确定本质要求我们用新手段去测试、监控、治理。很多人把AI项目失败归因于“模型能力不够”,但更多时候是因为没有对应的工程体系去支撑它。
1.2 AI工程、机器学习工程与软件工程的区别
机器学习工程更多关注模型训练、特征工程、模型部署;AI工程在生成式AI时代被推向了更高层,除了模型,还要处理Prompt、外部知识库、工具调用、Agent编排、上下文管理等问题。软件工程提供了底座,比如版本控制、CI/CD、代码审查,但AI工程还需要补充数据版本、模型版本、实验追踪、在线评估等环节。
有人问:现在一个人用模型API就能做出AI应用,是不是不需要工程化?短期demo可以,但一旦涉及业务连续性、成本控制、合规要求,没有工程体系的项目必然失控。一个人用云服务器也能搭网站,但银行系统不会这么干,因为SLA、审计、灾备都要工程支撑。AI应用只要面向真实用户,就必须把“不确定性”纳入管理范围。
AI工程还要求团队分工发生变化。再小的项目也要有人管数据、管评估、管成本。我在实践中发现,很多AI项目失败不是因为没有好模型,而是因为没有人对“评估标准”负责。模型换了、Prompt换了、知识库更新了,到底变好还是变差,说不清楚。所以AI工程的第一步往往不是选框架,而是定评估体系。
2. 从零搭建AI工程的完整技术栈
2.1 数据与实验的“地基”:版本控制、追踪与管理
从零开始最容易忽略的是数据版本管理。很多团队用文件名加“final_v2_最终版”来管理数据,这本质是灾难。推荐用DVC或lakeFS管理数据集版本,保证每次实验都能回溯到用哪一批数据和哪个模型版本产生的效果。实验追踪用MLflow或Weights & Biases,记录参数、指标、产物,形成实验历史。
这样做的价值在于复现。模型是随机训练的,Prompt是大语言模型生成的,谁也不能保证昨天跑的结果今天还能复现。有了版本化记录,至少能在出问题时定位到底改了哪个变量。我在实操中习惯用一套约定:数据、代码、模型、评估结果四者必须能通过一次commit关联起来。这个习惯看起来繁琐,但能在事故排查时省下几天的加班时间。
另外,所有外部API调用都要封装成独立模块,配置项走环境变量,不要硬编码在代码里。模型名称、温度、最大Token数这些参数要集中管理。我见过太多项目因为某次手动调试把temperature调高,结果上线时忘了改回来,整体回答风格变了,排查半天才发现是配置问题。
2.2 模型接入层:Prompt Engineering的系统化方法
Prompt Engineering不是“写几句花哨的话让模型听话”,它是把人对模型的要求转化为可复用、可评测的接口。系统化做法有三个关键点:
- 明确目标格式:不要只说“提取信息”,要定义输出的JSON Schema。
- 用示例约束行为:Few-shot的例子要覆盖边界情况,而不是只给正常案例。
- 把Prompt当代码管理:存到Git仓库,写版本号,改Prompt要过评审,就像改API一样。
从零开始建议把所有Prompt收集到一个目录,分场景维护,并用Pydantic或JSON Schema校验模型输出。这样做的好处是,Prompt的改动可以通过回归测试来验证,避免“修好一个问题引入三个新问题”。
一个具体例子:让模型做“从邮件中提取关键信息”的任务。第一版Prompt直接说“提取字段”,输出格式不稳定;改成“总是返回JSON格式,包含字段:sender, date, action, confidence”,再用Few-shot给出两个带格式的示例,正则校验失败率从20%降到0.5%。Prompt工程不是玄学,是“定义清晰+示例对齐+格式约束+回归测试”的四步循环。
2.3 应用编排与基础设施:框架不是银弹
自从LangChain出现,好多团队一上来就全套上,结果发现它包太多隐性问题:升级频繁、抽象复杂、调试困难。我的经验是:初期尽量少依赖框架,用原生代码封装LLM调用和工具调用,把每个环节显式暴露出来。等规模大了,再把通用逻辑沉淀成内部工具库。
基础设施层面要注意:LLM服务要开日志、加缓存、设超时和重试;向量数据库选型要看检索效果、过滤能力和运维成本;开源模型的自部署要评估硬件占用和延迟。说到底,AI工程的技术栈不是“越新越好”,而是“出了问题你能不能快速定位”。框架再花哨,日志缺失只能两眼一抹黑。
3. 落地AI工程的核心环节:以LLM应用为例
3.1 需求拆解与场景定义:别让模型干它不擅长的事
做AI应用第一件事不是写代码,而是定义“模型只负责这一个小环节”。比如做客服机器人,不要把期望设成“模型解答一切”,而是让模型分类、检索、生成,三个环节各司其职。分类用传统算法或小模型,检索用向量库,生成用大模型。这样既可控又省钱。
场景定义还要明确失败模式。比如“用户输入超长”“问题不在知识库中”“模型幻觉”分别怎么处理。我见过很多项目上线后才发现不知道“答不上来”算不算失败,就是因为在需求阶段没写清楚可接受标准。把失败模式变成产品规则,是工程化思维和玩具demo的分水岭。
3.2 Prompt设计与迭代:从直觉到实验
Prompt优化不能再靠拍脑袋。我的方法是建一个评测集,至少50条,覆盖典型场景和边界case,每次改Prompt后跑一遍,记录通过率、格式错误率和用户反馈。评测集可能要占30%的时间,但这是决定AI应用质量的最重要投资。
有人觉得50条太少,但在项目早期,50条足以拦截绝大多数明显回归。后续每两周扩充一次,把线上真实case标注后回流进来。评测集不要求完美,但要求稳定更新。把Prompt看作代码,把评测集看作测试用例——两者缺一不可。
Prompt迭代过程中,还要特别注意温度和top_p这类采样参数。它们会改变输出分布,但很多团队从没调过。我给客户做法律文本摘要时,把temperature从1.0降到0.2,答案更忠实原文,幻觉明显减少。参数调优要和Prompt一起进实验记录,不要只记录Prompt文本。
3.3 RAG架构与知识基座:检索质量决定上限
RAG(检索增强生成)是当前AI应用解决“模型不知道最新信息”的主流方案。核心链路是:文档切分、Embedding、向量存储、检索、重排序、生成。每一步都有坑,我这里逐个说。
文档切分别机械按字数切,最好按语义边界(标题、段落)切,并保留块之间的上下文。比如一份合同文件,如果按500字硬切,很可能把甲方的权利义务切成两段,导致检索时只能召回一半。现代切分方法通常混合使用结构识别和语义相似度,先按标题形成候选段,再根据内容边界微调。
Embedding模型要和领域数据匹配,通用模型对专业术语效果差。检索效果不要只看Top-1准确率,要看Recall@10,因为生成环节还能做二次筛选。重排序模型能显著提升召回精度,但会增加延迟,需要权衡。建议用RAGAS这类框架,自动计算忠实度、答案相关性和上下文精度,用数据驱动参数优化。
还要注意向量数据库的过滤能力。如果业务有权限体系,用户的提问必须限定在可见文档范围内,那向量库就要支持元数据过滤或权限检索。我在一个知识库项目里因为忽略了权限过滤,导致模型偶尔引用到用户无权访问的文件,差点酿成合规事故。RAG不只是检索准确,还要检索安全。
3.4 “AI测试开发”:如何测试一个不确定的系统
“AI测试开发”这个词最近很热,在我看,它的核心挑战是:传统断言不适用,模型输出没有唯一正确答案。但测试依然要做,做法是把“模糊”转化为“可度量”。
- 单元测试:验证Prompt中的工具函数、解析逻辑、格式校验。
- 集成测试:验证完整链路,比如模拟用户输入,检查最终答案是否覆盖关键信息。
- 回归评估:准备标注好的评测集,自动跑模型,比较新旧版本的指标。
- 线上监控:记录实时输入输出,定期抽检,计算“人工满意率”“无答案率”等业务指标。
我给自己立过一个规矩:没有自动化评估的AI项目不许上线。哪怕初期只做一个10条case的冒烟测试,也比裸奔强。逐步扩充评测集,把生产环境里发现的问题不断回流进去,形成闭环。这个闭环就是AI工程里的“loop engineering”——通过反馈不断修正系统,而不是放任自流。
具体实现上,评测集可以用表格或JSON管理,每条case包含输入、理想输出模式、关键词或评分规则。自动化测试脚本将运行结果写入报告,在CI流程里设置阈值,比如“格式错误率不能超过1%”“关键信息覆盖率不能低于90%”。只要指标不达标,就阻止合并代码。这样做看起来严格,实际上能省下大量线上返工成本。
3.5 部署、灰度与成本控制
AI应用部署不能像传统服务那样“重启就完事”。模型版本、Prompt版本、知识库版本都是变量,灰度发布必须伴随评估。建议用流量切分:先让5%流量走新版本,对比线上用户反馈和指标,再逐步放量。一旦发现“答非所问率”上升,立刻回滚到旧版本。
成本控制是另一个大坑。LLM按token计费,上下文越长成本越高。解决方案:缓存常见问题答案,用模型分级(大模型负责困难case,小模型负责简单case),压缩上下文(摘要、只传检索到的相关内容),并在网络层做超时和重试的限流,防止单次异常请求烧掉大量Token。
这里分享一个真实数据:一个客服问答系统,上线前每天成本预计50美元,第一次实际跑出300美元。原因是每个问题都把完整历史记录塞进Prompt,Token翻了几倍。后来加了会话摘要和时间窗口过滤,成本直接降到40美元以下。成本控制不是抠门,是工程化必须做的预算约束。
4. AI Agent工程的要点与陷阱
4.1 Agent的本质:从“问一句答一句”到“自主完成任务”
Agent不是简单加个循环调工具。它的核心是:模型根据用户目标,规划步骤,调用工具,观察结果,调整策略。听起来很好,但工程复杂度也上了好几个量级。我的建议是从最简单的框架入手:先定义清晰的状态机,模型每一步只能做有限的动作,不要给它无限自由。
很多人把Agent做成“套了循环的一次性脚本”,结果就是工具调用失败后死循环,或者上下文越来越长。工程化做法是给Agent加“护栏”:最大步数限制、超时控制、危险操作的确认机制、完整日志追踪。这些都是在从零打造AI Agent时容易忽略的,也是项目能否稳定交付的关键。
4.2 工具调用与上下文管理:别让上下文爆炸
工具调用最典型的问题就是模型乱传参。比如搜索工具期望“q”参数,模型可能传“query”。解决方法是给每个工具写严格的JSON Schema描述,并在Prompt里强调“必须严格按Schema传参”。另外,工具返回内容可能很长,直接塞进上下文会快速烧Token。我一般在工具返回处做截断或摘要,只保留结构化关键信息。
上下文管理是对Agent可用性的极限约束。除了截断,还可以用“记忆窗口”:用摘要记忆替代全量历史;设定“反思”节点,只保留与当前任务相关的信息。实测下来,上下文控制好了,效果提升比换大模型还明显。
还有一点:Agent的每一步动作都要有日志。包含动作名称、参数、返回结果、Token消耗、耗时。没有这类日志,Agent出问题根本没法排查。我甚至会把Agent的推理链(ReAct的thought/action/observation)记录下来,既方便调试,也能用来做安全审计。
4.3 多Agent协作:从单线程到多角色
最近“多AI协作”很火,但我要泼个冷水:多Agent不是万能,它把单Agent的崩溃概率指数级放大。多Agent适合的场景是“各司其职”协同,比如一个负责搜索、一个负责总结、一个负责审核,让一个Agent同时干多件事反而容易混乱。
协作的关键是设计清晰的通信协议:消息格式、任务分配、终止条件。每个Agent要有专门的“交付物定义”,否则中间结果没人接得住。另外,必须做事件追踪和审计,不然出了问题根本不知道是哪个Agent的锅。我建议新手不要一上来就上多Agent,先把单Agent做到稳定,再逐步扩展。
4.4 常见失败模式与治理
我整理过一份Agent项目失败清单,最常见的有:Agent陷入循环,解决方案是最大步数+检测重复动作;工具调用失败后吞掉错误,解决方案是强制把error透露给模型;上下文被无关内容占满,解决方案是记忆压缩;模型自作主张调用高成本工具,解决方案是白名单+预算监控。
这些问题的共性是“缺少工程约束”。Agent再聪明,也必须在边界内运行。AI工程之所以叫“工程”,就是因为我们要为不确定性设计确定性的流程和兜底,而不是指望模型自己变完美。所以凡是Agent项目,都要在企业级日志、权限、审计方面补课,这部分工作量往往比写Agent逻辑还大。
5. 零基础实践路径与避坑指南
5.1 三个月从入门到工程化的路线图
给从零起步的朋友一条可复制的路径:
- 第1个月:打好基础。掌握Python、REST API调用、熟悉模型API文档,学会写好Prompt。
- 第2个月:做一个小而全的RAG项目。要求:数据清洗、向量化、检索、评估、日志记录都别落下。
- 第3个月:加入Agent和自动化评估。给项目写自动化测试脚本,搭建简单的CI/CD,把评估结果可视化。
这条路的关键不是做多少项目,而是每个项目都按工程规范交付:代码可review、数据可追溯、评估可复现。三个月的目标不是做出“炫酷的demo”,而是养成“先定义指标再动手”的习惯。中途如果卡住,不要急着加框架,先把日志和评估补上,大部分问题都会自动暴露出来。
5.2 常见问题速查表
我把自己踩过的坑整理成速查表,方便大家排查。
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 模型输出格式时好时坏 | Prompt缺少格式约束 | 用JSON Schema校验,加Few-shot示例 |
| RAG检索召不回关键信息 | chunk切分过大/embedding领域不匹配 | 调整chunk size,换领域Embedding模型,加Rerank |
| Token成本忽高忽低 | 上下文无限制增长/重复调用 | 缓存、压缩上下文、工具返回截断 |
| Agent陷入死循环 | 缺少最大步数和重复检测 | 设置步数上限,检测相似动作序列并中断 |
| 上线后效果明显下降 | 评估集未覆盖线上数据分布 | 持续回流线上真实case到评估集 |
| AI回答“一本正经胡说” | 幻觉,且未启用引用和纠错 | 要求模型给出引用,不支持的问题要拒绝回答 |
这个表只是入口,真正的排查还要靠日志和可观测性。建议从第一天就给每次LLM调用打上request_id,记录输入输出、Token数、耗时。这样遇到问题才有据可查,而不是靠猜。
5.3 我的几点实操体会
我在实际项目里踩过不少坑,最突出的体会有三条。
第一,数据质量比模型参数更重要。一个13B的小模型喂好数据,能吊打一个盲目喂数据的7B模型。AI工程的重心应该放在数据基座上,而不是无脑追新模型。
第二,评估是工程化的灵魂。没有评估标准,项目就会变成“你说好我说不好”的玄学。哪怕评估集只有几十条,也比没有强。而且评估集要持续更新,让它跟上真实业务的变化。
第三,从零开始不要什么都想自己做,也不要什么都用框架。模型、向量库、云服务,能用托管就用托管,但在评估、日志、监控这些决定“谁对项目负责”的环节,一定要亲手搭清楚。
如果你正准备从零搭建AI工程,我的建议是:先别急着写代码,花一周时间把你的目标场景、成功指标、失败模式、评测策略写在纸上。这比什么框架选型都重要。等你想清楚了,你会发现实际的工程实现反而没那么难了。
最后再分享一个小技巧:每个AI工程都准备一个“账本”,记录每次修改的原因、期望影响和实际结果。这个账本会越来越值钱,因为它记载了从直觉到规律的完整路径。