LlamaIndex 查询机制
原文:Querying 查询
一句话
查询是 LLM 应用中最核心的部分,通过检索、后处理和响应合成三个阶段将用户问题转化为精准答案。
什么时候翻这页
当你需要了解 LlamaIndex 如何处理用户查询、自定义检索策略、优化响应质量或构建复杂查询流程时。
核心概念
- QueryEngine:所有查询的基础,可通过索引创建
- Retrieval:从索引中查找并返回与查询最相关的文档,最常见的是"top-k"语义检索
- Postprocessing:对检索到的节点进行重新排序、转换或过滤,例如根据特定元数据要求
- Response synthesis:将查询、最相关数据和提示组合并发送到 LLM 以生成最终响应
- Node:文档的基本单元,可包含元数据和与其他节点的关系
怎么做
基本查询
query_engine = index.as_query_engine()
response = query_engine.query(
"Write an email to the user given their background information."
)
print(response)
自定义查询阶段
- 配置检索器:
retriever = VectorIndexRetriever(
index=index,
similarity_top_k=10,
)
- 配置节点后处理器:
node_postprocessors = [
KeywordNodePostprocessor(
required_keywords=["Combinator"], exclude_keywords=["Italy"]
),
SimilarityPostprocessor(similarity_cutoff=0.7)
]
- 配置响应合成器:
query_engine = RetrieverQueryEngine.from_args(
retriever,
response_mode="compact", # 可选: "default", "compact", "tree_summarize", "no_text", "accumulate"
node_postprocessors=node_postprocessors
)
创建自定义查询工作流
可通过组合提示/LLM/输出解析器、检索器、响应合成器和自定义组件来设计复杂的查询流程。
命令 / API 速查
index.as_query_engine()- 从索引创建查询引擎VectorIndexRetriever- 向量索引检索器RetrieverQueryEngine- 基于检索器的查询引擎SimilarityPostprocessor- 相似度后处理器KeywordNodePostprocessor- 关键词节点后处理器get_response_synthesizer()- 获取响应合成器response_mode参数选项:default: "创建和精炼"答案,对每个检索到的节点进行单独的 LLM 调用compact: 在每个 LLM 调用中"压缩"提示,尽可能多地塞入节点文本块tree_summarize: 递归构建树并返回根节点作为响应,适用于总结no_text: 仅运行检索器获取节点,不发送到 LLMaccumulate: 对每个节点文本块应用查询并累积响应
与 Hello-Agents / LangGraph / 本博客 handbook 索引的联系
本查询机制与 Chroma vector store 的使用紧密相关,因为检索阶段依赖于 Chroma 中存储的 embedding 进行语义相似度匹配。在 Hello-Agents 的记忆与检索章节中,我们学习了基本的检索概念,而 LlamaIndex 提供了更高级的查询控制和后处理能力。LangGraph 可以用来构建更复杂的查询工作流,将 LlamaIndex 的查询组件作为节点连接起来。
初学者易错点
- 忽略后处理步骤可能导致检索到不相关或质量低的节点
- 选择不合适的 response_mode 可能导致响应质量下降或成本增加
- 过低的 similarity_cutoff 可能包含不相关内容,过高则可能过滤掉相关内容
- 未正确设置 similarity_top_k 可能导致检索过多或过少的信息