问答模式#
语义搜索#
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 支持需要理解时间的查询。它可以通过两种方式实现:
- 判断查询是否需要利用节点之间的时序关系(前/后关系)来检索额外的上下文以回答问题。
- 按时间排序并过滤过时的上下文。
指南