7.4 记忆与工具
短期 vs 长期记忆;Function Calling;MCP 模型上下文协议入门;工具选择策略
记忆:让 Agent 超越"金鱼脑"
一个没有记忆的 agent 是"金鱼"——每次对话都从零开始。要让 agent 在长任务中保持连贯、在多次对话中积累知识,必须设计合适的记忆系统。参考 Lilian Weng 的分类与 MemGPT 的实践,我们把 agent 记忆分成两大层级:
短期记忆(Short-Term Memory)
短期记忆 = LLM 的 context window。
现代 LLM 的 context window 从 GPT-3.5 的 4K 扩展到 Claude 3.5 的 200K、Gemini 1.5 的 1M,看起来"够用"了,但实际工程中仍然稀缺。典型的短期记忆载体:
| 形态 | 用途 |
|---|---|
| Scratchpad(草稿本) | ReAct 中每步的 Thought/Action/Observation |
| 对话历史 | 多轮对话的前文 |
| Working memory | 当前任务的子目标、已尝试路径 |
关键挑战:context 爆炸。当 agent 运行几十步后,scratchpad 已经把 window 撑满。两种常见应对:
- 截断:只保留最近 N 步(简单但丢失信息)
- 摘要:用 LLM 把早期历史压缩成摘要(LangChain 的
ConversationSummaryMemory)
长期记忆(Long-Term Memory)
长期记忆让 agent 跨会话积累知识。主流实现有三类:
向量库(Vector Store):把历史经验 embedding 后存入 Pinecone / Weaviate / Chroma / Milvus,需要时用当前 query 做相似度检索。这是今天 agent memory 的事实标准。
笔记文件(Note-taking):直接让 agent 把重要信息写进 markdown 文件或数据库,下次 prompt 里把相关笔记 load 进来。ChatGPT 的"Memory"功能、Cursor 的 .cursorrules 都是这种思路。
知识图谱:用节点-边结构显式表达实体关系。适合需要精确推理的场景(医学、法律),但构建与维护成本高。
MemGPT:分层记忆架构
Packer 等人(UC Berkeley, 2023)的 MemGPT 是最受关注的记忆系统设计。它借鉴操作系统的分层存储:
MemGPT 把 "memory_insert"、"memory_search"、"memory_move" 这些操作暴露为工具,让 LLM 自己决定何时把什么搬进/搬出主 context。这个思路后来演化为开源项目 Letta。
| 记忆类型 | 容量 | 速度 | 典型内容 |
|---|---|---|---|
| Core | ~1KB | 瞬时 | Persona、用户画像 |
| Main | ~32KB | 瞬时 | 近期对话、当前任务 |
| External | 无限 | 毫秒 | 历史经验、文档库 |
经典对应:MemGPT 的三层存储 = 经典 OS 的寄存器/RAM/磁盘,也 = BDI 的 core belief / working context / long-term knowledge。架构不变,只是材料变了。
工具:Agent 的执行器
"工具"让 LLM 突破自身边界:搜索实时信息、执行代码、读写文件、调用第三方 API。工具调用的基础设施经历了两次关键标准化。
Function Calling:结构化工具调用
2023 年 6 月,OpenAI 推出 Function Calling——让 LLM 输出结构化 JSON 来调用预定义函数。它的核心是把"工具描述"放进 prompt,让 LLM 自己判断何时调用哪个工具、传什么参数。
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的当前天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名,如 '北京'"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["city"]
}
}
}]
response = openai.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "北京今天热吗?"}],
tools=tools
)
# LLM 返回:
# {
# "tool_calls": [{
# "function": {
# "name": "get_weather",
# "arguments": '{"city": "北京", "unit": "celsius"}'
# }
# }]
# }后续重要演进:并行 function calling(2023-11,一次调用多个工具)、Structured Outputs(2024-06,保证 JSON schema 严格匹配)。
MCP:AI 的 USB-C
Function Calling 解决了"LLM 如何调用工具",但没解决"工具如何发布给 LLM"。如果 100 个 AI 应用要接 50 个数据源,需要 100 × 50 = 5000 个集成——这就是 M × N 集成问题。
2024 年 11 月,Anthropic 推出 MCP(Model Context Protocol),由 David Soria Parra 与 Justin Spahr-Summers 主导设计。MCP 的定位就是 "AI 的 USB-C":工具提供方只需实现一次 MCP Server,任何 MCP Client(Claude Desktop、Cursor、Continue 等)都能接入。
MCP 暴露三类抽象:
- Prompts:预置 prompt 模板(
/summarize、/explain-code) - Resources:只读数据源(文件、数据库行)
- Tools:可执行动作(search、write_file、query_db)
2025 年初,OpenAI 和 Google DeepMind 相继采用 MCP;2025 年 12 月,MCP 被捐赠给 Linux Foundation 的 Agentic AI 基金会。这意味着 MCP 很可能成为未来 agent 生态的通用协议。
类比:Function Calling 是"怎么打电话",MCP 是"电话号码黄页 + 通用拨号盘"。前者让 LLM 会调用工具,后者让工具能被任何 LLM 发现和调用。
工具选择策略
Agent 框架里能挂的工具越来越多(ToolLLM 的 ToolBench 覆盖 16,464 个真实 API),一个实际问题浮现:如何让 LLM 在 100 个工具中选对那一个?
几种常见策略:
| 策略 | 做法 | 适用规模 |
|---|---|---|
| All-in-prompt | 把所有工具 schema 塞进 system prompt | < 20 个工具 |
| 检索式选择 | 先用 embedding 检索 top-k 相关工具,再交给 LLM | 20–1000 个工具 |
| 层级路由 | 先选工具类别(文件 / 网络 / 代码),再选具体工具 | 1000+ 个工具 |
| 微调专用模型 | Gorilla(Patil et al., NeurIPS 2024)专门微调 LLaMA 来选 API | 大规模 + 低延迟 |
| 代码作为动作空间 | CodeAct(Wang et al., ICML 2024)让 LLM 直接生成 Python 调用工具 | 灵活组合场景 |
CodeAct 的洞见特别值得一提:与其让 LLM 输出 JSON 描述工具调用,不如让 LLM 直接写 Python 代码——这样工具可以组合、可以循环、可以 if-else。在多项基准上,CodeAct 比 JSON 式工具调用成功率高出最多 20%。
# JSON 式(传统 function calling):
# {"tool": "search", "args": {"q": "Transformer 论文"}}
# 然后 {"tool": "fetch", "args": {"url": "<result_url>"}}
# ... 需要 agent 循环多次
# CodeAct 式:
results = search("Transformer 论文")
for r in results[:3]:
content = fetch(r.url)
if "attention" in content:
save(r.title, content)
# 一段代码完成搜索-过滤-保存管道本节小结
- 短期记忆 = context window;长期记忆 = 向量库 / 笔记 / 知识图谱
- MemGPT 把 OS 的分层存储搬进 agent——核心思想是让 LLM 自己管理记忆搬运
- Function Calling 让 LLM 输出结构化工具调用;MCP 让工具以统一协议发布给任何 LLM
- MCP = AI 的 USB-C,解决 M×N 集成问题;2025 年已成行业事实标准
- 工具多了就需要检索式选择或层级路由;CodeAct 用"代码即动作"统一了工具组合
- 记住:给 agent 接工具的原则——能用代码完成的不要用 agent,需要决策的才用 agent