ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

AI工程从零搭建:数据、Prompt、Agent与落地避坑指南

AI工程从零搭建:数据、Prompt、Agent与落地避坑指南 做AI工程最难的地方往往不是模型不够强而是不知道整个链路要怎么从零开始串起来。我见过太多人一开始就冲进大模型API跑通一个Demo以后就卡住了数据怎么管、效果怎么评估、Agent怎么稳定复用、上线以后怎么迭代全是一笔糊涂账。这篇文章就围绕“ai-engineering-from-scratch”这件事把我这两年从零搭建AI工程链路踩过的坑、验证过的套路和可以直接抄的步骤整理出来适合正在从算法/后端/测试转AI工程的人也适合已经有模型但不知道怎么工程化落地的团队。1. 先想清楚AI工程到底是什么为什么要“从零开始”1.1 我理解的AI工程边界AI工程和“跑模型”是两码事。跑模型是拿一个现成权重喂几条数据看输出结果AI工程则是要把模型当成一个真实系统里的核心组件把数据、评估、推理、缓存、监控、迭代全部兜起来。你可以类比成“做一道菜”和“开一家餐厅”的区别前者只要味道过得去后者还要管供应链、出餐速度、食安、顾客投诉、菜单迭代。在我接手AI工程实践的初期最大的误区是以为把模型API接进来就完事了。实际上模型只占了整个系统一小部分更大的工作量在于模型之外的“围栏”输入怎么清洗、输出怎么校验、请求怎么降级、效果怎么回归。这些围栏做不好再强的模型也会在生产环境里翻车。所以“AI工程”不是某个职位专属而是所有让AI稳定创造价值的工作集合。它横跨数据工程、MLOps、后端服务、运维监控也包含Prompt工程和Agent编排。理解这个边界才能避免把时间全花在讨论“哪个模型聪明”上而是真正去解决“系统能不能可靠跑起来”的问题。1.2 从零开始的真正含义先做减法再做加法网上很多教程一上来就是LangChain、向量数据库、K8s部署全家桶看着很爽学完之后你还是不会独立搭建一个AI系统。原因很简单你跳过了“从零开始”对每个环节的直接感知。我建议的做法是先做减法把所有中间件都砍掉用最原始的方式跑通一条端到端链路拿一个文本分类任务举例先不引入任何大模型框架直接用HTTP请求调用模型API自己写代码做数据切分、自定义评测脚本、手动记录日志。这个过程中你会真切体会到数据偏差会让模型产生偏见评测不统一会让两个版本没法对比日志不完整会让线上问题无从溯源。这些体感是任何框架都不能替代的。做减法跑通之后再开始做加法。对某个环节的重复劳动忍无可忍了你再引入工具。比如发现手工切分数据太慢就去学“数据版本管理”发现评测逻辑散落各处就去做“统一评估平台”。这时候你做的每一个技术选型都是基于自己遇到过的痛点而不是跟风。所谓从零开始本质上是把系统的每个零件都亲手摸一遍建立正确的“问题直觉”。1.3 适合谁看以及各自怎么切入我接触过三类人最需要这份实践路线切入点和优先级不太一样我整理过一张表背景常见卡点推荐切入点后端开发不了解模型行为习惯确定性逻辑先补模型评估学会用“概率思维”看待输出算法工程师跑通实验容易工程化能力偏弱先补数据管道和部署把离线实验变成在线服务测试/运维不知道怎么测“不稳定的AI系统”先补Prompt与Agent原理再设计测试策略无论你是什么背景我都不建议直接去啃某个框架的全部文档。更有效的方式是按“最小闭环”来学确定一个小任务完成数据准备到上线监控的全流程再横向扩展。我见过最快的转岗路径就是每天抽出两小时连续两周只做“端到端文本分类系统”做完之后再看LangChain之类的框架理解完全不一样。2. 跑通第一版端到端AI工程环境、数据与模型选型2.1 环境准备用最省事的方式搭起开发环境如果你只是本地学习和验证我的建议是先用最朴素的方式Python 3.10一个虚拟环境一个Jupyter Notebook用于快速探索再有一个IDE用于写正式工程代码。不要一开始就上Docker和K8s那会分散你的注意力。等你的代码要在别人的机器上跑、或者要部署到服务器时再引入容器化。python -m venv .venv source .venv/bin/activate # Windows下用 .venv\Scripts\activate pip install --upgrade pip setuptools wheel装完基础环境后优先安装一个HTTP客户端和数据处理库比如requests和pandas再根据你选用的模型服务安装对应的SDK。很多人在环境阶段纠结要不要配GPU驱动我的建议是纯做大模型调用和Prompt工程普通CPU机器完全够用不用在本地跑模型只有你打算微调开源模型时才需要认真做GPU环境。我踩过的一个坑是直接用全局Python环境后来项目依赖冲突两个OpenAI版本互相覆盖排了一下午。后来老老实实用虚拟环境每个项目独立问题再没出现过。这算是所有AI工程里最便宜的一条经验环境隔离做在前面能帮你省掉大量低级调试时间。2.2 数据准备没有“干净数据”就没有AI工程模型很强大但数据不干净输出就一定不干净。这里的“数据准备”包括四件事采集、清洗、切分、版本管理。采集阶段要想清楚任务类型分类任务需要覆盖所有类别生成任务需要覆盖典型风格清洗阶段要做去重、去隐私信息、修格式切分阶段要按时间或按用户分组避免“数据泄漏”版本管理阶段要对每个数据集保存一份记录标明来源、处理脚本和变更时间。我见过一个很常见的翻车案例某团队做客服意图识别数据切分时随机打散结果同一个用户同一问题的不同表述被分进了训练集和测试集测试指标虚高上线后准确率暴跌20个点。后来他们改成按用户ID切分效果才和离线对得上。这件事让我深有体会AI工程里“离线指标不可信”的真相大半来自数据切分红线没守住。起步阶段不需要太重的数据平台一个简单的目录加README就够了data/ raw/ # 原始数据不可修改 processed/ # 清洗后的数据 splits/ # 训练、验证、测试三份文件 README.md # 记录数据来源、切分规则、版本变更第一次跑通链路时数据规模不用大几百条就够。关键是把流程跑顺之后的扩展只是数量和质量的累加。2.3 模型选型从轻量模型到大模型的决策框架模型选型的核心不是“谁最新、谁最强”而是“谁最合适你的任务、成本、延迟、可控性”。我习惯把模型分成三档本地小模型、商用大模型API、可私有化部署的开源大模型。三档没有绝对好坏甚至可以混合使用用小模型做粗筛用大模型做精排。选型方向适用场景优点主要顾虑本地小模型高吞吐、低延迟、离线环境成本极低延迟稳定效果上限有限需要较多微调商用大模型API语义理解、生成、开放域对话效果最好迭代快有成本数据外发风险开源大模型部署数据敏感可私有化数据可控可定制需要GPU资源和运维能力我自己常用的决策路径是先跑一版大模型API把“理想效果”摸出来然后看性能瓶颈在哪里再决定要不要用更小的模型蒸馏或替换。从零开始的时候千万别迷信“一步到位上大模型”也别一上来就排斥API关键是用最快的路径验证你的任务在“最优效果”下是否成立。如果最优效果都不成立问题大概率在数据定义上而不在模型上。3. 从调参到大模型Prompt工程与AI Agent实战3.1 Prompt工程的核心原则和常用套路很多人觉得Prompt工程就是“写几句提示词”其实它是一门“沟通设计”。大模型对指令的敏感度很高同样的任务换一种说法效果可能天差地别。我总结了三条最核心的原则明确目标、给出边界、指定格式。所谓明确目标是告诉模型“做什么、为谁做、成功标准是什么”给出边界是说明“不要做什么、遇到不确定怎么办”指定格式是约束输出结构方便程序解析。下面是一个我常用的Prompt骨架可以直接套用你是一个智能客服问答助手。 用户会提出一个售后问题请判断该问题的意图并从以下类别中选择最合适的一项 A. 退款退货B. 物流咨询C. 产品使用D. 其他 输出JSON格式{intent:A} 如果问题信息不足输出{intent:D}不要猜测。写Prompt时我还会刻意加一些“负约束”比如“不要编造不存在的政策”这比单纯要求“要正确”更有效。另一个技巧是“先让模型复述任务”让它先用自己的话解释一遍再做答能显著降低误解概率。对刚入门的人来说把Prompt当成一个人来“带新人”是最容易上手的类比你会给新人什么指令就怎么给模型写Prompt。3.2 AI Agent的骨架感知、规划、工具调用、反馈循环AI Agent和普通模型调用的本质区别在于它有“行动能力”模型不只是一个会说话的聊天框而是能根据用户目标调用工具、观察结果、做出下一步决策的闭环系统。我记得有一个很准确的说法是Agent像是一个“给大模型装上了手和眼睛”的工程。手是工具调用比如查数据库、发邮件、算数学题眼睛是环境反馈比如查询结果、用户确认信息。从工程角度一个最小可用的Agent需要四个部分目标解析模块、任务规划模块、工具注册表、结果校验模块。目标解析负责把用户模糊的需求还原成结构化目标任务规划决定调用哪些工具、什么顺序工具注册表是Agent能触达的外部能力清单结果校验模块负责判断任务是否完成如果没有完成则回到规划环节重新尝试。这就是Harness Engineering的核心思想不是让模型自由发挥而是用一套“安全带和缰绳”把它约束在目标轨道上。我在实践里发现很多Agent翻车不是模型不够聪明而是工具调用协议设计得太随意。工具的参数、返回格式、错误码如果不统一模型很容易理解混乱。所以工具注册表的每条工具必须写清楚“用途、参数、返回样例、错误场景”这是Agent稳定性的基础。3.3 手把手搭一个最小Agent代码说明为了让你直观感受AI Agent的骨架我用Python写一个最简版本模型负责判断该调用哪个工具代码执行工具模型再根据结果回答用户。这里没有用任何Agent框架全部手写更能看清每个环节。import json import requests # 模拟工具注册表 TOOLS { calculator: { description: 执行四则运算传入表达式如 1 2, function: lambda expr: str(eval(expr)), # 生产环境请用安全解析 } } def call_llm(messages, tools): # 假设这里调用大模型API返回一个包含tool_calls的响应 # 省略具体HTTP细节只保留逻辑 response requests.post(YOUR_API_ENDPOINT, json{messages: messages}, timeout30) return response.json() def run_agent(user_input): messages [{role: user, content: user_input}] # 第一步让模型决定要调用哪个工具 result call_llm(messages, TOOLS) if function_call in result: fn_name result[function_call][name] fn_args result[function_call][arguments] if fn_name in TOOLS: # 第二步代码执行工具 output TOOLS[fn_name][function](fn_args) # 第三步把结果反馈给模型 messages.append({role: function, name: fn_name, content: output}) # 第四步模型基于工具结果生成最终回答 final call_llm(messages, {}) return final[content] return result[content] if __name__ __main__: print(run_agent(帮我算一下 (12 34) * 2 等于多少))这段代码里的关键点是模型不负责计算只负责“决定工具和参数”计算由真实的函数执行执行结果再回到模型里生成自然语言答案。这样做的好处是数学计算不会出错模型也不用编造公式。当你理解了这四步再看LangChain这类框架里的Agent概念你会觉得非常清晰。在实际项目中工具调用往往需要处理更多细节参数校验、超时重试、并发控制、权限管理。我建议你在“从零开始”阶段先把这段代码跑起来然后再逐步加这些工程能力。4. 工程化落地评估、测试、观测与迭代4.1 评估指标体系别只看准确率很多团队评估AI系统只盯着一个指标比如准确率或BLEU分数这在复杂任务上非常危险。分类任务的准确率会被类别不平衡欺骗生成任务的BLEU分数和人工质量相关性很低对话任务更是没有一个统一标准。我习惯按“分维度抽样人工”的方式来建评估体系。以客服意图识别为例我会同时看四个指标准确率、召回率、错误类型分布、置信度校准。前两个是标准指标第三个用于分析模型更倾向于混淆哪些类别第四个用于判断“模型不确定的时候能不能主动拒绝回答”。在生成任务上我会额外看事实一致性、格式合规率、无回答率。在所有评估里最重要但也最容易忽视的是“失败案例复盘”。每次版本迭代我会让模型在固定测试集上跑一遍然后把预测错误的案例全部拿出来肉眼观察并分类归因是数据标注错、Prompt语义歧义、还是模型能力不足只有找到失败原因下一轮迭代才不是盲目换模型。4.2 AI测试的自动化从单元测试到回归测试AI系统的测试和传统软件测试最大的区别在于“不确定性”。同一个Prompt两次调用结果可能不同这让“断言等于期望值”的传统自动化测试变得很难写。我常用的方法有三层确定性单元测试、模糊断言测试、回归基准测试。确定性单元测试针对的是纯函数逻辑比如数据清洗、Prompt模板拼接、工具调用参数解析这些用传统断言即可。模糊断言测试针对模型输出不是断言某个字眼而是断言“JSON能解析”“标签落在合法集合”“意图置信度大于0.7”。回归基准测试则是在一个固定的“金标测试集”上跑模型记录关键指标变化。我特别推荐把评估集写成一个统一的数据文件然后写一个自动化脚本每次改完Prompt或模型后一键运行输出一份对比报告。这就是AI测试开发的核心工作。它看起来简单但能救你很多次我至少有三次是“感觉Prompt改得更好了”结果回归测试显示在其他场景上明显变差多亏脚本拦住了上线冲动。4.3 可观测性与日志线上监控和反馈闭环AI系统上线之后最怕的不是模型效果差而是“不知道它差在哪里”。所以从零开始阶段就要给系统加上日志和监控。最少要记录四类信息输入内容、模型输出、模型参数、耗时与成本。输入输出可以帮助回溯问题模型参数能辅助稳定复现耗时成本则是业务优先级判断的依据。我的做法是给每个请求分配一个request_id把整个链路日志串起来用户输入、Prompt最终版本、模型返回、后处理结果、最终响应。线上如果出现用户投诉只要查一个ID就能看到模型经历了什么定位效率提高非常多。在此基础上还可以加一个“用户反馈采集”接口在对话场景里放上“点赞/点踩”按钮在生成场景里记录“用户是否修改了结果”。这些真实反馈是比任何离线指标都宝贵的迭代依据。我见过的AI工程团队往往是靠一套完整的日志反馈闭环才在模型快速迭代中没有失控。5. 避坑实录我在AI工程实践里踩过的常见问题5.1 数据泄漏看似涨分实则翻车的典型前面提过数据泄漏这里再展开讲。最常见的三种泄漏形式一是切分前用了全局统计特征比如用全部数据的均值做归一化二是训练集和测试集里有重复或近似重复样本三是时间穿越用未来数据预测过去。文本任务里第三种很隐蔽比如你的训练集取的是2024年全年数据但验证集是从2024年12月抽的那模型自然“知道”了年底的事件。我排查数据泄漏的一个土办法训练集效果很烂但测试集效果出奇好这几乎就是泄漏的铁证。遇到这种情况先别高兴回去检查数据清洗和切分逻辑。从零开始阶段就把切分规则定好后面能省掉非常多返工。5.2 大模型“幻觉”和输出不稳定的控制方法大模型都会一本正经地编造不存在的事实这在知识型任务里尤其危险。我的控制策略是四步走限权、检索、校验、拒答。限权是要求模型只能基于给定参考内容回答不参考内容时坦诚说“不知道”检索是先把相关资料查出来拼进Prompt校验是在系统层面对模型输出的关键信息做规则检查比如订单号格式、金额范围拒答是若确定性不够宁可告诉用户“暂时无法确认”也不要生成一个虚构答案。这些说起来容易做起来最需要耐心。尤其是“拒答”这一步很多产品经理会希望模型“无论如何都给个答案”但从我的经验看一次错误的虚构回答对用户信任的伤害远大于十次正确的“不知道”。这块宁可保守也不要冒险。5.3 成本失控Token账单是怎么悄悄涨上去的很多AI工程是从一次“怎么看账单”开始清醒的。Token成本上涨通常来自三个地方把大段上下文反复发送、Agent多轮循环迟迟不退场、重试机制导致重复调用。第一个问题最常见因为你每轮都会把历史记录全部带上对话越长成本越高。解决办法是设定上下文窗口上限、截取关键信息、或对历史做摘要。第二个问题是Agent在任务已经完成时报错重来形成死循环解决办法是设置最大步数。第三个问题是网络超时后无脑重试导致同一请求扣多次费用解决办法是只允许对幂等操作做有限次数重试。我的成本监控工具并不高级每天导一份日志统计每个用户的Token消耗和调用次数按天看趋势曲线。当某条曲线突然上涨时我会去看对应的提示词和对话轮次很快就能定位到是哪次Agent循环或哪个长上下文导致。这些经验都不是从哪个标准教程里看来的而是我一次次看着账单和日志复盘出来的。如果你也能坚持做这样的复盘AI工程能力一定会很快上一个台阶。最后再分享一个小技巧无论做什么AI项目第一时间把固定评估集建立起来之后每次动模型和Prompt都用同一条回归脚本检查这种看似笨办法的习惯能让你少走我走过的绝大多数弯路。
返回列表