拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

从零搭建AI工程化骨架:Prompt、Agent与工作流实战指南

从零搭建AI工程化骨架:Prompt、Agent与工作流实战指南 做AI工程这件事我最大的体会是别急着冲进去调模型、堆框架先把“从零开始”这条链路完整走一遍。说干就干读完这篇文章你会得到一套可以照着搭建的AI工程化骨架理解从Prompt到Agent、从原型到工作流的完整演化路径也清楚每个环节为什么要这样设计而不是只会套用现成的“智能体模板”。这篇文章适合的对象很明确想系统掌握AI工程化能力、而不是碎片化试用各种AI工具的开发者需要把AI能力稳定嵌入业务流程的产品经理和技术负责人以及那些已经用了一阵子AI、但总觉得“效果不可控、不知道下一步怎么优化”的从业者。我默认你有一些Python基础但不要求你懂深度学习原理——工程化这件事门槛没你想的那么高但坑绝对比你想的多。1. 为什么“从零开始”的AI工程值得做1.1 AI工程和“调模型”完全是两码事很多人以为AI工程就是写Prompt、接API、跑几个Agent框架其实这只占很小一部分。真正的AI工程是把一次“偶然成功的AI实验”变成一个“可预期、可度量、可维护的系统”。它关心的是稳定性和可控性同样一段输入今天跑和明天跑结果差异有多大模型偶尔“抽风”时你的业务流程能不能兜住新版本模型上线时怎么快速评估它不会搞砸你的下游任务从零开始的意思是不直接依赖某个封装好的“AI应用框架”而是亲手把数据输入、模型调用、工具执行、结果校验、失败重试、日志追踪这些环节一个个搭起来。这样做看起来绕了远路实际上帮你避开了最大的坑很多现成框架前期用着爽一旦你的业务场景稍微特殊一点比如需要自定义工具协议、需要精细控制上下文内容、需要深度定制错误恢复策略框架的抽象反而成了枷锁。你自己搭过一遍骨架之后再看任何框架的文档都能一眼看出它替你做了什么、藏了什么风险。1.2 AI工程的三层地图基础层、模型层、工程层我习惯把AI工程能力拆成三层来看这样既方便规划学习路线也方便排障定位问题。第一层是基础层包括Python开发环境、数据结构处理、HTTP服务、异步编程、基本的向量检索概念。这些不要求精通但你得能在不同工具之间自如切换。第二层是模型层重点不是怎么训模型而是怎么理解模型的能力边界上下文窗口意味着什么、温度参数对结果稳定性的真实影响、结构化输出的正确姿势、Function Calling的机制原理。第三层是工程层这是绝大多数人最薄弱的环节Prompt版本管理、测试集构建、回归评估、缓存策略、限流与重试、成本监控、日志链路。把这三层串起来看你才会明白一条好的AI工作流为什么必须要包含“计划—执行—校验—复盘”的循环而不是简单的一问一答。1.3 这套能力的影响范围从个人效率工具到团队协作基座往小里说你可以给自己写一个“琐事处理助手”把整理周报、格式化数据、生成会议纪要这些杂活自动化每天节省一两个小时。往大里说当你把这套方法论迁移到团队里它就变成了一种“内部生产力平台”的建设思路不同的人负责不同的AI组件通过标准接口协作测试、日志、监控共享。很多团队买了一堆AI工具却用不好问题不在工具而在缺少一个“从零开始设计AI服务”的人。2. 核心方法论Prompt工程与Harness工程2.1 Prompt Engineering?更准确的说法是“任务拆解工程”“提示工程”这个词被用烂了但它真正的价值不在“怎么把Prompt写得更巧”而在“怎么把一个真实任务拆解成模型能稳定执行的子任务”。我给你一个很实用的分析框架产出定义、约束条件、处理路径、失败兜底。先讲产出定义你必须明确告诉模型“你交给我的是什么形式的东西”是要一段json、一个markdown表格还是一个Python代码块没有明确产出定义模型就会自由发挥。约束条件是业务侧的要求比如“只能基于我提供的资料回答问题不能编造”或者是“如果信息不足必须输出UNKNOWN”。处理路径是操作逻辑比如“先判断这个问题是事实型还是建议型再选择不同的回答模板”。失败兜底是最后的安全网告诉模型“当你发现自己不理解或者材料不够时该输出什么”。这四要素齐全一个Prompt才算是一个可交付的工程产物而不是一句碰运气的对话。2.2 Harness Engineering给AI这匹快马装上缰绳“Harness Engineering”这个名字我是在研究AI系统可靠性时逐渐理解的。它的核心思想是不要试图让模型“自己变成专家”而是把模型当作一个能力强大但需要被驾驭的执行器由你设计出一套缰绳来控制它。这套缰绳包括角色边界、工具权限、输出格式校验、内容安全过滤、以及针对模型“越权行为”的拦截机制。举个例子你让一个Agent“帮我整理本周的所有邮件”。如果没有Harness它可能会自作主张地读取它不该读的文件、用不正确的格式回复重要联系人、或者在没有充分依据的情况下“合理推测”出一些你根本没说过的话。而套上Harness之后系统的行为变成了它先列出自己准备访问哪些邮件目录等待你确认它只生成“待办清单”而不是直接发送任何回复每一次工具调用都有日志。我把它理解成“给AI配了一本操作手册和一套刹车系统”——能力是模型的边界是你定的。2.3 从单次调用到Agent工作流记忆、规划与工具单次调用解决的是“翻译类”任务比如把一段话总结成三个要点。Agent工作流解决的是“多步骤任务”它至少需要三样东西记忆、规划、工具。记忆分短期和长期短期就是上下文窗口内的对话历史长期则需要外部存储比如把历史结论存到本地文件或向量库里。规划指模型要能把一个大目标拆成小步骤并在每一步根据新信息调整计划。工具是它“动手做事”的接口比如搜索引擎、代码执行器、数据库查询器。这三个组件里工具设计是最容易被低估的。我给一个建议工具函数的输入输出尽量设计成强类型的JSON Schema减少模型“自由发挥”的空间。比如你提供一个search_docs(query: str, limit: int 3) - list[str]工具比提供一个run(query)的“万能工具”要可靠得多后者会让模型觉得它可以塞任何东西进来输出也会变得不可控。记住Agent不是魔法它只是比单次Prompt多了“循环能力”而已。3. 实操从零搭建一个能落地的AI工作流3.1 场景选择找一个“琐事缠身”但“AI能代劳”的目标我建议你先不要做“万能助手”而是找一个小而实的场景比如“把每日零散的会议记录整理成结构化事项”。这个场景有三个好处第一输入数据你手上就有第二任务边界清晰不会牵扯外部系统授权第三产出的验证非常直观——整理出来的待办事项准不准、全不全一目了然。下面的实操就以这个场景为例。3.2 环境准备与目录设计我通常用一个简洁的项目结构来承载这类AI工程连数据库都不用先上本地文件足够ai-engineering-from-scratch/ ├── data/ │ ├── raw/ # 原始会议记录 │ └── processed/ # 整理后的结构化输出 ├── src/ │ ├── tools.py # 工具函数读文件、写json │ ├── agent.py # 核心工作流编排 │ └── validate.py # 输出校验 ├── prompts/ │ ├── system.md # 系统提示词 │ └── tasks.md # 任务描述 └── tests/ └── test_output.py # 回归测试这个目录设计的逻辑是原始数据、处理代码、提示词、测试脚本全部隔离。这样任何一个环节出了问题你都能快速定位。特别是prompts目录单独放是因为提示词的修改频率远高于代码独立成目录后可以配合Git做版本管理哪天发现新Prompt改坏了结果直接回滚旧版本就行。3.3 核心代码实现一个带校验的Agent骨架下面这段代码我用Python写了最小可运行版本重点不是模型的调用细节而是工程骨架。你可以替换成任何你常用的模型服务包括本地部署的开源模型或者云端的API接口只要保留统一的调用封装即可。import json import re from datetime import datetime from typing import Callable # 假设你已经实现了一个调用模型的函数 # 它的输入是 messages 列表输出是字符串 def call_model(messages: list[dict]) - str: # 这里接你的模型服务 raise NotImplementedError(替换为真实模型调用) # 工具一读取原始会议记录 def read_meeting_notes(file_path: str) - str: with open(file_path, r, encodingutf-8) as f: return f.read() # 工具二把结构化结果写入文件 def write_structured_result(data: dict, out_path: str) - None: with open(out_path, w, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2) # 输出校验确保模型返回的是合法JSON且包含必要字段 def validate_output(text: str) - dict: # 去掉可能的 markdown 代码块围栏 text re.sub(rjson|, , text).strip() data json.loads(text) required_keys {action_items, owners, deadlines} assert required_keys.issubset(data.keys()), f缺少必填字段: {required_keys - data.keys()} return data # 核心Agent流程 def run_agent(raw_file: str, out_file: str) - dict: notes read_meeting_notes(raw_file) system_prompt open(prompts/system.md, encodingutf-8).read() task_prompt open(prompts/tasks.md, encodingutf-8).read() messages [ {role: system, content: system_prompt}, {role: user, content: f{task_prompt}\n\n以下是本次会议记录\n{notes}}, ] # 第一次调用生成结构化结果 raw_output call_model(messages) # 校验不合法则再让模型修正一次 try: result validate_output(raw_output) except Exception as e: messages.append({role: assistant, content: raw_output}) messages.append({role: user, content: f校验失败: {e}请重新输出合法JSON}) raw_output call_model(messages) result validate_output(raw_output) write_structured_result(result, out_file) return result if __name__ __main__: out_path fdata/processed/meeting_{datetime.now().strftime(%Y%m%d)}.json result run_agent(data/raw/meeting_draft.txt, out_path) print(完成共提取, len(result[action_items]), 条待办事项)这段代码里最关键的工程点不是模型调用而是validate_output这一步。很多AI工作流不稳定就是因为省掉了结构化校验导致模型输出的字段名称一会儿是action_items一会儿是ActionItems。你只要在代码里强制校验不合法就让模型重来整个系统就稳了一大截。实际上线时还可以加入“最多重试三次三次都失败就转人工”的兜底逻辑把失败率从百分之几压到千分之一以内。3.4 评估怎么知道工作流真的“可用”了不要用感觉来评估整理一个20条左右的测试集覆盖正常场景、长文本场景、含模糊信息的场景。每次修改Prompt或代码后都跑一遍测试集记录三个关键指标字段合法率输出能被成功解析的比例、关键信息召回率真实待办事项被准确提取的比例、单次运行成本。当你发现字段合法率达到95%以上、关键信息召回率稳定在90%以上这个工作流就可以交出去给别人用了。我第一次搭类似系统时就是漏掉了回归测试自认为Prompt已经写得很完美结果换了另一批数据立刻“翻车”。从那以后我养成了一个习惯任何Prompt改动必须先过测试集再上线顺序不能反。4. 工具链选型与工作流编排4.1 开发环境IDE插件与调试技巧现在很多IDE开始内置AI辅助能力比如我在PyCharm里就用了一些AI插件来补全代码和生成单元测试。但这里有个很实际的建议AI补全出来的代码一定要带着“验收”的心态去审。工程化的关键在于你要建立自己的代码审查清单。特别留意AI生成代码时最容易犯的几个毛病没有异常处理、硬编码了测试值、忽略目录路径的兼容性。你在工作流里加了validate_output这种“强制校验”函数其实也是同样的思想对AI的输出保持结构化、可验证的接受标准。调试AI工作流时别像调试普通程序那样只在IDE里看报错。你需要一套“日志优先”的思路把每一步的模型输入和输出都记录下来存成可检索的log文件。比如你可以把messages数组、raw_output、validate_output的异常信息都追加到一个运行日志里出了问题直接翻日志比对着屏幕猜要快得多。4.2 多AI协作编排模式与自治模式的取舍“多AI协作”听起来很酷但工程上其实只有两种模式值得推荐。第一种叫编排模式有一个主Agent负责任务拆解和结果汇总其他子Agent各干一件专门的事第二种叫自治模式多个Agent通过一个共享队列通信各自独立行动。我强烈建议你初次落地时选编排模式因为自治模式的调试难度是指数级上升的——你根本不知道是哪个Agent的哪一步决策导致链路断了。等编排模式跑顺了再引入自治能力逐步演进这是最稳妥的路径。工具选型上的建议是优先选择支持标准协议的组件避免被绑死在特定平台。文件读写、API鉴权、日志存储这些基础能力一律用原生标准方式实现不要依赖某个AI平台私有格式。这样即使模型服务商换了你的工程骨架改一行代码就能切换。4.3 从原型到生产缓存、限流与成本控制从零搭建的AI工作流一旦要从“自用”变成“团队用”就要考虑三件事缓存、限流、成本。缓存很实用因为很多任务是重复的——比如同一个会议模板整理完全可以在输入哈希一致时直接返回上次结果。限流是为了防止模型API被调用方不小心打爆你可以在代码里加一个简单的令牌桶控制每分钟的调用次数。成本监控则要求你把每次调用的token数和金额记录下来以天为粒度聚合成报表。对于刚开始做AI工程的人我建议先别追求“高端架构”把数据流和失败处理做扎实比引入消息队列或向量数据库更紧迫。很多生产事故根本不是模型能力不够而是你在没有缓存、没有重试机制的情况下把模型API当成了数据库来用。5. 常见问题排查实录5.1 上下文一长结果就“失忆”这是最典型的问题表现为对话超过一定轮数后模型开始忽略最早的信息。解决办法不是简单增加模型的最大长度而是做好上下文压缩。我会在每轮交互后把核心结论单独抽取出来放在系统提示词的“已知信息”区清掉已经消费过的详细对话。相当于给模型准备了一个便利贴重要信息写纸上其他内容随用随取。测试下来这么处理后长任务的成功率能提升20个百分点以上。5.2 输出格式不稳定字段时而多时而少根本原因是你在Prompt里只描述了“大概要什么”而没有给出严格的JSON Schema示例。我这里的方法是把校验失败的反例直接抛回给模型。比如本次的validate_output检测到缺少deadlines字段时就把具体的错误提示连同模型之前的输出一起发回去让它在错误信息上重试。实测下来两轮以内的修复成功率很高这种“把工程错误变成模型纠错指令”的思路非常重要。5.3 模型“合理编造”出用户没提供的信息幻觉问题在工程上只能减小不能清零。我能给出的最有效经验是在所有工具结果和参考材料前面强制标注来源比如“参考数据[会议记录-v3]原文如下...”。然后要求模型在输出结果时也必须标注每条结论的来源编号。凡是找不到来源编号的结论都不能输出。用这个规则约束后幻觉率至少可以下降一大截。对于高风险场景你还可以再加一道闸门用一个轻量级校验器扫描所有结论中的关键实体是否能在输入材料中找到。5.4 常见问题速查表从现象直接定位解法我把这些问题整理成一张速查表方便你直接对照。现象可能原因排查/解法结果混乱、不按格式输出Prompt里缺少严格Schema示例补充JSON样例并对输出强制校验长对话后忘记早期指令上下文过长导致信息稀释引入摘要机制把关键结论前置偶尔断在中间不返回超时或单次输出长度不够增加重试机制拆分子任务工具调用参数乱传工具Schema定义太宽松使用强类型的JSON Schema限定输入结果质量时好时坏温度参数过高在追求稳定场景把温度调低或固定同一个输入反复消耗接口缺少缓存对可重复输入做哈希缓存我把这十几条规则和技术实践理顺之后最大的一个感受是AI工程从零开始不是“玩玩具”它是一套系统化能力。当你亲手搭过一次完整的骨架再回头去看那些热门的Agent项目、工作流框架你会发现你看到的不是一堆陌生的名词而是“它在哪些环节替我做了决定、它的不确定性处理得好不好、我该怎么在它的基础上扩展”。这种内行的洞察力才是这个项目真正值得投资的回报。如果你也想动手试试就按我上面说的目录结构先用一个小场景把链路跑通然后把校验、重试、日志这三件套加上你的第一个AI工程就算是真的落地了。
返回列表