系列导航

  • 第 0 章 前言:为什么企业 AI 工程师必须掌握 RAGFlow
  • 第 1 章:安装部署与基础配置**——从零跑通第一个 RAG Pipeline
  • 第 2 章:RAGFlow RAGFlow 代码介绍
  • 第 3 章:攻克企业复杂文档——理解 DeepDoc、Naive、MinerU 与 Docling 的区别
    • 第一节 RAGFlow 配置参数全景图与实验结论
    • 第二节 实验Chunk Method (解析方法与布局识别)
    • 第三节 实验Chunk Token Num & Overlap (切片与重叠)
    • 第四节 实验Similarity Threshold (相似度阈值)(本文)
    • 第五节 实验Vector/Keyword Weight (混合搜索权重)
    • 第六节 MinuerBridge安装配置与运行使用
  • 第 4 章:理解 Agentic RAG 核心——定义与低代码实现
  • 第 5 章:工作流编排——构建基于图(Graph)的 RAG
  • 第 6 章:Deep Research 模板应用——部署自动拆解子问题的深度研究智能体
  • 第 7 章:企业级扩展——API 接入与外部工具集成(MCP)
  • 第 8 章:评估与复盘——从"玄学"到量化 RAG 性能指标评测

1. 官方定义与通俗理解

官方定义:用于过滤检索结果的最低分数线,通常基于向量相似度(余弦相似度等)。
通俗理解:这是知识库的 “拒载线”

  • 如果你的知识库里都是干货,阈值可以设低一点。
  • 如果你的知识库里有很多杂质,或者你发现 AI 经常胡言乱语(幻觉),那就把阈值调高,宁可让它说“不知道”,也别让它“瞎胡说”。

2. 核心架构流转图 (Retrieval Filter)

下面的流程图展示了 RAGFlow 如何在检索过程中应用这个“漏斗”:

Recall Logic (rag/nlp/search.py)

No

Yes

用户提问

问题向量化

DB 检索: 召回 Top 1024 个候选块

给每个块打分: Similarity Score

Score >= Threshold?

丢弃该切片

保留为有效切片

二阶段重排 / Top N 截断

发送给大模型生成回答

3. 关键代码位置证明

rag/nlp/search.pyretrieval 函数中:

  • (Line 394): req["similarity"] = similarity_threshold 将参数传给底层的向量引擎(如 Infinity)。
  • (Line 438-439): post_threshold = 0.0 if vector_similarity_weight <= 0 else similarity_threshold 处理了混合搜索下的阈值兼容性。
  • (Line 440): valid_idx = [int(i) for i in sorted_idx if sim_np[i] >= post_threshold] 这里是最后的断头台,不达标的块直接被排除出 valid_idx

4. 实验测试方案:如何感受“水线”的高低?

本实验旨在观察阈值如何平衡 “召回率(Recall)”“准确率(Precision)”
这里使用贴近真实企业业务文档的火电厂知识库。
真实业务里的问题往往不是“完全相关”和“完全无关”的区别,而是:

召回内容都属于同一个业务领域,但有些内容属于运行处置,有些内容属于检修分析。
如果混在一起回答,就会造成职责边界不清。


A. 实验数据源准备

本实验使用一个火电厂业务知识库,知识库中包含两个文档:

  • 运行侧文档火电厂机组运行规程与异常处置手册
  • 检修侧文档火电厂设备检修维护与缺陷闭环管理规定

两个文档都包含“凝汽器真空下降”相关内容。
运行侧文档关注:

  • 运行人员先检查什么;
  • 是否需要降负荷;
  • 循环水泵、真空泵、轴封压力、凝汽器水位等运行参数;
  • 真空严重下降时禁止继续升负荷。

检修侧文档关注:

  • 真空下降的检修原因分析;
  • 真空系统漏空气;
  • 凝汽器管束污染;
  • 低压加热器泄漏;
  • 氦检、灌水查漏、听音、肥皂水查漏等方法。

这里的“噪声数据”不是无关垃圾文档,而是 同领域、强相关、但回答场景不同的文档


B. 参数对比设置

针对同一个问题进行测试:

凝汽器真空下降应该怎么处理?

这个问题故意没有限定:

  • 是运行人员处理;
  • 还是检修人员处理;
  • 是事故初期处置;
  • 还是后续查漏消缺。
    因此,它可以很好地观察不同阈值下,系统是否会把运行处置和检修分析混在一起。
    本次测试设置三组参数:
  1. 宽松组Similarity Threshold = 0.05
  2. 适中建议组Similarity Threshold = 0.30
  3. 极度严格组Similarity Threshold = 0.70

C. 测试结果与预期结论

1. 宽松组:Similarity Threshold = 0.05

在这里插入图片描述
测试现象
系统能够召回运行侧内容,例如:

  • 检查循环水泵运行状态;
  • 检查循环水入口压力;
  • 检查凝汽器循环水进出口温差;
  • 检查真空泵运行状态;
  • 检查轴封供汽压力;
  • 检查凝汽器水位和热井水位;
  • 必要时降低机组负荷;
  • 严禁在真空严重下降时继续升负荷。
    但同时也召回了检修侧内容,例如:
  • 真空系统漏空气;
  • 凝汽器管束污染;
  • 低压加热器泄漏;
  • 氦检;
  • 灌水查漏;
  • 听音;
  • 肥皂水查漏。

结论
0.05 能保证召回,但召回范围偏宽,容易把运行处置和检修分析混在一起。
这说明低阈值并不一定导致完全错误,但会增加弱相关内容进入上下文的概率。


2. 适中建议组:Similarity Threshold = 0.30

在这里插入图片描述

测试现象
系统仍然能够召回运行侧核心内容,包括循环水泵、真空泵、轴封压力、凝汽器水位、低压缸排汽温度、降负荷等处置要求。
同时,系统也保留了部分检修侧原因分析,例如:

  • 循环水流量不足;
  • 真空系统漏空气;
  • 凝汽器水位过高;
  • 真空泵效率下降;
  • 低压加热器泄漏;
  • 凝汽器管束污染。
    但是相比 0.05,它没有继续展开氦检、灌水查漏、听音、肥皂水查漏等具体检修方法。

结论
0.30 能够保留主要相关内容,同时减少部分弱相关检修细节。
对于当前这组火电厂知识库来说,0.300.05 更收敛,也比 0.70 更稳定,可以作为较合适的初始基准值。


3. 极度严格组:Similarity Threshold = 0.70

在这里插入图片描述
测试现象
系统返回:

没有找到

结论
知识库中明明存在相关内容,但由于阈值设置过高,相关 chunk 没有通过过滤,最终导致系统无法召回答案。
这说明 Similarity Threshold 不是越高越好。
阈值过高会降低召回率,甚至出现:

文档中有答案,但系统说没找到。


D. 综合结论

本次测试结果可以总结为:

阈值 现象 结论
0.05 能召回较多内容,但运行处置和检修分析混在一起 召回充分,但边界偏宽
0.30 能召回核心内容,并减少部分检修细节 当前测试中较均衡
0.70 直接返回“没有找到” 阈值过高,漏召回

因此,对于当前企业文档测试知识库:

Similarity Threshold = 0.30

是一个更合理的初始基准值。


5. 总结建议

Similarity Threshold 没有绝对通用的行业标准。
它会受到以下因素影响:

  • embedding 模型;
  • chunk size;
  • chunk overlap;
  • 是否启用混合检索;
  • 是否启用 rerank;
  • Top N 设置;
  • 文档内容是否同质化;
  • 用户问题是否明确;
  • 业务是否允许误答。
    因此,不建议直接套用固定值,而应该基于真实知识库和真实问题做小样本验证。
    结合本次测试,可以采用下面的调参策略:
  • 初期调试:可以先设为 0.05 左右,用来观察系统到底召回了哪些内容。
  • 常规起点:建议从 0.20 - 0.30 开始测试。
  • 专业知识库:例如运行规程、检修规程、安全制度、API 文档,可以尝试 0.40 - 0.50
  • 不建议直接设置过高:例如 0.70,除非已经确认不会造成漏召回。
    对于本次企业知识库,推荐初始值为:
Similarity Threshold = 0.30

后续可以按下面规则微调:

  • 如果回答经常混入检修查漏、拆检、堵管等非当前场景内容,可以提高到 0.40 - 0.50
  • 如果经常出现“文档里有答案,但系统没找到”,应降低到 0.20 - 0.30
  • 如果只是调试召回范围,可以临时使用 0.05
  • 不建议盲目使用 0.70,因为它可能直接过滤掉真实相关内容。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐