人工智能实践(语言智能)
第7讲:Agent

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 撑满。两种常见应对:

  1. 截断:只保留最近 N 步(简单但丢失信息)
  2. 摘要:用 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 相关工具,再交给 LLM20–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