高效信息檢索新方法:LangChain中Retriever的多種高級(jí)策略 原創(chuàng)
在當(dāng)今的信息時(shí)代,如何高效檢索信息變得至關(guān)重要,尤其是在面對(duì)海量數(shù)據(jù)時(shí)。LangChain作為一個(gè)強(qiáng)大的工具集,通過(guò)不同類型的Retriever為用戶提供高效的信息檢索解決方案。本文將為大家介紹在LangChain中如何運(yùn)用三種先進(jìn)的Retriever策略,包括向量存儲(chǔ)檢索器(Vector Store Retriever)、多查詢檢索器(MultiQueryRetriever)、以及上下文壓縮檢索器(Contextual Compression Retriever)。無(wú)論是快速獲取相關(guān)文檔,還是針對(duì)特定上下文的精準(zhǔn)信息提取,這些Retriever都能極大提升LLM(大型語(yǔ)言模型)的實(shí)用性和用戶體驗(yàn)。
01、向量存儲(chǔ)檢索器:高效檢索的核心技術(shù)
向量存儲(chǔ)檢索器是一種通過(guò)向量表示來(lái)實(shí)現(xiàn)文檔檢索的技術(shù),它能夠?qū)⒉樵冝D(zhuǎn)換為向量,與文檔庫(kù)中的向量進(jìn)行比對(duì),從而找到最相關(guān)的內(nèi)容。通過(guò)向量存儲(chǔ)的方式,Retriever可以非常高效地從大量文檔中找到符合查詢條件的內(nèi)容。
使用向量存儲(chǔ)作為Retriever
在LangChain中,創(chuàng)建向量存儲(chǔ)檢索器非常簡(jiǎn)單,以下是具體步驟:
- 數(shù)據(jù)加載:我們從CSV文件中加載客戶評(píng)論,并進(jìn)行文本分割。
- 創(chuàng)建向量存儲(chǔ):使用向量化工具(如Pinecone)對(duì)文本進(jìn)行向量化。
- 創(chuàng)建Retriever:將向量存儲(chǔ)配置為Retriever,可以進(jìn)行相似度搜索或設(shè)置特定參數(shù)。
示例代碼:
from langchain_community.document_loaders import CSVLoader
from langchain_community.vectorstores import Pinecone
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
# 加載數(shù)據(jù)
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
retriever = vectorstore.as_retriever()
使用此Retriever可以方便地執(zhí)行查詢,比如想要了解“用戶對(duì)電池續(xù)航的評(píng)價(jià)”,代碼如下:
docs = retriever.invoke("What do customers think about the battery life?")
通過(guò)設(shè)置不同的檢索參數(shù),比如相似度得分閾值或結(jié)果數(shù)量(top-k),可以進(jìn)一步優(yōu)化檢索效果。
02、多查詢檢索器:多視角的精準(zhǔn)檢索
多查詢檢索器(MultiQueryRetriever)是一種增強(qiáng)的向量數(shù)據(jù)庫(kù)檢索技術(shù)。通過(guò)自動(dòng)化的提示調(diào)整,結(jié)合大型語(yǔ)言模型(LLM)生成多種視角的查詢,可以覆蓋不同的查詢表達(dá)方式,從而獲得更全面的檢索結(jié)果。它適用于用戶輸入模糊或存在多種解讀可能的情況。
構(gòu)建多查詢檢索器的示例
以下代碼展示了如何使用多查詢檢索器來(lái)檢索“客戶在智能手機(jī)上最看重的特性”:
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain_openai import ChatOpenAI
# 創(chuàng)建查詢
question = "What features do customers value in smartphones?"
llm = ChatOpenAI(temperature=0)
# 初始化MultiQueryRetriever
retriever_from_llm = MultiQueryRetriever.from_llm(
retriever=vectordb.as_retriever(), llm=llm
)
unique_docs = retriever_from_llm.invoke(question)
通過(guò)這種方法,多查詢檢索器生成了多個(gè)不同角度的查詢,以增加檢索的多樣性和相關(guān)性。這一策略尤其適用于復(fù)雜或多意圖的查詢,確保返回結(jié)果更全面。
自定義查詢提示
用戶還可以為多查詢檢索器自定義查詢提示,以更好地滿足特定應(yīng)用需求。例如,我們可以使用PromptTemplate創(chuàng)建自定義查詢模板:
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain_openai import ChatOpenAI
# 創(chuàng)建查詢
question = "What features do customers value in smartphones?"
llm = ChatOpenAI(temperature=0)
# 初始化MultiQueryRetriever
retriever_from_llm = MultiQueryRetriever.from_llm(
retriever=vectordb.as_retriever(), llm=llm
)
unique_docs = retriever_from_llm.invoke(question)
通過(guò)這種方式,多查詢檢索器在滿足用戶的查詢需求的同時(shí),還能根據(jù)不同的需求進(jìn)行自定義調(diào)整。
03、上下文壓縮檢索器:優(yōu)化信息的精確提取
在大型文檔中檢索有用信息時(shí),常常會(huì)遇到冗長(zhǎng)且不相關(guān)的信息。上下文壓縮檢索器(Contextual Compression Retriever)能夠通過(guò)上下文壓縮技術(shù),將檢索結(jié)果優(yōu)化為用戶真正需要的內(nèi)容,從而避免浪費(fèi)資源。
上下文壓縮的工作原理
上下文壓縮檢索器結(jié)合了基礎(chǔ)檢索器和文檔壓縮器,通過(guò)提取與查詢相關(guān)的內(nèi)容來(lái)壓縮檢索結(jié)果。具體步驟如下:
- 基礎(chǔ)檢索:先使用基礎(chǔ)的向量存儲(chǔ)檢索器進(jìn)行初步查詢。
- 壓縮檢索:結(jié)合大型語(yǔ)言模型進(jìn)一步提取與查詢最相關(guān)的信息,過(guò)濾掉無(wú)關(guān)部分。
以下是一個(gè)使用上下文壓縮檢索器的示例:
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
from langchain_openai import OpenAI
# 初始化LLM和壓縮器
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?")
通過(guò)上下文壓縮檢索器,返回的內(nèi)容更加精確且切中要害。這一技術(shù)尤其適用于需要精準(zhǔn)回答的場(chǎng)景,如政策分析或新聞報(bào)道。
04、自定義檢索器:打造個(gè)性化的檢索工具
LangChain中還提供了靈活的接口,允許用戶根據(jù)自己的需求創(chuàng)建自定義檢索器。通過(guò)擴(kuò)展BaseRetriever類并實(shí)現(xiàn)核心方法,用戶可以定制符合自身應(yīng)用場(chǎng)景的檢索邏輯。以下是一個(gè)簡(jiǎn)單的示例,展示如何實(shí)現(xiàn)自定義檢索器:
from typing import List
from langchain_core.documents import Document
from langchain_core.retrievers import BaseRetriever
class CustomRetriever(BaseRetriever):
"""一個(gè)簡(jiǎn)單的檢索器,根據(jù)查詢返回包含關(guān)鍵字的文檔。"""
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 = CustomRetriever(documents=documents, k=1)
result = retriever.invoke("dog")
print(result[0].page_content) # Output: "Dogs are great companions."
這種自定義檢索器可以應(yīng)用于特定場(chǎng)景,比如公司內(nèi)部資料或特定主題的文檔搜索,滿足多樣化的應(yīng)用需求。
05、結(jié)論:靈活高效的信息檢索
在LangChain框架中,Retriever是實(shí)現(xiàn)高效信息檢索的核心組件。通過(guò)學(xué)習(xí)和運(yùn)用不同的Retriever類型——向量存儲(chǔ)檢索器、多查詢檢索器和上下文壓縮檢索器,開(kāi)發(fā)者可以根據(jù)不同的應(yīng)用場(chǎng)景選擇合適的工具,優(yōu)化信息檢索的準(zhǔn)確性和效率。此外,LangChain還提供了靈活的自定義功能,使得開(kāi)發(fā)者能夠基于特定需求構(gòu)建個(gè)性化的檢索器。
掌握這些Retriever策略,可以幫助開(kāi)發(fā)者在LLM應(yīng)用中更好地管理大數(shù)據(jù)集,提升用戶體驗(yàn),實(shí)現(xiàn)高效的知識(shí)訪問(wèn)和信息提取。無(wú)論是在客戶服務(wù)、教育還是金融等領(lǐng)域,這些技術(shù)都能為復(fù)雜應(yīng)用場(chǎng)景提供便捷、高效的信息解決方案。
參考:
本文轉(zhuǎn)載自公眾號(hào)Halo咯咯 作者:基咯咯
