首頁 > 科技週邊 > 人工智慧 > 3種朗鏈獵犬的先進策略

3種朗鏈獵犬的先進策略

Jennifer Aniston
發布: 2025-03-19 11:16:09
原創
313 人瀏覽過

LangChain檢索器:高效靈活地訪問文檔

LangChain框架中的檢索器扮演著至關重要的角色,它提供了一個靈活的接口,用於根據非結構化查詢返回文檔。與向量數據庫不同,檢索器無需存儲文檔;其主要功能是從大量數據中檢索相關信息。雖然向量數據庫可以作為檢索器的基礎,但存在各種類型的檢索器,每種都針對特定用例進行了定制。

3 Advanced Strategies for Retrievers in LangChain

學習目標

  • 了解檢索器在LangChain中的關鍵作用,實現高效靈活的文檔檢索,以滿足各種應用需求。
  • 學習LangChain的檢索器(從向量數據庫到多查詢和上下文壓縮)如何簡化對相關信息的訪問。
  • 本指南涵蓋LangChain中的各種檢索器類型,並說明每種檢索器如何定制以優化查詢處理和數據訪問。
  • 深入研究LangChain的檢索器功能,檢查用於增強文檔檢索精度和相關性的工具。
  • 了解LangChain的自定義檢索器如何適應特定需求,使開發人員能夠創建高度響應的應用程序。
  • 探索LangChain的檢索技術,這些技術集成了語言模型和向量數據庫,以獲得更準確、更高效的搜索結果。

目錄

  • 學習目標
  • LangChain中的檢索器
  • 使用向量數據庫作為檢索器
  • 使用MultiQueryRetriever
    • 構建示例向量數據庫
    • 簡單用法
    • 自定義提示
  • 如何使用上下文壓縮進行檢索
    • 上下文壓縮概述
  • 創建自定義檢索器
    • 接口
    • 示例
  • 結論
  • 常見問題

LangChain中的檢索器

檢索器接收字符串查詢作為輸入,並輸出一個Document對象的列表。此機制允許應用程序高效地獲取相關信息,從而實現與大型數據集或知識庫的高級交互。

  1. 使用向量數據庫作為檢索器

向量數據庫檢索器通過利用向量表示來高效地檢索文檔。它充當向量存儲類的輕量級包裝器,符合檢索器接口並使用諸如相似性搜索和最大邊際相關性(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})
登入後複製

輸出:

3 Advanced Strategies for Retrievers in LangChain

使用向量數據庫作為檢索器可以通過確保高效訪問相關信息來增強文檔檢索。

  1. 使用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) # 檢索到的唯一文檔數量
登入後複製

輸出:

3 Advanced Strategies for Retrievers in LangChain

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) # 檢索到的唯一文檔數量
登入後複製

輸出

3 Advanced Strategies for Retrievers in LangChain

使用MultiQueryRetriever可以實現更有效的檢索過程,確保基於用戶查詢獲得多樣化和全面的結果。

  1. 如何使用上下文壓縮進行檢索

從大型文檔集合中檢索相關信息可能具有挑戰性,尤其是在數據攝取時不知道用戶將提出的特定查詢時。通常,有價值的見解隱藏在冗長的文檔中,導致對語言模型(LLM) 的調用效率低下且成本高昂,同時提供的響應不如理想。上下文壓縮通過改進檢索過程來解決此問題,確保僅根據用戶的查詢返回相關信息。此壓縮包括減少單個文檔的內容和過濾掉不相關的文檔。

上下文壓縮概述

上下文壓縮檢索器通過將基本檢索器與文檔壓縮器集成來運行。此方法不會完整返回文檔,而是根據查詢提供的上下文壓縮文檔。此壓縮包括減少單個文檔的內容和過濾掉不相關的文檔。

實現步驟

  1. 初始化基本檢索器:首先設置一個普通的向量存儲檢索器。例如,考慮一篇關於氣候變化政策的新聞文章:
 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()
登入後複製
  1. 執行初始查詢:執行查詢以查看基本檢索器返回的結果,其中可能包括相關信息和不相關信息。
 docs = retriever.invoke("What actions are being proposed to combat climate change?")
登入後複製
  1. 使用上下文壓縮增強檢索:使用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)
登入後複製

輸出

3 Advanced Strategies for Retrievers in LangChain

此實現提供了一種基於用戶輸入檢索文檔的簡單方法,說明了LangChain中自定義檢索器的核心功能。

結論

在LangChain框架中,檢索器是強大的工具,可以有效地訪問各種文檔類型和用例中的相關信息。通過理解和實現不同的檢索器類型(例如向量存儲檢索器、MultiQueryRetriever和上下文壓縮檢索器),開發人員可以根據其應用程序的特定需求定製文檔檢索。

每種檢索器類型都具有獨特的優勢,從使用MultiQueryRetriever處理複雜查詢到使用上下文壓縮優化響應。此外,創建自定義檢索器可以提供更大的靈活性,以適應內置選項可能無法滿足的特殊要求。掌握這些檢索技術使開發人員能夠構建更有效且更具響應性的應用程序,從而充分利用語言模型和大型數據集的潛力。

常見問題

Q1. LangChain中檢索器的主要作用是什麼? A1. 檢索器的主要作用是根據查詢獲取相關文檔。這有助於應用程序有效地訪問大型數據集中的必要信息,而無需自行存儲文檔。

Q2. 檢索器與向量數據庫有何不同? A2. 向量數據庫用於以允許基於相似性的檢索的方式存儲文檔,而檢索器是用於根據查詢檢索文檔的接口。儘管向量數據庫可以是檢索器的一部分,但檢索器的任務側重於獲取相關信息。

Q3. 什麼是MultiQueryRetriever,它是如何工作的? A3. MultiQueryRetriever通過使用語言模型創建查詢的多個變體來改進搜索結果。此方法捕獲可能與不同措辭的問題相關的更廣泛的文檔範圍,從而增強檢索信息的豐富性。

Q4. 為什麼上下文壓縮很重要? A4. 上下文壓縮通過將文檔內容減少到僅相關部分並過濾掉不相關信息來優化檢索結果。這在大型集合中尤其有用,因為完整文檔可能包含無關的細節,從而節省資源並提供更集中的響應。

Q5. 設置MultiQueryRetriever的要求是什麼? A5. 要設置MultiQueryRetriever,您需要一個用於文檔存儲的向量數據庫、一個用於生成多個查詢視角的語言模型(LLM),以及可選的自定義提示模板以進一步優化查詢生成。

以上是3種朗鏈獵犬的先進策略的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板