返回 RAG 工程实战目录

检索与生成链路设计

组织混合检索、重排、引用和拒答

生命周期 · 阶段四 开发实现(在线侧) | 上游:入库流水线(05)| 下游:模块编码(07)

查询侧链路:用户提问 → 查询改写 → 混合检索 → 重排序 → 组装 Prompt → LLM 生成 → 引用溯源。入库决定了上限,查询侧决定能发挥几成。

一、查询理解与改写

用户原始提问往往口语化、缺主语、有错别字,直接拿去检索效果差。

技术说明示例
查询清洗去口气词、纠错"那个…抵押物咋处置啊" → "抵押物处置流程"
查询改写(Rewrite)LLM 把口语改为检索友好表述同上
多查询扩展(Multi-Query)生成 3~5 个不同角度的查询分别检索,结果合并提升召回
HyDE让 LLM 先生成一个假设性答案,用答案去检索语义鸿沟场景
历史融合(RAG-Fusion)多轮对话中把指代补全成独立问题"他的流程呢" → "张三的入职流程"
元素抽取从问题中抽时间、部门、文档类型等结构化条件用于元数据过滤

代价权衡:每增加一次 LLM 改写,延迟 +1~2s。简单场景可先做规则清洗。

二、检索(Retrieval)

混合检索

flowchart LR Q["用户查询"] --> V["向量检索 (懂语义)"] Q --> K["BM25 关键词检索 (精确术语/文号/人名)"] V --> R["RRF 融合排序 score = Σ 1/(k + rank)"] K --> R R --> C["候选集(top 20~50)"] style R fill:#fff8e1,stroke:#d4a017
  • 向量检索:懂语义("怎么处理坏账" ≈ "不良资产处置"),但精确词/编号弱
  • BM25:精确命中术语、文号、人名,但不懂同义
  • RRF(Reciprocal Rank Fusion)score = Σ 1/(k + rank_i),k 常取 60

元数据过滤(务必与权限结合)

检索时先按权限过滤再看相似度:

filter: department IN (用户所属部门) AND security <= 用户密级

[!warning] 红线

权限过滤必须在检索层强制执行,不能只靠 Prompt 让模型"别答"——Prompt 层约束可被注入话术绕过。

top_k 与候选量经验

  • 粗排取 top 20~50,精排后取 top 3~8 进 Prompt
  • k 越大召回越高但噪声与 token 成本上升,用评测集调优(见 09 篇)

三、重排序(Rerank)

粗排(向量库 ANN)快而糙,精排(Cross-Encoder)慢而准。

flowchart LR A["候选 50 条"] --> B["BGE-Reranker 逐对打分(query, chunk)"] B --> C["取 top 5 进 Prompt"] style B fill:#fff0f5,stroke:#e06fa8
  • 常用模型:bge-reranker-v2-m3、Cohere Rerank
  • 效果显著:通常比纯向量检索的 NDCG 提升 5~15 个百分点
  • 位置:检索之后、组装 Prompt 之前

四、Prompt 组装与生成

Prompt 模板(示例)

你是不良资产业务知识库助手。请严格遵守:
1. 仅根据【参考资料】回答,不要使用【参考资料】之外的知识
2. 资料中没有答案时,直接回答"根据现有资料无法回答该问题"
3. 回答末尾列出引用的资料编号与页码
4. 涉及金额、日期、比例等数字时必须与资料完全一致

【参考资料】
[1] 《处置操作手册》P12:……
[2] 《债权转让指引》P3:……

【问题】
{query}

生成控制要点

  • temperature 调低(0~0.3):知识问答要稳定不要发散
  • 流式输出:提升体感
  • 超长上下文截断:候选切片按相关度排序装填,超出预算截断
  • 结构化输出:需要表格/JSON 时在指令中明确格式

五、兜底与安全策略

场景策略
检索证据不足(阈值与规则由评测集校准)说明未找到足够依据并给出缺口;是否允许通用知识补充由产品模式决定
检索结果都不相关拒答 + 推荐相近问题
问题超出知识范围但模型知道Prompt 强约束"仅根据资料"
敏感/越权问题权限过滤 + 敏感词拦截
LLM 服务超时重试 1 次 → 降级返回纯检索结果(切片列表)

六、链路可观测性

每次问答记录(用于测试分析与线上监控):

{
  "query": "抵押物处置流程",
  "rewritten_query": "抵押物处置流程是什么",
  "retrieval": {
    "vector_top10": [...],
    "bm25_top10": [...],
    "rerank_top5": [{"doc": "处置操作手册", "page": 12, "score": 0.87}]
  },
  "prompt_tokens": 2310,
  "answer": "……",
  "latency_ms": {"retrieve": 120, "rerank": 80, "llm": 2100}
}

测试排障时,答案错了先定位是检索没召回(换检索策略)还是召回了但没用(Prompt/重排问题)还是LLM 乱答(模型/指令问题)。

本篇交付与下一步

本阶段应交付可重放的查询链路、检索配置、权限过滤、引用映射、拒答策略和观测字段。相似度分数只在同一模型、索引和处理流程内有可比性,阈值必须由评测集校准。下一步进入 07-核心模块开发实现