Agent 如何积累能力:RAG、Memory 与 Skills

Feb 14, 2026·
夏 伟
夏 伟

一个 Agent 想把事情做得越来越好,至少要回答三个问题:当前缺的信息去哪里找?上一次做过什么要不要记住?一套反复使用的做法如何沉淀下来?

在整理 Code Agent 的中控系统 和长程任务时,我发现 RAG、Memory 和 Skills 很容易被放进同一条“能力升级”时间线。我最初也沿着这个思路理解它们:先检索知识,再保存经验,最后把经验压缩成技能。重新对照它们在系统里的读写路径后,我更倾向于把三者看成并列、互补的能力层。

RAG、Memory 和 Skills 分别对应这三个问题。它们经常被描述成一条从 RAG 到 Memory、再到 Skill 的演进路线,但这种说法容易造成误解:三者并不是前后替代关系,而是 Agent 系统里的不同层。

能力层解决的问题典型内容主要风险
RAG当前任务缺什么外部信息文档、数据库、网页、代码检索错误、来源过时
Memory哪些历史状态和经验值得保留用户偏好、任务摘要、失败经验记错、过期、隐私泄露
Skills一类任务应该按什么流程完成指令、脚本、模板、参考资料错误流程被稳定复用
Tools / MCPAgent 如何对外执行动作API、文件系统、数据库、应用权限过大、调用副作用

我更愿意把它们理解为四种不同的上下文来源:RAG 提供“现在需要知道的事实”,Memory 提供“过去发生过什么”,Skill 提供“应该怎么做”,Tool 则负责“真正去做”。

flowchart LR goal["当前目标"] --> agent["Agent"] agent --> tool["Tool、MCP"] tool --> env["外部环境"] env --> obs["执行结果"] obs --> agent rag["RAG、Skills"] --> agent mem["Memory"] --> agent obs -.->|写入| mem

RAG:让 Agent 主动找信息

传统 RAG 通常是一条固定流水线:收到问题、查询向量数据库、把结果塞进 Prompt、生成回答。Agentic RAG 的变化在于,检索本身也成了 Agent 可以规划和反复执行的动作。1

例如,一个企业分析任务可能需要先查内部文档,再根据文档里的客户编号查询 SQL,最后到网页验证最新公告。Agent 需要决定:

  • 该查哪个数据源;
  • 当前证据是否足够;
  • 检索结果互相冲突时相信谁;
  • 查询失败后是改写问题,还是换一个工具。
flowchart LR question["问题"] --> route["选择数据源"] route --> retrieve["检索或
调用工具"] retrieve --> judge{"证据
够不够"} judge -->|不够| rewrite["改写查询
或换数据源"] rewrite --> retrieve judge -->|足够| answer["生成答案
并标注来源"]

这里不一定需要多 Agent。很多任务用一个 Agent 加几个清晰的检索工具就够了。只有当数据源权限、上下文或执行周期明显不同,多 Agent 分工才可能抵消额外的调度成本。

RAG 的边界也很明确:它可以重新找到过去的记录,却不会自动判断哪些历史信息值得长期保存;它能检索一份操作手册,却不会保证 Agent 每次都按手册执行。前者是 Memory 的问题,后者更接近 Skill。


Memory:保存状态,而不是囤积对话

Memory 不是“把所有聊天记录放进向量库”。一个可用的记忆系统至少需要写入、整理、读取和遗忘四个环节。近期综述也把 Agent Memory 描述为一个与感知和行动耦合的 write–manage–read 循环。2

工程上可以先按用途分成三类:

记忆类型例子生命周期
工作记忆当前计划、已读文件、待验证假设单次任务
事实记忆用户偏好、项目约束、环境状态跨任务,但需要更新
经验记忆某类失败的原因、有效的调试路径跨任务,需要归纳和验证

真正困难的是写入路径。任务中的很多信息只在当时有用:旧报错、临时文件路径、一次失败的猜测。如果不加筛选地保存,Memory 很快会从帮助变成噪声。

一个较稳妥的写入流程是:

  1. 从轨迹中提取候选事实或经验;
  2. 区分观察到的事实和模型自己的推断;
  3. 检查是否与已有记忆冲突;
  4. 给记忆附上来源、时间和适用范围;
  5. 只有在未来任务中确实可复用时才长期保存。

读取同样不能只靠向量相似度。系统还需要考虑新旧程度、来源可靠性、项目范围和当前上下文预算。一次相似但过期的经验,可能比完全没有记忆更危险。

所以 Memory 的价值不是“记得多”,而是能够维护一份可信、可更新的状态。


Skills:把过程知识变成可加载模块

Skill 适合保存“如何完成一类任务”。它通常不只是 Prompt,也不只是一个函数,而是由说明、脚本、模板和参考资料组成的目录。Anthropic 将 Agent Skills 定义为可以被动态发现和加载的能力包,并把渐进式披露作为核心设计原则。3

三者的区别可以简单理解为:

组件主要回答例子
Prompt这一次要做什么“检查这个 PR 的兼容性问题”
Tool用什么动作完成读取 diff、运行测试、写评论
Skill这类任务通常怎么做检查顺序、风险清单、验证脚本、输出格式

Skill 的工程价值在于按需加载。Agent 启动时只需要知道 Skill 的名称和描述;判断相关后再读取 SKILL.md;更长的参考资料和脚本只在具体步骤需要时加载。

flowchart LR metadata["名称与描述"] --> trigger{"任务
是否匹配"} trigger -->|否| skip["不加载"] trigger -->|是| instructions["读取
SKILL.md"] instructions --> need{"是否
需要细节"} need -->|是| resources["读取 references
或运行 scripts"] need -->|否| execute["执行任务"] resources --> execute

这种设计解决的是上下文成本,而不是让能力变得“无限”。目录里可以放很多材料,但每次加载多少、模型能否找到正确文件、脚本有没有权限,仍然需要设计和测试。


Skills 与 MCP 怎么配合

MCP 和 Skill 经常一起出现,但它们解决的不是同一个问题。

  • MCP 负责提供连接和动作,例如读取 Google Drive、查询数据库或操作 GitHub;
  • Skill 负责描述完成业务目标的步骤,例如“如何从设计稿生成开发交接文档”;
  • 代码执行环境负责把多个调用组合起来,并承担过滤、循环和格式转换;
  • 权限系统负责限制这些动作可以影响什么。

当工具很多时,把所有 schema 永久放进上下文会带来明显开销。Anthropic 的实践建议让 Agent 按需发现工具,或者通过代码把多步调用封装成更高层操作。4 但代码执行也扩大了风险面,需要沙箱、资源限制和审计。

一个生产级 Skill 不应该只写“依次调用 A、B、C”。它还需要说明:

  • 调用前检查什么;
  • 哪些输入来自用户,哪些来自可信系统;
  • 失败后能否重试,重试几次;
  • 哪些动作需要确认;
  • 怎样判断任务真正完成。

怎样写一个可维护的 Skill

结合 Anthropic 的公开说明和实际工程经验,我会把 Skill 开发压缩成五个步骤。

  1. 从真实失败开始

先运行一组代表性任务,观察 Agent 缺的是知识、工具还是流程。只有当问题会重复出现,而且可以总结为稳定做法时,才值得做成 Skill。不要先写一份宏大手册,再去找使用场景。

  1. 让描述承担路由职责

namedescription 是 Agent 决定是否加载 Skill 的入口。描述既要说明做什么,也要说明什么时候使用。太宽泛会过度触发,太窄又会漏掉用户的自然表达。

  1. 主文件只保留主路径

SKILL.md 应该让 Agent 快速理解目标、步骤和关键约束。罕见分支、长文档和示例放到 references/,可重复且需要确定性的操作放到 scripts/

  1. 用代码保证硬约束

格式校验、文件检查、数值计算和批量转换更适合交给脚本。自然语言擅长解释和判断,不适合稳定执行机械规则。

  1. 同时测试触发和结果

Skill 评估至少包含两部分:它是否在正确的问题上被加载,以及加载后是否提高了任务质量。一个每次都触发、但没有改善结果的 Skill,只是在消耗上下文。


我现在怎么理解这三层

RAG、Memory 和 Skills 不是 Agent “越来越聪明”的三个阶段,而是三种需要分别治理的状态:外部事实、历史经验和过程知识。

这一区分会直接影响系统设计:

  • 会变化的外部事实留在数据源里,通过 RAG 获取;
  • 与用户或任务连续性有关的状态进入 Memory,并带上时间和来源;
  • 稳定、可复用的做法封装成 Skill;
  • 真正产生副作用的动作交给 Tool,并受权限系统约束。

未来值得关注的不是 Agent 能否自动生成更多 Skills,而是它能否验证一段经验真的可复用、识别旧 Skill 已经过期,并在执行前理解它会获得什么权限。相关研究也开始把 Skill 的获取、组合与安全治理放在同一个框架下讨论。5 能力沉淀只有和遗忘、版本与安全一起设计,才会变成资产,而不是另一种上下文债务。


参考资料