检索
这里回顾的一些概念利用模型来生成查询(例如,用于SQL或图数据库)。 这样做存在固有风险。 请确保您的数据库连接权限根据应用程序的需求尽可能狭窄地限定。 这将减轻风险,尽管不能完全消除构建一个能够查询数据库的模型驱动系统的风险。 有关通用安全最佳实践的更多信息,请参阅我们的 安全指南。
概览
检索系统是许多人工智能应用的基础,能够从大型数据集中高效地识别相关信息。 这些系统支持多种数据格式:
- 非结构化文本(例如文档)通常存储在向量存储或词汇搜索索引中。
- 结构化数据通常存储在具有定义模式的关系型数据库或图数据库中。
尽管数据格式日益多样化,现代人工智能应用越来越致力于通过自然语言接口使各类数据都可访问。 模型在这一过程中发挥着关键作用,它们将自然语言查询转化为与底层搜索索引或数据库兼容的格式。 这种转换使得与复杂数据结构的交互更加直观和灵活。
核心概念

(1) 查询分析: 一个模型将查询转换或构建为优化检索的过程。
(2) 信息检索: 搜索查询用于从各种检索系统中获取信息。
查询分析
虽然用户通常更倾向于使用自然语言与检索系统进行交互,但这些系统可能需要特定的查询语法,或从某些关键词中获益。 查询分析充当原始用户输入与优化搜索查询之间的桥梁。查询分析的一些常见应用包括:
- 查询重写: 查询可以被重写或扩展,以改善语义或词汇搜索。
- 查询构建: 搜索索引可能需要结构化查询(例如,数据库的SQL)。
查询分析使用模型将原始用户输入转换或构建为优化的搜索查询。
查询重写
检索系统应理想地处理各种用户输入,从简单且表述不清的查询到复杂、多方面的提问。 为了实现这种多样性,一种流行的方法是使用模型将原始用户查询转化为更有效的搜索查询。 这种转换可以涵盖从简单的关键词提取到复杂的查询扩展和重写。 以下是使用模型进行非结构化数据检索中查询分析的一些主要优势:
- 查询澄清: 模型可以重新表述模糊或表达不清的查询,以提高清晰度。
- 语义理解: 它们可以捕捉查询背后的意图,而不仅仅是字面的关键词匹配。
- 查询扩展: 模型可以生成相关的术语或概念,以扩大搜索范围。
- 复杂查询处理: 它们可以将多部分问题分解为更简单的子查询。
已开发出多种技术来利用模型进行查询重写,包括:
| 名称 | 何时使用 | 描述 |
|---|---|---|
| Multi-query | When you want to ensure high recall in retrieval by providing multiple phrasings of a question. | Rewrite the user question with multiple phrasings, retrieve documents for each rewritten question, return the unique documents for all queries. |
| Decomposition | When a question can be broken down into smaller subproblems. | Decompose a question into a set of subproblems / questions, which can either be solved sequentially (use the answer from first + retrieval to answer the second) or in parallel (consolidate each answer into final answer). |
| Step-back | When a higher-level conceptual understanding is required. | First prompt the LLM to ask a generic step-back question about higher-level concepts or principles, and retrieve relevant facts about them. Use this grounding to help answer the user question. Paper. |
| HyDE | If you have challenges retrieving relevant documents using the raw user inputs. | Use an LLM to convert questions into hypothetical documents that answer the question. Use the embedded hypothetical documents to retrieve real documents with the premise that doc-doc similarity search can produce more relevant matches. Paper. |
例如,查询分解可以通过提示词和结构化输出来简单实现,该输出强制生成一系列子问题。 然后可以在下游检索系统中按顺序或并行运行这些子问题。
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)])
查看我们的“从零开始构建RAG”视频,了解几种不同的具体方法:
查询构建
查询分析还可以专注于将自然语言查询转换为专门的查询语言或过滤器。 这种转换对于有效地与存储结构化或半结构化数据的各种类型数据库进行交互至关重要。
-
结构化数据示例: 对于关系型数据库和图数据库,使用特定领域的语言(DSL)来查询数据。
- 文本转SQL: 将自然语言转换为SQL,用于关系型数据库。
- 文本转Cypher: 将自然语言转换为Cypher,用于图数据库。
-
半结构化数据示例: 对于向量存储,查询可以结合语义搜索与元数据过滤。
- 自然语言转元数据过滤器: 将用户查询转换为 适当的元数据过滤器。
这些方法利用模型来弥合用户意图与不同数据存储系统特定查询需求之间的差距。以下是一些常用的技术:
| 名称 | 何时使用 | 描述 |
|---|---|---|
| Self Query | If users are asking questions that are better answered by fetching documents based on metadata rather than similarity with the text. | This uses an LLM to transform user input into two things: (1) a string to look up semantically, (2) a metadata filter to go along with it. This is useful because oftentimes questions are about the METADATA of documents (not the content itself). |
| Text to SQL | If users are asking questions that require information housed in a relational database, accessible via SQL. | This uses an LLM to transform user input into a SQL query. |
| Text-to-Cypher | If users are asking questions that require information housed in a graph database, accessible via Cypher. | This uses an LLM to transform user input into a Cypher query. |
例如,以下是使用 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(结构化查询语言)高效地查询和操作数据。 关系型数据库在保持数据完整性、支持复杂查询以及处理不同数据实体之间的关系方面表现出色。
图数据库
图数据库是一种专门设计用于存储和管理高度互联数据的数据库。 与传统的关系型数据库不同,图数据库采用一种灵活的结构,由节点(实体)、边(关系)和属性组成。 这种结构使得复杂互联数据的表示和查询更加高效。 图数据库以图结构存储数据,包含节点、边和属性。 它们特别适用于存储和查询数据点之间的复杂关系,例如社交网络、供应链管理、欺诈检测和推荐服务。
- 查看我们的 教程,了解如何使用图数据库。
- 查看我们的 图数据库集成列表。
- 查看 Neo4j 的 LangChain 入门套件。
检索器
LangChain 通过 retriever 概念为与各种检索系统交互提供了一个统一接口。该接口简单明了:
- 输入:查询(字符串)
- 输出:文档列表(标准化的 LangChain Document 对象)
您可以使用前面提到的任何检索系统创建检索器。我们讨论的查询分析技术在此特别有用,因为它们可以为通常需要结构化查询语言的数据库提供自然语言接口。
例如,您可以使用文本到SQL转换为SQL数据库构建一个检索器。这使得自然语言查询(字符串)在后台被转换为SQL查询。
无论底层检索系统如何,LangChain中的所有检索器都共享一个通用接口。您可以使用简单的 invoke 方法来使用它们:
docs = retriever.invoke(query)
- 查看我们的 关于检索器的概念指南。
- 查看我们关于如何使用检索器的操操作指南。