5.3 记忆与工具:ConversationBufferMemory与外部API集成
本节内容基于《大模型应用开发极简入门:基于GPT-4和ChatGPT(第2版)》第5章「LangChain基础组件」中的**记忆(Memory)与工具(Tools)**编写,涵盖ConversationBufferMemory、VectorMemory、Google Search、Python REPL、API调用等扩展外部能力的用法。
一、记忆(Memory)概述(书5.2)
书中指出,LangChain的记忆模块用于对话历史与上下文管理,包括:
- ConversationBufferMemory:保留全部或最近若干轮对话
- VectorMemory:将历史存入向量库,按语义检索相关片段注入上下文
记忆使Agent或对话链能够"记住"之前的交互,实现多轮对话与上下文延续。
二、ConversationBufferMemory
2.1 作用
将用户与助手的对话保存在内存中,每次请求时自动将历史消息注入提示,实现多轮对话。
2.2 与书中多轮对话的对应
书中多轮对话通过维护messages列表实现:
# 书中 gpt_multi_turn_dialog
dialog_messages.append({"role": "user", "content": user_input1})
reply1, dialog_messages = gpt_multi_turn_dialog(dialog_messages)
dialog_messages.append({"role": "user", "content": user_input2})
reply2, dialog_messages = gpt_multi_turn_dialog(dialog_messages)
ConversationBufferMemory封装了相同逻辑,并可与LangChain的Chain、Agent无缝集成。书中第5章「LangChain基础组件」将记忆与工具并列讲解,本节先掌握 Memory 的用法,再在后续小节中与 Tools、RAG、Agent 组合,形成「对话历史 + 外部能力」的完整链路。书中 5.2 节「记忆(Memory)」与「工具(Tools)」并列,本节将两者统一讲解:先掌握 ConversationBufferMemory 与常用 Memory 类型,再掌握 Tools 的定义与调用方式,便于在 5.6、5.7 节开发 Agent 时同时使用记忆与工具。与 2.5 节多轮对话的 messages 维护、3.3 节对话能力集成的对应关系:LangChain Memory 封装了「历史消息的存储与注入」,Tools 封装了「外部 API 与函数的调用约定」,二者是 RAG 与 Agent 的基础组件。
2.3 基本用法
"""
ConversationBufferMemory 示例(基于书5.2)
运行: pip install langchain langchain-openai langchain-core python-dotenv
"""
import os
from dotenv import load_dotenv
from langchain.memory import ConversationBufferMemory
from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain
load_dotenv()
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.7, api_key=os.getenv("OPENAI_API_KEY"))
memory = ConversationBufferMemory()
chain = ConversationChain(llm=llm, memory=memory)
# 第一轮
chain.invoke({"input": "我叫小明"})
# 第二轮:会记住"小明"
result = chain.invoke({"input": "我叫什么?"})
print(result["response"])
2.4 带返回历史的Memory
memory = ConversationBufferMemory(return_messages=True)
# 与ChatPromptTemplate配合时,return_messages=True 可得到消息列表格式
三、其他Memory类型(书5.2 扩展)
| 类型 | 说明 | 适用场景 |
|---|---|---|
| ConversationBufferMemory | 保留全部历史 | 短对话 |
| ConversationBufferWindowMemory | 只保留最近k轮 | 长对话、成本控制 |
| ConversationSummaryMemory | 将早期对话摘要后保留 | 超长对话 |
| VectorStoreRetrieverMemory | 历史存入向量库,按需检索 | 大量历史、语义检索 |
四、工具(Tools)概述(书5.2)
书中列举了以下工具类型:
- Google Search:查询实时信息、最新数据
- Python REPL:执行Python代码片段
- API调用:对接内部或第三方接口
工具通过描述传给模型,模型据此决定是否调用及传何参数。书中Agent示例使用了DuckDuckGoSearchRun与自定义天气工具。
五、Tool定义与集成
5.1 基本结构
from langchain_core.tools import Tool
def search(query: str) -> str:
# 实际实现:调用搜索API
return "搜索结果..."
tool = Tool(
name="Search",
func=search,
description="用于查询实时信息、最新数据、未知知识点等场景"
)
5.2 与书中Agent工具的对应
书中Agent示例:
# 书中工具定义
tools = [
Tool(name="Search", func=search_tool.run, description="用于查询实时信息..."),
Tool(name="Weather", func=weather_tool, description="用于查询指定城市的天气信息...")
]
description需清晰说明用途与输入格式,模型据此决定调用方式。
5.3 错误处理
工具内部应捕获异常,将错误信息以字符串返回,而非抛出。这样Agent可得知失败原因并决定重试或向用户说明。
def safe_tool(query: str) -> str:
try:
return do_something(query)
except Exception as e:
return f"工具执行失败:{str(e)}"
六、完整可运行示例(基于书中Agent结构)
以下示例结合书中ConversationChain与Tool的用法:
"""
记忆与工具示例(基于书5.2与书中Agent代码)
运行: pip install langchain langchain-openai langchain-core python-dotenv
"""
import os
from dotenv import load_dotenv
from langchain.memory import ConversationBufferMemory
from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain
from langchain_core.tools import Tool
load_dotenv()
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.5, api_key=os.getenv("OPENAI_API_KEY"))
# 记忆
memory = ConversationBufferMemory()
chain = ConversationChain(llm=llm, memory=memory)
# 工具(模拟)
def get_weather(city: str) -> str:
data = {"北京": "晴,20-28℃", "上海": "多云,22-30℃"}
return data.get(city, "暂无数据")
weather_tool = Tool(
name="Weather",
func=get_weather,
description="查询城市天气,输入为城市名"
)
# 对话测试
print(chain.invoke({"input": "北京今天天气怎么样?"})["response"])
# 若需Agent自动调用工具,需使用 create_react_agent + AgentExecutor(见5.6节)
七、记忆与工具的配合
在Agent中,记忆保存对话历史,工具扩展外部能力。Agent根据用户问题与历史,决定是否调用工具,并将工具结果与历史一起送入下一轮推理。书中ReAct Agent示例完整展示了这一流程。
九、与书中 5.2 节基础组件的对应
书中 5.2 节列出记忆(Memory):ConversationBufferMemory、VectorMemory 等,以及工具(Tools):Google Search、Python REPL、API 调用。本节 ConversationBufferMemory 与 Tool 的定义、错误处理及与 ConversationChain 的配合,即书中该部分的落地。VectorMemory 将历史存入向量库,适合长对话的语义检索式回顾;BufferMemory 简单保留最近 N 轮,适合一般对话。下一节 RAG 与 5.6 节 Agent 会继续用到「检索 + 工具」,本节是记忆与工具的基础。实际开发中,可先仅用 ConversationBufferMemory 跑通多轮对话,再按需增加 Tool 并接入 create_react_agent,避免一次性复杂度过高。书中 5.2 节「记忆与工具」的示例代码结构与本节的完整可运行示例一致,可直接复制后替换为自有业务工具。
十、小结
本节基于书中第5章「记忆与工具」,系统讲解了ConversationBufferMemory、VectorMemory及Tool的定义与集成方式。记忆实现多轮对话,工具扩展外部能力,二者是构建对话式Agent的基础。下一节将深入RAG与企业知识库搭建。
下一节预告:5.4 RAG检索增强生成原理与企业知识库问答系统搭建