3种朗链猎犬的先进策略
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工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

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

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Meta的Llama 3.2:多模式和移动AI的飞跃 Meta最近公布了Llama 3.2,这是AI的重大进步,具有强大的视觉功能和针对移动设备优化的轻量级文本模型。 以成功为基础

嘿,编码忍者!您当天计划哪些与编码有关的任务?在您进一步研究此博客之前,我希望您考虑所有与编码相关的困境,这是将其列出的。 完毕? - 让&#8217

本周的AI景观:进步,道德考虑和监管辩论的旋风。 OpenAI,Google,Meta和Microsoft等主要参与者已经释放了一系列更新,从开创性的新车型到LE的关键转变

Shopify首席执行官TobiLütke最近的备忘录大胆地宣布AI对每位员工的基本期望是公司内部的重大文化转变。 这不是短暂的趋势。这是整合到P中的新操作范式

介绍 想象一下,穿过美术馆,周围是生动的绘画和雕塑。现在,如果您可以向每一部分提出一个问题并获得有意义的答案,该怎么办?您可能会问:“您在讲什么故事?

介绍 Openai已根据备受期待的“草莓”建筑发布了其新模型。这种称为O1的创新模型增强了推理能力,使其可以通过问题进行思考

SQL的Alter表语句:动态地将列添加到数据库 在数据管理中,SQL的适应性至关重要。 需要即时调整数据库结构吗? Alter表语句是您的解决方案。本指南的详细信息添加了Colu

对于那些可能是我专栏新手的人,我广泛探讨了AI的最新进展,包括体现AI,AI推理,AI中的高科技突破,及时的工程,AI培训,AI,AI RE RE等主题
