资讯动态

从零构建Agent:先能力后框架,吃透工具调用与记忆管理

发布时间:2026/10/17 4:00:15 来源:尧图企业网站定制
如果你最近也动过“自己从零构建一个 Agent”的念头我猜你大概率经历过下面某个场景打开一个开源项目看到 README 里写着环境搭建、配置文件、API Key、跑通 Demo结果除了复制粘贴什么都没留下或者买了一门教你用某个框架做 Agent 的课跟着敲完一遍换个需求照样不知道从哪下手。这不是你学得慢而是学习顺序不对。太多人一开始就钻进框架里从“安装框架”开始学构建 Agent。但真正扎实的路径是从“能力”开始而不是从“工具”开始。这篇文章我想分享一条我自己验证过、也带过不少新手走过的学习主线先建立最小闭环再逐步加深最后再碰框架和工程化。哪怕你只有基础的编程能力只要愿意每周投入几小时按这个顺序走下来会比盲目追新框架的人先读懂 Agent 的本质。1. 先别急着碰框架先搞懂 Agent 的最小闭环在哪很多人对 Agent 有个误解觉得 Agent 是一套很高级的系统。但实际上一个最小可用的 Agent 闭环不依赖任何框架甚至不用写太多代码。它本质上就是一个循环给你一个大语言模型的接口给它若干工具的调用说明让它在“思考”和“执行”之间反复横跳直到完成你的目标。我做一个粗糙但清晰的描述用户提出目标比如“帮我查一下这几个城市的天气然后按温度排序”模型判断需要调用哪个工具查天气的接口并生成参数城市列表你的程序执行这个工具拿到真实数据数据回填给模型模型基于结果向用户输出最终答复如果任务还没完成模型会继续下一轮工具调用这个循环里没有框架的戏份。框架只是把这类循环工程化、可视化、可部署但它替代不了“你理解这个循环”这件事。如果你一上来就钻框架很容易变成“照着搭积木”遇到一个框架没覆盖到的场景就直接卡死。1.1 四个地基能力按顺序自检在构建 Agent 之前我认为有四个地基能力必须过关。它们不是可选项是后面所有内容的承重墙。第一是“稳定拿到模型输出”。你得会调用模型接口处理超时、限流、内容截断、异常返回。很多新手调通一次接口就觉得自己会了实际上换个模型、换个网络环境、加个并发就暴露出问题。第二是“结构化输出”。Agent 是一个程序系统它不能容忍模型每次回复的格式都不一样。你要会约束模型输出 JSON、输出固定字段也会处理“模型这次不听话输出了一堆废话和 JSON 混在一起”的情况。这项能力直接决定你能不能把模型的输出变成程序逻辑的输入。第三是“提示词工程的基础意识”。不是让你去背各种花哨的 few-shot 模板而是要理解角色设定影响什么、步骤描述影响什么、给不给示例影响什么。这部分不需要学得玄乎但至少要能写清楚一段“让模型按照某流程处理输入”的指令。第四是“上下文窗口意识”。模型输入会占 tokentoken 就是成本。你需要大概知道一段对话经过几轮之后会撑满窗口应该怎么截断、压缩或者省略。很多人后面积累到多轮 Agent 时出了怪问题回头查才发现是“上下文被塞满了导致模型开始胡说”。1.2 四道自测题过关再继续光说“你要会”是空的我给四道具体的自测题你可以现在就试试。第一题找一篇文章用模型接口抽取“人物、时间、地点”三个字段要求输出 JSON字段名固定为people、time、place值必须是数组或字符串。这道题考察你能否稳定拿到结构化输出。第二题把同样的文章换成英文提问要求 JSON 里的字段名仍然保持英文people、time、place不论你用中文、英文、还是夹杂式的 prompt字段名都不能漂移。这道题考察你的提示词是否具备跨场景稳定性。第三题故意给模型一段超长文本要求它输出全文摘要。然后你去处理“输出被截断”的情况看看是有 retry 机制、还是能感知到截断并请求继续。这道题考察你对输出长度的管控能力。第四题连续对话 20 轮每轮都把历史消息带进请求里打印每一轮的 token 消耗。之后观察第 15 轮开始模型的回答质量是不是在下降。这道题不是考记忆是考你对“上下文占用”的体感。四道题做完打开一个本地项目把这几段代码整理成几个可复用函数。这一步的价值是构建 Agent 后面要用的通信骨架你已经亲手搭过了。很多人跳过了这一步后面学什么都很虚。2. 工具调用从“会聊天”到“会干活”的那条线Agent 和普通聊天机器人的本质分界线是“工具调用”。聊天机器人只会“说”Agent 会“干”。而“干”这件事靠的是模型能把你的意图映射到某个真实可执行的函数上。工具调用机制业界常叫 Function Calling说白了就是你给模型一份工具菜单每个工具描述了“这个工具叫什么、接收什么参数、参数是什么格式、大概能做什么事”然后模型看了用户的问题自己决定调用哪个工具、填什么参数。你的程序拿到这个结果去执行真实函数再把执行结果交给模型。这个过程像什么像你在餐厅里不直接进厨房炒菜而是告诉服务员你要吃什么服务员把菜单传到后厨后厨再把菜端给你。模型就是那个服务员你的代码才是后厨。工具调用机制的伟大之处在于你不需要把“用户意图判别”的逻辑全部硬编码成 if-else模型把意图理解和参数提取这部分工作替你做了。2.1 先手写一个极简工具调用循环我不建议你第一次接触工具调用就去框架里找封装好的 Tool 类先自己写一个最小版本整个过程不超过 50 行代码。下面是一个简化到极致的伪代码思路def run_agent_turn(user_query, tools): messages [{role: user, content: user_query}] response llm.chat_with_tools(messages, toolstools) if response.has_tool_call: tool_name response.tool_call.name tool_args response.tool_call.arguments result execute_tool(tool_name, tool_args) # 你的程序执行真实函数 messages.append(response.message) messages.append({role: tool, content: result}) final_answer llm.chat(messages) # 把结果回填给模型 return final_answer.content return response.content这段逻辑里最关键的一行是execute_tool。模型不执行任何东西它只负责“决定调哪个工具”和“填参数”真正干活的是你本地的 Python 函数。所以 Agent 的能力边界取决于你给它接了多少真实工具、每个工具描述得够不够清楚。我见过不少新手在第一步就想着“我做一个能自己写代码、自己执行代码的 Agent”结果卡在“让模型生成代码”和“沙箱执行代码”的安全问题上。这个方向不是不能做但它不是打基础的路径。你应该先从“接一个天气接口”“接一个计算器函数”“查一下本地数据库”这种确定性强、边界清晰的小工具做起。2.2 工具 Schema 设计的三个实操经验工具调用能不能用好一半取决于模型一半取决于你把工具描述写得好不好。我踩过几次坑之后总结出三条很实用的经验。第一工具名和参数名要语义化。不要写func1、arg1要写get_weather_by_city、city_name。模型不是靠记忆理解参数是靠命名理解参数。命名越接近自然语言模型填参数就越准。第二必填参数越少越好。如果某个参数不是必填就别放进required列表里让模型能省则省。必填参数一多模型在不确定时就会开始编造值。比如“查天气”这个工具city必填就够了“日期”做成可选没给日期就默认今天这样成功率会明显上升。第三工具返回结果要尽量简洁、结构化。模型每次都要把工具结果重新读一遍你给它返回一大段夹杂着日志的 HTML它很容易提取错关键信息。更好的做法是让工具返回{city: 北京, temperature: 18}这样干净的 JSON再交给模型总结。我最早做工具调用时最常犯的错是工具执行失败后不知道怎么办。比如网络请求超时了你总不能让模型干等着。后来我的习惯是所有工具执行失败时统一返回一个结构化的错误信息比如{error: timeout, message: ...}然后在提示词里告诉模型“如果看到 error 字段就如实告诉用户不要编造结果”。这个细节虽然不是核心机制但能救命的程度远远超过你的想象。3. 记忆管理为什么“记住上下文”比想象中难工具调用解决的是“干”的问题记忆管理解决的是“记得住”的问题。一个 Agent 如果只能处理单轮指令那它的实用性会大打折扣。可一旦进入多轮对话你立刻会撞上一个大麻烦模型的上下文窗口是有限的你不能把所有历史消息都原封不动地塞进去。上下文窗口就像你的办公桌。桌子就那么大你手头能放的文件就那么多。你可以在桌上堆更多纸但堆到一定程度就再也找不到真正需要的那张了。Agent 的记忆管理本质上是在做“办公桌整理”哪些纸张保留哪些纸张压缩哪些纸张放进档案柜长期存储以后要用再去翻。3.1 短期记忆三种简单的对话压缩策略短期记忆指的是当前这轮会话里模型能“看到”的信息。最笨的办法是把所有对话历史都带上但在多轮任务里很快会撑爆窗口。实操中常用的有三种策略。滑动窗口只保留最近 N 轮对话。好处是简单直接坏处是早期出现的关键信息会被丢得一干二净。比如用户在第 3 轮说过“我想要红色”第 20 轮你问“你想要什么颜色”时模型完全不知道。所以滑动窗口适合那些前置信息不重要的任务。摘要压缩每隔几轮让模型把之前的对话浓缩成一段摘要比如“用户想做一个博客系统已确认使用某某数据库当前关注登录功能”。之后每一轮你只带上这段摘要加最近几轮对话模型既保留了全局脉络又不用担心窗口被塞满。关键信息抽取针对特定业务只抽核心信息。比如客服场景里抽“用户名、订单号、诉求类型、情绪倾向”就够了无关寒暄直接丢掉。这种方式最节省 token但需要你对业务非常了解能列出真正值得留存的字段。让我给一个最容易上手的组合最近 N 轮完整对话加上前面所有内容的摘要。N 取多少取决于你的任务复杂度一般 5 到 10 轮比较合适。这个组合不用引入任何额外组件纯靠提示词就能实现是我推荐新手先跑通的第一版记忆方案。3.2 长期记忆什么时候才需要向量数据库和 RAG短期记忆装不下所有东西而人类用户希望 Agent 能长期记住自己的偏好、历史、项目背景这就引出了长期记忆。很多人一提到长期记忆就条件反射想到向量数据库和 RAG但我必须泼盆冷水大部分早期项目根本不需要向量检索简单存储完全够用。RAG 解决的是一个更具体的问题模型知识库之外的大量私有文档如何按需检索。比如你有一个 Agent 需要回答公司内部规章制度问题几千页文档不可能全塞进上下文于是你把文档切成片段、做向量化、存进检索库用户提问时先检索相关片段再把片段塞给模型参考。这套逻辑的适用场景是“有大量静态文本需要按相关性查询”。但如果你只是想让 Agent 记住“用户上次选了哪个城市、偏好什么风格”一个简单的 JSON 文件、或者一个普通的数据表就够用了不需要上向量库。我见过太多项目一上来就搭了一套完整的向量检索实际上长期记忆只有三条字段。存储选型不是越高级越好而是越匹配越好。如果确实要上 RAG我提醒三个关键控点。第一是切块大小块太大会夹带无关信息块太小会丢失上下文连贯性一般 300 到 500 字左右起步按你的文档类型调。第二是检索数量只取 top 3 到 top 5 的片段喂给模型喂太多片段会稀释注意力。第三是引用溯源让模型在回答里标注来源片段编号否则出错时你连查都查不了。3.3 记忆层的正确学习顺序我建议的记忆层学习顺序是这样的先不要碰任何存储组件用“最近 N 轮 摘要”把记忆跑通然后用一个最简单的键值存储甚至是一个本地 JSON 文件保存用户长期偏好等你的量级到几千条、查询速度有明显瓶颈、或者你真的面临“文档知识问答”需求时再上向量数据库。这样看起来慢但实际上每一步都在为下一步铺垫。很多人的悲剧在于第一步都没做扎实就直接跳到 RAG结果既不会压缩上下文也不会设计检索流程整条链路乱成一锅粥。4. 规划与反思让 Agent 自己拆解任务只是第一步工具调用让你能执行单步操作记忆让你能记住跨轮信息但真实世界的任务往往是多步的。比如“帮我整理这份报告并生成 PPT 大纲”就至少包含读取报告、提取要点、设计大纲结构、输出成指定格式。你当然可以手写代码把这些步骤串起来但 Agent 的核心魅力在于让模型自己规划步骤。这一步的学习重点不是“怎么把步骤写完”而是“怎么让模型在只有目标、没有明确步骤的情况下自己拆解并执行”。业内最常见的思路是 ReAct交替进行“推理”和“行动”每一步行动之后观察结果再调整下一步行动。4.1 ReAct 模式到底在做什么ReAct 这个名字来自 Reasoning Acting翻译过来就是“边想边做”。它的关键区别是模型不只是一次性给出答案而是在每一轮都输出“对当前状态的分析”和“下一个行动指令”。我给你一个简化版的执行轨迹你就明白了用户“帮我查一下北京今天的天气如果下雨就提醒我带伞。”模型思考“用户想知道北京天气并且需要判断是否需要带伞。我需要先调用天气查询工具。”模型动作get_weather_by_city(city北京)工具返回{city: 北京, temperature: 16, condition: 小雨}模型思考“天气是小雨所以需要提醒用户带伞。”最终输出“北京今天 16 度有小雨记得带伞。”这个轨迹里“思考”和“动作”是交替出现的。当你把这段思考轨迹展示给用户看时Agent 的行为就会显得很“聪明”。更重要的是如果某一步工具返回的结果和预期不一致模型能在下一步思考中修正计划而不是按死板脚本继续往下走。4.2 三种规划策略的取舍对比并不是所有任务都适合用 ReAct。我在实际项目中一般把规划方式分成三档按任务复杂度选择。规划方式适用场景优点缺点单轮工具调用用户只提一个明确操作快、省 token只解决单步任务ReAct 循环多步操作且步骤之间依赖强灵活、能及时纠错延迟高、token 消耗大计划-执行Plan-and-Execute任务步骤多且相对独立先给出全局计划执行更稳定计划错了后面容易跟着错用大白话翻译如果任务一句话就能说清别套 ReAct直接一步调用工具省时间也省钱如果任务需要三四步且每步依赖上一步的结果ReAct 是自然选择如果任务有七八步、你可以先让模型列个大纲给你看再按大纲执行那就用 Plan-and-Execute。我个人的建议是先死磕 ReAct把它理解透再去看 Plan-and-Execute。ReAct 的缺点是慢但它给了模型最大的灵活性是你理解 Agent 循环心智的最佳载体。4.3 警惕“假规划”漂亮的计划不等于能执行新手很容易被一件事迷惑模型能输出一份看起来非常合理的五步计划但执行起来完全不是那么回事。我把这种情况叫做“假规划”。比如模型计划“第一步收集数据第二步清洗数据第三步建模”听起来像模像样但每一句都是空话根本没有落到具体的工具调用上。这个问题的根源是模型在生成计划时并没有真的在执行环境里验证每一步是否可行。它只是在“模仿”一份好计划的样子。解决办法有两个方向。一个是 ReAct 模式下不要逼着模型一次性输出完整步骤而是让它“走一步看一步”。每一步动作都必须对应一个真实存在的工具如果模型想不到该调什么工具它就必须停下来向你求助。这样“思考”始终和“动作”绑在一起假规划就很难出现。另一个是 Plan-and-Execute 模式下把计划里每一步都写成一个可校验的中期产物。比如“清洗数据”写清楚“输出一份缺失值统计和清洗后的 CSV 文件路径”。有了可校验的中间产物你就能发现某一步到底有没有完成。我还会在规划类任务里加一个兜底机制给模型一个“工具列表里没有合适工具时如实说做不到”的指令。很多模型在用户需求超出能力范围时会倾向于编造一个即将执行但实际不存在的动作。这一句话能把很多坑提前填上。5. 上框架和工程化之前先想清楚这几件事当你已经亲手写过工具调用循环、做过基础记忆压缩、理解 ReAct 的运转方式之后再去看市面上那些 Agent 编排框架你会发现它们不再神秘。大部分框架做的事情无非是把一个循环图可视化、抽象成节点和边让你能以状态机的思维编排“什么时候执行什么节点、节点之间怎么流转”。这也是我为什么一直坚持“先手写循环再碰框架”。你亲手写过一遍就能快速识别框架里哪些抽象是必要的哪些是纯增加心智负担的。反过来如果你从来没写过循环你会把框架里的每一行都当作魔法去背效率极低。5.1 用状态机思维理解主流编排方式我不打算在这里评价某个具体框架因为这类迭代太快了今天推荐的工具半年后可能就没人维护。但你要掌握的是它们背后的共同抽象把 Agent 的每一次“思考 - 工具调用 - 观测结果”看成状态之间的转移。一个常见的建模方式是把所有流程画成图节点是“要执行的动作”比如调用某个大模型、执行某个工具、发给用户确认边是“动作执行完之后往哪走”。你在自己的手写循环里用 if-else 实现的流程在框架里就是图和边。理解了这一点不管未来出现什么新框架你上手都会很快因为底层心智没有变。5.2 可观测性别让 Agent 变成一个黑盒Agent 项目最容易踩的坑之一是黑盒运行。模型在一个循环里自己调用工具、自己总结、自己决定下一步一旦结果不符合预期你连“是哪一步出了问题”都不知道。所以我建议你在项目一开始就记录三样东西每一步的模型输入输出、工具调用的参数和返回结果、每一步消耗的 token 数。这些日志不是给用户看的是给你自己排查用的。我见过一个排查案例某开发者说“Agent 总在第三步乱调工具”翻日志后才发现是第二步工具返回里多了一个历史遗留的旧字段模型把这个字段理解成了新信息才导致后面的一系列误判。如果没有日志这个排查可能要猜上几个小时有了日志十分钟就定位了。5.3 成本、延迟、失败重试的平衡工程化最后绕不开的是成本和延迟。多步 ReAct 虽然聪明但每一轮都要调用模型接口调用次数一多延迟累计起来非常可观费用也会快速上升。我的经验是做三层控制。第一层控制最大迭代次数。给循环设一个硬上限比如最多 5 次工具调用超过就强制结束输出“任务未完成超出最大尝试次数”。这一条能防止模型在某些失败场景里无限循环。我见过最夸张的情况是模型反复调用一个一直报错的工具连续调用十几次才停止费用和体验都崩了。第二层调整模型选型。不是所有步骤都需要最强模型。规划和大局判断用能力强的模型摘要、格式化、简单判断用便宜的小模型能把平均成本降下来一截。代价是实现更复杂建议中期再考虑。第三层设置兜底结果。工具失败时返回一个结构化错误让模型基于错误决定是重试、换方案还是放弃。这里不要放任模型无限重试一般重试一次失败后就让模型如实向用户说明原因并提出替代方案。这三层控制看起来都是小事但它们在线上环境里直接决定了你的 Agent 是“偶尔聪明的小玩具”还是“稳定可用的工具”。我自己在实际项目中最大的体会是构建 Agent 最难的不是某个单独环节而是当所有环节串起来时你能在脑海里构建一条完整的链路——输入进来模型怎么理解工具怎么执行结果怎么回来历史怎么记住计划怎么调整。这个链路感的建立靠的就是“先能力、后框架”的顺序。如果你现在正处在“不知道下一步该学什么”的状态我的建议很具体这周把四道自测题做完下周写一个极简工具调用循环再下周给这个循环加一个“最近 N 轮 摘要”的短期记忆。三个星期之后你再看那些满天飞的 Agent 开源项目和框架教程眼里看到的将是骨架而不是一堆新名词。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑