快速结论:该问题发生在 RAGFlow 配置了 rerank 模型且数据集中分块带有自动生成问题(question_kwd / question_tks)的场景。由于 rerank_by_model 路径在构建传给 cross-encoder 的文档字符串时遗漏了 question_tks,导致模型重排时完全看不到分块自带的生成问题,从而影响排序效果。优先确认是否使用了 rerank 模型,并检查 rag/nlp/search.py 中 rerank_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.py 中 Dealer 的三条 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.py中rerank_by_model路径(约第 516 行)的 token 列表是否包含question_tks。
解决步骤
- 对比
rag/nlp/search.py中三条 rerank 路径的 per-chunk token 列表:rerank_with_knn(约 462 行):content_ltks + title_tks*2 + important_kwd*5 + question_tks*6rerank(约 494 行):content_ltks + title_tks*2 + important_kwd*5 + question_tks*6rerank_by_model(约 516 行):content_ltks + title_tks + important_kwd(缺少question_tks)
- 在
rerank_by_model路径中将question_tks加入 per-chunk token 列表。修复时注意:与其他两条路径的加权方式(*6)不同,此处应不加权重加入,与title_tks和important_kwd在该路径中的处理方式保持一致。 - 如果不想手动修改代码,可跟踪官方修复 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 模型的文档字符串中包含了分块的生成问题文本。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[bug]: InvokeAI v6.14.0-RC1 Crashed while generating Krea-2 Image](https://www.chat-gpts.plus/wp-content/uploads/2026/09/9444-d6bdc60c-768x403.jpg)
![[Question]: Shared embedded chat URL fails to access documents after logout or when accessed by other users](https://www.chat-gpts.plus/wp-content/uploads/2026/09/15895-cf3f7033-768x403.jpg)
