J'Blog

11 课 · LlamaIndex

语义检索

基于 Chroma 向量库,与 Workspace 知识库分离。用自然语言描述你想查的内容。 非管理员每人每天可检索 5 次(消耗站点 AI 配额)。

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)

自定义查询阶段

  1. 配置检索器
retriever = VectorIndexRetriever(
    index=index,
    similarity_top_k=10,
)
  1. 配置节点后处理器
node_postprocessors = [
    KeywordNodePostprocessor(
        required_keywords=["Combinator"], exclude_keywords=["Italy"]
    ),
    SimilarityPostprocessor(similarity_cutoff=0.7)
]
  1. 配置响应合成器
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: 仅运行检索器获取节点,不发送到 LLM
    • accumulate: 对每个节点文本块应用查询并累积响应

与 Hello-Agents / LangGraph / 本博客 handbook 索引的联系

本查询机制与 Chroma vector store 的使用紧密相关,因为检索阶段依赖于 Chroma 中存储的 embedding 进行语义相似度匹配。在 Hello-Agents 的记忆与检索章节中,我们学习了基本的检索概念,而 LlamaIndex 提供了更高级的查询控制和后处理能力。LangGraph 可以用来构建更复杂的查询工作流,将 LlamaIndex 的查询组件作为节点连接起来。

初学者易错点

  1. 忽略后处理步骤可能导致检索到不相关或质量低的节点
  2. 选择不合适的 response_mode 可能导致响应质量下降或成本增加
  3. 过低的 similarity_cutoff 可能包含不相关内容,过高则可能过滤掉相关内容
  4. 未正确设置 similarity_top_k 可能导致检索过多或过少的信息

相关词条

官方原文:https://developers.llamaindex.ai/python/framework/understanding/rag/querying/index