‌LangChain Memory赋能:打造高效多轮对话检索系统‌

本文详细讲解如何使用 LangChain 中的 Memory 模块,构建支持“上下文记忆”的多轮问答系统。你将学习如何结合向量检索(RAG)、Memory 缓存、提示模板,实现一个能“记住你上句话”的智能问答助手,适用于客服机器人、企业知识库、助手应用等场景。

📘 目录

  1. 多轮对话系统的挑战与需求
  2. LangChain Memory 模块原理图解
  3. 技术准备:依赖安装与模型配置
  4. 构建基础 Memory 示例
  5. Memory + 检索器(RAG)集成实战
  6. 自定义 Memory 类型:Token Buffer vs ConversationBuffer
  7. 对话效果演示与代码解读
  8. 最佳实践与性能建议
  9. 总结与拓展方向

1. 多轮对话系统的挑战与需求

❓为什么 Memory 重要?

多轮对话需要“上下文保持”:

  • 用户说:“北京社保多少钱?”
  • 接着又说:“那上海呢?”
  • 系统要“记得”之前问的是“社保”话题。

👇 常见痛点:

问题说明
无上下文记忆每次都是独立问答,无法理解“他/她/那个”
上下文串联逻辑复杂用户可能跳跃话题、回溯
Token 长度限制整段上下文拼接太长会触发截断

2. LangChain Memory 模块原理图解

                    +------------------------+
                    | 用户当前输入 UserInput |
                    +------------------------+
                               |
                               v
                  +-----------------------------+
                  |  Memory(历史对话)         |
                  |  - ConversationBufferMemory |
                  +-----------------------------+
                               |
                               v
        +--------------------------------------------------+
        | Prompt 模板(含历史上下文 + 当前问题)            |
        +--------------------------------------------------+
                               |
                               v
                       [调用 LLM 生成回答]
                               |
                               v
                    +------------------------+
                    | 输出当前回答 ChatReply |
                    +------------------------+
                               |
                               v
                 [追加到 Memory,形成对话历史]

3. 技术准备:依赖安装与模型配置

安装 LangChain 与模型支持库

pip install langchain openai

(也可使用本地模型如 ChatGLM / Qwen / llama-cpp)

设置 OpenAI 环境变量(如使用 ChatGPT)

export OPENAI_API_KEY=your-key

4. 构建基础 Memory 示例

from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain

llm = ChatOpenAI(temperature=0)
memory = ConversationBufferMemory()

conversation = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True
)

# 多轮对话测试
conversation.predict(input="我想了解2024年北京社保政策")
conversation.predict(input="上海的呢?")

输出结果:

> 记住了“北京社保”
> 接着问“上海的呢”能自动理解是“上海的社保”

5. Memory + 检索器(RAG)集成实战

结合向量检索(如 Elasticsearch)与 Memory,可以实现智能问答 + 记忆系统:

from langchain.vectorstores import ElasticsearchStore
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.chains import ConversationalRetrievalChain

embedding = HuggingFaceEmbeddings(model_name="BAAI/bge-base-zh")
vectorstore = ElasticsearchStore(
    es_url="http://localhost:9200",
    index_name="rag_docs",
    embedding=embedding
)

retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True
)

llm = ChatOpenAI(temperature=0)

qa = ConversationalRetrievalChain.from_llm(
    llm=llm,
    retriever=retriever,
    memory=memory,
    verbose=True
)

qa.run("我想了解2024年北京的社保基数")
qa.run("那上海是多少?")

6. 自定义 Memory 类型对比

类型说明适合场景
ConversationBufferMemory默认内存,保存全对话小对话场景
ConversationSummaryMemory用 LLM 压缩摘要历史长对话、总结式
ConversationTokenBufferMemory限定 token 数上下文控制上下文长度
ConversationKGMemory知识图谱存储实体多实体复杂问答

示例:Token Buffer 限定上下文

from langchain.memory import ConversationTokenBufferMemory

memory = ConversationTokenBufferMemory(
    llm=llm,
    max_token_limit=800
)

7. 对话效果演示与代码解读

输入:

用户:我想问一下北京2024年社保缴费标准?
用户:上海的呢?
用户:那我需要每月交多少钱?

实际 Prompt 拼接内容:

历史对话:
Human: 我想问一下北京2024年社保缴费标准?
AI: 北京的社保缴费基数上限为xxx...
Human: 上海的呢?
AI: 上海的缴费上限为xxx...
Human: 那我需要每月交多少钱?

→ LLM 能精准定位上下文“社保”话题,并跨轮整合知识。


8. 最佳实践与性能建议

建议描述
控制上下文长度使用 Token Buffer Memory 限制 LLM 输入
长对话摘要ConversationSummaryMemory 自动摘要
本地部署搭配 ChatGLM、Qwen 等本地模型可离线部署
日志记录结合 Streamlit 或 FastAPI 可实时展示对话
可视化调试使用 verbose=True 查看 Prompt 合成

9. 总结与拓展方向

模块使用说明
LLMChatOpenAI / Qwen / llama-cpp
MemoryConversationBufferMemory / TokenBuffer
检索器Elasticsearch / FAISS 向量库
业务逻辑结合 Chain 实现提问 + 回答 + 历史记忆

拓展方向:

  • 多轮对话 RAG + 文档总结
  • Memory + Agent 智能工具链
  • 聊天机器人 WebUI + 用户会话日志持久化
最后修改于:2025年06月20日 13:30

评论已关闭

推荐阅读

AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日
python之plot()和subplot()画图
2024年11月26日
理解 DALL·E 2、Stable Diffusion 和 Midjourney 工作原理
2024年12月01日