langchain從入門到精通(三十四)——RAG優化策略(十)父文檔檢索器實現拆分和存儲平衡

1. 拆分文檔與檢索的沖突

在 RAG 應用開發中,文檔拆分 和 文檔檢索 通常存在相互沖突的愿望,例如:

  1. 我們可能希望擁有小型文檔,以便它們的嵌入可以最準確地反映它們的含義,如果太長,嵌入/向量沒法記錄太多文本特征。
  2. 但是又希望文檔足夠長,這樣能保留每個塊的上下文。
    這個時候就可以考慮通過 拆分子文檔塊檢索 父文檔塊 的策略來實現這種平衡,即在檢索中,首先獲取小塊,然后再根據小塊元數據中存儲的 id,使用 id 來查找這些塊的父文檔,并返回那些更大的文檔,該策略適合一些不是特別能拆分的文檔,或者是文檔上下文關聯性很強的場景
    請注意,這里的“父文檔”指的是小塊來源的文檔,可以是整個原始文檔,也可以是切割后比較大的文檔塊
    子文檔->父文檔 的運行流程也非常簡單,其實和 多向量檢索器 一模一樣,如下:
    在這里插入圖片描述
    除了使用 MultiVectorRetriever 來實現該運行流程,在 LangChain 中,還封裝了 ParentDocumentRetriever,可以更加便捷地完成該功能,使用技巧也非常簡單,傳遞 向量數據庫、文檔數據庫 和 子文檔分割器 即可。
    代碼示例:
import dotenv
import weaviate
from langchain.retrievers import ParentDocumentRetriever
from langchain.storage import LocalFileStore
from langchain_community.document_loaders import UnstructuredFileLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_weaviate import WeaviateVectorStore
from weaviate.auth import AuthApiKeydotenv.load_dotenv()# 1.創建加載器與文檔列表,并加載文檔
loaders = [UnstructuredFileLoader("./電商產品數據.txt"),UnstructuredFileLoader("./項目API文檔.md"),
]
docs = []
for loader in loaders:docs.extend(loader.load())# 2.創建文本分割器
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=50,
)# 3.創建向量數據庫與文檔數據庫
vector_store = WeaviateVectorStore(client=weaviate.connect_to_wcs(cluster_url="https://mbakeruerziae6psyex7ng.c0.us-west3.gcp.weaviate.cloud",auth_credentials=AuthApiKey("xxxxxxxxxxxxxxxxxxxxxxxxxxxx"),),index_name="ParentDocument",text_key="text",embedding=OpenAIEmbeddings(model="text-embedding-3-small"),
)
store = LocalFileStore("./parent-document")# 4.創建父文檔檢索器
retriever = ParentDocumentRetriever(vectorstore=vector_store,byte_store=store,child_splitter=text_splitter,
)# 5.添加文檔
retriever.add_documents(docs, ids=None)# 6.檢索并返回內容
search_docs = retriever.invoke("分享關于LLMOps的一些應用配置")
print(search_docs)
print(len(search_docs))

輸出內容會返回完整的文檔片段,而不是拆分后的片段(但是在向量數據庫中存儲的是分割后的片段)

[Document(metadata={'source': './項目API文檔.md'}, page_content='LLMOps 項目 API 文檔\n\n應用 API 接口統一以 JSON 格式返回,并且包含 3 個字段:code、data 和 message,分別代表業務狀態碼、業務數據和接口附加信息。\n\n業務狀態碼共有 6 種,其中只有 success(成功) 代表業務操作成功,其他 5 種狀態均代表失敗,并且失敗時會附加相關的信息:fail(通用失敗)、not_found(未找到)、unauthorized(未授權)、forbidden(無權限)和validate_error(數據驗證失敗)。\n\n接口示例:\n\njson\n{\n    "code": "success",\n    "data": {\n        "redirect_url": "https://github.com/login/oauth/authorize?client_id=f69102c6b97d90d69768&redirect_uri=http%3A%2F%2Flocalhost%3A5001%2Foauth%2Fauthorize%2Fgithub&scope=user%3Aemail"\n    },\n    "message":...')]

2.父文檔檢索器檢索較大塊

在上面的示例中,我們使用拆分的文檔塊檢索數據原文檔,但是有時候完整文檔可能太大,我們不希望按原樣檢索它們。在這種情況下,我們真正想要做的是先將原始文檔拆分成較大的塊(例如 1000-2000 個 Token),然后將其拆分為較小塊,接下來索引較小塊,但是檢索時返回較大塊(非原文檔)。
運行流程變更如下
在這里插入圖片描述

ParentDocumentRetriever 中,只需要傳遞多一個 父文檔分割器 即可,其他流程無需任何變化,更新后的部分代碼如下

parent_splitter = RecursiveCharacterTextSplitter(chunk_size=2000)
child_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)retriever = ParentDocumentRetriever(vectorstore=vector_store,byte_store=store,parent_splitter=parent_splitter,child_splitter=child_splitter,
)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87175.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87175.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87175.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Javaweb - 7 xml

XML 是EXtensible Markup Language 的縮寫,翻譯過來就是可擴展標記語言。即,XML 和 HTML 一樣,都是標記語言,也就是說,它們的基本語法都是標簽。 特點: 1. 可擴展:即 XML 是允許自定義格式的。但…

qml實現 裁剪進度條

我們需要實現一個垂直進度條效果,但使用圖片裁剪的方式。具體需求: 1. 圖片位置固定,容器對齊其左邊和下邊,寬度和圖片相同。 2. 容器背景透明,調整裁剪容器的高度,使其有高度進度條的感覺(從下…

Dify 工作流全棧解析:從零構建你的 AI 應用流程引擎

AI工作流的導言: 工作流系統(Workflow System)是 Dify 的核心組成部分,它通過可視化編程界面支持創建復雜的 AI 應用程序。用戶可以將不同的功能塊連接起來,從而設計出用于處理數據、與 AI 模型交互、管理條件以及執行…

上下位機通訊規則

0:事由 最近開發,上位機Qt與下位機通訊的時候發現通訊規則有些不一樣,這里簡單記錄一下 。所有代碼基于元寶生成,屬于偽代碼不保證真實可用,啊但是邏輯是這么個邏輯。 1:底層通訊規則 以STM32向上位機通訊…

創建平衡二叉樹C++

給你一個整數數組 nums &#xff0c;其中元素已經按 升序 排列&#xff0c;請你將其轉換為一棵 平衡 二叉搜索樹。 平衡二叉樹&#xff1a;每個節點的左右子樹高度差不超過1 class Solution { public:TreeNode* dfs(vector<int>& nums, int left, int right){if(l…

海光の初體驗

背景 八張K100的風扇已經將近一年沒轉過了…早在今年4月29日&#xff0c;Qwen3正式發布并全部開源8款「混合推理模型」。作為Qwen系列中的最新一代大型語言模型&#xff0c;Qwen3在推理、指令遵循、工具調用、多語言能力等方面進行了全面增強。海光DCU&#xff08;Deep Comput…

場外交易(OTC)財富管理系統開發及解決方案報告

——跨境金融科技賦能機構客戶新增長 一、OTC市場現狀與機構業務痛點 1. 政策機遇與市場擴容 “北向互換通”期限延長&#xff1a;2025年7月1日&#xff0c;中國外匯交易中心聯合香港交易所將利率互換合約期限延長至30年&#xff0c;首日交易規模達15.3億元&#xff0c;填補超…

pytorch底層原理學習--JIT與torchscript

文章目錄 0 目的1 TorchScript1.1 語言特性的限定性1.2 設計目的&#xff1a;模型表達的專注性 2pytorch JIT&#xff08;Just-in-time compilation)2.1pytorch JIT定義2.1pytorch JIT整個過程&#xff1a;1. 前端轉換層&#xff1a;生成靜態計算圖2. 中間表示層&#xff08;IR…

Ubuntu+Nginx+php+SQLite3+typecho手動搭建個人博客

零.Ubuntu環境 一.安裝nginx 使用以下指令進行nginx web服務器安裝&#xff1a; apt-get install nginx 如果提示找不到安裝包&#xff0c;也可以更新一下系統的apt環境包&#xff1a; sudo apt update 安裝完成后&#xff0c;可以使用以下指令查看nginx是否處于激活狀態&#…

網絡協議概念與應用層

1.概念 1.1 例子 點外賣 上述這個過程,就是自定義協議 自定義協議,具體的方式也是非常靈活的 2.幾種開發中更常見的格式 2.1xml 上古時期的組織數據的格式 通過標簽來組織數據 xml的優勢:讓數據的可讀性變得更好了 劣勢:標簽寫起來繁瑣,傳輸的時候也占用更多網絡帶寬 2.2…

pytorch學習—7.處理多維特征的輸入

2. 線性模型 3.梯度下降算法 4.反向傳播(用pytorch算梯度) 5.用pytorch實現線性回歸 6.logistic回歸 7.處理多維特征的輸入_嗶哩嗶哩_bilibili 7.1代碼復現: import numpy as np import torch import matplotlib.pyplot as plt# 1. 獲取數據集 xy_data = np.lo

AI助手“智普清言”《三元》(Python)詩解

文本邏輯解清晰&#xff0c;詩意對應技法輕。 筆記模板由python腳本于2025-07-01 06:54:55創建&#xff0c;本篇筆記適合喜歡python三元語句的coder翻閱。 學習的細節是歡悅的歷程 博客的核心價值&#xff1a;在于輸出思考與經驗&#xff0c;而不僅僅是知識的簡單復述。 Pytho…

本地RAG實戰:用Spring AI+Ollama+DeepSeek+ChromaDB增強文檔問答

本文手把手教你在本地部署RAG系統&#xff1a; 用 Spring AI 整合 Ollama&#xff08;運行DeepSeek中文模型&#xff09;ChromaDB 存儲本地文檔&#xff08;PDF/TXT&#xff09;向量Java程序實現&#xff1a;文檔解析 → 語義檢索 → 增強生成 最終效果&#xff1a;模型回答更準…

Python 數據分析:DataFrame,生成,用字典創建 DataFrame ,鍵值對數量不一樣怎么辦?

目錄 1 示例代碼2 歡迎糾錯3 論文寫作/Python 學習智能體------以下關于 Markdown 編輯器新的改變功能快捷鍵合理的創建標題&#xff0c;有助于目錄的生成如何改變文本的樣式插入鏈接與圖片如何插入一段漂亮的代碼片生成一個適合你的列表創建一個表格設定內容居中、居左、居右S…

Java 并發編程的 CAS(Compare and Swap)是什么?

CAS&#xff08;Compare and Swap&#xff0c;比較并交換&#xff09; 并非 Java 語言特有的概念&#xff0c;而是現代計算機硬件提供的一條核心原子指令。在 Java 并發編程中&#xff0c;它扮演著“幕后英雄”的角色&#xff0c;是構建高性能、無鎖并發工具&#xff08;如原子…

【UnityAssetBundle】AssetBundle打包

AssetBundle生成AB包資源文件方式&#xff1a; Unity編輯器開發&#xff0c;自定義打包工具&#xff1b;官方提供好的打包工具&#xff0c;Asset Bundle Browser 打包 選擇一個資源&#xff0c;new一個壓縮包名稱或選擇一個壓縮包名稱 點擊Window->AssetBundle Browser&…

Hush Puppies大中華區鞋類業務移交品牌方繼續經營

據悉&#xff0c;隨著百麗集團運營的暇步士&#xff08;Hush Puppies&#xff09;大中華區鞋類授權的到期&#xff0c;暇步士&#xff08;Hush Puppies&#xff09;鞋類業務已開始運營權移交。其中線上渠道授權于2025年6月30日正式到期&#xff0c;線下渠道將于2025年12月31日前…

解釋LLM怎么預測下一個詞語的

解釋LLM怎么預測下一個詞語的 通過上文詞的向量進行映射 在Transformer架構的大語言模型(如GPT系列、BERT等)中,詞語會先被轉化為詞向量。在預測下一個詞時,模型會基于之前所有詞的向量表示(并非僅僅上一個詞,但上一個詞的向量是重要信息來源之一)進行計算。 以GPT-2…

DAY 49 CBAM注意力

目錄 DAY 49 CBAM注意力1.通道注意力模塊復習2.空間注意力模塊3.CBAM的定義作業&#xff1a;嘗試對今天的模型檢查參數數目&#xff0c;并用tensorboard查看訓練過程 DAY 49 CBAM注意力 1.通道注意力模塊復習 2.空間注意力模塊 3.CBAM的定義 import torch import torch.nn …

【網絡】Linux 內核優化實戰 - net.ipv4.conf.all.rp_filter

目錄 net.ipv4.conf.all.rp_filter 參數詳解一、參數基本概念二、參數取值及含義三、反向路徑過濾的工作原理四、配置示例與注意事項五、與其他參數的關聯六、總結 net.ipv4.conf.all.rp_filter 參數詳解 一、參數基本概念 net.ipv4.conf.all.rp_filter 是 Linux 內核中用于控…