LangChain檢索器:高效靈活地訪問文檔
LangChain框架中的檢索器扮演著至關重要的角色,它提供了一個靈活的接口,用於根據非結構化查詢返回文檔。與向量數據庫不同,檢索器無需存儲文檔;其主要功能是從大量數據中檢索相關信息。雖然向量數據庫可以作為檢索器的基礎,但存在各種類型的檢索器,每種都針對特定用例進行了定制。
學習目標
目錄
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通過解決常見限制(例如查詢措辭的變化和次優嵌入)來增強基於距離的向量數據庫檢索。使用大型語言模型(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?")
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中文網其他相關文章!