1. 项目概述:从零开始构建AI工程能力
我见过太多人把"会调API"和"懂AI工程"混为一谈。几个月前,当我决定系统性梳理自己的AI工程能力时,发现网上要么是单点技术讲解,要么是铺天盖地的概念科普,极少有人把从需求分析到模型部署的完整链路讲透。这也是我想写这个主题的原因——从零开始,不是从"Hello World"开始,而是从建立一套可复用的工程思维开始。
这个项目想解决的问题很实在:当你在真实业务场景中落地AI能力时,遇到的80%的坑其实不在算法层面,而在工程层面。数据怎么管理、模型怎么评估、提示词如何迭代、服务如何部署、成本如何控制,这些问题没有系统的工程框架,做出来的东西永远停留在Demo阶段。
适合谁来参考?如果你是刚入门AI开发但不想只停留在调参层面的工程师,或者已经在用大模型API做功能但觉得每次改动都像打地鼠的开发者,再或者是想在公司内部建立AI工程规范的团队负责人——这篇文章的价值是帮你把零散的经验串成体系。我不会讲太多高深的数学原理,重点是那些真正能用在一线实战中的方法和套路。
2. 体系拆解:AI工程化的核心框架与选型逻辑
2.1 从"能跑通"到"能上线"之间的距离
很多人觉得AI应用开发门槛低,因为现在调用大模型API确实太容易了,几十行代码就能做出一个看起来不错的聊天机器人。但真实场景中,从"能跑通"到"能上线",中间隔着一整条工程化的鸿沟。
我在实际项目中总结过,一个AI能力要真正落地,需要同时解决四个核心问题:数据怎么来、效果怎么评、服务怎么稳、成本怎么控。这四个问题任何一环脱节,项目就会陷入"开发一时爽,维护火葬场"的困境。
就拿最容易被忽视的评估环节来说。很多团队做大模型应用,评估全靠"感觉"——觉得回答得还行就上线了。可一旦你要迭代提示词、换模型版本,没有一套量化的评估机制,你根本不知道改动到底是变好了还是变差了。我在一个实际项目里就吃过这个亏:盲目更新了一次模型版本,结果核心场景的回答质量其实下降了15%,但因为依赖人工抽查,两周后才在用户投诉中发现。
2.2 技术选型的基本盘
AI工程化的技术选型,我建议遵循一个基本原则:能选成熟的不选热门的,能选简单的不选复杂的。这里说的成熟和简单,指的是生态完善度、社区活跃度、学习曲线这三项指标的综合权衡。
模型选型上,现在的主流思路是分层策略。基础能力调用大模型API,比如文本理解、生成、推理对话;垂直场景自建小模型,比如意图识别、实体抽取、内容审核这类任务,用开源模型微调反而更可控。这种分层的好处是成本灵活——高频低复杂度任务走小模型,一天几万次调用成本可能只有大模型的十分之一;低频高复杂度任务走大模型,质量有保障。我做过一个内容分类系统,最初所有文本都扔给大模型做分类,一个月账单接近五位数,后来把高频分类任务迁移到微调后的开源模型上,成本直接降了一大截,准确率还提升了两个点。
工程框架上,Python生态依然是AI工程的主力,核心组合是FastAPI做服务层、Pydantic做数据校验、Docker做容器编排。这套组合的优势是类型安全、文档自动生成、部署方便,团队协作成本低。前端集成方面,如果是内部工具,用Streamlit这类快速开发框架能极大压缩交付周期;如果是面向用户的产品,还是走常规的前后端分离架构。
2.3 项目管理上的工程思维
很多AI项目失败,死在管理方法上。传统软件工程的瀑布流不适用,因为AI能力的边界一开始就是模糊的;但完全敏捷也不对,因为AI项目天然有探索属性,纯粹的敏捷流会让团队陷入无休止的试错。
我推荐的做法是"阶段化交付+里程碑验证"的组合模式。第一阶段先花两周时间做技术验证(Proof of Concept),目标只有一个:用最小成本验证核心场景的AI能力是否可行。这个阶段不追求完美,快速打通"输入-处理-输出"链路即可。第二阶段进入原型开发,把评估体系、数据回流机制搭建起来。第三阶段才进入正式的工程化开发,这时候你已经有了足够的信息来精确定义接口规范、数据结构和服务级别协议。
这套流程的核心价值是规避最致命的风险——在不确认AI能力边界是否匹配业务需求前,就投入大量资源做系统建设。我自己经手过的项目里,至少有三分之一是在PoC阶段就发现方向需要调整的。早发现一天,就省一天的时间成本和资金成本。
3. 核心细节解析:AI应用开发的关键环节
3.1 提示词工程:从玄学到科学
提示词工程是AI工程里最容易被低估的环节。很多人觉得就是"把需求写清楚一点",但实际上,一套可维护、可评估的提示词体系,需要严格的工程方法。
我维护提示词的原则是三条:模块化、版本化、模板化。
模块化指提示词按功能拆块——角色设定、任务描述、输入输出格式、约束条件、示例样本各成一段,每段可以独立修改而不影响其他部分。例如一个信息抽取的提示词,我会把"抽取规则"和"输出格式"分开两段,这样调整规则时不用动格式定义。
版本化要求每次改动都留记录。我见过太多团队用"final_v2_最终版"这类命名方式管理提示词,改到最后根本不知道线上跑的是哪个版本。我的做法是用代码仓库管理提示词文件,每次修改都走提交记录,回滚也方便。这个习惯在模型升级或者业务调整时价值极大——你能清晰知道哪些改动带来了效果提升,哪些是无用功。
模板化则是把提示词的变量部分和固定部分剥离。固定部分应对场景稳定不变,变量部分是每次调用时的动态输入,比如用户提交的原始文本、特定的上下文数据。这样提示词的变化范围被收拢到可控的变量插槽里,减少出问题的概率。
对于提示词里的示例样本,我建议数量控制在3到5个,既要覆盖典型场景,也要包含边缘场景。少一个典型样本,模型可能"理解不了"任务意图;少一个边缘样本,你可能把"55开"的话术漏过去不处理,上线后就是事故。
3.2 RAG系统的搭建与优化
RAG(检索增强生成)几乎是目前大模型落地最热门的模式。它的核心思路很直白——模型不懂的行业知识和私有数据,通过外部检索喂给它,让它基于真实材料来回答,而不是凭空编造。但真正把RAG做好,工程细节非常多。
最关键的三个环节是文档切分(分块)、向量化、检索策略。
文档切分是决定效果上限的第一道卡。切得太粗,超出模型的上下文窗口;切得太细,又会失去语义完整性。我在实践中总结的经验是:优先按章节或语义段落切分,在此前提下单块字数控制在500到800字之间。如果文档本身具有强结构,比如操作手册,可以直接按"标题+正文"的层级来切。切分块之间要保留少量重叠,避免关键信息刚好落在两块交界处被切断。
向量化部分的核心是Embedding模型选型。中文场景我个人常用的是开源的BGE系列,效果稳定且对中文支持好。向量数据库的选型,如果是轻量级应用,单机场景可以用轻量化的方案;生产环境需要考虑并发、扩展性和过滤能力,我目前用的是Milvus,高并发场景下的性能表现靠谱。
检索策略的提升空间往往被忽略。很多人用最简单的向量相似度搜索完事,但实际业务中,混合检索(向量检索+关键词检索)的效果通常比单一模式好很多。关键词检索保证精确匹配不遗漏,向量检索覆盖语义泛化,两者结果做重排(Rerank)。重排模型的选择直接影响最终效果,我经历过一次检索率从60%左右提升到80%以上的过程,关键动作就是引入重排环节——用更高精度的模型对粗召回的候选结果精排,牺牲部分性能换取准确度是值得的。
3.3 评估体系的建立是头等大事
如果说RAG是大模型应用的身体,那么评估体系就是它的神经系统。没有评估,一切优化都无从谈起。
评估不只是"对或者不对",至少要分成三个维度:准确性、忠实度、相关性。准确性指回答内容是否与问题匹配;忠实度指回答是否严格基于给定的上下文材料,还是模型自己发挥编造了不存在的细节;相关性指回答是否直接回应了用户问题而不是绕圈子。这三个维度的评判,可以用大模型打分自动化,也可以人工标注,我建议是两者结合——批量场景用大模型打分,抽样场景人工复核,既能保证效率又能校准评分标准。
建立评估集也是一门学问。我从实际项目里总结出来的经验是,评估集需要至少覆盖三类样本:第一类是典型场景样本,就是业务中最常见的请求类型;第二类是边界场景样本,比如流程类问题中那些多步骤、跨分支的复杂提问;第三类是陷阱场景样本,就是容易诱导模型产生错误判断的敏感问题。三类样本的比例建议在6比3比1左右,过于偏重典型样本会掩盖真实用户遇到的问题。
评估跑通了,后续的模型选型、提示词迭代、重排策略调整才有依据。我现在每做一次模型版本升级或提示词结构调整,都会先在固定评估集上跑一遍全量比对,效果曲线一目了然。
4. 实操过程:一个AI应用从零到上线的完整链路
4.1 需求定义与架构设计
拿一个我最近完成的智能客服项目来举例。需求很典型:给一个SaaS平台做工单自动分诊,用户提交问题后,系统自动识别问题类型并把工单分配给对应部门。
需求定义阶段,我没有急着写代码,而是先和业务方厘清三件事:输入的范围是什么(用户会用什么方式描述问题)、输出的要求是什么(分类体系有几类、是否允许转人工)、效果底线是什么(准确率达到多少才可接受)。这三件事没对齐,后面开发全是白费。
架构设计上,我采用了经典的三段式:
- 输入层:接收用户问题文本,做基础清洗(去重、超长截断、敏感词预检)
- 理解层:调用意图识别模型,输出问题类型和置信度,同时做关键词抽取辅助部门匹配
- 分发层:根据理解层的结果,按规则引擎(优先级规则+置信度阈值)把工单分配到指定部门队列,低置信度的自动转人工
这个架构的妙处在于,每一层都是可替换的。理解层的模型可以从小模型换到大模型,分发层的规则也可以灵活调整,不影响整体骨架。
4.2 核心代码实现要点
这里分享几个核心环节的实现思路。意图识别部分,我没有直接用大模型API裸跑,而是先用一个本地小模型(微调过的开源中文模型)做主分类,遇到低置信度样本再升级到大模型兜底。这样设计的考虑很实际:高频请求走低成本路径,低频困难样本走高质量路径,整体成本能控制住。
from fastapi import FastAPI, HTTPException from pydantic import BaseModel import httpx app = FastAPI() class Ticket(BaseModel): content: str user_id: str class TicketResponse(BaseModel): category: str confidence: float need_manual: bool INTENT_LEVELS = [ (0.8, "auto"), (0.5, "llm"), (0.0, "manual") ] @app.post("/ticket/classify", response_model=TicketResponse) async def classify_ticket(ticket: Ticket): rule_result = await predict_local(ticket.content) confidence = rule_result["confidence"] for threshold, route in INTENT_LEVELS: if confidence >= threshold: return handle_route(route, ticket, rule_result) raise HTTPException(status_code=400, detail="Classification failed")这个代码的核心逻辑是分级路由。置信度大于0.8直接走自动分类;0.5到0.8之间走大模型二次确认;低于0.5直接转人工,并在工单上标注"疑似复杂问题"。这个分级策略上线后,整体自动分类准确率稳定在86%左右,人工介入率比原来降低了差不多四成。
大模型二次确认的部分,关键在于提示词设计。我用的模板是"你是一名客服工单分类助手,以下是用户问题原文和初步分类结果,请判断分类是否正确。如果不正确,输出你认为的正确分类,并给出简短理由。"
注意这里要求模型输出结果的同时给理由,一方面能校验模型是否只是盲目跟随,另一方面,抽查时也能通过理由回溯到问题源头。
4.3 模型部署与性能考量
部署环节,本地小模型走常规的自托管方案。我用的配置是Docker容器化部署,内部用进程管理工具做常驻服务,对外提供统一HTTP接口。这里踩过的一个坑是并发处理——很多模型推理框架默认是单线程的,直接暴露给外部服务很容易出现请求排队,表现为主体无响应或超时。
解决方式是用消息队列做削峰:外部请求先进队列,消费端按批次拉取数据做推理,结果通过回调或者查询接口返回。这套方案在突发流量下表现稳定,不会因为单次推理过慢拖垮整个服务。
大模型API调用部分,我总结了三个优化策略:
- 缓存策略:相同问题短期内重复出现的情况在客服场景非常常见,引入语义缓存(基于向量相似度做缓存命中判断)能省掉大量重复调用费用
- 超时策略:大模型API的响应时间波动很大,必须设置合理的超时时间并设计重试机制。我通常设三档重试:第一次8秒超时,第二次10秒,第三次12秒,超过三次直接降级转人工
- 批量策略:如果业务允许非实时响应,把多个请求合并成一次API调用,按行分隔符输出结果,成本能降低20%到30%
我实测过一个场景:加了语义缓存后,客服系统的API调用量直接下降了接近三成,对没有技术背景的业务同事来说,这个数字比什么优化都直观。
4.4 上线前的安全检查
安全这块我必须多说几句,因为AI应用比传统应用多了一层内容安全的复杂性。核心是输入过滤和输出过滤两层。
输入过滤至少要覆盖:注入攻击(恶意引导模型越权执行的指令)、非法内容、以及各种绕过策略的变体。输出过滤则要保证模型生成的内容符合规范,特别是面向C端用户的产品内容安全,这是底线红线。
技术实现上,可以在网关层统一做内容和文本的合规校验。基于开源模型自建或者用第三方接口都行,关键是必须在主业务链路之前完成过滤,而不是靠事后抽查。
5. 常见问题与排查技巧实录
5.1 响应延迟居高不下
症状:接口调用平均耗时要好几秒,用户流失率明显上升。
排查路径:先看延迟分布——是整体都慢,还是部分请求特别慢。如果是整体慢,大概率是模型的输入长度太长,或者上下文窗口设置过大。我在一个项目里发现模型输入中带着超长的历史对话,上下文窗口基本满负荷运行,推理速度自然上不去。解决方式是把历史对话做滑动窗口截断,只保留最近几轮和关键信息摘要。
如果是部分请求慢,重点检查超时重试逻辑。很多框架默认的超时策略是全量等待,一个慢请求会拖住整个线程池。应该锁定单独的超时配置,并利用超时降级机制,不等待慢响应。
5.2 回答质量波动,时好时坏
这是大模型应用的典型问题。排查时先分场景:同一个问题多次调用结果是否稳定?不同问题之间是系统性偏差还是偶发波动?
如果是系统性偏差,比如某些类型的问题总是回答不好,那基本是提示词设计或数据来源的问题。如果是偶发波动,大部分情况下是采样参数的问题。我建议把Temperature参数调低,比如设定在0.2到0.4之间,同时开启长稳定输出模式,回答质量的一致性会显著提升。代价是回答可能略显保守,但对绝大多数业务场景来说,稳定性远比创造性重要。
5.3 语义缓存命中率低,成本降不下来
缓存命中率低,最常见的两个原因:一是向量相似度阈值设得过高,二是缓存键设计不合理。
阈值方面,我的经验是不要死扣精确匹配。先跑一段真实流量看相似度分布,再定阈值。如果相似度集中在0.9以上,阈值设在0.92左右比较合适;如果分布比较分散,可以考虑降低到0.85。关键是反复调整,不做指标对比就无法判断。
缓存键设计上,需要把核心语义信息和噪声信息分开。用户问题的有效信息通常在规范化的文本中,比如脱敏处理后的数据里。我在实践中发现,做了基本的同义词归一化后,缓存命中率能提升大约10个点。
5.4 数据回流机制缺失,迭代无从下手
很多团队做完第一版上线后就停止了演进,问题在于觉得"模型跑起来了就完事了"。实际上,AI应用的护城河是数据——你沉淀的每一份用户交互数据都是下一轮优化的燃料。
我建议从上线第一天就搭建数据回流链路。核心是两块:一是自动记录每次请求的输入、输出、置信度、用户反馈(满意与否),给每个样本打标签;二是定期抽样做人工标注,把错例归因(是数据缺失、提示词问题,还是模型能力不足),形成迭代需求的来源。
这套机制跑起来之后,每个月迭代一个小版本,对比线上数据和评估集数据,优化方向会很清晰。成本不高,但对产品的持续竞争力来说是不可或缺的基础设施。
6. 工程实践的进阶方向
6.1 从单点AI到Agent系统
当业务场景复杂到单次问答无法覆盖时,就要考虑从"单点AI能力"升级到"Agent系统"。
Agent的本质是让AI具备自主规划与工具调用的能力。比如客服场景,不只是回答问题,还要查订单、翻历史记录、操作后台系统——这时候靠一段提示词已经做不到了,需要Agent按需调度不同的工具。
我的建议是不要把Agent想得太神秘,它的核心就是一个循环:感知(接收任务)→ 规划(拆分子任务)→ 执行(调用工具或多个模型)→ 观察(获取结果)→ 再规划(决定下一步)。实现上可以从最简单的"固定工作流Agent"开始,把流程节点先定义好,再逐步增加自主决策的能力——先从工程可控的确定性流程上路,比一上来就做开放式自主Agent要稳得多。
6.2 多AI协作的设计模式
多AI协作(多Agent)是比单Agent更进阶的一层。核心思想是让不同的AI各司其职,形成协同效应。比如在内容生产场景里,可以拆成选题Agent、写作Agent、审核Agent三个角色。选题Agent负责出方向,写作Agent负责生成初稿,审核Agent负责检查事实性和合规性。
多Agent协作的关键是角色隔离和消息协议。每个Agent只关心自己的输入输出格式(协议),不直接读对方的内部状态。协议用类型化结构体定义,别用自然语言裸传——一旦消息传递的语言漂移,整个系统的行为就会失控。我在实践中深有体会,当我给每个Agent定义了严格的输入输出Schema之后,调试成本大幅下降,行为也变得更可预测。
设计协作流程时,先想清楚哪些环节是可以并行的,哪些必须串行。串行环节多意味着整体延迟会增加,能用流水线方式并行处理的就尽量并行。比如内容审核这个环节,可以做预审核和深度审核两段式,预审核先过一遍快速规则,高风险内容才进入深度审核的Agent链路。
6.3 大模型应用的可观测性建设
AI应用比传统应用的观测性要求更高,因为大模型是概率系统,每次输出都不是确定的。没有好的观测体系,线上出问题就像在一团迷雾里抓凶手。
我通常会在三个层面做观测:
- 调用链层面(Trace):记录每次请求经过的完整链路(输入过滤→模型调用→后处理→返回),每跳耗时和结果都落日志
- 指标层面(Metric):统计成功率、平均延迟、置信度分布、缓存命中率等核心指标,按天或按周做趋势分析
- 日志样本层面(Log):每次请求的完整输入输出存留,配合评估集做离线分析
这套观测体系搭建起来后,很多问题的定位时间能从半天压缩到半小时以内。比如某天准确率暴跌,你回看评估集数据,发现大量的新样本集中在某个特定类别上——那八成是新业务上线带来的数据分布漂移,需要尽快调整或补充该类别的训练数据。
6.4 成本优化的持续化运营
AI工程的成本结构与传统软件差异极大——它是持续的、动态的、和效果强相关的。不是"上线之后成本就固定了",而是"每一次调用都在花钱"。
所以成本优化不能是一锤子买卖,要持续运营。我的运营节奏是每两周做一次成本复盘,看三个核心指标:单次请求平均成本、高成本请求占比、低价值调用占比。高成本请求一般是输入Token过长或者走了大模型兜底路径的样例,针对性优化策略是优化上下文窗口、做多级路由;低价值调用则是那些根本没必要用大模型的场景,比如简单的关键词匹配,直接降级到规则系统,成本能省一大块。
我见过一个极端案例,某个团队1个月内大模型账单费占到了总研发预算的三成,后来发现其中一半的调用是做文本分类任务,而这些任务用一个轻量级的小模型就能取得同等效果——这就是缺失成本运营的代价。
个人经验分享
做AI工程化实践这一路,我最大的体会是:这个领域的核心竞争力,不是谁手里的模型更强,而是谁的系统更扎实。模型会快速迭代,算法会推陈出新,但工程化的思维方式——数据怎么管理、效果怎么度量、成本怎么控制、风险怎么兜底——这些才是穿越技术周期的稳定资产。
如果你要开始自己的AI工程化之路,我的建议是先别急着搞大模型微调或者Agent系统。先选一个真实的业务场景,从调用API做一个最小可用功能开始,完整走一遍数据准备、提示词构建、评估验证、部署上线的全过程。这个过程会逼着你面对那些'看起来不重要但实际绕不开'的问题,而它们就是你工程能力的起点。
最后分享一个小技巧:每次做技术选型或方案设计时,把"如果三个月后要替换这个组件,成本有多大"这个问题摆在桌面上。这个思维习惯会帮你在早期避开很多看似捷径,实则死胡同的路线。