1. 项目概述:当AI不再只是“调接口”,工程化才是真正的分水岭
AI engineering,这个title最近一年越来越频繁地出现在技术社区的讨论里,各大招聘网站上也挂出了不少相关岗位。但如果你以为它就是把大模型API接一接、把Prompt调一调,那你大概率还没摸到这门技术的核心。我在经历了几个从零开始的AI项目之后,最大的感受是:能把模型跑通的人很多,能把它稳定、安全、可维护地跑在生产环境里的人,才是真正稀缺的。
这个“ai-engineering-from-scratch”项目,本质上是建立一套完整的AI工程能力体系——从最基础的模型原理理解,到Prompt Engineering、RAG(检索增强生成)、Agent架构设计、评测体系搭建、甚至多AI协作的落地实践,每一步都需要系统性的方法论,而不能靠零散的“试错式开发”。这篇博文,我希望能把这两年积累的经验拆开揉碎,讲清楚AI工程一条龙的知识地图,也给正在这条路上探索的朋友一份可复用的参考。无论你是刚开始接触AI开发的软件工程师,还是已经在做AI产品但总觉得差点意思的开发者,这篇文章都有你能带走的东西。
我见过太多团队在AI项目上的典型困境:模型选型拍脑袋、Gound Truth(正确性评估基准)缺失、Prompt改一次全网回归测一遍、Agent链条稍长就直接失控。这些问题表面上都是技术问题,但骨子里都是工程问题。真正的AI工程,不是算法的深奥程度,而是能否把不确定性量化、把变化控制住、把复杂度管理好。这篇文章会从为什么、是什么、怎么做三个维度,把整套思路展开给你看。
2. 内容整体设计与思路拆解
2.1 AI工程的核心矛盾与解决思路
第一个问题,AI工程和传统软件工程到底有什么本质区别?我自己的答案是:传统软件工程是在确定性的世界里做设计,而AI工程是在不确定性世界里做治理。你的代码逻辑是确定的,但模型的输出不是的;你的接口返回结构是固定的,但模型对不同输入的响应质量是有波动的。这种本质差异,决定了你不能用老一套的思维来管理AI系统。
举个例子。传统开发里,你写一个函数,输入"订单金额",输出"税额",逻辑是死板的,测试用例一写就完事。但在AI系统里,你给模型一段用户问题,它返回的答案可能今天正确、明天句式就变了;你稍微改了一个Prompt措辞,可能某个很偏门的用例反而变好了。这不是说AI不可靠,而是说我们需要一套适应这种不确定性的工程框架。
我在这个项目里设计的整体思路,是三段式协同架构——基础层、能力层、应用层。
基础层就是模型本身和部署环境。做工程的人一定要明白一个道理:模型选型是你所有上层建筑的地基。你现在用GPT-4效果好,不代表你以后都要用它;你现在用某个开源模型推理慢,不代表你换个量化版本就不行。所以基础层的核心工作是建立"模型选型的评估基准"。
能力层是整个架构的枢纽,包含Prompt模板库、知识库接入、工具调用框架、记忆管理模块、评测系统。这一层解决的问题是:让模型在我自己的业务场景里,能够稳定地输出高质量的结果。能力层的设计质量,直接决定了最终应用的智能化天花板。
应用层则是你面向用户呈现的形态,可能是聊天机器人、Copilot、自动化流程,甚至是一个多AI协作的Agent系统。应用层的关键不是模型,而是产品体验和容错设计。要知道,用户能接受传统软件偶发卡顿,但对AI的"幻觉"容忍度极低,这就倒逼工程上必须做前置校验和降级方案。
这套架构的核心优势在于"松耦合、可替换"。模型可以换,Prompt可以调,知识库可以更新,而应用层不需要重构。我早期做AI项目时最大的教训就是,把模型API调用和业务逻辑死死塞在一起,结果每换一次模型都要牵一发动全身。后来按照这种分层思路重构,替换模型的工作量从几天缩短到了半天。
2.2 Prompt Engineering的系统化方法论
很多人一听到Prompt Engineering,就觉得是"写提示词"。如果只是写几句话,那确实不需要专门开一个章节来讲。但真正的Prompt Engineering,是在做一套"可维护的、针对特定场景的交互协议"。
我在这个项目里使用的核心方法论,是CO-STAR框架——Context(上下文)、Objective(目标)、Style(风格)、Tone(语气)、Audience(受众)、Response Format(回复格式)六个维度的结构化对齐。别小看这个框架,它最大的价值不是让你的Prompt更花哨,而是让Prompt的每个部分都有了"为什么而存在"的明确目的,这为后续的调试和迭代提供了切入口。
举个例子。我曾经帮一个教育团队优化一个作文批改系统的Prompt。一开始他们给的指令特别简单:"批改学生的作文,给出建议。"模型输出的结果泛泛而谈,什么"中心思想不够突出"、"内容不够丰富",这种反馈对学生来说完全没用。后来用CO-STAR框架重构:
Context部分明确了这是给小学六年级学生的周记; Objective从"批改"改成"识别3个最具体可执行的改进点"; Style要求用鼓励性的口吻; Response Format强制结构化——每个改进点必须指出原文对应的句子、问题类型、改进示例。
结果效果立竿见影。模型给出的反馈从"内容不够丰富"变成了"你写'今天很开心'这句话时,可以具体描写一下开心的原因和表现,比如我建议改成'今天数学考了95分,同桌的李明跑过来拍着我的肩膀说这次进步真大'"。两版Prompt的差距,本质上是工程化思维和玄学思维的差距。
对于Prompt模板的版本管理,我强烈建议用Git来控制。每一条Prompt的改动,都要像代码改动一样记录在案。我有一个小习惯:每次迭代Prompt后,都会在commit message里写上"改成X格式,目的是解决Y问题,效果是Z指标提升了多少"。这样做了半年之后,你会拥有一套非常宝贵的实验记录,它会告诉你哪些措辞变化真正有效,哪些只是自我感觉良好。
2.3 架构选型背后的决策逻辑
这个项目的第二个核心决策,是构建"模型无关(Model Agnostic)"的能力中间层。如果你现在去看市面上很多成熟的AI开发框架,它们都强调一件事:不要让业务代码直接依赖某一个具体模型的SDK。我深以为然。
为什么这么强调模型无关?因为AI领域的发展速度太恐怖了。今天你用的最强模型,三个月后可能就被另一个开源模型在同等参数量下超越了。如果你把所有业务逻辑都耦合在某一个模型平台上,转换成本极高。反向来看,如果你在架构上预留了抽象层,那模型切换就变成了一次"改配置"而非"改代码"。
这个抽象层在设计上需要三个组件: 第一,统一的调用接口。不管底层是OpenAI协议、Anthropic协议、还是本地部署的模型,对上层都暴露一致的请求-响应格式。 第二,统一的上下文管理。对话历史、知识库检索结果、工具调用记录,都通过标准化的Context对象传递。 第三,统一的输出校验。模型的输出进入业务逻辑之前,先经过格式校验、内容校验、敏感信息检查三道关卡。
我接触过一个做法律咨询AI的团队,他们在早期没有做模型无关设计,结果因为成本问题要从某商业模型厂商切换到开源模型,整整折腾了三周——大量业务代码都在直接拼接模型响应的结构,改一处错一处。后来切到抽象层设计之后,再换模型两个小时搞定,剩下时间全花在回归评测上。这个案例非常典型,工程架构的早期投入,会在后续的每一次迭代中加倍还给你。
除了模型无关,我在架构上还坚持了一个原则:"能不用Agent就不用Agent"。这不是说Agent不好,而是说Agent带来了额外的自由度和随之而来的不确定性。单轮问答场景,用RAG+Prompt就能解决,何必把Tool Calling和多轮规划引入进来增加复杂度?只有在任务确实需要多步骤推理、动态决策的场景,才值得引入Agent架构。工程能力强的团队,不是会用最炫技术的团队,而是知道在什么场景用什么技术火候最合适的团队。
3. 核心细节解析与实操要点
3.1 RAG系统的搭建与优化全流程
RAG(Retrieval-Augmented Generation)是目前AI工程里落地价值最高、应用范围最广的模式。简单来说,就是让模型在回答问题之前,先从你的知识库里检索相关信息作为参考,再基于这些参考生成答案。这样既能利用大模型的通用推理能力,又能把答案约束在你自己业务的知识边界内。
RAG系统的搭建,传统上分为索引、检索、生成三个环节。但我在项目里把整个流程拆得更细,分成了七个可独立优化的节点:文档加载、文本切分、向量化、索引构建、查询改写、检索融合、生成增强。
讲几个踩过坑的细节。
文档切分是最容易被低估的一环。很多人拿一个PDF就直接整篇扔给切分器,按固定字符数切开就算完。这其实大错特错。我处理过大量技术手册,最好的切分策略是"结构化感知切分"——先把文档解析成标题树,然后保证每个切分块尽量完整地包含语义单元,比如一个章节、一个完整的说明步骤,而不是从句子中间切断。为什么要这么做?因为模型阅读一个半截句子做出来的摘要,和你给它一整段完整逻辑链条做出来的摘要,质量差距是显而易见的。如果你用的切分工具能支持markdown标题识别,一定优先用这个功能。
向量化这个环节,核心是Embedding模型的选择。我要给你一个忠告:不要盲从任何Embedding模型的榜单分数,一定要在自己的语料上测试。榜单上的平均分数是综合多个数据集的结果,而你的业务文本有自己的领域特殊性。我试过一次很有意思的实验:在两个Embedding模型上跑我们内部的故障排查文档检索,A模型在公开基准上比B模型高了两个点,但在我们的实际业务数据集上,B模型检索准确率反而高出12%。所以,一切以你的验证集为准。
检索环节,很多人只做向量相似度检索,这个也不够。成熟的RAG系统应该做混合检索——向量检索负责捕捉语义,BM25这类基于关键词的检索则负责精确匹配。为什么要混合?因为用户的查询里经常包含专业术语、编号、型号等"精确信号",这些都是向量检索会模糊化处理的东西。我建议的比例是向量检索结果、关键词检索结果做加权融合,权重通过一次小规模的离线实验来确定,通常2:1到3:1之间的区间效果比较稳妥。
3.2 Agent架构设计与Tool Calling的工程陷阱
Agent系统是AI工程皇冠上的明珠,也是最多翻车现场的重灾区。所谓Agent,就是让模型具备"规划-行动-观察-再规划"的循环能力,它能够调用外部工具、处理复杂任务。但工程视角下的Agent,核心还是可控性。
我在项目里做的Agent架构是双循环设计:短循环是执行器,负责单步工具调用;长循环是规划器,负责多步骤任务的分解和决策。这种拆分的好处在于,短循环追求速度和失败恢复,长循环追求任务覆盖度和步骤正确性。两者用不同的策略管理——短循环用白名单工具集,长循环用状态机来跟踪任务进度。
Tool Calling的工程陷阱,最常见的有这么几类。
第一类是"过度工具化"。我在早期Demo中给Agent挂了七八个不相关的工具,结果模型在简单问题上反而纠结选哪个工具,耗时成倍增加。后来做了工具集的动态路由——根据用户问题意图,先经过一个轻量级的意图分类器,只注入相关的3到4个工具定义,准确率和速度都显著提升。
第二类是"参数传递的脏数据"。模型生成的工具参数是字符串格式,但后端接口需要结构化数据。你必须要有一层严格的结构化校验,比如使用JSON Schema对模型输出进行验证。千万别把模型给的参数直接拼接进你的内部API请求,这是很多数据安全事故的源头。
第三类是"Agent死循环"。模型在一个错误的结果之上反复重试,每次都以为自己在推进任务,实际上能量全耗在无效循环里。我给Agent设计了两个保险丝:最大步数限制(通常5~8步)和重复动作检测(如果连续两步调用了相同工具且参数一致,直接中断并请求用户澄清)。
最后提一个Agent评测的问题。Agent系统的非线性决策路径导致它的评测比普通问答复杂得多。我采用的方案是两级评测:第一级,单步工具调用正确率;第二级,任务最终完成率。第一级的问题在于精细定位,第二级的问题是宏观把控。这两级指标一起看,你才能知道一个Agent系统到底行不行。
3.3 评测体系:没有度量,就没有优化
如果让我选择整个AI工程里最重要但也最容易敷衍的部分,我会说是评测体系的建设。绝大多数团队做AI项目的失败路径,都是"上线第一天效果惊艳,上线一星期开始频繁出错,上线一个月彻底失控"。这背后的根源,就是没有一套自动化、可持续的评测系统来监控每一次迭代的质量。
评测体系的设计,我从三个维度来展开。
数据层面,建设高质量的评测集是根基。评测集要怎么来?我总结了三个来源:真实用户反馈、基于业务规则的合成数据、金标人工标注。真实用户反馈最宝贵,但对冷启动项目来说样本太少;合成数据效率高但要防偏;金标标注成本高但质量最稳。我的建议是三管齐下,按照6:2:2的比例构建初版评测集,然后逐月用线上数据回流扩充。
指标层面,要区分宏观和微观。宏观指标包括答案准确率、拒绝率(应该拒绝回答时是否正确拒绝)、幻觉率(答案是否忠实于检索内容)。微观指标则和你的具体业务相关,比如电商场景的SKU命中率、客服场景的解决率。这里我非常推荐使用人工评测辅助体系来实现"小样本高置信"的判断——每个版本迭代,抽300到500条样本让人工标注,配合LLM-as-a-Judge模式,就能在没有大量人工的前提下有效控制质量底线。
流程层面,必须把评测嵌入到CI/CD流水线里。每次Prompt改动、模型更新、知识库更新,都自动触发一轮回归评测,评测结果决定是否允许发版。这个流程的落地,让AI系统的迭代从"盲人摸象"变成了"科学实验"。
4. 实操过程与核心环节实现
4.1 从零搭建一个本地知识问答系统的全记录
理论知识讲了这么多,接下来走一遍实操。我以搭建一个内部技术文档问答系统为例,整个过程完全可以在本地完成,核心组件包括一个中等规模的开源模型、一个向量数据库、一个Embedding模型、和一套编排代码。
第一步是模型选择。如果你不想过于依赖商业API,我建议用Open Source模型加量化部署的模式。模型参数量根据你的硬件条件来定,24GB显存以上可以尝试14B级别的量化版本,16GB左右的显存则选7B或8B级别更稳妥。选择模型的判断标准是:在你的垂直领域语料上测试过效果,而不是看它综合榜单的名次。
第二步是知识库准备。把内部的PDF、Markdown、Word文档统一转成Markdown格式,这一步我用脚本做了批量处理。然后根据既定的"结构化感知切分"策略,把文档切分为每条512个字左右的文本块,相邻块之间保留少量重叠,避免上下文被硬生生截断。
第三步是向量化入库。我使用开源的Embedding模型来批量生成向量,然后存进向量数据库。这一步要注意的是批量大小(Batch Size)不要设太小,不然Embedding过程会非常慢;同时做好元数据管理,每个向量要绑定文档来源、章节位置、更新时间,这是以后做结果溯源的基础。
第四步是写检索与生成逻辑。核心调用链是:用户问题输入后,先做查询改写,把口语化问题转成更规范的检索语句;接着混合检索Top-K文档块,通常K取4到6比较合适;然后把文档块和大语言模型拼接成Prompt;最后调用大模型生成最终答案。
第五步是接入评测。我为这个系统准备了200条评测用例,覆盖技术问答、操作指引、故障排查等场景。每次改Prompt跑一遍评测,重点盯准确率和幻觉率两个指标。
整个实操过程中,我至今后悔没在一开始就做的事情是:把知识更新流程自动化。原来知识库更新全靠手动上传文档,直到有一次把一份过期的手册误传上去,导致输出了一段时间的错误信息,才下决心构建知识解析、切分、入库、QA校验的全自动Pipeline。现在每次知识更新都会自动生成一份变更摘要和验证结果,这件事千万不要省。
4.2 多AI协作系统的可行性验证实验
接下来这个实验想法比较前沿——多AI协作。简单来说,就是让多个具备不同专长定位的AI(可以是多个模型、也可以是同模型的不同角色配置)协同完成一个复杂任务。听起来很高大上,但工程落地的第一步其实是验证"协作产生增量价值"。
我设计了一个验证实验:一个AI负责写代码,另一个AI负责Code Review,第三个AI负责集成测试。对比方式是,单一AI完成同样任务的最终效果评分。实验结果很有意思——在中等复杂度的需求下,多AI协作的完成质量明显高于单一AI;但在简单任务场景下,多AI协作由于通信开销和上下文膨胀,反而效率更低。
这个结论给了我很重要的工程启示:多AI协作不是银弹,它是一种有适用场景的架构模式。场景复杂度高、任务颗粒度大、质量要求严格的场景,值得引入多AI协作;交互简单、响应要求快的场景,用单模型加好Prompt就够了。工程架构上没有最先进的方案,只有最合适的方案。
实现层面,我用的核心通信机制是"共享工作区+结构化通告"。每个AI不是直接把输出内容传递出去,而是把结果连同状态、依赖、风险说明写入共享状态区,其他AI按需读取。这招可以避免多轮对话导致的上下文爆掉,也是多AI协作设计里的核心思路。如果你也想实验这个方向,建议从这个简单模式起步,先跑通流程再看效果。
5. 常见问题与排查技巧实录
5.1 高频故障与排查思路速查表
在我跑这个项目的过程中,整理了一份高频故障清单,分享给你。
| 故障现象 | 可能原因 | 排查思路与解决方案 |
|---|---|---|
| 检索结果质量差 | 切分策略不当或Embedding模型不匹配 | 检查切分块是否有完整语义单元;在自有数据集上对比多个Embedding模型效果 |
| 模型答案出现明显幻觉 | 检索上下文不足或Prompt压制不足 | 加大Top-K召回数;在Prompt中明确"仅基于提供的文本作答";必要时引入引用溯源 |
| Agent反复调用错误工具 | 工具描述模糊或意图路由不准 | 优化工具描述,明确输入输出格式与适用场景;加入工具动态选择机制;检查意图分类精度 |
| 系统响应延迟高 | 检索慢、生成慢或链路串行 | 检索加缓存;输出开启流式响应;将多步骤可并行节点改为并发执行 |
| 多轮对话记忆混乱 | 上下文窗口管理失当 | 引入摘要记忆机制;对历史对话做压缩;设定记忆持久化策略 |
| 模型输出格式不稳定 | 未做结构化约束或校验缺失 | 在Prompt内明确JSON或Markdown约束;增加JSON Schema输出校验;失败时做一次规范重试 |
5.2 后台运行细节:日志、监控与安全
日志系统在AI应用中比传统应用更重要,因为你需要它来做事后的质量追溯。我在项目里对每一次模型调用都记录回放信息,包括输入输出的完整内容、耗时、令牌消耗、检索命中的文档ID。这些日志在排查用户的每一次不满时,都是最有力的证据。
监控层面有三个指标必须设置阈值电话:接口错误率、响应延迟(P95)、内容安全拦截率。前两个是通用指标,第三个是AI特有指标。具体怎么设阈值,建议取你系统运行一周的基线数据,再在基线之上加一个合理波动区间。
安全方面有两条铁律:第一,任何模型输出在进入用户界面之前,必须经过内容安全过滤器;第二,任何工具调用在真正触发外部副作用操作之前,必须经过权限校验。这两条不是产品体验问题,是事故责任问题,希望你不要有侥幸心理。
6. 职业成长视角:AI工程的能力地图与发展路径
如果把AI工程当作一个职业方向来规划,你需要掌握的能力远不止"会调模型"。我把它拆成四层能力地图,每一层都是下一层的基础。
第一层是编程与系统设计能力。你依然要精通数据结构、算法、分布式系统、数据库,这些是AI工程的身体,没有这个基础你连模型都部署不好。
第二层是机器学习基础。你没有必要成为能推导反向传播公式的研究员,但你至少要理解模型是怎么训练的、决定模型行为的关键参数有哪些、为什么会出现过拟合、泛化能力指什么。
第三层是AI工程实践能力。包括模型服务化部署、Prompt调优、RAG构建、Agent编排、评测体系搭建、AI应用的可观测性与安全性设计。这一层是这个岗位区别于普通后端开发者的核心价值所在。
第四层是产品思维与场景理解力。你要能判断什么场景真正需要AI、什么场景用传统代码就足够。这种判断力非常稀缺,也是从"工程师"升级为"技术负责人"的关键分水岭。
日常学习路径方面,我给自己的实践方法是在实际项目里学而非堆积理论。光看书不写代码是学不会的,光写代码不懂理论又会在关键时刻做出错误决策。正确路径是:理论为实践做铺垫,实践为理论做验证,互相驱动前行。
7. 扩展实践:从单点到平台的AI工程全局
当单点的AI应用跑通之后,你会遇到一个新的问题:怎么把它做成平台化,支撑公司里的多个业务方使用?这个阶段需要你跳出手工搭建的思维模式。
平台化的核心是把能力沉淀为可复用的AI服务。比如,将知识检索做成一个独立的检索服务,提供一套标准API给各个上层应用调用;把Prompt模板做成可配置化的管理后台;把评测系统做成自助化的平台,让业务方自己上传用例、触发评测、查看报告。
这个阶段还需要引入"AI网关"的概念——所有模型调用统一经过网关转发。为什么?因为网关是集中管控模型成本、权限、频率的最好位置。你可以为不同业务线分配不同的限额,可以做模型版本灰度切换而不影响业务方,还可以在网关层统一做内容安全策略的适配。
从项目到平台,最明显的工程心智转变是"从完成到治理"——开始考虑SLA目标、故障预案、成本优化、租户隔离这些系统性问题。这也是真正的AI工程和普通AI开发在思维深度上的根本差别。
8. 写在最后的个人实战心得
这个项目做到现在,我最大的心得是:AI工程能力的成长速度,与你对"不确定性"的接纳速度成正比。你不可能一开始就做出完美的系统,但你可以尽早放下"写一次就跑"的传统软件思维,转变成"跑起来之后持续调优"的AI系统思维。
还有一件很重要的事,就是保留你的好奇心。AI工程发展地太快,我今天写的这些东西,可能半年后又有框架能做更好。但底层的能力——把问题拆解清楚、设计可评测的方案、在不确定性中建立秩序——这些才是穿越技术周期始终有效的元能力。对一个想要深耕这个领域的人来说,最值得投入的,正是这些不会被淘汰的底层能力。