问答模式#
语义搜索#
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)
教程
指南
摘要#
摘要查询要求大型语言模型(LLM)遍历大部分(如果不是全部)文档以合成答案。例如,摘要查询可能如下所示:
- “这篇文本集的摘要是什么?”
- “请给我一份关于 X 先生/女士在公司经历的摘要。”
通常,摘要索引适用于这种用例。摘要索引默认会遍历所有数据。
经验上,将 response_mode="tree_summarize"
设置为 "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 DataFrame 还是 SQL 数据库。
以下是一些相关资源:
教程
指南
对异构数据的路由#
LlamaIndex 还支持使用 RouterQueryEngine
对异构数据源进行路由——例如,如果您想将查询“路由”到基础文档或子索引。
要做到这一点,首先在不同的数据源上构建子索引。然后构建相应的查询引擎,并为每个查询引擎提供描述以获得一个 QueryEngineTool
。
from llama_index.core import TreeIndex, VectorStoreIndex
from llama_index.core.tools import QueryEngineTool
...
# define sub-indices
index1 = VectorStoreIndex.from_documents(notion_docs)
index2 = VectorStoreIndex.from_documents(slack_docs)
# define query engines and tools
tool1 = QueryEngineTool.from_defaults(
query_engine=index1.as_query_engine(),
description="Use this query engine to do...",
)
tool2 = QueryEngineTool.from_defaults(
query_engine=index2.as_query_engine(),
description="Use this query engine for something else...",
)
然后,我们在其上定义一个 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(
"In Notion, give me a summary of the product roadmap."
)
指南
比较/对比查询#
您可以在 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
query_engine_tools = [
QueryEngineTool.from_defaults(
query_engine=sept_engine,
name="sept_22",
description="Provides information about Uber quarterly financials ending September 2022",
),
QueryEngineTool.from_defaults(
query_engine=june_engine,
name="june_22",
description="Provides information about Uber quarterly financials ending June 2022",
),
QueryEngineTool.from_defaults(
query_engine=march_engine,
name="march_22",
description="Provides information about Uber quarterly financials ending March 2022",
),
]
然后,我们基于这些工具定义一个 SubQuestionQueryEngine
from llama_index.core.query_engine import SubQuestionQueryEngine
query_engine = SubQuestionQueryEngine.from_defaults(
query_engine_tools=query_engine_tools
)
这个查询引擎可以在合成最终答案之前,针对查询引擎工具的任何子集执行任意数量的子查询。这使得它特别适合进行跨文档的比较/对比查询以及与特定文档相关的查询。
指南
多步查询#
LlamaIndex 还可以支持迭代的多步查询。给定一个复杂查询,将其分解为初始子问题,并根据返回的答案顺序生成子问题,直到返回最终答案。
例如,给定问题“作者启动的第一批加速器项目中有谁?”,该模块将首先将查询分解为一个更简单的初始问题“作者启动的加速器项目是什么?”,查询索引,然后提出后续问题。
指南
时间序列查询#
LlamaIndex 可以支持需要理解时间的查询。它可以通过两种方式实现:
- 判断查询是否需要利用节点之间的时间关系(上一个/下一个关系)来检索附加上下文以回答问题。
- 按新近度排序并过滤过时上下文。
指南