问答模式#
语义搜索#
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("作者在成长过程中做了什么?")
print(response)
教程
指南
摘要#
摘要查询需要 LLM 遍历许多甚至大多数文档,以便综合出一个答案。 例如,摘要查询可能如下所示:
- "对这段文本进行摘要是什么?"
- "给我一个关于人X在公司的经历的摘要。"
一般来说,摘要索引适用于这种情况。默认情况下,摘要索引会遍历所有数据。
根据经验,设置 response_mode="tree_summarize"
也会导致更好的摘要结果。
index = SummaryIndex.from_documents(documents)
query_engine = index.as_query_engine(response_mode="tree_summarize")
response = query_engine.query("<摘要查询>")
结构化数据查询#
LlamaIndex 支持对结构化数据进行查询,无论是 Pandas DataFrame 还是 SQL 数据库。
以下是一些相关资源:
教程
指南
- SQL 指南(核心) (笔记本)
- Pandas 演示 (笔记本)
异构数据路由#
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
作为路由器,使用 LLM 选择最佳的子索引来路由查询,给定描述。
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
)
该模块将帮助将复杂的查询分解为现有索引结构上的简单查询。
指南
您还可以依赖 LLM 推断 是否执行比较/对比查询(请参阅下面的多文档查询)。
多文档查询#
除了上述明确的综合/路由流程外,LlamaIndex 还可以支持更一般的多文档查询。
它可以通过我们的 SubQuestionQueryEngine
类来实现这一点。给定一个查询,此查询引擎将生成包含子文档的子查询的“查询计划”,然后综合出最终答案。
为了实现这一点,首先为每个文档/数据源定义一个索引,并将其包装在QueryEngineTool
中(类似于上面的方式):
from llama_index.core.tools import QueryEngineTool, ToolMetadata
query_engine_tools = [
QueryEngineTool(
query_engine=sept_engine,
metadata=ToolMetadata(
name="sept_22",
description="提供截至2022年9月的Uber季度财务信息",
),
),
QueryEngineTool(
query_engine=june_engine,
metadata=ToolMetadata(
name="june_22",
description="提供截至2022年6月的Uber季度财务信息",
),
),
QueryEngineTool(
query_engine=march_engine,
metadata=ToolMetadata(
name="march_22",
description="提供截至2022年3月的Uber季度财务信息",
),
),
]
然后,我们在这些工具上定义一个SubQuestionQueryEngine
:
from llama_index.core.query_engine import SubQuestionQueryEngine
query_engine = SubQuestionQueryEngine.from_defaults(
query_engine_tools=query_engine_tools
)
这个查询引擎可以针对任何子查询工具的任何子集执行任意数量的子查询,然后合成最终答案。这使其特别适合跨文档进行比较/对比查询,以及与特定文档相关的查询。
指南
多步查询#
LlamaIndex还支持迭代式多步查询。给定一个复杂的查询,将其分解为初始子问题,并根据返回的答案顺序生成基于追踪答案的子问题,直到返回最终答案。
例如,给定一个问题“作者启动的第一批加速器计划中有谁?”,该模块将首先将查询分解为更简单的初始问题“作者启动的是什么加速器计划?”,查询索引,然后提出后续问题。
指南
时间查询#
LlamaIndex可以支持需要时间理解的查询。它可以通过两种方式实现:
- 决定查询是否需要利用节点之间的时间关系(前/后关系)以检索额外的上下文来回答问题。
- 按最近排序并过滤过时的上下文。
指南