检索与生成链路设计
组织混合检索、重排、引用和拒答
生命周期 · 阶段四 开发实现(在线侧) | 上游:入库流水线(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-核心模块开发实现。