主题
语义检索
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" 也能带来更好的摘要效果。
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 在异构数据源上做路由——例如把一条查询“路由”到某个底层 Document 或某个子索引上。
做法是先为不同数据源建好各自的子索引,再把它们对应的查询引擎构造出来,并给每个查询引擎配一段描述,从而得到一个 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 也能支持那些需要理解时间的查询。它有两种做法:
- 判断这条查询是否需要利用节点之间的时间关系(prev/next 关系),以便检索到更多上下文来回答问题。
- 按新旧程度排序,并过滤掉过时的上下文。
指南