查询转换
LlamaIndex 允许您对索引结构执行查询转换。 查询转换是将一个查询转换为另一个查询的模块。它们可以是单步的,即在查询针对索引执行之前运行一次转换。
它们也可以是多步骤的,例如:
- 查询被转换,针对索引执行,
- 响应被获取。
- 后续查询以顺序方式转换/执行。
我们在下面更详细地列出了一些查询转换方法。
查询转换具有多种应用场景:
- 将初始查询转换为更容易嵌入的形式(例如 HyDE)
- 将初始查询转换为可以更轻松从数据中回答的子问题(单步查询分解)
- 将初始查询分解为多个子问题,这些子问题可以更容易地独立回答。(多步骤查询分解)
HyDE 是一种技术,当给定一个自然语言查询时,首先生成一个假设的文档/答案。然后使用这个假设的文档进行嵌入查找,而不是原始查询。
要使用HyDE,下面展示了一个示例代码片段。
from llama_index.core import VectorStoreIndex, SimpleDirectoryReaderfrom llama_index.core.indices.query.query_transform.base import ( HyDEQueryTransform,)from llama_index.core.query_engine import TransformQueryEngine
# load documents, build indexdocuments = SimpleDirectoryReader("../paul_graham_essay/data").load_data()index = VectorStoreIndex(documents)
# run query with HyDE query transformquery_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-4step_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))查看我们的示例笔记本获取完整演示。