[Bug]: rerank_by_model drops question_tks, so a configured rerank model never sees chunk questions

该问题发生在 RAGFlow 配置了 rerank 模型且数据集中分块带有自动生成问题(question_kwd / question_tks)的场景。由于 rerank_by_model 路径在构建传给 cross-encoder 的文档字符串时遗漏了 question_tks ,导致模型重排时完

快速结论:该问题发生在 RAGFlow 配置了 rerank 模型且数据集中分块带有自动生成问题(question_kwd / question_tks)的场景。由于 rerank_by_model 路径在构建传给 cross-encoder 的文档字符串时遗漏了 question_tks,导致模型重排时完全看不到分块自带的生成问题,从而影响排序效果。优先确认是否使用了 rerank 模型,并检查 rag/nlp/search.pyrerank_by_model 路径的 token 列表是否包含 question_tks

适用环境:RAGFlow v0.26.4(Issue 中确认的镜像版本),workspace commit 为 68f826082。不特定于操作系统或硬件,适用于所有启用了问题生成且配置了 rerank 模型的数据集。

最快修复方案:暂无确认的一步修复方案可直接应用。Issue 作者已提交修复 PR(#18473),该 PR 在 rerank_by_model 路径的 per-chunk token 列表中加入 question_tks(不加权重),并补充了 5 个 AST 回归测试。在官方发布包含该修复的版本前,可优先尝试升级到包含 PR #18473 的代码版本。

注意事项:修复方案中 question_tks不加权重加入的,与另外两条路径的 *6 加权不同。这是因为 rerank_by_model 路径的 token 会拼成单个文档字符串交给 cross-encoder 打分,重复字段反而会干扰模型自身的评分。如果自行修改代码,不要照搬 *6 的方式。

问题场景

在 RAGFlow 中,当满足以下两个条件时触发:

  • 数据集开启了问题生成功能,分块带有 question_kwd / question_tks 字段;
  • 在检索或聊天设置中配置了 rerank 模型。

此时用户提出的问题如果与分块自动生成的问句措辞相近、但与分块内容本身的词汇重合度低,该分块的排名会比未配置 rerank 模型时更低,因为生成的问题从未进入 reranker 的评分过程。

报错原文

[Bug]: rerank_by_model drops question_tks, so a configured rerank model never sees chunk questions

实际行为中并非出现报错弹窗,而是逻辑缺陷:rag/nlp/search.pyDealer 的三条 rerank 路径里,rerank_by_model 的 token 列表为 content_ltks + title_tks + important_kwd,缺少 question_tks

原因分析

根本原因是代码演进中的遗漏,而非有意为之:

  • rerank_by_model 路径于 2024-05-29 由提交 614defec2(#969 “add rerank model”)引入;
  • question_tks 字段于 2024-12-05 由提交 56f473b68(#3875 “Feat: Add question parameter to edit chunk modal”)引入,该提交把 question_kwd / question_tks 加入到了获取的源字段列表和 rerank() 的 token 列表中,但从未修改已经存在了六个月的 rerank_by_model

git show 56f473b68 -- rag/nlp/search.py 显示变更只涉及字段列表和 rerank() 内的一行 tks = ... 代码。字段虽然从索引中取回(rag/nlp/search.py:163),但 rerank_by_model 中该值被直接丢弃。

更关键的是,在 rerank_by_model 路径中,ins_tw 不仅用于计算词项相似度,还被拼成文档字符串交给 rerank 模型打分:

docs = [remove_redundant_spaces(" ".join(tks)) for tks in ins_tw]

tksim = self.qryr.token_similarity(keywords, ins_tw)
vtsim, _ = rerank_mdl.similarity(query, docs)

因此生成的问题被同时排除在词项相似度评分和 cross-encoder 的文本之外。而检索查询对 question_tks^20 有最高的字段加权(rag/nlp/query.py:37),检索阶段把生成问题视为最强信号,模型重排阶段却将其丢弃,前后逻辑不一致。

环境排查

  • 确认 RAGFlow 镜像版本是否为 v0.26.4(Issue 中确认的版本);
  • 确认 workspace commit ID 是否为 68f826082 或在 56f473b68 之后、修复 PR 合并之前的版本;
  • 检查数据集是否启用了问题生成功能,分块是否带有 question_kwd / question_tks 字段;
  • 确认检索/聊天设置中是否配置了 rerank 模型;
  • 检查 rag/nlp/search.pyrerank_by_model 路径(约第 516 行)的 token 列表是否包含 question_tks

解决步骤

  1. 对比 rag/nlp/search.py 中三条 rerank 路径的 per-chunk token 列表:
    • rerank_with_knn(约 462 行):content_ltks + title_tks*2 + important_kwd*5 + question_tks*6
    • rerank(约 494 行):content_ltks + title_tks*2 + important_kwd*5 + question_tks*6
    • rerank_by_model(约 516 行):content_ltks + title_tks + important_kwd(缺少 question_tks
  2. rerank_by_model 路径中将 question_tks 加入 per-chunk token 列表。修复时注意:与其他两条路径的加权方式(*6)不同,此处应不加权重加入,与 title_tksimportant_kwd 在该路径中的处理方式保持一致。
  3. 如果不想手动修改代码,可跟踪官方修复 PR #18473 的合并状态,升级到包含该修复的版本。该 PR 还补充了 5 个 AST 回归测试(test/unit_test/rag/nlp/test_rerank_by_model_question_tks.py),验证 question_tks 被正确提取并包含在 per-chunk token 列表中。

验证方法

  • 通过 Issue 中提供的确定性复现脚本(针对 rag/nlp/search.py 的单元测试,使用 MagicMock 模拟)验证修复前 5 个回归测试中有 3 个失败,修复后全部通过;
  • 在真实环境中,用与分块生成问题措辞相近但与正文词汇重合度低的问题进行检索,对比修复前后配置 rerank 模型时的分块排名;
  • 确认 rerank_by_model 路径传给 reranker 模型的文档字符串中包含了分块的生成问题文本。

参考来源

infiniflow/ragflow #18472 — [Bug]: rerank_by_model drops question_tks, so a configured rerank model never sees chunk questions

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21235

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注