查询转换#
LlamaIndex 允许您对索引结构执行查询转换。查询转换是将查询转换为另一个查询的模块。它们可以是单步的,即在查询针对索引执行之前运行一次转换。
它们也可以是多步的,如下所示:
- 查询被转换后,在索引中执行,
- 获取响应。
- 后续查询按顺序进行转换/执行。
我们将以下列方式更详细地列出一些查询转换。
用例#
查询转换有多种用例:
- 将初始查询转换为更容易嵌入的形式(例如 HyDE)
- 将初始查询转换为更容易从数据中回答的子问题(单步查询分解)
- 将初始查询分解为多个更容易单独回答的子问题(多步查询分解)
HyDE(假设文档嵌入)#
HyDE 是一种技术,根据自然语言查询,首先生成一个假设的文档/答案。然后使用此假设文档进行嵌入查找,而不是使用原始查询。
要使用 HyDE,以下是一个示例代码片段。
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.indices.query.query_transform.base import (
HyDEQueryTransform,
)
from llama_index.core.query_engine import TransformQueryEngine
# 加载文档,构建索引
documents = SimpleDirectoryReader("../paul_graham_essay/data").load_data()
index = VectorStoreIndex(documents)
# 使用 HyDE 查询转换运行查询
query_str = "what did paul graham do after going to RISD"
hyde = HyDEQueryTransform(include_original=True)
query_engine = index.as_query_engine()
query_engine = TransformQueryEngine(query_engine, query_transform=hyde)
response = query_engine.query(query_str)
print(response)
请查看我们的示例笔记本以获取完整的演示。
多步查询转换#
多步查询转换是对现有单步查询转换方法的概括。
给定一个初始的复杂查询,对查询进行转换并在索引中执行。从查询中检索响应。 给定响应(以及先前的响应)和查询,还可以针对索引提出后续问题。此技术允许对单个知识源运行查询,直到该查询满足所有问题。
下面显示了一个示例图像。
以下是相应的示例代码片段。
from llama_index.core.indices.query.query_transform.base import (
StepDecomposeQueryTransform,
)
# gpt-4
step_decompose_transform = StepDecomposeQueryTransform(llm, verbose=True)
query_engine = index.as_query_engine()
query_engine = MultiStepQueryEngine(
query_engine, query_transform=step_decompose_transform
)
response = query_engine.query(
"Who was in the first batch of the accelerator program the author started?",
)
print(str(response))
请查看我们的示例笔记本以获取完整的演示。