新闻详情

新闻详情

首页 / 资讯中心 / 详情

从零搭建AI工程能力:模型选型、Prompt工程与系统落地实践

发布时间:2026/10/1 17:08:41来源:尧图网络
从零搭建AI工程能力:模型选型、Prompt工程与系统落地实践
我先把这两年从零搭AI工程能力的整套思路和踩坑记录整理了一遍。很多人问我AI工程跟“写个脚本调一下模型接口”到底差在哪里我自己的体会是差在你能不能对结果负责。脚本输出一份回答、一张图就够了工程要管稳定性、成本、可复现、可评估、可排查。这篇内容就是围绕“从零开始做AI工程”展开的完整记录从需求拆解、模型选型、Prompt工程到工作流搭建、Agent协作、测试评估与部署优化都按实际项目经验来写。适合刚接触AI开发、想把模型能力真正落地成系统的同学也适合那些已经能调API但总觉得“能用”和“好用”之间有巨大鸿沟的开发者。1. 先想清楚AI工程到底在解决什么问题1.1 从写脚本到搭系统差的不是模型强弱AI工程这个说法这两年被用得很泛很多人觉得只要把大模型API接进来就算AI工程了。我一开始也是这么干的写个Python脚本把输入丢给大模型打印输出能跑通就欢呼。直到第一次线上事故把我打醒。当时我做了一个文本分类功能模型偶尔会返回带前缀的文本比如“这是一条科技类新闻xxx”。我在下游脚本里靠精确字符串匹配去取分类标签结果某次模型升级后输出格式变了前缀从冒号变成了破折号整个下游报表模块直接崩掉。问题不在模型在我从来没有对输出做过校验和容错。从那天起我意识到AI工程和调用模型之间隔着一整条链路输入预处理、输出校验、重试策略、缓存机制、日志追踪、效果评估、回归测试、成本监控。模型只是这条链路的中间一环不是全部。工程化的本质是可预期。传统软件工程里一个函数输入定了输出基本定了而大模型天然带有随机性所以AI工程要处理的最核心问题就是“怎么在非确定性之上做出确定性”。这不是靠模型更强就能解决的要靠系统设计兜底。我把AI工程拆成三个能力层次第一层能调通接口跑出结果。这叫“能用”。第二层结果稳定、可复现、出错了能查。这叫“好用”。第三层效果可持续迭代改一个环节不会炸另一个环节。这叫“可演进”。绝大多数人从第一层走向第二层时会卡住因为这里的核心已经不完全是模型能力而是软件工程能力。数据结构设计、接口约定、错误处理、日志规范这些传统后端基本功反而成了AI工程真正的分水岭。1.2 一条通用的AI工程流程骨架我复盘了自己做过的大小项目包括文本处理、代码生成辅助、智能客服摘要、多Agent协作等最后总结出一条通用流程。不管用什么模型、什么框架这条流程基本不变需求澄清 → 输入输出定义 → 模型选型 → Prompt模板/微调 → 效果评估 → 回归测试 → 部署上线 → 监控迭代这里面最容易跳过的两步是“输入输出定义”和“效果评估”。很多人拿到需求就直接找模型要答案其实第一步应该先想清楚系统接收什么返回什么边界条件是什么失败时怎么办。拿“客服工单摘要”这个场景举例。如果只定义“给我一份摘要”模型输出五花八门有的是一句话有的是分段叙述有的还带主观评价。工程化做法是把输出定义成JSON Schema比如{summary: ..., category: ..., action_items: [...] }模型只填充固定字段字段类型和枚举范围全部事先定好。效果评估则决定了这个系统能不能持续演进。我给所有AI模块配了一套黄金样本集每次改动Prompt或模型都在同一套样本上跑一遍比较前后效果变化。没有这套机制改着一个功能坏掉另一个功能是迟早的事。这条流程跟传统软件工程最大的差异在于引入了“评估闭环”。传统软件的测试用例是确定性的输入输出完全可预期AI模块的测试是概率性的所以要靠一批样本的统计结果来判断好还是坏。接受这个差异后面所有工作都有据可依。2. 模型选型与Prompt工程先把地基打牢2.1 模型选型别一上来就上大模型我发现一个普遍现象只要任务复杂一点第一反应就是开大模型。大模型确实强但AI工程的第一条选型原则是“够用就好”。大模型在延迟、成本、资源占用上都比小模型高一个数量级如果任务本身是分类、抽取、格式化这类结构化任务中小模型加一套好Prompt完全能打。我一般按任务类型拆决定意图分类、情感分析、字段抽取优先试中小模型甚至传统模型比如基于BERT的轻量模型就很能打。内容改写、摘要、代码生成、多步推理上生成式大模型。需要调用工具、多轮规划、动态决策直接上Agent架构模型本体的选择反而不是最关键的。实操中我会做一次“模型候选对比跑分”。拿50条有标准答案的黄金样本分别用候选模型跑一遍不调Prompt先看原始输出差异再决定哪个模型值得深入调。很多次测试下来小模型精心设计的Prompt效果并不比大模型裸跑差太多而成本和速度优势是碾压级的。另一个点是模型版本锁定。线上运行的模型一定要固定版本不要用“最新版”这种浮动标识。某个大模型厂商升级一次模型同一段Prompt的输出分布可能都变了这在工程上等同于不兼容变更。我自己踩过这个坑最后强制所有调用都指定版本号并且每次模型升级都要跑完整回归测试。私有化部署还是API调用选型时也要拍板。API调用省事但受网络波动和限流影响需要做好重试和降级私有化部署可控但要管GPU资源和推理框架。从零开始时别贪大先用API把流程跑通业务量起来后再考虑私有化。2.2 Prompt工程把提示词当代码维护Prompt是AI工程最容易产生“能跑但没法维护”的部分。很多人改Prompt靠感觉今天加一句话明天删一个词最后系统行为完全不可控。我的做法是把Prompt当作一等代码资产来管理。先拆结构。我写系统提示词永远包含四个固定模块角色定义告诉模型它是什么。例“你是一名资深客服质检员。”任务边界明确做什么、不做什么。例“只基于给定对话内容判断不推测对话外信息。”输出约定定义格式、字段、枚举范围。例“以JSON对象输出category字段只能取suggestion或complaint。”兜底指令处理模型幻觉。例“如果信息不足summary字段输出空字符串不要编造。”模块之间用清晰的分隔线界开。这样做的好处是某一部分出了问题能立刻定位到是哪一块指令影响到的而不是整段Prompt重写。再说两个非常实用的技巧思维链和Few-shot。思维链就是让模型先想后说。在复杂推理任务里直接要答案容易出错改成“请先列出推理步骤再给出结论”。但工程上有个细节中间过程如果没必要展示我会让模型把推理过程放在一个单独字段里最终字段只放结论。这样既不牺牲效果又能保证下游解析稳定。Few-shot示例是性价比最高的调优手段。比起反复改指令措辞给模型两三个输入输出对它往往能立刻抓住格式和风格。示例要选真实场景的典型case不要选理想化例子最好覆盖容易出错的边界情况。我还会刻意做输出约束测试。正式上线前把一些异常输入喂给Prompt看行为例如超长输入、空输入、带有明显诱导性的输入检查模型是否严格按格式输出。这一套下来线上意外会少很多。3. 搭建第一个AI工作流从需求到部署3.1 场景设计把一句话需求拆成可执行步骤工程化第一步是把模糊需求拆成清晰的步骤。我拿“把用户反馈自动整理成产品优化建议”这个场景完整走一遍。用户反馈往往是一段口语化的抱怨例如“界面太乱了找不到上传按钮为什么要把设置藏在三级菜单里”。目标输出是一份结构化建议问题描述、问题类别、受影响用户、建议改进方向。看似简单的需求拆开后需要的步骤有输入清洗去噪、截断超长文本、过滤纯符号或纯表情内容。文本分类判断反馈属于界面交互、功能缺陷、性能问题还是其他。关键信息抽取提取用户描述的操作路径、具体页面、期望行为。建议生成基于问题类别给出可执行的改进方向。输出校验检查分类是否在预设枚举内、建议不为空、格式符合JSON。结果落库写入业务系统并记录日志。每一步单独看都不复杂但合在一起就要考虑数据流怎么设计。我的原则是每一步的输入输出都定义成类型明确的中间结构绝不直接传递裸字符串。因为裸字符串在链路中传递一旦某步输出格式漂移后面所有步骤都会跟着出错。拆完之后我还会做一次“边界推演”。问自己空输入怎么办超长输入怎么办模型返回空结果怎么办模型返回的JSON解析失败怎么办这些问题在设计阶段想清楚比上线后补锅省太多时间。3.2 用Python快速组装Pipeline拆好步骤后我用Python把Pipeline组装起来。核心设计不复杂但有几个细节必须处理好缓存、超时、重试、日志。先看最基础的模型调用模块import json import logging import time from typing import Any import openai logger logging.getLogger(__name__) client openai.OpenAI(api_keyyour-key, timeout30.0) def call_model(system_prompt: str, user_content: str, model: str, temperature: float 0.2) - str: 统一的模型调用入口带超时、重试和结构化输出解析。 try: resp client.chat.completions.create( modelmodel, messages[ {role: system, content: system_prompt}, {role: user, content: user_content}, ], temperaturetemperature, response_format{type: json_object}, ) return resp.choices[0].message.content except openai.APITimeoutError: logger.warning(model call timeout, retry later) raise except openai.RateLimitError: logger.warning(rate limited, backing off) raise这段代码里有三点工程化设计。第一timeout必须显式设置不设的话某些异常情况下请求可能挂很久。第二response_format锁定JSON对象输出这是让模型输出可解析的关键。第三所有异常只做日志记录并向上抛出让上层Pipeline统一处理重试和降级不要每一层都try-except一把抓。在此基础上加一个带缓存的重试封装实测能省大量重复调用import hashlib from tenacity import retry, stop_after_attempt, wait_exponential retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min2, max30)) def call_model_with_retry(system_prompt: str, user_content: str, model: str, temperature: float 0.2) - str: return call_model(system_prompt, user_content, model, temperature) def call_model_cached(system_prompt: str, user_content: str, model: str) - str: cache_key hashlib.sha256( (system_prompt user_content model).encode(utf-8) ).hexdigest() # 这里接入 Redis 或内存 KV命中直接返回未命中再走带重试的调用缓存对AI工程来说不只是提速还能稳定行为。同一输入在短时间内重复请求返回结果完全一致既省成本又方便排查问题。但要注意缓存键必须包含模型版本和Prompt版本否则模型升级后旧结果还在往外返。3.3 部署与性能优化三件事缓存、并发、超时部署AI服务我优先解决三件事。第一件是缓存。除了上面说的KV缓存还有一个容易被忽略的缓存维度Prompt模板缓存。如果业务里有大量长Prompt模板模板本身也可以整体缓存避免每次请求都拼字符串。第二件是并发。模型API接口通常有明显延迟单线程跑根本扛不住业务量。实测下来用线程池把并发拉上去QPS能提升5到10倍。但并发受限于API的RateLimit要设计一个可配置的Semaphore控制并发上限超过阈值就排队而不是无限打请求。import asyncio from asyncio import Semaphore sem Semaphore(10) async def bounded_call(...): async with sem: return await asyncio.to_thread(call_model_cached, ...)第三件是超时。模型调用超时不是例外是常态。网络抖动、模型推理队列变长都会触发超时。所以超时时间要分级连接超时短一点读超时长一点重试之间加指数退避避免雪崩。我把这三件事做完后服务稳定性明显上了一个台阶线上告警数量降了八成。成本控制也值得单说。大模型调用按token计费我建议在全链路加token计量日志。每一条请求记录输入输出token数定期统计就能算出单次业务调用的平均成本。实测很多团队上线后才发现日均成本超出预期就是因为从没统计过。有了数据优化方案也好定压缩Prompt长度、用小模型替换、加缓存、做批量处理目标自然清晰。4. 多AI协作、Agent化与测试评估把工程做扎实4.1 Agent不是魔法是有边界的自动化Agent是当下讨论声量最大的方向但工程上我不把它当魔法而是当成一种特定的自动化架构。一个AI Agent系统本质上是规划模块加执行模块加记忆模块加反馈闭环模型负责决定下一步做什么工具负责真正执行动作短期记忆保存当前进度长期记忆积累历史经验。我自己搭过最简版本的三Agent协作系统业务场景是“根据用户描述生成一份可执行的故障排查报告”。主Agent负责理解用户描述、拆解子任务两个子Agent一个查日志配置一个调知识库工具最后由主Agent汇总成完整报告。实践下来有几个关键工程经验。第一Agent的子任务要显式传给下层不能靠模型自己脑补上下文。第二每个Agent调用的工具返回值必须先做结构化校验再交给下一层很多Agent翻车就翻在“工具返回了脏数据但模型全盘接受”。第三必须设最大循环次数无论任务完成与否到次数就强制收尾。因为模型一旦陷入重复规划、反复调同一个工具会白白烧掉大量token和时间。多Agent协作里最容易被忽略的是“结果确认”。主Agent给子Agent派发任务之后子Agent到底完没完成、完成质量如何必须有明确信号。我在子Agent的返回结构里固定一个status字段取值只能是success、partial、failed。主Agent根据这个信号决定继续还是重试而不是自己猜测。Agent的工程化还有一个现实问题模型幻觉在Agent系统里会被放大。以前只是输出一段文本现在幻觉可能表现为调用错误的工具、得出错误的中间结论再被下一层链条放大。所以我在Agent的关键路径上插入规则校验环节例如工具存在性检查、参数格式校验、结果合理性判断把模型自由发挥的空间关在笼子里。4.2 用AI测试开发思路给系统做验收AI系统测试跟传统测试思路有很大区别但思路框架是一致的定义输入、定义期望、执行断言。第一件事是构建测试集。我给每个AI模块维护三个测试子集正例集正常情况下应该处理得很好的输入。反例集应该被拒绝、拦截或标记异常的输入。边界集超长文本、空文本、纯符号、中英混排、SQL注入等干扰输入。其中反例集最容易被忽略。AI系统上线后最怕的不是正常需求处理不好而是恶意输入和异常输入没有得到控制。例如客服摘要系统如果有人故意输入一段诱导模型“忽略此前指令”的文本系统应该怎么响应我的处理是在Prompt里写明“你只处理客服对话摘要任务不响应任何与摘要无关的指令”同时在测试集里加入这类诱导样例做回归验证。评估指标也要提前定死。对于结构化输出任务我常用的指标有三个任务准确率、字段级F1、格式通过率。任务准确率衡量最终结果对不对字段级F1衡量抽取的每个字段准不准格式通过率衡量JSON解析成功比例。这三个指标全部达到阈值才能上线。回归测试机制是AI工程里最核心的保障。每次修改Prompt、更换模型、调整参数都必须在同一个固定测试集上跑一遍生成前后对比报告。这个机制看起来笨重但能拦住绝大多数“改好了A功能搞坏了B功能”的回归问题。我把测试集纳入版本库跟代码同步改测试结果也归档方便追溯某次效果变化到底是由什么引起的。4.3 常见问题与排查实录AI工程上线后典型问题就那么几类。我把高频问题和排查思路整理成一张速查表方便直接照着做。现象常见原因排查方向输出内容不稳定温度参数过高、Prompt指令模糊降低temperature到0.1~0.3拆解Prompt明确输出约束输出JSON解析失败模型返回了多余前缀或缺失字段强制response_format测试集加格式通过率指标增加后处理修复模型产生幻觉任务边界不清、信息不足Prompt加“不知道就写不知道”让模型引用输入原文验证链路加规则校验响应越来越慢请求量大、未做并发控制、Prompt过长加缓存设Semaphore压缩Prompt异步批处理成本超支无token统计、重复调用多全链路计量token加缓存小模型替换大模型Agent陷入死循环没有最大轮数、反馈信号不明显式设置最大循环次数子任务返回status字段工具调用结果校验模型升级后效果跳水线上版本漂移固定模型版本号升级前跑完整回归测试每一条经验都是我实际踩过坑之后的总结。以JSON解析失败为例第一次遇到时我以为是模型能力问题后来才发现是我把“你是一个AI助手请回答以下问题”这种废话放在了系统提示词里导致模型输出不一定是纯JSON。删掉冗余指令、锁定response_format解析成功率直接涨到99%以上。还有一个常见认知误区很多人以为模型输出不稳定就要换更强模型。实际上多数不稳定的根因在“输入太模糊”模型只能自由发挥。先把Prompt边界和输出约束做严谨再判断是不是模型能力问题这是性价比最高的排查顺序。5. 几条个人最想分享的工程经验第一条经验先把流程手工跑通再写自动化代码。我见过太多人一上来就搭复杂平台结果连最基本的效果验证都没做。正确顺序是拿十组真实数据人工分析结果确认可行性再代码化。第二条经验把Prompt当代码维护纳入版本库写上commit message。我改Prompt的时候一定会注明“为什么改、影响哪些模块”一个月后回看才知道当时的决策逻辑。没有版本记录的Prompt本质上是不可维护的技术债。第三条经验保留完整的实验记录。每次换模型、调参数、改Prompt都记录测试集得分、耗时、成本、异常样本。积累久了这套记录本身就是最好的决策依据。有时候判断要不要升级一个模型翻一下历史记录比跑十轮测试还有用。第四条经验AI工程要同时重视“下行风险”。做AI功能时我会问自己输出错了会怎样成本失控会怎样被恶意输入攻击会怎样把这些风险设计进系统比模型本身的聪明程度更重要。我在实际项目里最深刻的体会是AI工程从零到一最难的并不是模型技术而是建立起一套对不确定性的管理框架。接受模型会出错、会漂移、会幻觉然后用系统设计去兜住这些不确定性让每一次输出都可追、可查、可回滚。能做到这一点AI能力才真正变成了产品能力而不是一段演示脚本。最后再分享一个小技巧所有AI接口调用入口统一封装日志里记录完整的输入、输出、耗时、token数、Prompt版本号。这套日志在排查线上问题时价值极大值得从项目第一天就做起来。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

UVM中-类的继续和多态的使用 2026/10/1 20:58:39

UVM中-类的继续和多态的使用

1. 继承关系与句柄 class a; endclassclass b extends a; endclassclass c extends b; endclass 声明: systemverilog a tr1; // 基类句柄 b tr2; // 中间子类句柄 c tr3; // 最具体子类句柄 执行: systemverilog tr1 = c::type_id::create("tr1"); …

阅读更多 →
2026年MCP实战教程:用Python搭建大模型网关,聚合多模型API并统一为MCP协议接口 2026/10/1 20:58:39

2026年MCP实战教程:用Python搭建大模型网关,聚合多模型API并统一为MCP协议接口

MCP协议普及之后,一个常见诉求是把多个大模型的API聚合到MCP服务器端,对外统一暴露成一个协议接口,客户端按需调用。整体思路是让网关层屏蔽各家API的差异,鉴权、限流、协议转译、路由全部收敛到网关统一处理,客户端只…

阅读更多 →
重庆GEO项目加盟靠谱源头厂家怎么选?有顶层资源支持的企业综合实力推荐 2026/10/1 20:58:39

重庆GEO项目加盟靠谱源头厂家怎么选?有顶层资源支持的企业综合实力推荐

深圳市讯灵智能技术科技有限公司是南方网通集团旗下全资子公司,深耕企业数字化营销领域,依托合规自研GEO生成式引擎AI智能体双引擎系统,为企业提供AI获客全链路解决方案,是国内兼具国家算法备案与权威背书的商用AI营销系统源头原厂…

阅读更多 →
JS数组插入删除:push、pop、shift、unshift与splice 2026/10/1 20:58:33

JS数组插入删除:push、pop、shift、unshift与splice

js数组的常用方法里,插入和删除这两类动作被问到的频率最高,尤其是头部插入、头部删除、尾部插入、尾部删除这四个基础操作,几乎是每个刚接手真实项目的人都会先去翻一遍文档的东西。我刚开始写业务代码的时候也觉得这几个方法没什么可讲的&a…

阅读更多 →
JS数组方法全解析:从增删改查到性能优化与避坑指南 2026/10/1 20:58:33

JS数组方法全解析:从增删改查到性能优化与避坑指南

1. 数组操作看着简单,为什么很多人还是写不顺手前阵子帮同事排查一个聊天列表的卡顿问题,代码逻辑本身不复杂:每来一条新消息,就往列表头部插入一条。他写的是list [newMsg].concat(list)。单条消息看不出问题,可一旦…

阅读更多 →
本地AI前置预处理:文档分片与L0规则调度实战 2026/10/1 20:58:33

本地AI前置预处理:文档分片与L0规则调度实战

做本地AI应用的大概都被同一个问题卡过:你辛辛苦苦在本机跑起一个大模型,结果发现真正推进业务效率的不是模型本身,而是模型前面那堆脏活累活——把几百份办公文档转成模型能读的文本,再按需切片、过滤、分类,最后才轮…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉