LangChain檢索器:高效靈活地訪問文檔
LangChain框架中的檢索器扮演著至關重要的角色,它提供了一個靈活的接口,用於根據非結構化查詢返回文檔。與向量數據庫不同,檢索器無需存儲文檔;其主要功能是從大量數據中檢索相關信息。雖然向量數據庫可以作為檢索器的基礎,但存在各種類型的檢索器,每種都針對特定用例進行了定制。
學習目標
- 了解檢索器在LangChain中的關鍵作用,實現高效靈活的文檔檢索,以滿足各種應用需求。
- 學習LangChain的檢索器(從向量數據庫到多查詢和上下文壓縮)如何簡化對相關信息的訪問。
- 本指南涵蓋LangChain中的各種檢索器類型,並說明每種檢索器如何定制以優化查詢處理和數據訪問。
- 深入研究LangChain的檢索器功能,檢查用於增強文檔檢索精度和相關性的工具。
- 了解LangChain的自定義檢索器如何適應特定需求,使開發人員能夠創建高度響應的應用程序。
- 探索LangChain的檢索技術,這些技術集成了語言模型和向量數據庫,以獲得更準確、更高效的搜索結果。
目錄
- 學習目標
- LangChain中的檢索器
- 使用向量數據庫作為檢索器
- 使用MultiQueryRetriever
- 構建示例向量數據庫
- 簡單用法
- 自定義提示
- 如何使用上下文壓縮進行檢索
- 上下文壓縮概述
- 創建自定義檢索器
- 接口
- 示例
- 結論
- 常見問題
LangChain中的檢索器
檢索器接收字符串查詢作為輸入,並輸出一個Document對象的列表。此機制允許應用程序高效地獲取相關信息,從而實現與大型數據集或知識庫的高級交互。
- 使用向量數據庫作為檢索器
向量數據庫檢索器通過利用向量表示來高效地檢索文檔。它充當向量存儲類的輕量級包裝器,符合檢索器接口並使用諸如相似性搜索和最大邊際相關性(MMR) 等方法。
要從向量數據庫創建檢索器,請使用.as_retriever
方法。例如,對於基於客戶評論的Pinecone向量數據庫,我們可以按如下方式進行設置:
from langchain_community.document_loaders import CSVLoader from langchain_community.vectorstores import Pinecone from langchain_openai import OpenAIEmbeddings from langchain_text_splitters import CharacterTextSplitter loader = CSVLoader("customer_reviews.csv") documents = loader.load() text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50) texts = text_splitter.split_documents(documents) embeddings = OpenAIEmbeddings() vectorstore = Pinecone.from_documents(texts, embeddings) retriever = vectorstore.as_retriever()
我們現在可以使用此檢索器查詢相關的評論:
docs = retriever.invoke("What do customers think about the battery life?")
默認情況下,檢索器使用相似性搜索,但我們可以將MMR指定為搜索類型:
retriever = vectorstore.as_retriever(search_type="mmr")
此外,我們可以傳遞諸如相似度分數閾值之類的參數,或使用top-k限制結果數量:
retriever = vectorstore.as_retriever(search_kwargs={"k": 2, "score_threshold": 0.6})
輸出:
使用向量數據庫作為檢索器可以通過確保高效訪問相關信息來增強文檔檢索。
- 使用MultiQueryRetriever
MultiQueryRetriever通過解決常見限制(例如查詢措辭的變化和次優嵌入)來增強基於距離的向量數據庫檢索。使用大型語言模型(LLM) 自動化提示調整,可以從不同角度為給定的用戶輸入生成多個查詢。此過程允許為每個查詢檢索相關文檔,並將結果組合起來以產生更豐富的潛在文檔集。
構建示例向量數據庫
為了演示MultiQueryRetriever,讓我們使用來自CSV文件的商品描述創建一個向量存儲:
from langchain_community.document_loaders import CSVLoader from langchain_community.vectorstores import FAISS from langchain_openai import OpenAIEmbeddings from langchain_text_splitters import CharacterTextSplitter # 加載產品描述loader = CSVLoader("product_descriptions.csv") data = loader.load() # 將文本分割成塊text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=50) documents = text_splitter.split_documents(data) # 創建向量存儲embeddings = OpenAIEmbeddings() vectordb = FAISS.from_documents(documents, embeddings)
簡單用法
要使用MultiQueryRetriever,請指定用於查詢生成的LLM:
from langchain.retrievers.multi_query import MultiQueryRetriever from langchain_openai import ChatOpenAI question = "What features do customers value in smartphones?" llm = ChatOpenAI(temperature=0) retriever_from_llm = MultiQueryRetriever.from_llm( retriever=vectordb.as_retriever(), llm=llm ) unique_docs = retriever_from_llm.invoke(question) len(unique_docs) # 檢索到的唯一文檔數量
輸出:
MultiQueryRetriever生成多個查詢,增強了檢索到的文檔的多樣性和相關性。
自定義提示
要調整生成的查詢,您可以創建一個自定義PromptTemplate和一個輸出解析器:
from langchain_core.output_parsers import BaseOutputParser from langchain_core.prompts import PromptTemplate from typing import List # 自定義輸出解析器class LineListOutputParser(BaseOutputParser[List[str]]): def parse(self, text: str) -> List[str]: return list(filter(None, text.strip().split("\n"))) output_parser = LineListOutputParser() # 用於查詢生成的自定義提示QUERY_PROMPT = PromptTemplate( input_variables=["question"], template="""Generate five different versions of the question: {question}""" ) llm_chain = QUERY_PROMPT | llm | output_parser # 初始化檢索器retriever = MultiQueryRetriever( retriever=vectordb.as_retriever(), llm_chain=llm_chain, parser_key="lines" ) unique_docs = retriever.invoke("What features do customers value in smartphones?") len(unique_docs) # 檢索到的唯一文檔數量
輸出
使用MultiQueryRetriever可以實現更有效的檢索過程,確保基於用戶查詢獲得多樣化和全面的結果。
- 如何使用上下文壓縮進行檢索
從大型文檔集合中檢索相關信息可能具有挑戰性,尤其是在數據攝取時不知道用戶將提出的特定查詢時。通常,有價值的見解隱藏在冗長的文檔中,導致對語言模型(LLM) 的調用效率低下且成本高昂,同時提供的響應不如理想。上下文壓縮通過改進檢索過程來解決此問題,確保僅根據用戶的查詢返回相關信息。此壓縮包括減少單個文檔的內容和過濾掉不相關的文檔。
上下文壓縮概述
上下文壓縮檢索器通過將基本檢索器與文檔壓縮器集成來運行。此方法不會完整返回文檔,而是根據查詢提供的上下文壓縮文檔。此壓縮包括減少單個文檔的內容和過濾掉不相關的文檔。
實現步驟
- 初始化基本檢索器:首先設置一個普通的向量存儲檢索器。例如,考慮一篇關於氣候變化政策的新聞文章:
from langchain_community.document_loaders import TextLoader from langchain_community.vectorstores import FAISS from langchain_openai import OpenAIEmbeddings from langchain_text_splitters import CharacterTextSplitter # 加載並分割文章documents = TextLoader("climate_change_policy.txt").load() text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0) texts = text_splitter.split_documents(documents) # 初始化向量存儲檢索器retriever = FAISS.from_documents(texts, OpenAIEmbeddings()).as_retriever()
- 執行初始查詢:執行查詢以查看基本檢索器返回的結果,其中可能包括相關信息和不相關信息。
docs = retriever.invoke("What actions are being proposed to combat climate change?")
- 使用上下文壓縮增強檢索:使用ContextualCompressionRetriever包裝基本檢索器,使用LLMChainExtractor提取相關內容:
from langchain.retrievers import ContextualCompressionRetriever from langchain.retrievers.document_compressors import LLMChainExtractor from langchain_openai import OpenAI llm = OpenAI(temperature=0) compressor = LLMChainExtractor.from_llm(llm) compression_retriever = ContextualCompressionRetriever( base_compressor=compressor, base_retriever=retriever ) # 執行壓縮檢索compressed_docs = compression_retriever.invoke("What actions are being proposed to combat climate change?")
查看壓縮結果: ContextualCompressionRetriever處理初始文檔並僅提取與查詢相關的相關信息,從而優化響應。
創建自定義檢索器
檢索器在許多LLM應用程序中都是必不可少的。它的任務是根據用戶查詢獲取相關文檔。這些文檔被格式化為LLM的提示,使其能夠生成適當的響應。
接口
要創建自定義檢索器,請擴展BaseRetriever類並實現以下方法:
方法 | 描述 | 必需/可選 |
---|---|---|
_get_relevant_documents |
檢索與查詢相關的文檔。 | 必需 |
_aget_relevant_documents |
異步實現,用於原生支持。 | 可選 |
繼承自BaseRetriever會為您的檢索器提供標準的Runnable功能。
示例
這是一個簡單檢索器的示例:
from typing import List from langchain_core.documents import Document from langchain_core.retrievers import BaseRetriever class ToyRetriever(BaseRetriever): """一個簡單的檢索器,它返回包含用戶查詢的前k個文檔。""" documents: List[Document] k: int def _get_relevant_documents(self, query: str) -> List[Document]: matching_documents = [doc for doc in self.documents if query.lower() in doc.page_content.lower()] return matching_documents[:self.k] # 示例用法documents = [ Document("Dogs are great companions.", {"type": "dog"}), Document("Cats are independent pets.", {"type": "cat"}), ] retriever = ToyRetriever(documents=documents, k=1) result = retriever.invoke("dog") print(result[0].page_content)
輸出
此實現提供了一種基於用戶輸入檢索文檔的簡單方法,說明了LangChain中自定義檢索器的核心功能。
結論
在LangChain框架中,檢索器是強大的工具,可以有效地訪問各種文檔類型和用例中的相關信息。通過理解和實現不同的檢索器類型(例如向量存儲檢索器、MultiQueryRetriever和上下文壓縮檢索器),開發人員可以根據其應用程序的特定需求定製文檔檢索。
每種檢索器類型都具有獨特的優勢,從使用MultiQueryRetriever處理複雜查詢到使用上下文壓縮優化響應。此外,創建自定義檢索器可以提供更大的靈活性,以適應內置選項可能無法滿足的特殊要求。掌握這些檢索技術使開發人員能夠構建更有效且更具響應性的應用程序,從而充分利用語言模型和大型數據集的潛力。
常見問題
Q1. LangChain中檢索器的主要作用是什麼? A1. 檢索器的主要作用是根據查詢獲取相關文檔。這有助於應用程序有效地訪問大型數據集中的必要信息,而無需自行存儲文檔。
Q2. 檢索器與向量數據庫有何不同? A2. 向量數據庫用於以允許基於相似性的檢索的方式存儲文檔,而檢索器是用於根據查詢檢索文檔的接口。儘管向量數據庫可以是檢索器的一部分,但檢索器的任務側重於獲取相關信息。
Q3. 什麼是MultiQueryRetriever,它是如何工作的? A3. MultiQueryRetriever通過使用語言模型創建查詢的多個變體來改進搜索結果。此方法捕獲可能與不同措辭的問題相關的更廣泛的文檔範圍,從而增強檢索信息的豐富性。
Q4. 為什麼上下文壓縮很重要? A4. 上下文壓縮通過將文檔內容減少到僅相關部分並過濾掉不相關信息來優化檢索結果。這在大型集合中尤其有用,因為完整文檔可能包含無關的細節,從而節省資源並提供更集中的響應。
Q5. 設置MultiQueryRetriever的要求是什麼? A5. 要設置MultiQueryRetriever,您需要一個用於文檔存儲的向量數據庫、一個用於生成多個查詢視角的語言模型(LLM),以及可選的自定義提示模板以進一步優化查詢生成。
以上是3種朗鏈獵犬的先進策略的詳細內容。更多資訊請關注PHP中文網其他相關文章!

利用“設備” AI的力量:建立個人聊天機器人CLI 在最近的過去,個人AI助手的概念似乎是科幻小說。 想像一下科技愛好者亞歷克斯(Alex)夢見一個聰明的本地AI同伴 - 不依賴

他們的首屆AI4MH發射於2025年4月15日舉行,著名的精神科醫生兼神經科學家湯姆·因斯爾(Tom Insel)博士曾擔任開幕式演講者。 Insel博士因其在心理健康研究和技術方面的傑出工作而聞名

恩格伯特說:“我們要確保WNBA仍然是每個人,球員,粉絲和公司合作夥伴,感到安全,重視和授權的空間。” anno

介紹 Python擅長使用編程語言,尤其是在數據科學和生成AI中。 在處理大型數據集時,有效的數據操作(存儲,管理和訪問)至關重要。 我們以前涵蓋了數字和ST

潛水之前,一個重要的警告:AI性能是非確定性的,並且特定於高度用法。簡而言之,您的里程可能會有所不同。不要將此文章(或任何其他)文章作為最後一句話 - 目的是在您自己的情況下測試這些模型

建立杰出的AI/ML投資組合:初學者和專業人士指南 創建引人注目的投資組合對於確保在人工智能(AI)和機器學習(ML)中的角色至關重要。 本指南為建立投資組合提供了建議

結果?倦怠,效率低下以及檢測和作用之間的差距擴大。這一切都不應該令任何從事網絡安全工作的人感到震驚。 不過,代理AI的承諾已成為一個潛在的轉折點。這個新課

直接影響與長期夥伴關係? 兩週前,Openai提出了強大的短期優惠,在2025年5月底之前授予美國和加拿大大學生免費訪問Chatgpt Plus。此工具包括GPT-4O,A A A A A


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3漢化版
中文版,非常好用

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)