ARTICLE DETAIL

资讯详情

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

真实业务从零构建AI Agent:架构、Token成本与工程化落地实践

真实业务从零构建AI Agent:架构、Token成本与工程化落地实践 先把态放对位这篇文章不是什么“AI行业观察”而是一个普通开发者在真实业务里从零搞出一个AI Agent踩了无数坑之后留下的过程记录和工程笔记。如果你正准备涉足Agent开发或者已经在做但总感觉哪里不对这篇东西值得你花十几分钟看一遍里面有些判断和取舍是我拿好几个通宵换来的。1. 项目定位与整体设计思路1.1 这个项目到底要解决什么问题我接到这个项目时的原始需求很朴素公司内部有个高频重复的运营流程需要从多个数据来源收集信息、做初步判断、然后生成统一的日报再根据日报内容触发不同的后续动作。以前这些事靠运营同事每天手工完成耗时且容易遗漏。老板的想法很简单“能不能搞个AI Agent替他把这活儿干了”第一次接触AI Agent的人最容易把Agent理解成一个“更聪明的大模型”。这是最要命的误解。AI Agent不是大模型本身而是以LLM为决策核心、以工具为执行手脚、以环境反馈为闭环的完整系统。大模型只负责“想”Agent负责“想完了之后做做完观察结果再想”。所以在设计这个项目时我给自己定了三件事第一Agent必须能自主完成“理解任务—拆解步骤—调用工具—校验结果”的完整循环第二Agent的每一步操作都要可控、可观测不能变成黑盒第三在保证效果的前提下尽可能降低token消耗因为业务体量摆在那里每个月几百万token的成本不是闹着玩的。这三条几乎是所有Agent项目的通用底线不论你是做内容生成、数据处理还是自动化运维都绕不开。1.2 Agent系统拆解的几种主流架构动手之前我先看了一圈目前行业内主流的Agent架构方案归根结底就几条路线ReAct模式、Plan-and-Execute模式、Reflection反思模式以及Multi-Agent多智能体协作模式。ReActReason Act是基础中的基础核心逻辑就是“推理—行动—观察—再推理”交替进行。它适合任务路径比较短、需要实时反馈的场景实现起来最简单对token的消耗也最可控。像基本的问答加工具调用用ReAct就够。Plan-and-Execute则把过程拆成两段先生成一个完整的行动规划再按规划逐步执行。相比ReAct它的优点是不会在长任务中迷失方向缺点是应对突发情况时不够灵活。Reflection模式是给Agent加一个“自省”环节每次输出前先自我批评一轮再修正输出。效果往往更好但token消耗几乎翻倍。Multi-Agent则是让多个角色扮演不同职能的Agent协作完成复杂任务比如一个负责拆解问题一个负责写代码一个负责审查。这种模式最灵活但也最复杂调试起来非常痛苦。我的结论是没有最好的架构只有最合适的架构。对于这个日报加自动触发的项目我最终选了ReAct作为主框架在几个关键节点加入Reflection环节做结果校验组合出一套轻量方案。2. 核心技术选型与关键实现2.1 编程语言选型为什么考虑Rust最终怎么选搜索热词里“基于Rust语言的AI Agent”被提起得挺多我也认真评估过这条路线。Rust做Agent的天然优势在于性能和内存安全。Rust的异步生态tokio处理高并发API调用非常稳类型系统和所有权模型可以规避大量运行时错误这在大规模生产部署里是非常有吸引力的。但理性的判断是Rust生态里与LLM相关的库还远没有成熟。当前主流Agent框架几乎都是Python写的LangChain、LlamaIndex、CrewAI等大量现成的工具封装、Chain实现、回调机制Python都能开箱即用。如果团队里所有人都写Python让整个项目用Rust重写一遍首先是开发周期不可控其次是后续维护的人很难找。所以我最终做了个折中方案核心业务系统用Python实现Agent编排逻辑把高频调用的关键路径比如请求分发模块用Rust写了个高性能侧车服务通过HTTP通信对接。这样既拿到了Rust的性能红利又保住了Python生态的迭代速度。提示如果你所在团队对性能没有极端要求不建议一上来就全栈Rust做Agent。先把业务逻辑跑通再针对性能瓶颈做局部优化收益远大于“为Rust而Rust”。2.2 Token到底是什么以及如何管好上下文“AI Agent token是什么意思”这个问题很多新手都在搜。通俗讲token是模型处理文本的最小单位一个token大概是1个英文字母或半个汉字左右不同模型分词器略有差异。你输入给模型的文字、模型输出的文字都要按token计费。Agent每跑一轮任务可能涉及多次模型交互token消耗会被指数级放大。我在这个项目里做了三件事来控制token成本。第一是压缩上下文。不要每次都把全量对话历史塞进模型只保留最近几轮的关键信息更早的内容改为摘要。这样长任务的上下文窗口不会爆成本也低一截。第二是限制输出长度。很多情况下Agent只需输出“是否触发某个动作”或“一段消息模板”这样的短内容我在接口参数里直接限制了max_tokens不惯着模型啰嗦。第三是合理设置工具描述。工具描述写得越精炼越好因为每个工具的description都会随每次调用一起发给模型几十个工具加起来也是一笔不小的开销。我见过一个团队工具描述写了上万字一次请求光工具描述就吃掉几千token属于纯浪费。2.3 Agent与外部系统的工具接入设计一个Agent要干活必须有“手”你必须定义好它能调用的工具。工具的本质就是“大模型可以感知并触发的一组函数”比如查数据库、发HTTP请求、读文件、写日志。工具接入这块最重要的设计原则是给工具的输入/输出都做严格Schema约束。比如“生成日报”这个工具它的输入格式是“日期范围数据源ID”输出格式是“Markdown文本统计数字”我在工具定义文件里把字段类型、是否必填、枚举范围全部写清楚。为什么必须这样做因为大模型本身并不会严格遵守你口头描述的工具契约只有显式的JSON Schema才能让模型大部分时间都按照预期调用工具。另一个容易忽视的坑是工具异常信息的返回。工具调用失败时返回给模型的错误信息要包含“为什么失败”以及“下一步可以尝试什么”。比如数据库连接失败返回“连接超时请检查数据源配置而后重试”模型就能在下一轮推理中采取补救措施。如果你只返回一个空值或错误码模型是真的不知道该怎么办的。2.4 关键技术模块的代码骨架Agent内核部分我用一个简易的ReAct循环来串起整个流程。伪核心逻辑如下def run_agent(task: str, tools: dict, max_iterations: int 8): messages [{role: system, content: SYSTEM_PROMPT}, {role: user, content: task}] for step in range(max_iterations): response llm.chat(messages, toolslist(tools.values())) if response.get(tool_calls): # 解析模型发起的工具调用请求 call response[tool_calls][0] result tools[call[name]].execute(call[arguments]) # 把工具执行结果返回给模型继续推理 messages.append({ role: tool, tool_call_id: call[id], content: result }) continue # 没有工具调用说明模型认为任务已完成 return response[content] raise TimeoutError(fAgent在{max_iterations}轮内未完成任务)这段代码看起来简单但工程化还有很长的路要走。真实项目里你至少还要加上重试策略、超时控制、日志追踪、token用量统计、错误兜底等一系列能力。我把这些内容都做成了独立模块让Agent主循环保持干净问题排查时才不会一团乱麻。3. 实操过程与部署落地3.1 开发环境的搭建与依赖管理项目基于Python 3.11和LangChain框架来做Agent编排模型使用国内可稳定调用的Qwen系列API上下文窗口设为32K。依赖管理用Poetry因为Agent项目依赖链复杂Poetry的锁文件能保证多人协作时环境一致性。环境初始化我建议做一个标准流程用pyenv管理Python版本避免系统自带Python的权限和版本干扰用Poetry创建虚拟环境所有依赖写入pyproject.toml环境变量统一放到.env文件由pydantic-settings加载API Key绝不写死在代码里本地开发用docker-compose起一个轻量的Redis和PostgreSQL用于Agent状态存储和日志记录这一套组合拳打下来新成员加入项目时只需要两个命令就能跑起环境poetry install和docker-compose up -d。省掉的不是一个小时是一整天的环境配置时间。3.2 Agent状态管理与持久化设计Agent系统里有个容易被低估的问题对话状态和任务进度需要持久化。如果Agent跑了一半服务崩了重新启动后得能恢复上下文否则前面几十轮花费的token全白费。我的做法是给每个Agent任务分配一个task_id将所有消息记录、工具调用记录、中间结果分表存储到PostgreSQL里。每个消息都带时间戳和token用量方便回溯。对于高并发场景我还用Redis做了一层内存缓存把最近对话的上下文在内存里保持热状态。这套两级存储的方案实测下来既能保证数据可靠又能把状态读取的延迟压到毫秒级。很多快速Demo型项目不做这一步看起来跑得挺顺一上生产环境就原形毕露。3.3 部署流程从容器化到对外服务部署环节我用Docker镜像把Agent服务打包走的是GitLab CI推镜像、服务器拉取的路线。Dockerfile里有几个关键点基础镜像用python:3.11-slim装完依赖后务必用非root用户运行不然容器安全审计过不了多阶段构建builder阶段装编译依赖runtime阶段只拷site-packages产物镜像能从1.2G缩到400M左右启动命令用gunicorn uvicorn workers因为Agent服务是HTTP接口层异步worker模式更合适部署架构如下外部请求 - Nginx - API Gateway - Agent Service - 工具服务数据库/搜索引擎/通知服务 | Redis(缓存) PostgreSQL(持久化)服务上线后我配置了Prometheus监控指标请求数、延迟、token消耗、错误率并接入Grafana看板。Agent这种系统有一个特点表面响应正常但内部可能已经陷入某种低效循环。只有靠监控指标才能把这些隐性故障揪出来靠人工盯着日志根本不现实。3.4 一个完整的执行链路示例拿“自动日报生成”这个场景举例子整个Agent执行链路是这样的用户给Agent一条指令“请生成昨天的运营日报并根据数据判断是否需要发送异常告警到工作群。”Agent第一轮推理调用“获取指标数据”工具传入日期范围参数。工具从数据库拉取访问量、转化率、订单量等指标返回结构化结果。Agent第二轮推理发现转化率比前一周下降了15%触发了异常判断条件。于是调用“生成告警消息”工具把异常指标写进一条格式化消息里。Agent第三轮推理确认日报和告警消息都已完成返回最终输出。整个流程用时约25秒共消耗约4000token成本折合人民币不到一毛钱。而人工完成同样的工作至少需要20分钟。这个执行链路的本质是“感知—决策—行动”的循环Agent的每一步都被日志记录下来无论是运营同事还是我本人都能随时追溯Agent为什么做了某个判断。4. 常见问题与排查技巧实录4.1 Agent陷入死循环怎么破这是Agent开发里最让人头秃的问题。模型在某个环节反复调用同一个工具或者反复输出同样的错误格式一次任务能烧掉几万token。我处理死循环的武器库设置最大迭代轮次我默认设为8轮超过直接掐断并返回超时提示检测重复行为如果最近N次工具调用都是同一工具且相似参数强制终止并切换策略引入“思考停顿”机制当模型连续两次输出高度相似时插入一条系统提示要求它改变思路实测下来重复检测是最有效的。早期我上线时每个Agent实例每月的死循环事件有几十起加了重复检测后直接降到个位数。4.2 工具调用格式老出错模型生成的工具调用参数经常不符合Schema要求比如少传字段、类型错误、参数名拼错这类问题在复杂工具场景下几乎必然出现。我给方案做了三层防护。第一层是在工具定义里写清楚descriptions让大模型从源头减少错误第二层是在执行工具前做一个轻量的Schema校验不合规就让模型自己修正提示里带上具体字段错误第三层是为高频工具做了参数容错比如“日期”字段如果模型传了空值就默认使用昨天。这套三层防护不是一蹴而就的是在生产环境被报错日报逼着迭代出来的。“让模型自己修正”这一招很关键因为大模型有很强的自我纠错能力只要你给足反馈信息它大概率能自行把参数补齐。4.3 上下文窗口超限怎么办32K的上下文窗口听起来不小但当对话轮次多了以后超限只是时间问题。我的处理策略是分层裁剪加摘要第一层超过一定轮数后把早期的小消息直接合并第二层合并后的内容若是普通文本用摘要模型压缩成两三句话第三层如果是工具结果保留核心指标字段丢弃格式和无关内容。这三层做完一个原本30轮的长任务上下文可以被压缩到原来的一半以下同时关键信息基本不丢。如果你做的是那种超长周期的Agent任务建议把“摘要记忆”做成一个固定组件而不是等出了问题再做。4.4 常见问题与解决方案速查表现象常见原因解决方案Agent反复调用同一个工具模型没有从工具结果中得到足够信息增加工具输出中的上下文说明明确告知下一步该做什么输出内容偏离项目要求System Prompt不够具体在System Prompt中加入约束规则和使用示例token消耗异常攀升上下文无限膨胀或陷入循环启用压缩机制设置最大迭代轮数添加重复检测工具调用频繁报格式错误工具Schema描述不清晰精炼每个字段的description必要时附带JSON示例部署后API响应很慢模型推理耗时长开启流式输出先把部分响应返回再后台处理完整任务Agent结果不稳定模型温度参数设置过高将该任务的temperature调到0.2以下或使用确定性采样这张表是我在项目过程中总结的再遇到类似问题第一反应先查表而不是对着日志干瞪眼。5. Agent实战扩展与学习路线建议5.1 从单Agent到多Agent协作的演进单Agent项目跑通之后我很快就遇到了能力的边界。比如日报生成这个场景一个Agent既要处理数据又要写分析还要决定是否告警所有压力集中在一次上下文中Prompt稍微复杂一点效果就开始不稳定。后来我把任务拆成了三个Agent数据采集Agent、分析报告Agent、决策告警Agent。每个Agent只负责一个垂直领域Prompt更短更聚焦互相之间通过结构化消息传递结果。改造后效果很显著单次任务准确率提升明显而且每个环节可以独立测试和优化调试体验好了很多。Multi-Agent不是银弹它带来的额外开销也很实在角色定义、通信协议、任务协调、异常处理每个环节都有新的复杂度。我的建议是如果你目前的单Agent方案已经能解决80%的需求不用急着升级到多Agent只有当单一Agent开始频繁出错或Prompt已经臃肿到无法维护时再考虑拆分。5.2 一个完整的AI Agent学习路线看到不少人在问“AI Agent学习路线”我结合自己的经历整理了一个三段式路径适合大多数开发者参考。第一阶段打基础周期约1-2周。需要掌握大模型API的基本调用方式理解token计费机制熟悉Prompt工程的核心方法Few-shot、CoT、角色设定。这个阶段的目标是能独立完成一个简单的基于LLM的功能Demo。第二阶段学架构周期约2-4周。重点理解ReAct模式的标准流程选择一个主流框架LangChain、LlamaIndex或CrewAI完成一个带工具的Agent实例。这个阶段的关键是搞清楚框架背后是怎么交互的最好能手写一个简易版ReAct循环。第三阶段做项目周期约1-2个月。找一个真实业务需求从架构设计、工具建设到部署监控完整落地。只有真正上过生产你才会理解“可控”“可观测”“成本”这三个词在Agent开发里的分量。我强烈建议不要前两个阶段还没走完就急着上项目。我见过太多人拿官方Demo跑了一遍就以为自己会做Agent了结果一接触真实场景被工具调用的格式问题、上下文管理的复杂度和成本失控打得措手不及。5.3 实际项目可以落地的场景参考除了日报生成Agent能落地的场景在我实践中还有几类你可以看看有没有适合自己的切入点。内容运营场景比如“让小红书自动发消息”这个热词搜索背后本质上就是做一个内容生成与发布Agent根据指令自动采集素材、生成符合平台调性的文案、在经过人工审核后辅助发布。注意括号里的前提——合规的自动化应该是“辅助提交”而不仅是“全自动发布”平台规则不可违背。数据处理场景Agent自动从多个数据源拉取信息、清洗、汇总并生成可视化报告。这个场景最容易量化ROI也是当前企业落地Agent最密集的领域之一。代码辅助场景Agent作为编程助手帮助开发者检索API文档、自动生成单元测试、分析构建报错日志。这种场景的好处是结果天然可以被验证不会出现“模型觉得自己对了但实际错了”的尴尬。5.4 后续还能往哪个方向扩展这个项目目前的基础版本已经稳定运行了几个月的生产环境但我清楚后面还能做不少深度扩展。我下一步计划做的事情主要有三件一是接入更完善的评估体系。现在Agent输出质量还是靠人工抽检接下来打算建一套自动评估流水线用LLM-as-a-Judge加少量标注数据来批量评测每次任务的质量让优化有数据可依。二是增强Agent的主动学习能力。当前工具集是静态的后续计划让Agent能把高频操作沉淀成新的工具函数逐步减少重复劳动。三是把部署升级到Kubernetes。现在的单机Docker部署在高并发时会遇到扩容瓶颈迁到K8s之后可以按需弹性伸缩配合Message Queue做异步任务处理整体吞吐量能上一个台阶。6. 最后再分享一点实际体会这个项目做下来我心里最深的感触是AI Agent真正难的从来不是“接入大模型”而是“用工程化的方式管住大模型”。大模型像一匹很有天赋但偶尔发疯的马你的整套系统设计——状态管理、工具约束、上下文控制、成本监控——都是为了给它修一条坚固的围栏让它在围栏里跑得快、跑得稳又不至于失控跑偏。如果你现在正准备启动自己的Agent项目我给你的建议是先小后大先把一条核心业务链路用最小的方案跑通再逐步加功能。别一上来就搞Multi-Agent、搞Rust重写、搞复杂的记忆系统知识密度再高也扛不住一个跑不起来的系统。把第一个完整闭环做出来让业务方看到真实效果后面你才有资本去谈架构升级和技术优化。
返回列表