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[模型回复]
关键流程
- 获取 Agent 挂载的知识源列表(含优先级与来源类型)
- (可选)Multi-Query 扩展:LLM 生成多个语义等价查询变体
- 使用嵌入服务对查询生成向量
- 在 Qdrant 中按知识源过滤检索
- 对短查询(≤12 tokens)触发关键词回退检索,补充向量检索遗漏
- 合并多路结果,按 chunk_id 去重,保留最高分
- (可选)重排序:对候选结果重新排序
- 从数据库读取命中的文本块内容
- 按来源优先级和分数排序,生成上下文并拼接到用户问题
参数约定
当前默认参数来自运行时配置 config.toml [rag](或环境变量 RAG_*):
top_k: 5score_threshold: 0.3max_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 指标评估效果
预期收益:检索精度显著提升,尤其是语义相近但相关性不同的候选块排序。
2. 混合检索(Hybrid Search)
现状: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