检索
此处回顾的一些概念利用模型生成查询(例如,针对 SQL 或图数据库)。这样做存在固有风险。请确保您的数据库连接权限范围尽可能狭窄,以满足您应用程序的需求。这将减轻(但不会消除)构建能够查询数据库的模型驱动系统的风险。有关通用安全最佳实践的更多信息,请参阅我们的安全指南。
概述
检索系统是许多 AI 应用程序的基础,能够高效地从大型数据集中识别相关信息。这些系统支持多种数据格式:
- 非结构化文本(例如文档)通常存储在向量存储或词汇搜索索引中。
- 结构化数据通常存储在具有预定义模式的关系型或图数据库中。
尽管数据格式日益多样化,现代 AI 应用程序仍越来越多地致力于通过自然语言界面使所有类型的数据可访问。模型在此过程中发挥着关键作用,它们将自然语言查询转换为与底层搜索索引或数据库兼容的格式。这种转换使得与复杂数据结构的交互更加直观和灵活。
关键概念
(1) 查询分析:模型转换或构建搜索查询以优化检索的过程。
(2) 信息检索:使用搜索查询从各种检索系统中获取信息。
查询分析
虽然用户通常更喜欢使用自然语言与检索系统交互,但这些系统可能需要特定的查询语法或受益于某些关键词。查询分析充当原始用户输入与优化搜索查询之间的桥梁。查询分析的一些常见应用包括:
- 查询重写:可以重写或扩展查询以改进语义或词汇搜索。
- 查询构建:搜索索引可能需要结构化查询(例如,数据库的 SQL)。
查询分析利用模型将原始用户输入转换为或构建为优化的搜索查询。
查询重写
检索系统理想情况下应处理广泛的用户输入,从简单、措辞不当的查询到复杂、多方面的问题。为了实现这种多功能性,一种流行的方法是使用模型将原始用户查询转换为更有效的搜索查询。这种转换可以从简单的关键词提取到复杂的查询扩展和重构。以下是在非结构化数据检索中使用模型进行查询分析的一些主要优点:
- 查询澄清:模型可以重新措辞模棱两可或措辞不当的查询,以提高清晰度。
- 语义理解:它们可以捕获查询背后的意图,超越字面关键词匹配。
- 查询扩展:模型可以生成相关术语或概念以扩大搜索范围。
- 复杂查询处理:它们可以将多部分问题分解为更简单的子查询。
已开发出多种技术来利用模型进行查询重写,包括:
名称 | 使用时机 | 描述 |
---|---|---|
多查询 | 当您希望通过提供问题的多种措辞来确保检索的高召回率时。 | 使用多种措辞重写用户问题,为每个重写的问题检索文档,并返回所有查询的唯一文档。 |
分解 | 当一个问题可以分解成更小的子问题时。 | 将问题分解为一组子问题/子查询,这些子问题/子查询可以按顺序解决(使用第一个答案+检索来回答第二个)或并行解决(将每个答案合并为最终答案)。 |
回溯 | 当需要更高层次的概念理解时。 | 首先提示大型语言模型(LLM)提出一个关于更高层次概念或原则的通用回溯问题,并检索相关事实。利用这些基础信息帮助回答用户问题。论文。 |
HyDE | 如果您在使用原始用户输入检索相关文档时遇到挑战。 | 使用大型语言模型(LLM)将问题转换为回答该问题的假设性文档。利用嵌入的假设性文档检索真实文档,前提是文档-文档相似性搜索可以产生更相关的匹配。论文。 |
例如,查询分解可以通过提示和强制输出子问题列表的结构化输出来简单实现。然后可以在下游检索系统上按顺序或并行运行这些子问题。
from typing import List
from pydantic import BaseModel, Field
from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage
# Define a pydantic model to enforce the output structure
class Questions(BaseModel):
questions: List[str] = Field(
description="A list of sub-questions related to the input query."
)
# Create an instance of the model and enforce the output structure
model = ChatOpenAI(model="gpt-4o", temperature=0)
structured_model = model.with_structured_output(Questions)
# Define the system prompt
system = """You are a helpful assistant that generates multiple sub-questions related to an input question. \n
The goal is to break down the input into a set of sub-problems / sub-questions that can be answered independently. \n"""
# Pass the question to the model
question = """What are the main components of an LLM-powered autonomous agent system?"""
questions = structured_model.invoke([SystemMessage(content=system)]+[HumanMessage(content=question)])
查询构建
查询分析还可以侧重于将自然语言查询转换为专门的查询语言或过滤器。这种转换对于有效与存储结构化或半结构化数据的各种类型数据库进行交互至关重要。
-
结构化数据示例:对于关系型和图数据库,使用领域特定语言(DSLs)来查询数据。
- 文本到 SQL:将自然语言转换为 SQL,用于关系型数据库。
- 文本到 Cypher:将自然语言转换为 Cypher,用于图数据库。
-
半结构化数据示例:对于向量存储,查询可以结合语义搜索和元数据过滤。
- 自然语言到元数据过滤器:将用户查询转换为合适的元数据过滤器。
这些方法利用模型来弥合用户意图与不同数据存储系统的特定查询要求之间的差距。以下是一些流行的技术:
名称 | 使用时机 | 描述 |
---|---|---|
自查询 | 如果用户提出的问题通过基于元数据而不是文本相似性来获取文档能更好地回答。 | 这使用大型语言模型(LLM)将用户输入转换为两部分内容:(1)用于语义查找的字符串,(2)随附的元数据过滤器。这很有用,因为问题往往是关于文档的元数据(而不是内容本身)。 |
文本到 SQL | 如果用户提出的问题需要关系型数据库中存储的信息,并且可以通过 SQL 访问。 | 这使用大型语言模型(LLM)将用户输入转换为 SQL 查询。 |
文本到 Cypher | 如果用户提出的问题需要图数据库中存储的信息,并且可以通过 Cypher 访问。 | 这使用大型语言模型(LLM)将用户输入转换为 Cypher 查询。 |
例如,以下是如何使用SelfQueryRetriever
将自然语言查询转换为元数据过滤器的方法。
metadata_field_info = schema_for_metadata
document_content_description = "Brief summary of a movie"
llm = ChatOpenAI(temperature=0)
retriever = SelfQueryRetriever.from_llm(
llm,
vectorstore,
document_content_description,
metadata_field_info,
)
- 请参阅我们关于文本到 SQL、文本到 Cypher 和元数据过滤器查询分析的教程。
- 请参阅我们的博客文章概述。
- 请参阅我们关于查询构建的 RAG 从零开始视频。
信息检索
常见检索系统
词汇搜索索引
许多搜索引擎都是基于将查询中的词语与每个文档中的词语进行匹配。这种方法被称为词汇检索,使用的搜索算法通常基于词频。其直觉很简单:如果一个词在用户查询和特定文档中都频繁出现,那么这个文档可能是一个很好的匹配。
实现此功能所用的特定数据结构通常是倒排索引。这类索引包含一个词语列表,以及每个词语到其在各个文档中出现位置列表的映射。利用这种数据结构,可以高效地将搜索查询中的词语与它们出现的文档进行匹配。BM25 和 TF-IDF 是两种流行的词汇搜索算法。
- 请参阅 BM25 检索器集成。
- 请参阅 Elasticsearch 检索器集成。
向量索引
向量索引是索引和存储非结构化数据的另一种方式。请参阅我们的向量存储概念指南以获取详细概述。
简而言之,向量存储不是使用词频,而是使用嵌入模型将文档压缩成高维向量表示。这允许使用余弦相似度等简单数学运算对嵌入向量进行高效的相似性搜索。
关系型数据库
关系型数据库是许多应用程序中使用的基本结构化数据存储类型。它们将数据组织成具有预定义模式的表,其中每个表代表一个实体或关系。数据以行(记录)和列(属性)的形式存储,允许通过 SQL(结构化查询语言)进行高效的查询和操作。关系型数据库擅长维护数据完整性、支持复杂查询以及处理不同数据实体之间的关系。
- 请参阅我们关于使用 SQL 数据库的教程。
- 请参阅我们的SQL 数据库工具包。
图数据库
图数据库是一种专门的数据库类型,旨在存储和管理高度互连的数据。与传统关系型数据库不同,图数据库使用由节点(实体)、边(关系)和属性组成的灵活结构。这种结构允许高效表示和查询复杂的互连数据。图数据库以图结构存储数据,包含节点、边和属性。它们对于存储和查询数据点之间复杂关系特别有用,例如社交网络、供应链管理、欺诈检测和推荐服务。
检索器
LangChain 通过检索器(retriever)概念提供了一个统一的接口,用于与各种检索系统交互。该接口简单明了:
- 输入:查询(字符串)
- 输出:文档列表(标准化的 LangChain Document 对象)
您可以使用前面提到的任何检索系统创建一个检索器。我们讨论的查询分析技术在这里特别有用,因为它们为通常需要结构化查询语言的数据库提供了自然语言接口。例如,您可以使用文本到 SQL 的转换来为 SQL 数据库构建一个检索器。这允许自然语言查询(字符串)在后台转换为 SQL 查询。无论底层检索系统是什么,LangChain 中的所有检索器都共享一个通用接口。您可以使用简单的invoke
方法来使用它们。
docs = retriever.invoke(query)
- 请参阅我们关于检索器(retrievers)的概念指南。
- 请参阅我们关于使用检索器的操作指南。