在 LangChain 中实现 RAG(检索增强生成,Retrieval-Augmented Generation)的核心思路是:让大模型在生成回答前,先从外部知识库(如文档、数据库等)中检索相关信息,再基于检索到的内容生成更准确、更可靠的回答。LangChain 提供了丰富的组件和工具链,支持多种 RAG 实现方法,适配不同场景(如简单文档问答、多源信息整合、对话式问答等)。以下是常见的方法及具体实现步骤:

一、基础 RAG:单文档/单源检索增强

适用场景:简单的文档问答(如单篇论文、手册、长文本的精准问答),核心是“加载→分割→嵌入→存储→检索→生成”的完整流程。

具体做法:
  1. 文档加载(Document Loading)
    用 LangChain 的 DocumentLoaders 加载目标文档(支持 PDF、TXT、Word、网页等多种格式),将文档转换为 LangChain 标准的 Document 对象(包含文本内容 page_content 和元数据 metadata)。
    常用工具:PyPDFLoader(PDF)、TextLoader(TXT)、UnstructuredFileLoader(多格式)、WebBaseLoader(网页)等。

    from langchain.document_loaders import PyPDFLoader  
    loader = PyPDFLoader("论文.pdf")  # 加载 PDF 文档  
    documents = loader.load()  # 得到 Document 列表  
    
  2. 文档分割(Text Splitting)
    长文档直接嵌入会丢失上下文,需用 TextSplitter 分割为短片段(chunk)。关键是控制 chunk_size(片段长度)和 chunk_overlap(片段重叠度,保留上下文关联)。
    常用工具:RecursiveCharacterTextSplitter(通用分割,按标点/换行递归分割)、CharacterTextSplitter(简单字符分割)等。

    from langchain.text_splitter import RecursiveCharacterTextSplitter  
    text_splitter = RecursiveCharacterTextSplitter(  chunk_size=1000,  # 每个片段 1000 字符  chunk_overlap=200  # 重叠 200 字符,保留上下文  
    )  
    splits = text_splitter.split_documents(documents)  # 分割后的 Document 列表  
    
  3. 文本嵌入(Embedding)
    将分割后的文本片段转换为向量(嵌入),以便后续通过向量相似度检索相关内容。需用嵌入模型生成向量。
    常用工具:OpenAIEmbeddings(OpenAI 的 embedding 模型)、HuggingFaceEmbeddings(开源模型如 BERT、Sentence-BERT)等。

    from langchain.embeddings import OpenAIEmbeddings  
    embeddings = OpenAIEmbeddings()  # 使用 OpenAI 的 embedding 模型  
    
  4. 向量存储(Vector Storage)
    将嵌入向量和对应的文本片段存储到向量数据库(VectorStore),支持高效的相似度检索。
    常用工具:轻量本地库 ChromaFAISS;云端服务 PineconeWeaviateMilvus 等。

    from langchain.vectorstores import Chroma  
    # 初始化向量库并添加文档(自动完成嵌入和存储)  
    vectorstore = Chroma.from_documents(  documents=splits,  embedding=embeddings,  persist_directory="./chroma_db"  # 本地存储路径  
    )  
    vectorstore.persist()  # 持久化存储  
    
  5. 构建检索器(Retriever)
    从向量库中检索与问题相关的文本片段,作为 RAG 的“检索”环节。LangChain 的 VectorStore 可直接转换为 Retriever

    retriever = vectorstore.as_retriever(  search_kwargs={"k": 3}  # 检索最相关的 top 3 片段  
    )  
    
  6. 生成回答(Generation)
    用大模型(LLM)结合检索到的内容生成回答,通过 RetrievalQA 链串联“检索→生成”流程。

    from langchain.chat_models import ChatOpenAI  
    from langchain.chains import RetrievalQA  llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)  # 大模型  
    qa_chain = RetrievalQA.from_chain_type(  llm=llm,  chain_type="stuff",  # 将检索到的内容全部传入模型  retriever=retriever,  return_source_documents=True  # 返回检索到的源文档(可选)  
    )  # 提问并获取回答  
    query = "这篇论文的核心创新点是什么?"  
    result = qa_chain({"query": query})  
    print(result["result"])  # 回答内容  
    print(result["source_documents"])  # 检索到的源文档  
    

二、进阶 RAG:多阶段检索与精准优化

适用场景:当基础 RAG 检索相关性不足(如文档量大、歧义问题)时,通过多阶段检索或重排序提升精度。

具体做法:
  1. 多查询检索(Multi-Query Retrieval)
    对原始问题生成多个相似查询(由 LLM 自动扩展),用多个查询检索后合并结果,覆盖更多相关片段。

    from langchain.retrievers.multi_query import MultiQueryRetriever  # 用 LLM 生成多个查询  
    retriever_from_llm = MultiQueryRetriever.from_llm(  retriever=vectorstore.as_retriever(),  llm=ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)  
    )  # 用多查询检索结果回答  
    qa_chain = RetrievalQA.from_chain_type(  llm=llm,  chain_type="stuff",  retriever=retriever_from_llm  
    )  
    
  2. 上下文压缩检索(Contextual Compression)
    先检索初步结果,再用“重排序模型(Reranker)”或“过滤模型”对结果二次筛选,保留最相关的片段。
    常用工具:ContextualCompressionRetriever 结合 CohereRerankRankGPT 等重排序工具。

    from langchain.retrievers import ContextualCompressionRetriever  
    from langchain.retrievers.document_compressors import CohereRerank  # 初始化重排序器(需 Cohere API 密钥)  
    compressor = CohereRerank(model="rerank-english-v2.0", top_n=3)  
    # 构建压缩检索器  
    compression_retriever = ContextualCompressionRetriever(  base_compressor=compressor,  base_retriever=vectorstore.as_retriever(search_kwargs={"k": 10})  # 先检索 top 10  
    )  # 用压缩后的结果生成回答  
    qa_chain = RetrievalQA.from_chain_type(  llm=llm,  chain_type="stuff",  retriever=compression_retriever  
    )  
    
  3. 混合检索(Hybrid Retrieval)
    结合“向量检索(语义相似)”和“关键词检索(精确匹配)”,兼顾语义理解和精准关键词匹配(如专业术语)。
    常用工具:PineconeWeaviate 等支持混合检索的向量库,或用 LangChainMultiRetriever 组合。

三、多源 RAG:跨类型/跨库信息整合

适用场景:需要从多个数据源(如文档、数据库、API、表格等)检索信息,整合后生成回答(如企业知识库+产品数据库的问答)。

具体做法:
  1. 多向量库检索(Multi-VectorStore Retrieval)
    为不同类型的文档(如技术手册、用户案例、API 文档)创建独立向量库,检索时并行查询并合并结果。

    # 初始化多个向量库  
    vectorstore_tech = Chroma.from_documents(tech_docs, embeddings, persist_directory="./tech_db")  
    vectorstore_case = Chroma.from_documents(case_docs, embeddings, persist_directory="./case_db")  # 构建多检索器  
    from langchain.retrievers import MultiRetriever  
    retrievers = [  vectorstore_tech.as_retriever(search_kwargs={"k": 2}),  vectorstore_case.as_retriever(search_kwargs={"k": 2})  
    ]  
    multi_retriever = MultiRetriever(retrievers=retrievers)  # 用多检索器生成回答  
    qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=multi_retriever)  
    
  2. 结构化+非结构化混合检索
    结合非结构化文档(向量检索)和结构化数据(如 SQL 数据库、CSV 表格),用 SQLDatabaseChainTableQA 处理结构化查询,再与文档检索结果整合。

    from langchain.chains import SQLDatabaseChain  
    from langchain.sql_database import SQLDatabase  # 连接 SQL 数据库  
    db = SQLDatabase.from_uri("sqlite:///产品库存.db")  
    sql_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)  # 定义路由逻辑:判断问题需要文档检索还是数据库查询  
    from langchain.chains import RouterChain, LLMRouterChain, MultiPromptChain  
    from langchain.prompts import PromptTemplate  # 路由提示:让 LLM 判断问题类型  
    route_prompt = PromptTemplate(  template="""判断问题需要查询文档还是数据库:{input}  输出 'doc' 或 'sql'""",  input_variables=["input"]  
    )  
    router_chain = LLMRouterChain.from_llm(llm, route_prompt)  # 整合链:根据路由结果调用对应工具  
    chains = {"doc": qa_chain, "sql": sql_chain}  
    multi_chain = MultiPromptChain(router_chain=router_chain, destination_chains=chains)  # 提问(如“产品A的库存有多少?”→ 路由到 SQL;“产品A的使用场景?”→ 路由到文档)  
    result = multi_chain.run("产品A的库存和使用场景分别是什么?")  
    

四、对话式 RAG:带历史记忆的检索增强

适用场景:对话场景(如客服机器人),需要结合历史对话上下文动态检索,确保回答连贯性(如“上一个问题提到的功能如何操作?”)。

具体做法:

ConversationalRetrievalChain 替代基础 RetrievalQA,自动处理对话历史,生成包含历史上下文的检索查询。

from langchain.chains import ConversationalRetrievalChain  
from langchain.memory import ConversationBufferMemory  # 初始化对话记忆(存储历史对话)  
memory = ConversationBufferMemory(  memory_key="chat_history",  # 记忆键名  return_messages=True,  # 返回消息对象  output_key="answer"  # 输出键名(与链对齐)  
)  # 构建对话式 RAG 链  
conv_chain = ConversationalRetrievalChain.from_llm(  llm=llm,  retriever=retriever,  memory=memory,  return_source_documents=True  
)  # 多轮对话示例  
query1 = "这篇论文的研究背景是什么?"  
result1 = conv_chain({"question": query1})  
print(result1["answer"])  query2 = "基于这个背景,作者提出了什么方法?"  # 依赖上一轮历史  
result2 = conv_chain({"question": query2})  
print(result2["answer"])  

五、多模态 RAG:整合文本、图片、表格等跨类型信息

适用场景:文档包含图片、表格、公式等非文本内容(如 PDF 中的图表、PPT 中的图片),需检索多模态信息生成回答。

具体做法:
  1. 多模态文档加载:用 UnstructuredFileLoaderPyPDFLoader 加载含多模态内容的文档,保留图片/表格元数据。
  2. 多模态嵌入:对文本用常规嵌入模型,对图片用视觉嵌入模型(如 CLIP),存储到支持多模态的向量库(如 QdrantWeaviate)。
  3. 多模态检索:检索时同时匹配文本和图片向量,生成回答时引用图片内容(如“图1展示了XXX流程”)。
# 示例:加载含图片的 PDF 并保留图片元数据  
from langchain.document_loaders import PyPDFLoader  
loader = PyPDFLoader("带图片的文档.pdf", extract_images=True)  # 提取图片  
documents = loader.load()  # 多模态向量库存储(以 Qdrant 为例)  
from langchain.vectorstores import Qdrant  
from langchain.embeddings import HuggingFaceBgeEmbeddings  # 文本嵌入  
from PIL import Image  
import clip  # 视觉嵌入模型  # 文本嵌入 + 图片嵌入逻辑(需自定义处理)  
# ...(省略图片嵌入细节)  # 构建多模态检索器并生成回答  
qdrant = Qdrant.from_documents(...)  
retriever = qdrant.as_retriever()  
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)  

总结

LangChain 实现 RAG 的核心是通过“组件化”灵活组合文档处理、检索、生成环节,关键方法可归纳为:

  • 基础流程:加载→分割→嵌入→存储→检索→生成;
  • 精度优化:多查询、重排序、混合检索;
  • 多源整合:多向量库、结构化+非结构化混合;
  • 场景适配:对话式记忆、多模态检索。

实际应用中需根据文档类型、问答场景选择合适的方法,并通过调整 chunk_size、检索 k 值、重排序策略等优化效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919390.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919390.shtml
英文地址,请注明出处:http://en.pswp.cn/news/919390.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GEO 优化专家孟庆涛:技术破壁者重构 AI 时代搜索逻辑

在生成式 AI 重塑全球搜索生态的浪潮中,中国 GEO(生成式引擎优化)领域的开拓者孟庆涛以 "智能决策革命" 的技术框架,颠覆了传统 "发发文章" 的简单认知。作为辽宁粤穗网络科技有限公司总经理兼 GEO 实验室主任…

用relation-graph构建关系图谱 vue版

用relation-graph构建关系图谱 vue版vue文件和Json数据vue文件和Json数据 <template><div><div style"margin-top:0px;width: calc(100% - 10px);height:calc(100vh);"><RelationGraph ref"graphRef" :options"graphOptions&qu…

Python基础-控制结构

控制结构是编程语言中用来控制程序执行流程的语句。Python提供了条件语句、循环语句等控制结构&#xff0c;让程序能够根据不同条件执行不同的代码块。 程序执行流程图&#xff1a; ┌───────────────────────────────────────────…

Java算法之排序

下面我们将讲述七大基于比较的排序算法的基本原理及实现。并从稳定性、时间复杂度、空间复杂度3种性能对每种排序进行分析。 重点&#xff1a;快速排序和堆排序&#xff1b;难点&#xff1a;快速排序和归并排序 目录 一、排序概念 二、常见排序算法的实现 2.1 插入排序 2.…

RabbitMQ:SpringAMQP 多消费者绑定同一队列

目录一、案例需求二、代码实现三、总结生产者源码 消费者源码 一、案例需求 模拟WorkQueue&#xff0c;实现一个队列绑定多个消费者。 在RabbitMQ的控制台创建一个队列&#xff0c;命名为work.queue。在生产者服务中定义测试方法&#xff0c;在1s内产生50条消息&#xff0c;…

Java技术总监的成长之路(技术干货分享)

以下是针对 ​Java技术总监​ 在 Linux 环境下搭建企业级开发环境的完整指南&#xff0c;涵盖 JDK 配置、工程工具链、协作平台及性能优化方案&#xff1a; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 一、核心环境搭建 1. ​JDK 安装与调优​ ​版本选择…

C++代码解释:实现一个 mystring 类,用于表示字符串,实现构造函数,默认构造长度为 10 的空间,提供打印字符串,获取空间大小,修改内容的成员函数

题目代码#include <cstring> // 包含字符串处理函数库&#xff0c;如strlen、strncpy等 #include <iostream> // 包含输入输出流库&#xff0c;用于cout等操作 using namespace std; // 使用标准命名空间&#xff0c;避免重复书写std::class mystring { // 定…

如何解决IDEA/Datagrip无法连接数据库的问题:解决方法为添加参数-Djava.net.preferIPv4Stack=true

如何解决IDEA/Datagrip无法连接数据库的问题&#xff1a;解决方法为添加参数-Djava.net.preferIPv4Stacktrue 引言 在开发过程中&#xff0c;我们常常使用集成开发环境&#xff08;IDE&#xff09;如 IntelliJ IDEA 或 JetBrains DataGrip 来与数据库进行交互。然而&#xff…

走进数字时代,融入数字生活,构建数字生态

一、准备在IT行业深耕十七年&#xff0c;始终专注于企业生产经营中的实际应用问题&#xff0c;历经开发、测试、运维、实施、架构设计等多个技术岗位&#xff0c;并参与肉制品的生产与销售业务&#xff0c;推进了企业主业的市场管理落地&#xff0c;积累了业务与信息技术融合的…

【Vue开发】在Vite+Vue3项目中实现离线Iconify图标方案

在ViteVue3项目中实现离线Iconify图标方案 项目背景 当前项目需要部署到无网络连接的离线环境&#xff0c;因此需要将Iconify图标集打包到项目构建结果中&#xff0c;实现完全离线使用。 技术环境 框架: Vue 3构建工具: Vite核心依赖:"iconify/json": "^2.2…

Kotlin 协程之Channel

前言 在之前的文章中&#xff0c;我们已经知道了协程的启动、挂起、取消、异常以及常用的协程作用域等基础应用。 这些基础应用适合的场景是一次性任务&#xff0c;执行完就结束了的场景。 launch / async 适合的场景 网络请求数据库查询文件读写并行计算任务等等 Channel …

linux系统装google chrome,amd64

google chrome官网最下边其他平台&#xff0c;linux 查看自己的系统架构&#xff08;用下边这行代码查看&#xff09;&#xff0c;看看是amd还是 &#xff0c;我的显示amd64&#xff0c;amd对应.deb,rpm对应x86 &#xff0c;选择下载 dpkg --print-architecture 然后 sudo…

【C++基础】C++ 中const与volatile关键字深度解析:从面试考点到底层实现

在 C 开发岗位的面试中&#xff0c;const与volatile关键字是高频考点之一。这两个关键字看似简单&#xff0c;但实际上蕴含着丰富的语义和底层机制。本文从基础语法到高级应用&#xff0c;结合大厂真题&#xff0c;深入解析这两个关键字的奥秘。一、const关键字&#xff1a;常量…

达梦分布式集群DPC_故障分析_yxy

达梦分布式集群DPC_节点故障分析1 DPC核心概念回顾2 场景1-主库故障3 场景2-少数备库故障4 场景3-多数节点故障4.1 多数节点故障&#xff08;包括主库&#xff09;4.2 多数备库节点故障&#xff08;不包括主库&#xff09;1 DPC核心概念回顾 达梦分布式集群DPC&#xff0c;基于…

【高并发内存池】一、简介 定长内存池实现

文章目录Ⅰ. 项目介绍1、这个项目要做什么2、项目的要求Ⅱ. 什么是内存池1、池化技术2、内存池3、mallocⅢ. 设计一个定长内存池1、定长内存池的概念2、实现如何实现定长❓❓❓如何绕开 malloc 向堆直接申请空间❓❓❓3、性能测试Ⅰ. 项目介绍 1、这个项目要做什么 tcmalloc源…

产品设计.原型设计

产品思维&#xff1a; 1. 产品定位&#xff1a;产品的具体的、用户画像&#xff1b; --什么样的人在什么环境下做什么事情的场景 2. 范围层: 发现、识别和决策需求。--识别真假需求&#xff0c;做ROI判断 3. 可复用的、MVP产品方案--要能复用的解决方案&#xff0c;最小可用产品…

vue3+element-plus 输入框el-input设置背景颜色和字体颜色,样式效果等同于不可编辑的效果

应用效果&#xff1a;代码&#xff1a;<template> ......<el-form-item label"文件编号" label-position"right"><el-input v-model"qualityFileForm.fileNo" clearable :disabled"!props.isNew" /></el-form-it…

[ CSS 前端 ] 网页内容的修饰

目录 一. CSS 1. 概述 2. 基本语法 (1)行内样式表 (2)内嵌样式表 (3)外部样式表 3. 选择器 (1)标签选择器: (2)类选择器: (3)通配选择器: (4)后代选择器: 4. 基础样式 (1). 文本样式 (2). 背景样式 (3). 列表样式 5. 伪类 (1)定义: (2)伪类的语法&#xff1a; …

全面深入了解榛树游戏引擎

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;榛树游戏引擎&#xff08;Hazel&#xff09;是一款专为游戏开发设计的先进软件工具&#xff0c;它集成了多种功能&#xff0c;支持现代图形API&#xff0c;具有高性能的物理模拟系统和易学易用的脚本语言&#…

“大模型”技术专栏 | 浅谈基于 Kubernetes 的 LLM 分布式推理框架架构:概览

编者按&#xff1a;人工智能正以前所未有的渗透力重塑生产与生活图景。作为国内领先的数据智能科技企业&#xff0c;和鲸科技自 2015 年成立以来&#xff0c;深耕人工智能与数据科学&#xff0c;历经十年发展&#xff0c;已在气象、教育、医疗、航空航天、金融、通信、能源、零…