ARTICLE DETAIL

资讯详情

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

AI Agent开发实战:从架构设计到Token成本优化的完整指南

AI Agent开发实战:从架构设计到Token成本优化的完整指南 1. 新手期的典型误区从调API到理解Agent的运行逻辑大概在半年前我拿到《AI Agent开发项目实践》这个题目时第一反应是这有什么难的不就是把大模型的API接进来写个循环让它自己调用工具吗。结果真正动手之后才意识到我对AI Agent的理解整个就是错的。那段时间我几乎把热搜词里的坑全踩了一遍——什么agent token是什么意思、ai agent主流架构、让小红书自动发消息看着都不难真做起来才发现每一行都是学问。这个项目我从零开始设计最后落地了一个能完成多步骤任务的Agent系统支撑了四个真实业务场景自动生成数据分析报告、按模板整理会议纪要、对接内部CRM做客户信息汇总、定时巡检监控指标并给出告警描述。整个过程大概花了两个多月中间推翻重来了整整三轮。这篇就把这段时间的实践记录完整地拆出来从架构选型、核心模块、Token成本到部署踩坑按真实项目推进的顺序写。1.1 最初的翻车一口气接上API并不等于会做Agent我最开始犯的错特别典型。拿到项目之后第一步就是去注册模型API写好一个输入prompt、输出结果的封装函数然后再加一层while循环——让模型自己决定下一步调哪个函数。跑起来那一刻真觉得自己要成了Agent能自己挑选工具、自己调用、自己判断跟网上demo视频一模一样。但等到应用场景一复杂问题全暴露了。比如让它完成整理一份本周销售数据报告这个任务它会先查数据库然后发现数据不太对再查一遍然后又去问了另一个数据源两个结果不一致它就陷入了反复比对。最大问题是它没有一个整体的任务规划走一步看一步中间一旦遇到模糊情况就开始转圈。最夸张的一次它为了确认一条数据对不对连续调用查询工具七次最后直接在上下文里带偏了输出了一份丢了好几个重要字段的残缺报告。这就是我理解Agent的第一个拐点Agent不是能调用工具的程序而是一个在不确定环境中做决策的系统。这个决策需要目标拆解、状态追踪、结果验证、异常恢复缺一环它都会变成碰运气的智能体。1.2 厘清Task、Agent、Chain、Pipeline之间的关系后来我花了整整两天把网上能搜到的架构资料和开源项目源码过了一遍才算把几个基础概念理清楚。很多人跟我一样一开始把Agent当成一个更大的模型调用其实区别非常大Chain链条固定流程步骤写死在代码里适合每一步都知道下一步是什么的场景。Pipeline流水线也是固定流程但强调数据在不同处理阶段之间流转偏向数据处理管线。Agent智能体流程不是固定的模型根据当前状态决定下一步做什么就像人接到任务之后自己安排步骤。Task任务交给Agent的一个目标可以拆成多个子步骤每个子步骤可能是Chain也可能是另一个Agent。我早期之所以翻车就是把Agent当成Chain在写。以为只要给个循环让模型反复决策就是Agent了但缺了流程控制、状态管理和终止条件。三个关键动作是必须的任务拆解器把目标拆成子任务、执行器逐个处理子任务、验证器检查每个子任务完成得对不对错了就修正。为了验证这个理解我用一周时间写了一个最小可行版本意图识别模块、三个可调用工具、一个复盘模块。这个版本只做一件事——让Agent自动读取一篇英文技术文档提取关键信息翻译成中文摘要并按固定格式输出到指定文件。这个任务足够简单但刚好覆盖了拆解-执行-验证-输出四个环节跑通了之后我才算真正开始理解Agent的运作方式。1.3 动手前的思维转变把Agent当成交互式系统而不是高级API这个思维转变是整个项目里最重要的一个节点。过去我写业务代码习惯是输入是确定的逻辑是确定的输出是确定的。但Agent完全不同——输入可能是模糊的中间步骤是动态决定的甚至同一个任务两次运行走的路径都可能完全不一样。所以我被迫接受了三件事第一必须给Agent足够的自我修正空间。第一次跑出来的结果大概率不是最好的甚至可能是错的所以要让它在每完成一个子步骤之后做一次反思把上下文中的失败信息作为下一次决策的依据。第二必须设计终止条件。Agent天然有无限运行的趋势没有明确的终止条件就会一直循环或者重复调用工具。我后来在所有执行循环里都加了最大步数限制和连续N次未产生有效结果就自动退出的熔断逻辑。第三必须把不确定性显式建模。不要假装模型永远正确每个工具调用的返回值都要做置信度校验关键操作要有确认环节。这套认知让我后面写代码顺畅了很多。之前是能跑就行之后变成了可解释、可控制、能收敛。这个项目做到最后我最大的体会是AI Agent开发挑战你的不是写代码的能力而是把不确定性系统化的能力。2. 架构选型从全用现成框架到核心自研的取舍过程架构选择是我花时间最多、也最纠结的一个环节。当时主流方案就两条路要么直接用成熟框架比如LangChain、LlamaIndex这类要么自己写一套轻量级的。我最后走了第三条路——框架的核心机制参考开源设计但关键模块全部自研。2.1 为什么没有直接用成熟的Agent框架说实话成熟的框架确实省事文档齐全、生态强大社区里能搜到大量现成的案例。我排序对比了好几个框架发现它们共同的优点和共同的槽点都特别明显。框架的好处是工具调用、记忆管理、提示词模板这些基础能力已经封装好了起步速度极快适合做原型验证和demo演示。但这些框架的问题也很现实第一高度抽象出问题的时候排查链路极长黑盒感很强第二可定制性受限想实现自己的调度逻辑往往要绕过框架的设计意图第三升级频繁接口变动大跟版本都得花不少精力。我当时做了一个小实验用LangChain搭一个给销售团队写客户跟进邮件的Agent demo只花了一个下午就通了。但当我试图给它加上读取公司内部CRM数据→分析客户历史交互→判断客户意向度→生成定制话术这条业务链路时框架的结构反而成了障碍。它的Agent执行逻辑固定在思考→行动→观察这个循环里而我的业务需求是先做一个深度分析再决定是否生成邮件中间还涉及两个不同模型的配合、多个数据源的融合。最后我决定不跟框架较劲了自己写核心调度系统框架只用来做本地向量检索和部分工具封装。这个决定让我项目周期拉长了大概三周但换来的是对每一个环节的完全掌控后面按业务需求迭代的时候非常顺手。如果你想快速做demo验证可行性直接用框架没问题但如果你的目标是要做一个长期演进的业务系统我的建议是核心调度自己做外部能力用轮子。2.2 主架构模型路由 多Agent协作 记忆分层我的最终架构分成了五层每一层都有明确的职责边界层级职责关键组件交互层接收用户请求返回最终结果REST API、WebSocket、消息队列路由层识别意图判断任务类型和优先级意图分类模型、规则引擎规划层拆解任务为子步骤规划执行顺序Planner模块、任务队列执行层调用具体工具、模型、服务工具注册表、模型网关记忆层保存上下文、历史记录、领域知识短期缓冲、长期存储、向量库这个架构最核心的设计就三条模型路由、多Agent协作、记忆分层。模型路由解决的是什么任务该用哪个模型的问题——简单的意图识别用小模型省钱省时间复杂推理用大模型保证质量实现上就是一张路由表加几个质量阈值。多Agent协作解决的是单Agent能力有限的问题——每个Agent聚焦一个领域比如数据查询Agent只负责数据库操作报告生成Agent只负责文本输出它们之间通过任务队列通信。记忆分层解决的是上下文塞不下的问题——短期记忆就是当前对话的直接上下文长期记忆是用户的历史偏好和项目档案外部知识库则是业务数据和文档按需求动态加载。2.3 为什么规划层执行层分离比单Agent自由决策更稳这是一个非常关键的架构决策我一开始是纯单Agent自由决策路线后来改成规划与执行分离效果天差地别。自由决策模式就是我最开始写的while循环模型自己决定下一步干什么直到它认为任务完成。这个模式的好处是灵活坏处是不可控——你不知道它接下来要干嘛也没法预判它会在哪里卡住。这在demo环境里很爽在真实业务里会让人崩溃因为你没法给它设置有效的监护机制。规划与执行分离的设计是由规划和任务拆解模块在接到任务之初就生成一个完整的子任务清单规划完成后交给执行层逐个执行执行完一个子任务之后验证层检查结果再把结果回传给规划层由它决定下一步是继续执行、调整计划还是终止任务。这样每一步都有据可查出了问题能精确定位到是规划错了还是执行错了。我实际测下来同一个任务在自由决策模式下跑了119步才完成中间甚至出现了对同一数据源的三次重复查询在规划-执行分离模式下同样任务只用了21步而且每一步都能看到明确的意图。稳定性提升非常明显。3. 核心模块逐个落地工具调用、状态管理和上下文窗口架构定了之后就进入填肉阶段。这个阶段我最大的感受是每个核心模块单拆出来都不难但放在一起要协同工作各种细节就会冒出来。这一章按模块逐个讲清楚。3.1 让Agent学会使用的工具Function Calling的正确打开方式工具调用是Agent最重要的能力之一。我的实现方式是使用模型提供的Function Calling能力这个机制简单说就是在每次请求里附带一份可调用函数列表模型根据对话内容判断需要调用哪个函数返回结构化的调用请求我再在本地执行对应函数然后把结果回传给模型做下一轮推理。实践下来有几个关键细节是文档里不会写明白的第一工具描述要写得极其具体包括使用场景、参数含义、常见坑。比如我注册了一个query_sales_data工具描述里写了用于查询销售数据当用户询问销量、收入、客户数据时使用这个工具。参数date_range是时间范围格式为YYYY-MM-DD。如果描述写得含糊模型经常在错误的场景下调用它。第二要让模型知道什么时候不该用工具。这一点我开始完全没想到。后来发现模型会因为过度调用工具而把简单问题复杂化——比如用户问今天周几模型先去调用了一个日期工具。所以我后来在每个工具注册表里都加了一条工具使用规则字段说明什么时候该用、什么时候不该用实测降低了不少无效调用。第三Function Calling返回的结果要统一清洗成模型友好的格式。模型能读的是文本所以我让每个工具返回值都是结构化的JSON字符串并在返回前做好格式化避免模型被原始的、脏乱的数据干扰判断。3.2 状态管理的核心用状态机避免Agent迷路Agent跑多步骤任务时最大的安全隐患是迷路——做着做着忘了自己在做什么任务或者做完第一步直接跳到了第四步。我解决这个问题的方式是引入状态机。我定义了一套状态集合INITIALIZED已初始化、PLANNING规划中、EXECUTING执行中、VERIFYING验证中、REVISING修正中、COMPLETED已完成、FAILED失败。每个状态有明确的进入条件和退出条件Agent每一步都要更新状态状态不合法就触发异常处理。比如执行中的数据查询步骤Agent进入EXECUTING状态后只有等待工具调用返回并完成结果校验才能进入VERIFYING校验通过才能进入下一步校验失败则进入REVISING重试次数超过三次直接置为FAILED并终止任务。这个状态机看起来简单但它解决的核心问题是Agent不能从一个子任务漂移到另一个子任务。我在实现里给每个子任务都挂了一个独立的上下文标记Agent每次生成回复之前系统会校验当前上下文标记是否匹配不匹配就强制它回到正确轨道。状态机的实现代码不算复杂但价值极高。3.3 上下文窗口超过限制截断、摘要还是RAG上下文窗口是每个Agent开发者都绕不开的经典难题。我的项目里最典型的情况是Agent要给客户生成一份项目周报背景资料里包含了过去三个月几十份项目文档全部塞进去根本不可能。我最终采用了三级上下文策略这是我从RAG检索增强生成的思路里演变出来的第一级是最新对话上下文保留最近几轮的完整对话记录保证对话连贯性第二级是工作记忆存放当前任务拆解清单、已执行步骤和中间结果这是Agent做决策的必要信息第三级是长期知识来自向量数据库按相关度召回只把最相关的文档片段注入上下文。实现上就是三个池子短期缓冲用普通的列表结构即可长期知识用向量库存业务文档。每轮开始前做一个上下文组装操作取短期缓冲→合并当前工作记忆→根据任务类型从向量库检索补充知识→拼装成最终的Prompt。这一套流程跑下来我的上下文使用量直接下降了约60%而且答案质量没有下降——因为塞进去的每一段都是相关的。代价是需要多写一个上下文管理器维护成本和调试成本都高了但这是值得的。任何一个Agent项目从demo走向生产这一步早晚都得做。4. 成本账Token到底是怎么花掉的项目上线之前我觉得成本是个以后再说的问题。结果第一次完整跑完一个任务链打开账单明细的时候我整个人是懵的——三个子任务花了十几万Token换算成钱虽然单次不吓人但乘以每天几百次调用这个数字就非常可观了。这一章专门讲讲Token成本优化的实践这也是热搜词里很多人问agent token是什么意思的原因。4.1 一个任务的Token消耗拆解钱都去哪了我详细拆了一个典型任务——分析最近一周销售数据并生成报告的Token消耗结果非常有意思环节Prompt消耗Completion消耗占比任务拆解1,2004803.8%数据查询与结果整理4,6001,30013.5%数据反复校验第一次结果异常8,9002,40025.8%报告结构规划2,3009007.3%报告撰写15,2006,80046.8%自我检查与修正3,1001,50010.7%其中最扎心的发现是中间经历了一次数据校验失败-尝试新方法-再次失败-最终成功的过程这一轮消耗占总Token的约25.8%。也就是说Agent的返工成本是非常高的——它每失败一次不只是浪费时间而是在烧钱。这也侧面说明了为什么规划-执行分离的架构在经济性上更优规划做好了返工就少返工少了Token就省了。4.2 三种有效的省钱手段缓存、语义压缩和任务合并成本优化我做了三轮每一轮都有实际效果。第一轮是缓存。凡是重复出现的固定文本系统提示词、工具描述、知识库片段我都做了前缀缓存——相同的前缀内容不会重复计费。这一项帮我省了大约15%的开销。第二轮是语义压缩。每次子任务完成后不是把完整的结果直接塞进上下文而是先做一个语义摘要只保留关键信息。比如查询数据库返回了五十行明细我先让一个小模型把这五十行压缩成本周销售额100万同比增长12%主要增长来自华东区再注入上下文。这样上下文干净了后续步骤的Token消耗也降低了总体降了约25%。第三轮是任务合并。原本很多小步骤是可以合并的——比如数据查询和格式整理虽然逻辑上是两步但模型是可以在一次调用里先查完再整理的。我对照执行链路识别出五组可以合并的步骤减少了大模型调用次数这一步又省了约20%。三轮下来同一个任务的Token消耗从约16万降到了约7万成本下降了接近一半。这个优化空间可比我想的大多了如果你的项目也在线上跑强烈建议先做这三件事。4.3 模型路由的省钱价值不是所有任务都需要最强的大脑最后要说的这个模型路由是我觉得所有省钱手段里性价比最高的一个。大模型确实强但90%的时候用不到它完整的推理能力。我的做法是定义了三级模型策略一级处理简单分类、格式转换、关键词抽取用小而快的模型二级处理中等难度的内容生成、结构化提取用中等规格的模型三级才处理复杂推理、多步骤规划、困难问题用最强的模型。路由逻辑就是我在架构设计里提到的意图分类模块——先判断任务的复杂度和类型再决定交给哪个模型。实测数据是一个典型请求里约45%的调用落在了一级小模型上35%落在二级只有20%落在三级大模型上。整体单次任务成本直接再降了35%左右而用户感知到的质量几乎没有变化——因为简单任务小模型完全能胜任。5. 部署阶段的真实问题重试风暴、并发隔离与稳定性写完代码只是万里长征第一步。真正让我感受到项目工程化和业余练手之间差距的是部署阶段。这个阶段遇到的问题一个比一个真实也一个比一个非技术感。5.1 上线第一夜当我看到200请求的重试风暴第一次把Agent服务部署到云服务器上准备让它定时跑任务结果第二天早上一看日志整个人都清醒了——一晚上发了两百多次重试请求。排查后发现原因特别低级Agent在执行一个数据查询任务时连不上数据库它按设计的逻辑自动重试但重试间隔设置得太短了再加上有多个任务同时重试直接把数据库连接池打满了。数据库连接不上→查询失败→Agent继续重试→连接池更满一个标准的重试风暴。修复办法其实是经典做法给所有外部调用加上指数退避重试——第一次失败等10秒再试第二次失败等30秒第三次失败直接放弃并标记任务失败交给人工处理。同时给Agent的重试次数设上限最多三次。这个改动做完重试风暴彻底消失。5.2 并发隔离为什么会让两个任务互相干扰并发任务之间互相干扰这是我在线上环境里踩的第二个坑。现象是两个任务同时跑的时候偶尔会出现任务A的输出结果出现在任务B的报告里这种诡异情况。排查下来原因是我的Agent上下文中保存了任务状态和中间结果而多个任务复用了同一个模型客户端实例某个环节的异步调用导致了上下文串写。这是初级错误但特别容易犯。修复方式是彻底隔离——每个Agent任务独享一份上下文字典任务之间不共享任何可变状态模型调用客户端也按任务维度单独创建。改完这个之后再也没出现过串味的问题。5.3 权限粒度与安全沙箱把Agent的能力关进笼子里Agent的能力越强风险越大这句话在部署阶段体会特别深。我的Agent可以调用数据库查询、发HTTP请求、读写文件这些能力本身没问题但如果Agent被恶意Prompt诱导完全可能做出越权行为。我的处理方式是三层防护。第一层是能力最小化每个Agent任务创建时声明它需要的工具清单不在清单里的工具一律不可调用——比如简报生成Agent就只能访问摘要工具和格式化工具不给数据库权限。第二层是数据隔离Agent能访问的数据集由权限模块控制运行时的所有数据访问请求都要经过权限校验。第三层是输出审计Agent的所有输出都经过敏感信息过滤和合规检查防止它把不该外传的数据写进报告里。这套安全体系是不是把自己限制得太死了我一开始也担心但实际跑下来发现只要任务场景定义清晰最小权限原则几乎不会影响功能却能把风险降低好几个数量级。任何用它连接内部系统的Agent项目安全设计都应该从第一天就做而不是上线后补。6. 验收与复盘从像Agent到是Agent的拐点项目进入尾声我用三个之前完全跑不通的场景做了验收。场景一让它从一堆杂乱的调研资料里提炼一份结构化报告不仅需要筛选信息还需要判断资料之间的逻辑关系场景二让它根据上下文判断用户当前最需要的服务是什么并主动调用对应工具去查询和提供而不是只等用户明确指令场景三让它执行一个需要连续多轮调整的任务——比如对比三个数据源的销售数字找出差异原因并形成结论中途任何一个数据源出错都要能自动恢复。6.1 自以为是Agent和真Agent的判别标准做完验收我总结了一套自测清单用来判断一个项目到底只是调用了大模型的程序还是一个真Agent第一能不能在没有明确指令时根据目标主动拆解动作如果所有的步骤都是代码里写死的那是Chain不是Agent。第二遇到执行结果异常时能不能在运行中自动调整策略真Agent应该有这个能力不能一失败就报错退出。第三同一个任务换一种说法执行路径是否合理变化如果输入措辞大改之后Agent还是走完全一样的执行链路说明它可能没在理解只是在套模板。我的项目在这三条上经过多次迭代后才真正通过。这个拐点不是某一个核心代码改动带来的而是整套架构——规划与执行分离、状态追踪、工具规范、上下文管理、安全控制——共同作用的结果。6.2 三件最改变结果的事复盘整个项目如果只让我说三件最值得做的事我的答案是第一把规划和执行分开。这是整个项目中收益最大的一次架构调整没有之一。单Agent自由决策的模式看起来很酷但不可控就是不可用。第二提前做成本监控。我一开始完全忽略了这个环节导致上线后账单超预期。其实Token成本的可控性比想象中好关键是早设计而不是事后补救。第三对工具的规范化注册。一个工具描述得好不好直接决定了Agent会不会正确使用它。把每个工具当成一个文档写——场景、参数、禁忌、返回结构都写清楚Agent的稳定性和准确率会有明显提升。6.3 给后来者的学习路线建议如果你也想从零开始练这个技能我给一条务实的路线按顺序推进先从函数调用入门学会让模型按格式输出结构化动作然后手动实现一个规划-执行-验证的最小闭环不用任何框架下一步加入外部工具和记忆再进一步引入多Agent协作然后考虑部署、监控和成本优化最后看开源框架的源码这时候你会突然看懂很多当初觉得神秘的设计。我自己走过弯路才明白AI Agent的开发核心其实不在模型本身而在系统设计。所谓练成练的不是能写出多少行代码而是把不确定的智能行为安放到可控的工程轨道上的能力。这条路走得越深越会发现它跟你以前写过的任何一个系统都不一样——你写的不是逻辑是生态。
返回列表