Skip to content

问答模式#

语义搜索#

LlamaIndex 最基本的用法是通过语义搜索实现。我们提供了一个简单的内存向量存储供您入门,但您也可以选择使用我们提供的任何向量存储集成

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader

documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("What did the author do growing up?")
print(response)

教程

指南

摘要生成#

摘要查询要求大语言模型遍历大部分(若非全部)文档以综合生成答案。例如,摘要查询可能类似以下形式:

  • "这段文本集合的摘要是什么?"
  • "总结人物X在公司的经历。"

通常,摘要索引适合这种用例。默认情况下,摘要索引会遍历所有数据。

经验表明,设置 response_mode="tree_summarize" 也能获得更好的摘要结果。

index = SummaryIndex.from_documents(documents)

query_engine = index.as_query_engine(response_mode="tree_summarize")
response = query_engine.query("<summarization_query>")

结构化数据查询#

LlamaIndex 支持对结构化数据的查询,无论是 Pandas 数据框还是 SQL 数据库。

以下是一些相关资源:

教程

指南

异构数据路由#

LlamaIndex 还支持通过 RouterQueryEngine 在异构数据源上进行路由——例如,如果您想将查询"路由"到底层文档或子索引。

要实现这一点,首先需要为不同数据源构建子索引。然后构建相应的查询引擎,并为每个查询引擎添加描述以获取 QueryEngineTool

from llama_index.core import TreeIndex, VectorStoreIndex
from llama_index.core.tools import QueryEngineTool

...

# 定义子索引
index1 = VectorStoreIndex.from_documents(notion_docs)
index2 = VectorStoreIndex.from_documents(slack_docs)

# 定义查询引擎和工具
tool1 = QueryEngineTool.from_defaults(
    query_engine=index1.as_query_engine(),
    description="使用此查询引擎执行...",
)
tool2 = QueryEngineTool.from_defaults(
    query_engine=index2.as_query_engine(),
    description="使用此查询引擎执行其他操作...",
)

然后,我们定义 RouterQueryEngine。默认情况下,这会使用 LLMSingleSelector 作为路由器,该路由器利用大语言模型根据描述选择最佳子索引来路由查询。

from llama_index.core.query_engine import RouterQueryEngine

query_engine = RouterQueryEngine.from_defaults(
    query_engine_tools=[tool1, tool2]
)

response = query_engine.query(
    "在Notion中,给我产品路线图的摘要。"
)

指南

比较/对比查询#

您可以通过 ComposableGraph 中的查询转换模块显式执行比较/对比查询。

from llama_index.core.query.query_transform.base import DecomposeQueryTransform

decompose_transform = DecomposeQueryTransform(
    service_context.llm, verbose=True
)

该模块将帮助将复杂查询分解为针对现有索引结构的更简单查询。

指南

您也可以依赖大语言模型来_推断_是否执行比较/对比查询(参见下面的多文档查询)。

多文档查询#

除了上述显式合成/路由流程外,LlamaIndex 还支持更通用的多文档查询。这是通过我们的 SubQuestionQueryEngine 类实现的。给定一个查询,该查询引擎将生成包含针对子文档的子查询的"查询计划",然后合成最终答案。

要实现这一点,首先为每个文档/数据源定义一个索引,并用 QueryEngineTool 包装它(类似于上述方法):

from llama_index.core.tools import QueryEngineTool

query_engine_tools = [
    QueryEngineTool.from_defaults(
        query_engine=sept_engine,
        name="sept_22",
        description="提供关于Uber截至2022年9月的季度财务信息",
    ),
    QueryEngineTool.from_defaults(
        query_engine=june_engine,
        name="june_22",
        description="提供关于Uber截至2022年6月的季度财务信息",
    ),
    QueryEngineTool.from_defaults(
        query_engine=march_engine,
        name="march_22",
        description="提供关于Uber截至2022年3月的季度财务信息",
    ),
]

然后,我们定义 SubQuestionQueryEngine

from llama_index.core.query_engine import SubQuestionQueryEngine

query_engine = SubQuestionQueryEngine.from_defaults(
    query_engine_tools=query_engine_tools
)

该查询引擎可以在合成最终答案之前,对任何查询引擎工具子集执行任意数量的子查询。这使得它特别适合跨文档的比较/对比查询以及特定文档的查询。

指南

多步查询#

LlamaIndex 还支持迭代式多步查询。给定一个复杂查询,将其分解为初始子问题,并根据返回的答案顺序生成子问题,直到返回最终答案。

例如,给定问题"作者创办的加速器项目第一批学员是谁?",该模块首先将查询分解为更简单的初始问题"作者创办的加速器项目是什么?",查询索引,然后提出后续问题。

指南

时序查询#

LlamaIndex 支持需要理解时间的查询。它可以通过两种方式实现:

  • 判断查询是否需要利用节点之间的时序关系(前/后关系)来检索额外的上下文以回答问题。
  • 按时间排序并过滤过时的上下文。

指南

其他资源#