当前位置: 首页 > news >正文

LangChain是如何实现RAG多轮问答的

目录

  • 引言
  • 一、LangChain实现RAG多轮问答核心机制
      • 1. 对话历史管理(Memory)
      • 2. 问题重写(Query Rewriting)
      • 3. 检索增强生成(RAG Core)
      • 4. 链式工作流(Chain)
  • 二、关键设计特点
  • 三、完整示例代码
  • 四、优化建议

引言

小马之所以写今天这篇文章是因为在上一篇文章《多轮问答与指代消解》中的第一章节有提到“LangChain是怎么实现的多轮问答”,但很显然没有提到它在RAG下是怎么实现的多轮问答,毕竟这两者还是有区别的。前一篇文章刚好提到自己实现RAG下的多轮问答要怎么实现,唯独没有提到LangChain在RAG下是怎么实现的多轮。
前篇文章中提到的MultiQueryRetriever小马已经在文中声明,这个并不是为了解决RAG多轮的机制。

庆幸的是,我们回过头来看LangChain实现RAG多轮问答的方式其实和我们自己实现的思路不能说一模一样,简直是毫无区别。只是LangChain封装了组件,我们直接调用就能实现了,省去了自己写工程代码来实现的过程。接下来我们有必要一起看下的,不过看过上一篇的同学其实看这篇文章就很好理解了。
在这里插入图片描述

一、LangChain实现RAG多轮问答核心机制

在 LangChain 中实现 RAG(Retrieval-Augmented Generation)的多轮问答主要通过以下核心机制完成,确保对话历史被有效利用:

1. 对话历史管理(Memory)

LangChain 使用 Memory 组件 存储和传递上下文:

  • ConversationBufferMemory
    存储完整的原始对话历史(用户输入 + AI 响应)。
  • ConversationSummaryMemory
    用 LLM 压缩历史为摘要,避免 token 超限。
  • ConversationBufferWindowMemory
    仅保留最近 K 轮对话,控制上下文长度。
from langchain.memory import ConversationBufferMemorymemory = ConversationBufferMemory(memory_key="chat_history",  # 存储对话的键名return_messages=True        # 返回消息列表而非字符串
)

2. 问题重写(Query Rewriting)

将当前问题结合历史重写为独立查询,使检索更准确:

  • ConversationalRetrievalChain 内置 condense_question 步骤:
    1. 输入:当前问题 + 对话历史
    2. 输出:重写后的独立问题(如将代词替换为具体实体)
from langchain.chains import ConversationalRetrievalChainqa_chain = ConversationalRetrievalChain.from_llm(llm=chat_model,             # 如 ChatOpenAIretriever=vectorstore.as_retriever(),  # 向量检索器memory=memory,condense_question_llm=condense_model  # 可选:专用重写模型
)

3. 检索增强生成(RAG Core)

多轮流程如下:

  1. 检索上下文
    用重写后的查询从向量库检索相关文档片段。
  2. 组装提示
    将以下内容组合为最终提示:
    • 检索到的上下文
    • 对话历史(原始或摘要)
    • 当前问题
  3. 生成答案
    LLM 基于完整上下文生成连贯回复。
提示词示例:
[检索到的文档]
对话历史:用户: 量子计算是什么?AI: 量子计算利用量子比特...
当前问题:它有什么优势?
最终答案:量子计算的优势包括...

4. 链式工作流(Chain)

ConversationalRetrievalChain 自动处理整个流程:

# 第一轮
result = qa_chain({"question": "什么是RAG?"})
print(result["answer"])# 第二轮(自动携带历史)
result = qa_chain({"question": "它如何解决幻觉问题?"})  # "它"指代RAG
print(result["answer"])

二、关键设计特点

组件作用
Memory持久化历史对话,支持多种存储策略(原始/摘要/滑动窗口)
Query Rewriting解决指代消解(如“它”指代上文的 RAG),提升检索准确性
Contextual Prompt动态组装提示,包含历史 + 检索结果 + 当前问题
检索器优化支持自定义检索器(如过滤元数据、调整相似度阈值)

三、完整示例代码

from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain# 初始化向量库和模型
vectorstore = FAISS.load_local("rag_vector_db", OpenAIEmbeddings())
llm = ChatOpenAI(model="gpt-4-turbo")
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)# 构建链
qa_chain = ConversationalRetrievalChain.from_llm(llm=llm,retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),memory=memory
)# 模拟多轮对话
questions = ["LangChain是什么?","它的核心组件有哪些?",  # "它" 指代LangChain"如何用RAG实现多轮对话?"
]
for q in questions:result = qa_chain.invoke({"question": q})print(f"问题: {q}\n答案: {result['answer']}\n")

四、优化建议

  1. 历史摘要:长对话时使用 ConversationSummaryMemory 避免 token 超限。
  2. 重写模型:用轻量级模型(如 GPT-3.5)专门处理问题重写,降低成本。
  3. 检索过滤:基于元数据(如对话 ID)过滤无关文档。
  4. 提示工程:定制提示模板明确区分历史/当前问题/检索内容。

通过组合 Memory 管理智能查询重写上下文感知的 RAG 流程,LangChain 有效实现了多轮问答的连贯性与准确性。

本篇文章旨在补充上一篇文章的内容,建议结合上一篇文章食用,口感效果更加。

http://www.dtcms.com/a/329259.html

相关文章:

  • 【算法岗面试】手撕Self-Attention、Multi-head Attention
  • 比特币持有者结构性转变 XBIT分析BTC最新价格行情市场重构
  • 微店商品数据API接口的应用||电商API接口的应用
  • 数据结构与算法-选择题
  • 公司项目用户密码加密方案推荐(兼顾安全、可靠与通用性)
  • Chaos Vantage 2.8.1 发布:实时探索与材质工作流的全新突破
  • CacheBlend:结合缓存知识融合的快速RAG大语言模型推理服务
  • 大模型推理框架vLLM 中的Prompt缓存实现原理
  • 性能优化之通俗易懂学习requestAnimationFrame和使用场景举例
  • 来伊份×养馋记:社区零售4.0模式加速渗透上海市场
  • 四、深入剖析Java程序逻辑控制:从字节码到性能优化
  • MySQL事务原理分析以及隔离与锁
  • 从人机协作到情感共鸣:智能销售机器人如何重塑零售体验
  • 基于RTSP|RTMP低延迟视频链路的多模态情绪识别系统构建与实现
  • C++ 类和对象详解(1)
  • 飞算JavaAI实现数据库交互:JPA/Hibernate + MyBatis Plus基础功能学习
  • STM32的UART奇偶校验注意
  • 20.04ubantu 编译lio_sam问题解决
  • 推荐系统论文分享之多任务模型--PLE(一)
  • Java 中 static 关键字详解(更新版)
  • JavaScript手录16-定时器
  • 基于51单片机的手机蓝牙控制8位LED灯亮灭设计
  • 传统Python开发工程师转型大模型智能体开发工程师路径
  • jq实现页面区域内拖动功能
  • InfluxDB 在工业控制系统中的数据监控案例(一)
  • 自然语言处理的实际应用
  • 晓知识: 微服务CAP定理
  • 5. synchronized 关键字 - 监视器锁 monitor lock
  • 基于 MybatisPlus 将百度天气数据存储至 PostgreSQL 数据库的实践
  • 飞算JavaAI云原生实践:基于Docker与K8s的自动化部署架构解析