Retrieval test pagination always reloads the first page in the search app

Retrieval test pagination always reloads the first page in the search app 通常发生在 RAGFlow 搜索应用的检索测试面板中:分页器页码已切换,但结果列表始终停留在第一页,因为分页参数通过 URL 闭包异步更新,请求发出时仍

快速结论:Retrieval test pagination always reloads the first page in the search app 通常发生在 RAGFlow 搜索应用的检索测试面板中:分页器页码已切换,但结果列表始终停留在第一页,因为分页参数通过 URL 闭包异步更新,请求发出时仍读取旧页码。优先排查 useTestChunkRetrieval 与 useTestChunkAllRetrieval 中 page/size 是否覆盖了调用方传入的最新值。

适用环境:Issue 仅确认涉及 RAGFlow 前端代码 web/src/pages/next-search/hooks.ts 与 web/src/hooks/use-knowledge-request.ts;未提供操作系统、Python、CUDA、显卡或依赖版本信息。

最快修复方案:暂无确认的一步修复方案。Issue 给出的验证方向是参照 PR #13720 已在 useTestRetrieval 中实现的修复方式:新增显式的 onPaginationChange 处理函数,将最新的 (newPage, newPageSize) 直接传给 mutation.mutate(),不再依赖 URL 参数闭包。

注意事项:Issue 讨论中的修复属于对现有修复模式的套用建议,应用到上述两个 hook 后尚未在讨论中标注为已验证;web/src/hooks/use-knowledge-request.ts 中的两份同样缺陷代码为未被引用的死代码,修改前需确认影响范围。

问题场景

用户在 RAGFlow 搜索应用的检索测试(retrieval test)面板中执行查询,返回结果超过一页。点击分页器第 2 页或更后面的页码时,页面上的页码视觉上会更新,但 chunk 列表不变化,仍然显示第 1 页的结果。该问题同样存在于 useTestChunkAllRetrieval;而数据集测试界面使用的独立 hook useTestRetrieval 分页正常。

报错原文

Retrieval test pagination always reloads the first page in the search app

原因分析

已确认的根本原因:分页变更处理函数先调用 setPagination(...),通过 URL search params 异步更新页码,随后在同一次渲染中同步调用检索 mutation。此时 URL 尚未更新,mutation 中从 useSetPaginationParams() 闭包读取到的 page 与 pageSize 仍为旧值。并且这两个字段被放在 ...values 展开之后,覆盖了调用方在 values 中传入的最新 page 和 size,导致请求始终查询上一页(常见情况即第 1 页):

retrievalTestFunc({
  ...values,                // contains the freshly selected page and size
  kb_id: values.kb_id ?? knowledgeBaseId,
  page,                     // stale value from the URL closure
  size: pageSize,           // stale value from the URL closure
  tenant_id: tenantId,
});

受影响代码位于 web/src/pages/next-search/hooks.ts 中的 useTestChunkRetrieval 和 useTestChunkAllRetrieval。另有两份相同缺陷的副本位于 web/src/hooks/use-knowledge-request.ts,但没有任何代码引用它们,属于未使用的死代码。

环境排查

  • 确认 RAGFlow 前端代码中 web/src/pages/next-search/hooks.ts 的 useTestChunkRetrieval 与 useTestChunkAllRetrieval 是否将闭包中的 page 和 pageSize 放在 ...values 展开之后。
  • 确认 page 与 size 是否通过 useSetPaginationParams() 从 URL 参数读取,而非直接使用调用方传入的最新值。
  • 检查 web/src/hooks/use-knowledge-request.ts 中是否有同名 hook 副本,以及是否确实无引用。
  • Issue 未提供 Python、CUDA、PyTorch、显卡或节点依赖版本信息,无需据此排查。

解决步骤

  1. 在 web/src/pages/next-search/hooks.ts 中定位 useTestChunkRetrieval 和 useTestChunkAllRetrieval 的检索 mutation 调用。
  2. 参照 PR #13720 在 useTestRetrieval 中采用的修复模式,为这两个 hook 引入显式的 onPaginationChange 处理函数。
  3. 在该处理函数中,将最新的 (newPage, newPageSize) 直接传入 mutation.mutate(),避免在 mutation 中从 URL 闭包读取可能过期的 page 和 size。
  4. 检查请求体中 page 和 size 的赋值顺序,确保闭包旧值不会覆盖调用方传入的最新值;可优先尝试移除展开之后的闭包字段覆盖。
  5. 确认 web/src/hooks/use-knowledge-request.ts 中的死代码副本无引用后,一并修正或移除,避免后续误用。

验证方法

打开一个返回结果超过一页的搜索应用,执行查询后点击第 2 页及后续页码,确认 chunk 列表实际切换为所选页的数据,且请求参数中的 page 和 size 为最新选择值;同时确认数据集测试界面的分页未受影响。

参考来源

infiniflow/ragflow #15869

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 34555

发表回复

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