Skip to content

查询转换#

LlamaIndex 允许您对索引结构执行_查询转换_操作。查询转换是指将查询语句转换为另一种查询语句的模块。它们可以是单步转换,即在查询执行前对查询进行一次转换。

也可以是多步转换,例如:

  1. 查询被转换后,在索引上执行;
  2. 获取响应结果;
  3. 后续查询以顺序方式进行转换/执行。

下面我们将详细介绍一些查询转换功能。

使用场景#

查询转换具有多种应用场景:

  • 将初始查询转换为更易于嵌入的形式(如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

# load documents, build index
documents = SimpleDirectoryReader("../paul_graham_essay/data").load_data()
index = VectorStoreIndex(documents)

# run query with HyDE query transform
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))

查看我们的示例笔记本获取完整演示。