跳转至

RAG 设计

本文档描述当前实现的检索增强生成流程,基于 ai_service/services/rag_retrieval.py 与编排器集成。

如果你想先看“当前整条 RAG 链路是怎么串起来的”,建议先读 当前 RAG 全链路;本页更偏向 RAG 设计视角与能力演进。

架构概览

flowchart TB
    Input[用户输入] --> Orchestrator[编排器]
    Orchestrator -->|agent_id 存在| MQ{Multi-Query 扩展}
    MQ -->|启用| Expand[LLM 生成查询变体]
    MQ -->|未启用| Embed
    Expand --> Embed[查询向量化]
    Embed --> Qdrant[向量检索]
    Qdrant --> Keyword{短查询?}
    Keyword -->|是| KWFallback[关键词回退检索]
    Keyword -->|否| Merge
    KWFallback --> Merge[结果合并与去重]
    Merge --> Rerank[重排序]
    Rerank --> DB[读取文本块]
    DB --> Context[上下文拼接]
    Context --> Orchestrator
    Orchestrator --> Output[模型回复]

关键流程

  1. 获取 Agent 挂载的知识源列表(含优先级与来源类型)
  2. (可选)Multi-Query 扩展:LLM 生成多个语义等价查询变体
  3. 使用嵌入服务对查询生成向量
  4. 在 Qdrant 中按知识源过滤检索
  5. 对短查询(≤12 tokens)触发关键词回退检索,补充向量检索遗漏
  6. 合并多路结果,按 chunk_id 去重,保留最高分
  7. (可选)重排序:对候选结果重新排序
  8. 从数据库读取命中的文本块内容
  9. 按来源优先级和分数排序,生成上下文并拼接到用户问题

参数约定

当前默认参数来自运行时配置 config.toml [rag](或环境变量 RAG_*):

  • top_k: 5
  • score_threshold: 0.3
  • max_context_length: 不限制(None

编排器默认会读取这组配置,单次调用仍然可以显式覆盖。

存储策略

数据类型 存储位置 说明
原始文档 MinIO 上传后保存原文件
文本块 PostgreSQL 分块后的文本内容与元数据
向量 Qdrant 向量索引与 payload
解析快照 PostgreSQL DocumentParseSnapshot 记录分块策略
块结构 PostgreSQL ChunkStructure 记录字符偏移等元数据

分块策略

支持 4 种分块策略,可按知识源单独配置:

策略 说明 适用场景
fixed_size 固定字符数分块(默认 512 字符,50 字符重叠) 通用文本
sentence_window LlamaIndex SentenceWindowNodeParser,句子感知 结构化长文本
semantic_splitter LlamaIndex SemanticSplitterNodeParser,基于 embedding 语义切分 主题跨度大的文档
docling 高级文档解析与分块 PDF 表格、复杂排版

嵌入服务

支持双后端:

  • API 模式(默认):DashScope text-embedding-v4(1536 维)
  • 本地模式:sentence-transformers all-MiniLM-L6-v2(384 维)

特性:批量处理、维度验证、懒加载、就绪探针检查。

已实现的能力增强

Multi-Query 扩展

  • 使用 LLM 生成多个语义等价查询变体(默认 3 个)
  • 各变体独立检索后合并结果
  • LLM 失败时自动降级为原始查询
  • 配置:[multi_query] 节,默认关闭

关键词回退检索

  • 针对短查询(≤12 tokens,3+ 有效词)触发
  • 大小写不敏感的词项匹配
  • 确定性评分:base 0.18 + 词项匹配加分,上限 0.29
  • 内置停用词过滤
  • 作为向量检索的安全网,防止简单领域术语检索失败

重排序(Stub)

  • 框架已就绪,配置为 qwen3-rerank
  • 当前为确定性 fallback 排序实现
  • 跟踪重排前后的排名漂移指标

知识纠错闭环

  • 管理员可纠正 LLM 回答
  • 纠正内容自动作为 MANAGED_CORRECTION 来源入库
  • 纠正来源在检索时获得更高优先级
  • 无需重新训练模型即可修正回答质量

可观测性

  • Langfuse 全链路 tracing
  • 分数分布、重排漂移等检索指标日志
  • 检索调试 API(Retrieval Debug Inspector)
  • 来源文件名可见性配置(hide_rag_source_filename

优化路线图

P0 — 高优先级

1. Reranking 真实对接

现状rerank.py 为 stub 实现,使用确定性 fallback 排序。配置中已预置 qwen3-rerank 但未接入 DashScope API。

目标:接入真实 reranking 模型,提升检索精度。

方案: - 对接 DashScope qwen3-rerank API - 在 RerankService 中实现真实调用,保留 fallback 作为降级策略 - 利用现有的 rerank drift 指标评估效果

预期收益:检索精度显著提升,尤其是语义相近但相关性不同的候选块排序。

现状:vector search + keyword fallback 两层策略,keyword fallback 仅对短查询(≤12 tokens)生效。

目标:实现 BM25 + Vector 融合的全量混合检索。

方案: - 利用 Qdrant sparse vectors 支持,建立 BM25 稀疏向量索引 - 使用 RRF(Reciprocal Rank Fusion)合并稠密与稀疏检索结果 - 替代现有的简单关键词回退机制

预期收益:对中文专业术语、产品名、精确短语等匹配场景提升显著。

3. Context Window 智能管理

现状top_k 固定为 5,无 token budget 感知。

目标:根据 LLM context window 动态调整检索量与上下文截断。

方案: - 计算 system prompt + 历史消息占用的 token 数 - 动态确定可用 context budget - 按相关性分数渐进式填充,而非硬截断前 k 个

预期收益:避免上下文浪费或溢出,长文档场景效果更好。

P1 — 中优先级

4. Multi-Query Expansion 优化

现状temperature=0.0,变体多样性有限;每次扩展增加 3-4x 检索延迟。

方案: - 适当提高 temperature(0.3-0.5)增加变体多样性 - 异步并行执行多路向量检索 - 考虑查询级别的 embedding 缓存

5. 分块策略自动选择

现状:4 种分块策略需人工配置。

方案: - 根据文档 MIME 类型和内容特征自动推荐策略 - PDF 表格多 → docling;长文本叙述 → semantic_splitter;短 FAQ → fixed_size + 小 chunk - 保留人工覆盖能力

6. 检索质量评估闭环

现状:有知识纠错机制,但缺少系统性检索质量指标。

方案: - 记录每次检索的 hit/miss(基于用户反馈或纠错信号) - 构建 evaluation dataset 自动测试检索召回率和精度 - 利用 Langfuse tracing 数据构建检索质量 analytics

P2 — 长期规划

7. 多语言优化

  • 评估 embedding 模型在中英文混合查询场景的表现
  • 考虑语言检测后路由到专用 embedding 模型
  • 优化中文分词对分块质量的影响

8. Embedding 缓存

  • 高频查询的 embedding 结果缓存,降低 API 调用成本
  • 可使用 Redis 或内存 LRU 缓存
  • 需要考虑缓存失效策略(模型更新时)

9. Contextual Retrieval / Late Chunking

  • 给每个 chunk 添加文档级上下文摘要后再做 embedding
  • 解决 chunk 脱离文档语境导致的语义丢失问题
  • 参考 Anthropic Contextual Retrieval 方案

相关代码

  • ai_service/services/rag_retrieval.py — 核心检索服务
  • ai_service/services/embedding.py — 嵌入服务
  • ai_service/services/chunking.py — 分块策略
  • ai_service/services/ingestion.py — 文档摄入流水线
  • ai_service/services/multi_query.py — Multi-Query 扩展
  • ai_service/services/rerank.py — 重排序服务
  • ai_service/services/rag_debug.py — 检索调试
  • ai_service/storage/qdrant_client.py — Qdrant 向量数据库客户端
  • ai_service/orchestrator/graph.py — 编排器 RAG 集成

最后更新

  • 2026-03-30