2731 字
约 9 分钟
4
RAG 中如何设计检索结果的置信评分机制?

RAG 中如何设计检索结果的置信评分机制?

在 RAG 系统里,我们经常会遇到一个问题:

检索出来的这段内容,到底有多可信?

比如用户问:

Redis 默认端口是多少?

检索系统返回了 5 个 Chunk。

虽然它们都被检索出来了,但实际上相关程度可能完全不同。

所以一个比较实用的做法,就是给每个检索结果计算一个:

Confidence Score,置信评分。

这个分数可以用来决定:

哪些内容可以传给 LLM

哪些内容只能作为辅助参考

哪些内容应该直接过滤掉

我自己比较推荐的基础方案,就是:

向量相似度
+
关键词匹配度

这两个指标结合起来,已经能够覆盖很多 RAG 场景。


一、为什么不能只看向量相似度?

向量检索擅长的是:

判断两段文本在“语义上”是否相似。

例如用户问:

Redis 为什么这么快?

文档写的是:

Redis 的数据主要存储在内存中,
因此能够减少磁盘 IO。

虽然两个句子里面几乎没有多少相同关键词,但语义明显相关。

Embedding 模型通常能够识别这种关系。

所以:

向量相似度非常适合判断语义相关性。

但是它有一个问题。

有些文本:

看起来语义相近,但实际上并不能回答用户的问题。

例如用户问:

Redis 默认端口是多少?

结果检索到了:

Redis 是一种高性能内存数据库。

它和 Redis 这个主题非常相关。

但是:

它根本没有回答“端口是多少”。

所以只依赖向量相似度,有时候会出现:

主题相关
≠
答案相关

二、为什么还要加入关键词匹配?

关键词匹配可以补上这个缺点。

例如用户问:

ERROR_CODE_1045 是什么意思?

这类问题里面:

ERROR_CODE_1045

本身就是一个非常强的关键词。

如果某个文档恰好包含:

ERROR_CODE_1045

那么它很可能比一个“语义大概相似”的文档更加可靠。

关键词匹配尤其适合:

错误码

产品型号

订单编号

接口名称

类名

函数名

专有名词

数字

版本号

所以可以简单理解成:

Vector Similarity
负责判断:

“意思像不像?”

Keyword Match
负责判断:

“关键东西对不对?”

两者结合通常比单独使用一个指标更加稳定。


三、最简单的置信评分公式

可以设计一个很简单的评分公式:

Confidence Score
=
0.7 × Vector Similarity
+
0.3 × Keyword Match Score

例如某个 Chunk:

Vector Similarity = 0.90

Keyword Match = 0.80

那么:

Confidence
=
0.7 × 0.90
+
0.3 × 0.80

= 0.87

最终:

Confidence = 87%

于是可以把它定义成:

High Confidence

四、为什么我更建议向量相似度权重大一点?

普通自然语言问答中,用户和知识库通常不会使用完全相同的表达。

例如用户问:

这个产品可以退吗?

知识库可能写:

消费者可以在购买后的 14 天内申请退款。

关键词:

退
退款

可能只匹配到一部分。

但语义明显高度相关。

因此普通 RAG 中,我通常会从这样的权重开始:

Vector Similarity:70%

Keyword Match:30%

也就是:

Confidence =
0.7 × Semantic Score
+
0.3 × Keyword Score

然后再根据实际 Evaluation 数据调整。


五、不同场景,权重应该不同

70/30 并不是固定规则。

如果系统主要处理:

FAQ
产品说明
内部知识库
自然语言问答

可以更偏向向量:

Vector:70%
Keyword:30%

但如果系统主要查询:

错误码
设备型号
SKU
API
订单号
版本号

关键词就应该更重要,例如:

Vector:40%

Keyword:60%

因为对于:

ERR_10241

这种东西来说:

精确匹配往往比“语义相似”更加重要。

所以权重应该由业务场景决定,而不是写死。


六、一个非常重要的问题:先做分数归一化

这里特别容易踩坑。

假设:

Vector Similarity = 0.82

但是 BM25 关键词分数可能是:

BM25 Score = 13.7

这两个数字不能直接:

0.82 + 13.7

因为它们根本不是一个量纲。

所以最好先把两个分数转换成:

0 ~ 1

例如:

Vector Score
0 ~ 1

Keyword Score
0 ~ 1

然后再计算:

Confidence
=
α × Vector Score
+
β × Keyword Score

并且:

α + β = 1

这一步叫:

Score Normalization,分数归一化。


七、关键词匹配度应该怎么算?

最简单的方法是:

看用户 Query 中的重要关键词,有多少出现在文档里。

例如:

Query:

Redis 默认端口是多少?

提取关键词:

Redis
默认端口

某文档包含:

Redis 默认监听端口为 6379。

两个关键词都匹配。

那么:

Keyword Score = 1.0

如果只匹配:

Redis

没有匹配:

默认端口

那么可以得到:

Keyword Score = 0.5

当然,实际项目里还可以使用:

BM25
TF-IDF
Exact Match
Token Match

来计算更加合理的关键词分数。


八、不是所有关键词都应该一样重要

还有一个非常重要的优化。

例如:

Redis 默认端口是多少?

这里:

是多少
默认

其实没有那么重要。

真正关键的是:

Redis
端口

所以最好给关键词设置权重。

例如:

Redis        0.4
端口         0.4
默认         0.2

如果某个文档同时命中:

Redis
+
端口

即使没有“默认”这个词,它仍然可以得到较高分数。

这比简单计算:

命中几个词 / 总词数

更加合理。


九、可以把置信度分成三个等级

最终得到 Confidence Score 后,不一定需要直接把:

0.873

暴露给模型。

可以转成更加直观的等级。

例如:

Confidence ≥ 0.85
→ High Confidence

0.70 ≤ Confidence < 0.85
→ Medium Confidence

Confidence < 0.70
→ Low Confidence

然后处理策略可以设计成:

High
↓
直接进入 Context

Medium
↓
作为补充信息

Low
↓
直接过滤

整体流程:

Retriever
   ↓
Vector Score
   +
Keyword Score
   ↓
Confidence Score
   ↓
───────────────

High
→ 保留

Medium
→ 谨慎使用

Low
→ 过滤

这样整个 RAG Pipeline 会更加可控。


十、一个完整例子

用户问题:

Redis 默认端口是多少?

检索到了三个文档。

Document A

Redis 默认端口是 6379。

评分:

Vector = 0.93

Keyword = 1.00

计算:

Confidence
=
0.7 × 0.93
+
0.3 × 1.00

= 0.951

结果:

95.1%
High Confidence

Document B

Redis 是一种高性能内存数据库。

评分:

Vector = 0.84

Keyword = 0.50

最终:

Confidence
=
0.7 × 0.84
+
0.3 × 0.50

= 0.738

结果:

73.8%
Medium Confidence

Document C

MySQL 默认端口是 3306。

评分:

Vector = 0.55

Keyword = 0.30

最终:

Confidence = 47.5%

结果:

Low Confidence

所以最终真正传给模型的,可能只有:

Document A

或者:

Document A
+
Document B

而 Document C 直接被过滤。


十一、不要把 Confidence 当成“事实正确率”

这里有一个概念非常重要。

我们计算出来的:

Confidence = 92%

并不意味着:

这段文档有 92% 的概率是正确的。

它真正表达的是:

根据当前检索信号,这个文档和用户问题具有较高的匹配可信度。

因为:

向量相似度
+
关键词匹配

主要衡量的是:

Retrieval Relevance

而不是:

Factual Correctness

文档本身完全有可能是错误或者过期的。

所以更准确的名字其实可以叫:

Retrieval Confidence

也就是:

检索置信度。


十二、以后还可以继续增加其他信号

如果系统以后变复杂,可以在这两个基础指标上继续增加:

Vector Similarity

Keyword Match

Reranker Score

Source Authority

Document Freshness

例如:

Confidence
=
40% Vector Similarity

+ 20% Keyword Match

+ 25% Reranker Score

+ 10% Source Authority

+ 5% Freshness

这样就从:

“这个文档和问题像不像?”

逐渐升级成:

“这个文档是否相关、可靠、权威并且没有过期?”

这会更加接近真正生产级的 RAG 置信评分体系。


十三、实际项目建议怎么做?

如果现在系统还不是特别复杂,我反而不建议一开始设计十几个指标。

先使用:

Vector Similarity
+
Keyword Match

完全足够。

可以从:

Confidence
=
0.7 × Vector
+
0.3 × Keyword

开始。

然后通过真实测试集观察:

High Confidence
里面有多少是真的相关?

Low Confidence
里面有没有大量正确结果被误杀?

再慢慢调整:

权重

Threshold

High / Medium / Low 分界线

而不是凭感觉设置。


总结

RAG 中设计检索置信评分,一个简单又实用的方法就是:

语义相关性
+
关键词相关性

也就是:

Vector Similarity
+
Keyword Match

两者分别解决:

Vector Similarity
→ 意思像不像?

Keyword Match
→ 关键内容对不对?

然后:

Normalize
↓
Weighted Score
↓
Confidence Score
↓
High / Medium / Low
↓
过滤低质量 Context

对于普通 RAG 项目,可以先从:

Vector Similarity:70%

Keyword Match:30%

开始。

但最重要的并不是这个 70/30。

真正重要的是:

通过真实 Evaluation Dataset 去校准权重和阈值。

最终,一个好的检索置信评分机制,并不是单纯告诉我们:

“这个结果分数是多少。”

而是帮助整个 RAG 系统做一个更重要的决定:

这段内容,到底值不值得交给大模型。

RAG 中如何设计检索结果的置信评分机制?
http://www.clxhxhhr.top/posts/576/
作者
clxstart
发布于
2026-09-11
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。