说明
查询(Querying)是 LLM 应用中最重要的部分。在llamaindex中,当完成:数据加载,构建索引、索引存储后,就可以进行LLM 应用程序最重要的部分:查询。
简单的查询只是对大语言模型的提示调用:它可以是一个问题并获得答案,或者是一个总结请求,或者是一个更复杂的指令。
复杂的查询可能涉及重复/链接提示+ LLM 调用,甚至跨多个组件的推理循环。
简单的示例
所有查询的基础是QueryEngine。获取 QueryEngine 最简单的方法是通过索引来创建,如下所示:
query_engine = index.as_query_engine()
response = query_engine.query("Write an email to the user given their background information."
)
print(response)
查询阶段
查询的内容比最初看到的要多。查询由三、四个不同的阶段组成:
- 检索(Retrieval)是指:您从索引中找到并返回与您的查询最相关的文档。正如前面在索引中所讨论的,最常见的检索类型是“top-k”语义检索,但还有许多其他检索策略。
- 后处理(Postprocessing)是指:对检索到的节点进行可选的重新排序、转换或过滤,例如要求它们具有特定的元数据,例如附加的关键字。
- 响应合成器(Response synthesis)是:将您的查询、最相关的数据和提示组合起来并发送给您的大语言模型以返回响应。
- 结构化输出(Structured Outputs):LlamaIndex 提供了各种模块,使大模型能够以结构化格式生成输出。这对于下游的应用来说,非常重要。
自定义查询
LlamaIndex 具有低级组合 API,可让您对查询进行精细控制。
在此示例中,我们自定义检索器以对 top_k 使用不同的数字,并添加一个后处理步骤,该步骤要求检索到的节点达到要包含的最小相似度分数。当您有相关结果时,这将为您提供大量数据,但如果您没有任何相关结果,则可能不会提供任何数据。
from llama_index.core import VectorStoreIndex, get_response_synthesizer
from llama_index.core.retrievers import VectorIndexRetriever
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.postprocessor import SimilarityPostprocessor# 构建索引
index = VectorStoreIndex.from_documents(documents)# 配置检索器
retriever = VectorIndexRetriever(index=index,similarity_top_k=10,
)# 配置响应合成器
response_synthesizer = get_response_synthesizer()# 融合查询引擎
query_engine = RetrieverQueryEngine(retriever=retriever,response_synthesizer=response_synthesizer,node_postprocessors=[SimilarityPostprocessor(similarity_cutoff=0.7)],
)# 开始查询
response = query_engine.query("What did the author do growing up?")
print(response)
小结
通过index来构建查询引擎,在查询过程中会进行一系列的操作,包括i:检索,后i处理,响应合成,结构化输出等。