LangChain RAG 簡述

在 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;已在氣象、教育、醫療、航空航天、金融、通信、能源、零…