LlamaIndex允许您对索引结构执行查询转换。查询转换是将查询转换为另一个查询的模块。它们可以是单步的,即在执行查询之前只运行一次转换。 它们也可以是多步的,即:
将查询转换,对索引执行
检索响应
以顺序方式转换/执行后续查询。
我们在下面详细列出了一些查询转换。
用例
查询转换有多种用例:
将初始查询转换为更容易嵌入的形式(例如HyDE)
将初始查询转换为可以更容易从数据中获得答案的子问题(单步查询分解)
将初始查询分解为多个子问题,这些子问题可以更容易地单独解决。 (多步查询分解)
HyDE(假设文档嵌入)
HyDE是一种技术,给定自然语言查询,首先生成假设文档/答案。然后使用这个假设文档进行嵌入查找,而不是原始查询。
要使用HyDE,下面显示了一个示例代码片段。
from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader
from llama_index.indices.query.query_transform.base import HyDEQueryTransform
from llama_index.indices.query import TransformQueryEngine
# 加载文档,构建索引
documents = SimpleDirectoryReader('../paul_graham_essay/data').load_data()
index = GPTVectorStoreIndex(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)
请查看我们的示例笔记本以获得完整的指导。
单步查询分解
最近的一些方法(例如self-ask,ReAct)建议,当LLM将问题分解为较小的步骤时,它们在回答复杂问题时表现更好。我们发现,对于需要知识增强的查询也是如此。
如果您的查询很复杂,不同的部分可以被分解为更容易回答的子问题,并且可以使用查询转换来实现。您的知识库可以回答围绕整个查询的不同“子查询”。
我们的单步查询分解功能将复杂的问题转换为数据集上的简单问题,以帮助提供对原始问题的子答案。
这在组合图上尤其有用。在组合图中,查询可以路由到多个子索引,每个子索引代表整个知识语料库的一个子集。查询分解允许我们将查询转换为任何给定索引上的更合适的问题。
下面是一个示例图片。

以下是在组合图上的相应示例代码片段。
# 设置:由多个向量索引组成的列表索引
# llm_predictor_chatgpt对应于ChatGPT LLM接口
from llama_index.indices.query.query_transform.base import DecomposeQueryTransform
decompose_transform = DecomposeQueryTransform(
llm_predictor_chatgpt, verbose=True
)
# 初始化索引和图
...
# 配置检索器
vector_query_engine = vector_index.as_query_engine()
vector_query_engine = TransformQueryEngine(
vector_query_engine,
query_transform=decompose_transform
transform_extra_info={'index_summary': vector_index.index_struct.summary}
)
custom_query_engines = {
vector_index.index_id: vector_query_engine
}
# 查询
query_str = (
"Compare and contrast the airports in Seattle, Houston, and Toronto. "
)
query_engine = graph.as_query_engine(custom_query_engines=custom_query_engines)
response = query_engine.query(query_str)
请查看我们的示例笔记本以获取完整的指南。
多步查询转换
多步查询转换是基于现有的单步查询转换方法的概括。
给定初始的复杂查询,将对索引进行查询转换和执行。从查询中检索响应。 给定响应(以及先前的响应)和查询,也可以对索引提出后续问题。这种技术允许将查询运行到单个知识源,直到查询满足所有问题为止。
下面是一个示例图片。

以下是相应的示例代码片段。
from llama_index.indices.query.query_transform.bas
```我们提供了一个[示例笔记本](https://github.com/jerryjliu/llama_index/blob/main/examples/vector_indices/SimpleIndexDemo-multistep.ipynb),您可以查看完整的步骤。使用StepDecomposeQueryTransform,我们可以创建一个MultiStepQueryEngine,它可以接受一个查询,例如“作者开始的加速器计划的第一批是谁?”,并返回一个响应。