这几年“AI”这两个字快被说烂了,朋友圈、短视频、职场群到处都在聊。但真正让我觉得有意思的,反而是另一个词:engineering。AI不只是一堆模型和接口的堆叠,更是一套工程方法——怎么拆需求、怎么设计提示词、怎么搭工作流、怎么和现有业务系统捏在一起。很多人一上来就想着“我也搞个大模型”,结果卡在环境装不上、API不会调、写出来的功能不稳定。其实换个思路,从工程角度入手,先把“从零开始怎么走通一条AI应用链路”想清楚,后面自然顺了。
这篇内容我打算围绕一套可复用的“从零起步路线”来拆解,包含环境准备、模型选型、提示工程、工作流设计、本地部署落地、测试和迭代维护。适合刚准备入手的开发者、技术产品经理,也适合那些想做内部AI工具但一直没找到切入点的团队。我写的东西偏实操,你可以直接照着改,不用当论文读。
1. 先把“AI工程”的定义搞清楚
1.1 它不只是一个模型,而是一条流水线
我发现很多新手对AI开发有个误解,以为重点就是“调用一个API”。确实,现在调用大模型接口很简单,几行代码就能让模型回话,但这离“工程化”还差得很远。一个合格的AI工程,至少包含这几层:
- 输入层:用户提问、上传文件、业务系统触发的事件。
- 处理层:意图识别、上下文整理、提示词组装、工具调用规划、多轮记忆管理。
- 模型层:底层大模型,可能是云端API,也可能是本地部署的开源模型。
- 输出层:自然语言回复、结构化数据、文件生成、业务系统动作。
- 稳定保障层:超时重试、内容过滤、成本控制、日志追踪、效果评估。
你可以把AI应用想象成一家餐厅。模型是后厨的厨师,提示词是菜谱,工作流是厨房动线,外部工具是食材仓库,日志系统是食品安全记录。只招个厨师(模型)不代表能开张,你得把整条供应链跑通,菜才能稳定端到顾客面前。
1.2 确认你手里的场景到底适不适合AI
做AI工程的第一步,可能不是写代码,而是“判断问题是不是AI问题”。我见过太多团队把普通逻辑问题包装成AI项目,比如计费规则、库存扣减,这类场景用规则引擎更可靠。真正适合AI介入的,通常是这几种:
- 非结构化信息处理:长文档、对话、图片、音频里的信息抽取和归纳。
- 开放式生成任务:文案、代码、方案草稿、知识问答。
- 语义匹配与分类:客服意图识别、工单分派、相似问题聚类。
- 多步骤自主执行:需要模型根据目标动态调用不同工具的Agent任务。
在选型之前,先把场景跑一遍“三问”:这个问题有没有明确的对错标准?如果是,那大概率不需要AI。这个任务是否高频重复且依赖人的判断?判断越复杂,AI的价值越大。这个任务容错空间多大?生成错了会不会造成不可逆后果?如果风险高,就需要人工复核环节兜底。拿这三条卡一遍,很多“伪需求”直接过滤掉了。
2. 环境准备与工具选型
2.1 本地运行环境的搭建细节
起步阶段,我不建议一上来就直接写生产代码。先把本地环境跑通,让模型能和你“对话”起来,比什么都重要。这里分三个层次来准备。
第一层是Python基础环境。我习惯用Anaconda或Miniconda管理Python版本,避免多个项目互相污染依赖。创建虚拟环境的命令很简单:
conda create -n ai-eng python=3.11 conda activate ai-eng之所以选Python 3.11,是因为当下主流AI框架和SDK对它的兼容性最好,3.12部分依赖还容易出现编译问题。Git这块也顺手提一句,在Windows环境下建议开启“core.autocrlf=true”,省得文件换行符在跨平台协作时闹鬼。
第二层是模型访问方式。最省事的是直接用大厂的开放平台API,注册账号、充值、拿Key,国内平台对开发者友好,文档也是中文的。还有一种方式是用开源模型做本地部署,比如从模型社区下载量化后的模型权重,配合推理框架运行。本地部署的入门门槛比调API高一些,但好处也明显:数据不出内网、调用成本可控、可以针对业务做微调。
我自己的建议是两者并行。日常开发调试用API,因为快、稳、不用等模型下载;涉及敏感数据、高频调用或需要深度定制时,再切到本地模型。
2.2 微调、RAG还是纯提示词
聊到“模型怎么适配业务”时,新手常被三个概念绕晕:提示工程、RAG(检索增强生成)、微调。我的判断标准很简单,先说结论:
- 能拿提示词解决的问题,坚决不动RAG;能拿RAG解决的问题,坚决不动微调。
- 为什么要这么做?因为成本递增。提示词改一版只要10分钟,RAG要搭向量库、写检索逻辑、解决切片和召回率问题,微调更要准备数据集、做训练验证、上GPU资源。每次迭代升级,复杂度都是指数级上升。
具体怎么选,我列了张判断表:
| 场景特点 | 推荐方案 | 原因 |
|---|---|---|
| 回答知识库内的固定内容、公司制度、产品说明 | RAG | 需要实时更新知识,检索能避免重训模型 |
| 输出格式要求严格(JSON、特定结构化字段) | 提示词 + Pydantic解析 | 用约束和校验兜底,成本最低 |
| 说话风格、专业领域术语、固定话术习惯 | 微调 | 需要模型“内化”特定表达方式 |
| 需要实时数据、最新政策、动态行情 | RAG或外部工具调用 | 模型训练数据有截止时间,不能靠记忆 |
| 简单意图分类、情绪判断 | 提示词 | 纯提示词足够,加复杂组件反而拖慢响应 |
一句话:让模型做它擅长的事,把工程复杂度留给确定性最强的环节。
2.3 还需要准备哪些工具
除了模型环境,一个像样的AI工程还需要准备这些工具:接口调试工具(Apifox或Postman),方便单独验证接口返回;向量数据库(比如Milvus、Chroma、pgvector),RAG方案里存嵌入向量用;缓存与队列(Redis)用来分担高并发请求;日志与监控工具,我常用的是Langfuse或LangSmith,记录每次调用的输入输出、Token消耗、延迟。别小看日志,AI工程没有日志等于盲人开车,出了故障根本无从排查。
3. 一份能直接照搬的AI应用落地过程
3.1 从0到1,先做“最小可用版本”
我拿一个实际做过的“企业制度智能问答助手”当案例拆解。背景是一家公司想把散落在几十个文档里的制度规定整合成一个问答入口,员工用自然语言提问,系统返回对应条款并注明出处。这个项目很典型:有明确知识边界、有格式要求、容错空间中等、需要引用来源。
第一步,我没急着写代码,而是花了半天把需求问清楚:
- 用户最常查的问法有哪些?整理成50个高频问题。
- 期望的回答格式是什么样的?带编号、带原文引用、还是只要摘要?
- 引用来源怎么呈现?支持跳转到原始文档的哪个章节?
- 回答错误能接受吗?哪些问题必须准、哪些可以模糊?
约定了最低可行版本的范围:先支持PDF和Word文档导入,能回答问题并附来源,响应控制在5秒内。至于多轮对话、流式输出、权限管理,全部放二期。
3.2 文档处理与知识库建设
接下来是知识库建设。这步是整个RAG链路里最容易被低估的一环,很多项目“答非所问”就是没有把文档处理好。
先把原始文档统一转成文本。PDF用解析工具抽取,Word和Markdown直接读取。这里的坑很多:有些PDF是扫描件,直接提取出来是乱码,需要先做OCR;有些表格结构复杂,提取之后信息错位。我的建议是不要试图在一个环节里解决所有格式问题,而是先处理高频格式,用规则把特殊版式单独拎出来处理。
然后是切片。很多教程说“按字符切片就行”,但在真实场景里,这样粗暴切开的文本语义会断裂。一个条款可能刚讲到一半就被切走了,检索时自然找不全。我比较推荐按语义结构切片:优先按文档标题层级切,二级标题下内容过长就按段落切,段落再长就按句子边界切,同时让相邻切片保留重叠区域,避免关键信息被切断。切片长度不必统一,控制在300-800字左右比较合适,太短噪声大,太长精确度低。
切完后就是向量化。把切片内容用嵌入模型转成向量,存进向量库。这里要说明一点:嵌入模型的质量比向量库本身的性能更影响召回效果。开源嵌入模型和商业API模型差距很大,选型时不要贪便宜。存储阶段做好元数据字段,比如文档名称、章节路径、更新时间、权限范围,后续过滤就靠它。
3.3 提示工程:让模型按你的规则说话
知识库准备好以后,真正的AI工程核心才开始——设计提示词。我见过不少团队在提示词上轻描淡写,觉得“随便写个系统提示词就行了”,结果上线后回答格式千奇百怪、引用错误百出。提示词要当成代码管理,而不是临时文案。
一个有效的系统提示词,至少要包含这几块:
- 角色定义:你是谁、在什么场景下工作。
- 行为约束:允许做什么、不允许做什么。比如“只回答知识库内相关内容”“不编造条款内容”。
- 输出格式:严格要求的字段结构,用示例做few-shot展示。
- 兜底策略:不知道答案时怎么说。
- 上下文说明:哪些是用户输入,哪些是检索到的知识片段。
我这里给一个简化的、结构化的提示词模板,各位可以照着改:
你是一位企业制度咨询助理。请依据【参考资料】中的内容回答用户问题。 规则: 1. 只引用【参考资料】中的信息,不得自行补充或编造。 2. 如果【参考资料】中没有该问题的明确答案,请回复“资料中未找到相关信息,请咨询相关负责部门”,不得尝试猜测。 3. 回答必须用中文,语言简洁。 4. 回答末尾标注引用来源,格式为:[来源文件:xxx.docx,章节:第x章] 参考资料的来源按优先级排序:企业制度V3.0 > 操作手册 > 历史公告。 用户问题:{{question}} 参考资料:{{context}}为什么要这么细化?因为大模型的默认行为是“尽力讨好式回答”,你问什么它都想给个答案。如果不在提示词里明确禁止编造,它就会在知识库没覆盖到的问题上自由发挥。添加source引用还有一个作用:让用户能核对答案,也为未来做自动评估提供依据。
3.4 工作流编排:从单次调用到多步骤协作
很多时候,单靠一个提示词不够。比如“帮我写一份请假制度的摘要,并按部门归类”这个需求,就要拆成多个步骤:先检索知识库,拿到相关文档切片;再对切片做重排序;然后让模型生成摘要;最后按部门信息做分类汇总。这一长串逻辑,如果全部放在一个提示词里,模型容易晕,错误率也高。
所以我在实际项目里引入了工作流编排。市面上不少现成框架,从代码角度,我更愿意直接用Python手写一个轻量流程控制,核心还是几段函数:
def run_qa_pipeline(question: str): # 1. 查询向量库,召回候选片段 candidates = vector_store.search(question, top_k=20) # 2. 用重排序模型精排,保留最相关的5条 refined = reranker.rerank(question, candidates)[:5] # 3. 组装上下文 context = "\n\n".join([c.content for c in refined]) # 4. 调用大模型生成回答 prompt = build_prompt(question, context) answer = llm.chat(prompt) # 5. 后处理:校验引用格式、提取来源 answer = post_process(answer, refined) return answer这几个步骤看着简单,但每个环节都有讲究。比如第2步“重排序”,我吃过不少亏。向量检索的召回粒度是“片段”,它只管“和问题沾边”,不管“排序是否精准”。所以检索之后最好再接一个交叉编码器重排序模型,宁可多花一点延迟,也别让排序错误毁掉回答体验。再比如第5步“后处理”,目的是检查模型输出中是否存在自造的来源。我在代码里做了一层校验,如果模型返回的引用文件名不在实际文档列表里,就强制替换成页面上提示“来源校验失败,请人工复核”,防止幻觉污染答案。
3.5 前后端交互与流式输出
到这一步,知识库链路基本通了,接下来是交互层。用户不关心你背后用了多少向量库和重排序模型,他只关心问题答得快不快、答案能不能用。
前后端交互在这类项目里其实是最老的套路:后端提供接口,前端调接口。但AI应用有一个特殊性——生成时间过长,普通HTTP请求容易超时。处理这个问题,业界主流方案是流式输出(SSE,Server-Sent Events)。前端每拿到一段内容就渲染一段,用户第一句回复不到1秒就能看到,体验比转菊花等8秒强太多。
后端流式输出用Python的FastAPI非常好实现,核心就是异步生成器:
from fastapi import FastAPI from fastapi.responses import StreamingResponse app = FastAPI() def generate_answer_stream(question: str): # 检索知识库(同步执行) context = retrieval(question) # 流式请求大模型,逐段产出 for chunk in llm.stream(prompt, context): yield f"data: {chunk}\n\n" @app.post("/chat") def chat(question: str): return StreamingResponse(generate_answer_stream(question), media_type="text/event-stream")这个方案的另一个好处是“首token延迟”指标会变得很漂亮。如果非流式接口,用户感知的延迟=完整生成时间;改成流式后,用户感知的延迟=首次返回时间,通常能缩短到原来的十分之一。对产品体验提升非常明显。
前端方面,我一般推荐直接套开源对话组件,不用自己造。前端和后端用串流协议对接,处理好“中断生成”“清空会话”“复制回答”几个基础交互,整个闭环就算通了。
4. 本地部署、测试与效果评估
4.1 部署阶段容易踩的坑
开发环境跑通以后,部署到生产环境又是一套全新挑战。我能想到的几个最容易踩的坑,提前给大家圈出来。
第一是GPU资源规划。如果你用本地部署的开源模型,要注意模型权重本身的大小,再加上推理时的显存开销,通常需要准备至少模型参数量对应显存的两倍空间。比如跑一个70亿参数的量化模型,建议安排至少16GB显存。没有GPU条件的话,要么用API,要么用CPU推理但严格控制并发数,否则响应延迟会高到用户无法接受。
第二是请求并发控制。大模型的推理是资源密集型,并发一高,显存容易溢出,或者单请求延迟被拉长。生产环境一定要加一层“信号量+队列”。我习惯在网关层做一个简单的限流器,限制单模型实例的并发数为2-4,超出部分排队等待,这样能保证单个请求的延迟稳定可控。
第三是容器化。AI应用建议从第一天就用Docker封装环境,把Python依赖、模型权重路径、环境变量全部写进镜像,避免“在我机器上是好的”这类尴尬。我自己踩过一次痛彻心扉的坑:开发时用的某个依赖版本和生产服务器相差一个小版本,结果模型输出格式全都乱了,排查了整整一天。封装好镜像后,环境差异问题基本绝迹。
4.2 大模型的测试,远不止“问问看”
传统软件开发有明确的单元测试、回归测试,但AI应用测试要难得多——因为同一个输入,模型每次输出都不完全一样。所以AI测试的核心不是断言“输出等于某个固定值”,而是建立一套评估体系和指标基线。
我目前采用的做法是两条线并行:自动化评测线和人工抽检线。
自动化评测线,我会准备一组有标准答案的评测集(大约几百条问答),每次模型或提示词更新后,跑一遍评测,量化四个指标:
| 指标 | 含义 | 目标参考值 |
|---|---|---|
| 准确率 | 回答内容与标准答案的语义一致程度 | 90%以上 |
| 引用命中率 | 回答中引用来源是否正确 | 95%以上 |
| 拒答率 | 面对知识库外问题时是否正确拒答 | 不高于5%(不该答的答了就是事故) |
| 幻觉率 | 存在编造内容的回答占比 | 3%以下 |
这里说的准确率,不是简单的字符串相等,而是让评测模型给一个打分,或者用语义相似度算法比较。实操中,我喜欢混合使用:偏向事实判断的场景,人工抽检更可靠;开放生成的场景,让一个强模型做裁判,成本低且一致性还行。
人工抽检线也很重要。每次发布新提示词或更新知识库后,拿出20-30个真实用户问题,人工跑一遍,看回答有没有上下文断裂、风格突变等自动化测不出的问题。这套双轨制用了三个月,可靠性明显比纯“测一测感觉效果不错”要高。
4.3 效果不好时应该先查哪个环节
项目上线后最怕的是什么?不是没人用,而是用户用了但觉得“AI挺蠢的”。一旦收到反馈,别着急改提示词,先按顺序排查:
- 问题出在召回环节,还是生成环节?好方法是打印日志中的context,看看模型实际拿到的知识片段。如果context里压根没有正确答案,那改提示词也没用,问题在检索。如果context有正确答案但模型答错了,问题在生成或提示词。
- 问题是否和提问方式强相关?同一个问题换个说法效果不同,这是典型的召回召回率不足,建议调整切片长度、增加top_k候选数量,或者升级嵌入模型。
- 问题是否集中出现在某几个特定主题?多半是知识库里对应文档没处理好,去检查原始文档的文本抽取质量和切片合理性。
这些排查技巧看起来朴实,但在实际项目中能省下大量时间。AI工程的debug和传统软件不一样,传统软件有报错堆栈,AI系统没有。你只能通过“输入-中间状态-输出”逐层定位,所以日志设计一定要把上下文和中间结果记录清楚。
5. 常见问题与避坑经验速查
5.1 开发期的典型问题
我整理了这段时间比较常碰见的问题,给各位一个参考:
| 症状 | 原因 | 解决办法 |
|---|---|---|
| API调用偶尔超时 | 模型接口受并发限制 | 增加重试机制,指数退避,超时阈值放大到两倍 |
| 回答格式跑偏 | 提示词对格式约束不够 | 给2-3个少样本示例,再用代码校验后处理 |
| 模型总爱“编”答案 | 缺少拒答规则 | 提示词明确“不知道就说不知道”,并增加后置校验 |
| 知识库问题答不准 | 切片切断了语义 | 按标题结构切片,增加上下文重叠 |
| 本地模型响应极慢 | 量化精度过低或线程没调 | 检查推理框架的线程数设置,适当调高量化精度 |
5.2 项目长期维护的三条建议
最后聊点长期的东西。AI工程不是一次性项目,模型在升级、文档在更新、用户需求在变化。做长期维护,我有三个建议:
第一,知识库要有版本管理。文档更新是常态,每次更新都要重建向量索引,并保留历史版本,方便回滚和对比。
第二,提示词也要版本管理。我把提示词当成配置存进代码仓库,每次修改都标注原因。上线后遇到效果波动,能快速对比“上一次正常时用的提示词是什么”。
第三,建立真实用户反馈闭环。在生产环境加一个“点赞/点踩”按钮,收集用户对回答的反馈,定期把负面样本汇聚成新评测集。这是成本最低、最具长期提升效果的数据来源。我见过太多团队花大力气做微调数据集,却眼睁睁把生产用户反馈丢弃,实在太可惜。
写在最后的几点心里话
从零做一个AI工程,真正考验人的不是模型接口调用,而是对各种细节的把握:你有没有认真拆解需求?有没有把文档处理干净?有没有给提示词做好约束?有没有在测试环节建立量化标准?这些琐事每一件单独看都不难,但合在一起,就是所谓的“工程能力”。
我个人在实际项目中最深的感受是,AI开发不能带着“差不多就行”的心态。模型输出天然有随机性,你只有在每个可控环节都用工程手段拧紧螺丝——检索、重排、提示、校验、人工抽查——整个系统才能在不确定的基础之上,稳定地交付结果。这套方法论不局限于某种框架或某个模型,换底下的模型、换业务领域,骨架都通用。
如果你正准备开始自己的AI项目,我的建议是:从小场景着手,把一条链路走完整。不要一开始就追求“什么都会的超级智能体”,先做一个能解决单一问题的工具,跑通、上线、收集反馈,再逐步加复杂度。走通第一个闭环后,你会发现后面每一步都轻快得多。