目錄
構建示例向量數據庫
簡單用法
自定義提示
上下文壓縮概述
實現步驟
創建自定義檢索器
接口
示例
結論
常見問題
首頁 科技週邊 人工智慧 3種朗鏈獵犬的先進策略

3種朗鏈獵犬的先進策略

Mar 19, 2025 am 11:16 AM

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1657
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1229
24
開始使用Meta Llama 3.2 -Analytics Vidhya 開始使用Meta Llama 3.2 -Analytics Vidhya Apr 11, 2025 pm 12:04 PM

Meta的Llama 3.2:多模式和移動AI的飛躍 Meta最近公佈了Llama 3.2,這是AI的重大進步,具有強大的視覺功能和針對移動設備優化的輕量級文本模型。 以成功為基礎

10個生成AI編碼擴展,在VS代碼中,您必須探索 10個生成AI編碼擴展,在VS代碼中,您必須探索 Apr 13, 2025 am 01:14 AM

嘿,編碼忍者!您當天計劃哪些與編碼有關的任務?在您進一步研究此博客之前,我希望您考慮所有與編碼相關的困境,這是將其列出的。 完畢? - 讓&#8217

AV字節:Meta' llama 3.2,Google的雙子座1.5等 AV字節:Meta' llama 3.2,Google的雙子座1.5等 Apr 11, 2025 pm 12:01 PM

本週的AI景觀:進步,道德考慮和監管辯論的旋風。 OpenAI,Google,Meta和Microsoft等主要參與者已經釋放了一系列更新,從開創性的新車型到LE的關鍵轉變

向員工出售AI策略:Shopify首席執行官的宣言 向員工出售AI策略:Shopify首席執行官的宣言 Apr 10, 2025 am 11:19 AM

Shopify首席執行官TobiLütke最近的備忘錄大膽地宣布AI對每位員工的基本期望是公司內部的重大文化轉變。 這不是短暫的趨勢。這是整合到P中的新操作範式

視覺語言模型(VLMS)的綜合指南 視覺語言模型(VLMS)的綜合指南 Apr 12, 2025 am 11:58 AM

介紹 想像一下,穿過​​美術館,周圍是生動的繪畫和雕塑。現在,如果您可以向每一部分提出一個問題並獲得有意義的答案,該怎麼辦?您可能會問:“您在講什麼故事?

GPT-4O vs OpenAI O1:新的Openai模型值得炒作嗎? GPT-4O vs OpenAI O1:新的Openai模型值得炒作嗎? Apr 13, 2025 am 10:18 AM

介紹 Openai已根據備受期待的“草莓”建築發布了其新模型。這種稱為O1的創新模型增強了推理能力,使其可以通過問題進行思考

如何在SQL中添加列? - 分析Vidhya 如何在SQL中添加列? - 分析Vidhya Apr 17, 2025 am 11:43 AM

SQL的Alter表語句:動態地將列添加到數據庫 在數據管理中,SQL的適應性至關重要。 需要即時調整數據庫結構嗎? Alter表語句是您的解決方案。本指南的詳細信息添加了Colu

最新的最佳及時工程技術的年度彙編 最新的最佳及時工程技術的年度彙編 Apr 10, 2025 am 11:22 AM

對於那些可能是我專欄新手的人,我廣泛探討了AI的最新進展,包括體現AI,AI推理,AI中的高科技突破,及時的工程,AI培訓,AI,AI RE RE等主題

See all articles