RAG(检索增强生成)系统-ScoreThreshold

在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

实际建议

  1. 开始时:从0.7开始调整

  2. 评估指标:通过准确率、召回率、F1分数评估

  3. AB测试:不同阈值下的效果对比

  4. 监控:在生产环境中监控阈值效果

ScoreThreshold是平衡检索精度和召回率的关键参数,需要根据具体应用场景和数据特点进行调整。在实际部署中,可能需要为不同类型的查询设置不同的阈值。

相关推荐
思绪无限2 小时前
YOLOv5至YOLOv12升级:木材表面缺陷检测系统的设计与实现(完整代码+界面+数据集项目)
人工智能·深度学习·目标检测·计算机视觉·木材表面缺陷检测
kishu_iOS&AI2 小时前
深度学习 —— 损失函数
人工智能·pytorch·python·深度学习·线性回归
好运的阿财2 小时前
OpenClaw工具拆解之canvas+message
人工智能·python·ai编程·openclaw·openclaw工具
TechubNews2 小时前
新火集团首席经济学家付鹏演讲——2026 年是 Crypto 加入到 FICC 资产配置框架元年
大数据·人工智能
蒸汽求职2 小时前
跨越 CRUD 内卷:半导体产业链与算力基建下的软件工程新生态
人工智能·科技·面试·职场和发展·软件工程·制造
DeepModel2 小时前
通俗易懂讲透 Q-Learning:从零学会强化学习核心算法
人工智能·学习·算法·机器学习
聊点儿技术3 小时前
LLM数据采集如何突破AI反爬?——用IP数据接口实现进阶
人工智能·数据分析·产品运营·ip·电商·ip地址查询·ip数据接口
小兵张健3 小时前
一场大概率没拿到 offer 的面试,让我更坚定去做喜欢的事
人工智能·面试·程序员
2501_940041743 小时前
AI创建小游戏指令词
人工智能·游戏·prompt
AC赳赳老秦3 小时前
OpenClaw二次开发实战:编写专属办公自动化技能,适配个性化需求
linux·javascript·人工智能·python·django·测试用例·openclaw