5.3 记忆与工具:ConversationBufferMemory与外部API集成

0 阅读5分钟

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结构)

以下示例结合书中ConversationChainTool的用法:

"""
记忆与工具示例(基于书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章「记忆与工具」,系统讲解了ConversationBufferMemoryVectorMemoryTool的定义与集成方式。记忆实现多轮对话,工具扩展外部能力,二者是构建对话式Agent的基础。下一节将深入RAG与企业知识库搭建。


下一节预告:5.4 RAG检索增强生成原理与企业知识库问答系统搭建