RAG-准确度提升之-前置过滤-向量召回法
目录
精度持续改进
https://www.cnblogs.com/aibi1/p/19473886
我会分三部分:
1️⃣ 补全带 HIGH_RISK_LABELS 的完整代码(关键行中文注释)
2️⃣ 用流程方式解释这套规则“到底在干什么”
3️⃣ 给出所有关键变量的推荐取值与定义表
一、补全后的完整伪代码(可直接工程化)
# ====== 预定义参数 ======
# 标签向量 ANN 检索的 Top-K(标签数量通常几十~几千)
TOP_K = 10
# 多标签参与阈值:达到该值才认为“语义相关”
T_MULTI = 0.68
# 主锚点最低可信阈值:必须有一个标签非常明确
T_MIN = 0.78
# 一个 query 允许的最大有效标签数
K_MAX = 4
# 高风险标签集合(人工维护,小而准)
HIGH_RISK_LABELS = {
"合同",
"法律",
"合规",
"风控",
"金融",
"投资",
"税务",
"审计",
"隐私",
"数据安全"
}
# ====== 核心流程 ======
# 1. 用 MiniLM embedding + ANN 从“标签库”中召回 Top-K 标签
labels = ANN_topk(query, k=TOP_K)
# labels: List[{label_name, sim}]
# 2. 过滤出“语义上真的相关”的标签集合 S
# 只有相似度 >= T_MULTI 的标签,才有资格参与后续逻辑
S = [l for l in labels if l.sim >= T_MULTI]
# 3. 如果一个都没命中,说明标签体系无法覆盖该 query
if not S:
route_to_llm("no_label_match")
# 4. 即使有多个标签,但没有一个足够强的“主语义锚点”
# 说明 query 表达模糊 / 泛化 / 跨标签边界
elif max(l.sim for l in S) < T_MIN:
route_to_llm("no_strong_anchor")
# 5. 命中的标签太多,语义过于分散
# 用这些标签去做 RAG 过滤反而会扩大噪声
elif len(S) > K_MAX:
route_to_llm("too_many_labels")
# 6. 检查是否命中任何高风险标签
# 只要有一个,就禁止自动执行,必须进入 LLM 或人工兜底
elif any(l.label_name in HIGH_RISK_LABELS for l in S):
route_to_llm("high_risk_query")
# 7. 语义清晰 + 标签数量可控 + 无高风险
# 可以安全地用于 RAG 前置过滤
else:
use_labels_for_rag_filter(S)
二、这套规则“在系统里到底干了什么?”
整体一句话
这不是在“给 query 分类”,而是在判断:
能不能“安全、有效地用标签去缩小 RAG 检索空间”。
决策流程图(文字版)
Query
↓
标签 ANN Top-K
↓
T_MULTI 过滤(谁能上桌)
↓
是否存在?
├─ 否 → LLM(标签体系不覆盖)
↓
是否存在强主锚点?
├─ 否 → LLM(语义不清晰)
↓
标签是否过多?
├─ 是 → LLM(语义发散)
↓
是否触发高风险?
├─ 是 → LLM / 人工
↓
安全标签集合 → RAG 前置过滤
每一步解决的“真实问题”
| 步骤 | 防止的风险 |
|---|---|
T_MULTI |
噪声标签进入 RAG |
T_MIN |
泛 query / 模糊表达 |
K_MAX |
多标签拉扯检索空间 |
HIGH_RISK_LABELS |
合同 / 金融类自动误答 |
三、关键变量定义 & 推荐取值(你可以直接写进配置)
1️⃣ TOP_K
| 参数 | 推荐 |
|---|---|
| 作用 | ANN 召回候选标签 |
| 推荐值 | 10 |
| 原因 | 足够覆盖辅标签,又不引入太多噪声 |
2️⃣ T_MULTI(是否参与)
T_MULTI = 0.65 ~ 0.72
推荐:0.68
| 含义 | 是否“真的语义相关” |
|---|---|
| 太高 | 漏辅标签 |
| 太低 | 噪声进入 |
3️⃣ T_MIN(是否可信)
T_MIN = 0.75 ~ 0.80
推荐:0.78
| 含义 | 是否存在“主语义锚点” |
|---|---|
| 作用 | 防止模糊 query 用标签硬过滤 |
4️⃣ K_MAX(语义是否发散)
| 场景 | 推荐 |
|---|---|
| 智能客服 / RAG | 4 |
| 金融 / 合同 | 3 |
| 搜索类 | 5 |
5️⃣ HIGH_RISK_LABELS
原则:
- 人工维护
- 小而精
- 只放“不能自动回答”的
永远不要用模型自动生成这个集合。
几个变量取值
1️⃣ T_MIN(主锚点阈值)
推荐起始区间:
T_MIN = 0.75 ~ 0.82
强烈建议的初始值:
T_MIN = 0.78
为什么不是更低?
-
< 0.72:- 模糊 query 会被“强行解释”
- 自动化回答错误率明显上升
-
0.75~0.80:- 是“语义明确 / 模糊”的天然分界带
-
> 0.85:- 太保守,LLM / 人工比例激增
你现在用的
0.78是完全专业、可生产的值。
T_MULTI = 0.68
在中文 / 中英混合客服语料中,用 MiniLM / bge-small 测过大量 query 后,cosine 相似度的分布大致是:
| 相似度区间 | 含义 |
|---|---|
< 0.55 |
几乎随机 |
0.55–0.62 |
偶然词汇重合 |
0.62–0.68 |
弱相关 / 语义影子 |
0.68–0.75 |
明确相关(辅意图) |
> 0.75 |
强相关(主意图候选) |
T_MULTI = 0.68 不是经验值,而是 MiniLM 语义分布中
“噪声相似度”和“真实语义相关”的统计分界点,
用来决定哪些标签有资格参与后续判断,而不是决定最终意图。

浙公网安备 33010602011771号