跳转至

RAG 运行时

在线聊天里的 RAG 不是单一函数,而是一条会根据 Agent 配置、source 治理状态和 query 形态动态变化的能力链。

当前运行顺序

  1. 从 Agent 挂载关系解析 active sources
  2. 解析 active sources 中哪些属于 managed_correction
  3. 按 query 生成 embedding,并在需要时做 multi-query expansion
  4. 先做向量召回
  5. 对 managed correction sources 单独再做一轮补充召回
  6. 合并结果并按 source priority / source kind / score 排序
  7. 如果 query 适合关键词回退,则执行 keyword fallback 补位
  8. 如果开启 rerank,则做 rerank 阶段
  9. 回表加载真实 chunk 文本
  10. 生成最终上下文,并把 provenance / debug payload 写进 turn

各阶段在代码里在哪里

阶段 关键实现
active source 解析 get_active_source_metadata_for_agent()
managed correction source 识别 _list_managed_correction_source_ids()
multi-query expansion ai_service/services/multi_query.py
向量召回 QdrantVectorService.search() + _search_with_query_expansion()
keyword fallback _extract_keyword_fallback_term_list()_build_keyword_fallback_match_list()
rerank ai_service/services/rerank.py
回表取 chunk get_document_chunks_by_ids()

multi-query 当前怎么工作

当前 multi-query 不是硬编码改写,而是一个独立服务:

  • 入口:ai_service/services/multi_query.py
  • 行为:用 LLM 把原始 query 改写成多个语义等价变体
  • 容错:任何失败都退回到 [原始 query]

这意味着 multi-query 是增强阶段,不是阻塞性依赖。

keyword fallback 当前怎么工作

当前代码不是简单 LIKE %query%。它会:

  • 先规范化 query
  • 过滤过短 token 和 stopword
  • 对短 query 与 CJK token 做特殊处理
  • 生成 fallback term list
  • 基于命中词项数和 exact query match 计算 deterministic fallback score

这个阶段的作用不是替代向量检索,而是给召回不足的 query 补一层可解释的文本命中能力。

managed correction source 当前怎么工作

当前检索链路会显式识别 KnowledgeSourceKind.MANAGED_CORRECTION

它的作用是:

  • 把已经发布的对话纠错作为一种特殊知识源参与检索
  • 在最终排序中给予 correction source boost
  • 让运营侧可以通过 correction publish 快速修补错误知识,而不用先改原始文档库

rerank 当前怎么工作

当前 RerankService 已经是独立阶段,但有两个现实要点:

  1. 如果 config.rerank.enabledfalse,直接保留原始向量排序
  2. 即使启用,当前实现也还是 deterministic stage,真正的专用 rerank endpoint 还没接入

所以现在的 rerank 更像“明确分离好的阶段”,已经有架构位,但效果强度仍受后端集成深度限制。

运行时会留下哪些调试痕迹

当前系统会为一次 RAG turn 保留:

  • multi-query 是否启用
  • rerank 是否启用
  • raw candidates
  • final retrieved chunks
  • rerank drift top3
  • provenance 信息

这些信息会进入 turn 级记录或 retrieval debug report,供运营和研发复盘。

运行时依赖

  • 聊天编排器提供时序与状态
  • rag_retrieval.py 提供主检索逻辑
  • rag_debug.py 提供解释性报告
  • Agent 配置决定 source 范围、阈值、重排与注入策略
  • Qdrant 提供向量召回
  • PostgreSQL 提供 chunk 回表和 source 治理真相源

最常见的 3 类运行时问题

有 source,但完全召回不到

优先怀疑:

  • Agent 没有正确挂载 source
  • 文档并未真正 indexed
  • 向量状态异常

能召回,但内容不对

优先怀疑:

  • chunking strategy 不适合
  • rerank 没开或不够强
  • source priority / correction source 排序影响了最终结果

能召回,但线上答复和 debug 不一致

优先怀疑:

  • turn 级上下文里实际注入的 chunk 集合和你看的测试条件不一致
  • 会话状态、Agent 配置或 mounted source 在测试前后发生了变化

继续阅读