在RAG(检索增强生成)系统中,ScoreThreshold(分数阈值)是一个关键参数,用于控制检索结果的质量和相关性。
ScoreThreshold的作用
1. 过滤低质量结果
-
当检索返回多个相关文档/片段时,ScoreThreshold用于过滤掉相关性较低的检索结果
-
通常基于余弦相似度、点积等向量相似度分数
2. 控制检索质量
-
只返回相似度分数高于阈值的文档
-
避免将不相关的信息传递给大模型
常见的阈值设置
python
# 示例:基于向量相似度的检索过滤
import numpy as np
def retrieve_with_threshold(query_vector, documents, threshold=0.7):
"""
query_vector: 查询的向量表示
documents: 文档向量列表
threshold: 相似度阈值
"""
relevant_docs = []
for doc_vector, doc_text in documents:
# 计算余弦相似度
similarity = np.dot(query_vector, doc_vector) / (
np.linalg.norm(query_vector) * np.linalg.norm(doc_vector)
)
# 应用阈值过滤
if similarity > threshold:
relevant_docs.append({
'text': doc_text,
'score': similarity
})
return sorted(relevant_docs, key=lambda x: x['score'], reverse=True)
典型的阈值范围
| 相似度度量 | 常用阈值范围 | 说明 |
|---|---|---|
| 余弦相似度 | 0.6-0.8 | 最常见,取决于语料库和embedding模型 |
| 点积 | 取决于向量标准化 | 需经验调整 |
| L2距离 | 0.2-0.5 | 距离越小越相似 |
如何选择合适的阈值
1. 基于数据分布
python
# 分析相似度分数分布
def analyze_score_distribution(query_vectors, document_vectors):
all_scores = []
for q_vec in query_vectors:
for d_vec in document_vectors:
similarity = np.dot(q_vec, d_vec) / (
np.linalg.norm(q_vec) * np.linalg.norm(d_vec)
)
all_scores.append(similarity)
# 分析统计信息
mean_score = np.mean(all_scores)
std_score = np.std(all_scores)
# 设置阈值(例如:平均值+标准差)
threshold = mean_score + 0.5 * std_score
return threshold
2. 考虑的因素
-
准确性要求:高精度场景用较高阈值
-
覆盖率要求:高召回场景用较低阈值
-
应用场景:
-
QA系统:0.7-0.8
-
语义搜索:0.6-0.7
-
文档推荐:0.5-0.6
-
在RAG中的实际应用
检索阶段
class RAGRetriever:
def __init__(self, threshold=0.7):
self.score_threshold = threshold
def retrieve(self, query, top_k=5):
# 1. 获取查询向量
query_embedding = get_embedding(query)
# 2. 检索相似文档
all_results = vector_db.search(
query_embedding,
top_n=top_k*2 # 检索更多,然后过滤
)
# 3. 应用阈值过滤
filtered_results = [
result for result in all_results
if result['score'] > self.score_threshold
]
# 4. 返回top-k
return filtered_results[:top_k]
动态阈值调整策略
python
def adaptive_threshold_retrieval(query, vector_db, initial_threshold=0.7):
# 尝试不同阈值
thresholds = [0.6, 0.7, 0.8]
best_results = []
for threshold in thresholds:
results = vector_db.similarity_search_with_score(
query,
k=3,
score_threshold=threshold
)
if results: # 如果有结果
best_results = results
break
return best_results
实际建议
-
开始时:从0.7开始调整
-
评估指标:通过准确率、召回率、F1分数评估
-
AB测试:不同阈值下的效果对比
-
监控:在生产环境中监控阈值效果
ScoreThreshold是平衡检索精度和召回率的关键参数,需要根据具体应用场景和数据特点进行调整。在实际部署中,可能需要为不同类型的查询设置不同的阈值。