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 语义分布中
“噪声相似度”和“真实语义相关”的统计分界点,
用来决定哪些标签有资格参与后续判断,而不是决定最终意图。

posted @ 2026-01-10 07:45  向着朝阳  阅读(18)  评论(0)    收藏  举报