成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

介紹一種實用的RAG技術:父文檔檢索(PDR)

譯文 精選
人工智能
父文檔檢索(PDR)能夠使RAG更準確、細致地響應各種復雜的查詢。本文將利用LangChain和OpenAI向你展示其分步實施步驟。

譯者 | 陳峻

審校 | 重樓

作為一種能在先進的 RAG(Retrieval-Augmented Generation,檢索增強生成)模型中實現的方法,父文檔檢索(Parent Document Retrieval,PDR)旨在恢復那些可以從中提取到相關子段落(或片段)的完整父文檔。此類文檔通過將豐富的上下文,傳遞給 RAG 模型,以便對復雜或細微的問題,做出更全面且內涵豐富的回答。通常,在 RAG 模型中檢索出父文檔的主要步驟包括:

  • 數據預處理:將冗長的文檔分解為多個可管理的片段。
  • 創建嵌入:將片段轉換為數值向量,以實現高效的搜索。
  • 用戶查詢:讓用戶提交問題。
  • 塊檢索:模型檢索出那些與查詢嵌入最為相似的部分。
  • 查找父文檔:檢索原始文檔或從中獲取更大的片段。
  • 父文檔檢索:檢索完整的父文檔,為響應提供更為豐富的上下文。

循序漸進的實施

根據上圖,我們可以將實現父文檔檢索的步驟簡單分為如下四個不同的階段:

1. 準備數據

我們首先應為自己的 RAG 系統創建環境并預處理數據,以便對后續的父文檔開展文檔檢索。

(1)導入必要的模塊

我們將從已安裝的庫中導入所需的模塊,以設置我們的 PDR 系統:

Python

from langchain.schema import Document
from langchain.vectorstores import Chroma
from langchain.retrievers import ParentDocumentRetriever
from langchain.chains import RetrievalQA
from langchain_openai import OpenAI
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.storage import InMemoryStore
from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings

上述這些庫和模塊正是構成整個過程步驟的主要部分。

(2)設置 OpenAI API 密鑰

接著,我們使用 OpenAI LLM來生成響應,為此我們需要一個 OpenAI 的API 密鑰。該密鑰可被用來設置環境變量:OPENAI_API_KEY。

Python

OPENAI_API_KEY = os.environ["OPENAI_API_KEY"] = ""  # Add your OpenAI API key
if OPENAI_API_KEY == "":
raise ValueError("Please set the OPENAI_API_KEY environment variable")

(3)定義文本嵌入函數

通過如下方式,我們利用 OpenAI 的嵌入來表示文本數據:

Python

embeddings = OpenAIEmbeddings()

(4)加載文本數據

為了讀取想要檢索的文本文檔,你可以利用類TextLoader來讀取文本文件:

Python

loaders = [
    TextLoader('/path/to/your/document1.txt'),
    TextLoader('/path/to/your/document2.txt'),
]
docs = []
for l in loaders:
docs.extend(l.load())

2. 檢索完整的文檔

下面,我們將通過設置系統,來檢索與子段落相關的完整父文檔。

(1)完整文檔的拆分

我們使用RecursiveCharacterTextSplitter將加載的文檔分割成比所需大小更小的文本塊。這些子文檔將使我們能夠有效地搜索相關段落:

Python

child_splitter = RecursiveCharacterTextSplitter(chunk_size=400)

(2)矢量存儲和存儲設置

下面,我們將使用Chroma向量存儲來嵌入各個子文檔,并利用InMemoryStore來跟蹤與子文檔關聯的完整父文檔: 

Python

vectorstore = Chroma(
    collection_name="full_documents",
    embedding_function=OpenAIEmbeddings()
)
store = InMemoryStore()

(3)父文檔檢索器

接著,讓我們從類ParentDocumentRetriever中實例化一個對象。該類主要負責完整父文檔與基于子文檔相似性檢索相關的核心邏輯。

Python

full_doc_retriever = ParentDocumentRetriever(
    vectorstore=vectorstore,
    docstore=store,
    child_splitter=child_splitter
)

(4)添加文檔

然后,這些加載的文檔將使用add_documents方法被饋入ParentDocumentRetriever中,如下代碼所示:

Python

full_doc_retriever.add_documents(docs)
print(list(store.yield_keys()))  # List document IDs in the store

(5)相似性搜索和檢索

至此,檢索器已基本實現,你可以在給定查詢的情況下,去檢索相關的子文檔,并獲取相關的完整父文檔:

Python

sub_docs = vectorstore.similarity_search("What is LangSmith?", k=2)
print(len(sub_docs))
print(sub_docs[0].page_content)  
retrieved_docs = full_doc_retriever.invoke("What is LangSmith?")
print(len(retrieved_docs[0].page_content)) 
print(retrieved_docs[0].page_content)

3. 檢索更大的數據塊

有時,在文檔非常大的情況下,我們可能無法獲取完整的父文檔。對此,可參考如下從父文檔獲取較大片段的方法:

塊和父級文本分割:

  • 使用RecursiveCharacterTextSplitter的兩個實例,其中一個用于創建特定大小的較大父文檔。另一個具有較小的塊大小,可用于創建文本片段,即父文檔中的子文檔。

矢量存儲和存儲設置(類似完整的文檔檢索):

  • 創建一個向量存儲Chroma,用于索引子文檔的嵌入。
  • 使用InMemoryStore保存父文檔的塊。

(1)父文檔檢索器

該檢索器可解決 RAG 中的一個基本問題:由于被檢索的整個文檔過大,而無法包含足夠的上下文。為此,RAG需將文檔切成小塊進行檢索,進而對這些小塊進行索引。不過,在查詢之后,它不會去檢索這些文檔片段,而是檢索整個父文檔,從而為后續的生成提供更為豐富的上下文。

Python

parent_splitter = RecursiveCharacterTextSplitter(chunk_size=2000)  
child_splitter = RecursiveCharacterTextSplitter(chunk_size=400)   
vectorstore = Chroma(
    collection_name="split_parents",
    embedding_function=OpenAIEmbeddings()
)
store = InMemoryStore()
big_chunks_retriever = ParentDocumentRetriever(
    vectorstore=vectorstore,
    docstore=store,
    child_splitter=child_splitter,
    parent_splitter=parent_splitter
)
# Adding documents
big_chunks_retriever.add_documents(docs)
print(len(list(store.yield_keys())))  # List document IDs in the store

(2)相似性搜索和檢索

該過程仍然與完整的文檔檢索類似,我們需要查找相關的子文檔,然后從父文檔中獲取相應的更大文檔塊。

Python

sub_docs = vectorstore.similarity_search("What is LangSmith?", k=2)
print(len(sub_docs))
print(sub_docs[0].page_content)  
retrieved_docs = big_chunks_retriever.invoke("What is LangSmith?")
print(len(retrieved_docs))
print(len(retrieved_docs[0].page_content)) 
print(retrieved_docs[0].page_content)

4. 與 RetrievalQA 集成

至此,我們已經實現了一個父文檔檢索器,你可以將其與RetrievalQA鏈集成,以使用檢索到的父文檔進行各種問答:

Python

qa = RetrievalQA.from_chain_type(llm=OpenAI(),
                                chain_type="stuff",
                                retriever=big_chunks_retriever)
query = "What is LangSmith?"
response = qa.invoke(query)
print(response)

小結

綜上所述,PDR 大幅提高了 RAG 模型輸出響應的準確性,而且這些響應都帶有豐富的上下文。而通過對父文檔的全文檢索,我們可以深入準確地回答各種復雜問題,這也是復雜人工智能的基本要求。

譯者介紹

陳峻(Julian Chen),51CTO社區編輯,具有十多年的IT項目實施經驗,善于對內外部資源與風險實施管控,專注傳播網絡與信息安全知識與經驗。

原文標題:Parent Document Retrieval (PDR): Useful Technique in RAG,作者:Intiaz Shaik

鏈接:https://dzone.com/articles/parent-document-retrieval-useful-technique-in-rag。

責任編輯:姜華 來源: 51CTO內容精選
相關推薦

2024-10-11 09:04:55

2009-11-27 09:25:50

Cisco路由器備份

2021-04-08 10:19:39

人工智能機器學習知識圖譜

2011-07-04 17:53:48

快速測試

2010-03-10 09:44:51

Linux啟動引導加密

2011-05-10 09:09:36

身份驗證HID Global

2019-12-31 14:21:00

數據挖掘關系網絡數據

2025-03-04 09:10:00

RAG大模型AI

2024-10-09 11:14:37

2011-01-24 15:52:07

2020-12-23 10:10:23

Pythonweb代碼

2022-06-22 09:44:41

Python文件代碼

2022-07-07 10:33:27

Python姿勢代碼

2020-12-09 10:15:34

Pythonweb代碼

2022-06-06 15:44:24

大數據數據分析思維模式

2023-09-12 14:46:24

人工智能自然語言

2022-06-20 14:03:11

區塊鏈可持續安全

2018-09-27 16:15:10

區塊鏈數據庫

2009-12-25 16:27:30

MODEM接入方式

2010-09-09 09:24:43

極客專屬人格技術狂人
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产视频1区 | 免费国产一区二区 | 一区二区在线免费观看视频 | 亚洲一区二区三区免费 | 美女爽到呻吟久久久久 | 美日韩中文字幕 | 老司机精品福利视频 | 成人a网| 久久久精彩视频 | 99久久精品一区二区成人 | 99视频免费播放 | 欧美在线视频a | 奇米久久久 | 国产欧美精品区一区二区三区 | 一区二区视屏 | 精精国产xxxx视频在线野外 | 国产亚洲精品精品国产亚洲综合 | 中文字幕高清 | 国产精品毛片一区二区在线看 | 神马久久久久久久久久 | 欧美日韩在线一区二区 | 69亚洲精品 | 99re国产精品| 日韩视频在线免费观看 | 中文字幕精品一区 | 激情婷婷| 日本一区二区三区精品视频 | 波波电影院一区二区三区 | 久久综合伊人 | 亚洲精品免费在线 | 国产精品久久久久久久久动漫 | 欧美又大粗又爽又黄大片视频 | 午夜国产羞羞视频免费网站 | 久久久久久国产精品免费免费狐狸 | 成人精品高清 | 日韩一区二区三区精品 | 中文在线一区二区 | 成人免费大片黄在线播放 | 国产美女免费视频 | 伊人久久综合 | 精品国产乱码久久久久久闺蜜 |