[Bug]: Retrieval tool accepts cross_languages in memory mode and silently ignores it

当你在 RAGFlow 的 Agent 里给 Retrieval 工具设置 retrieval_from: "memory" 并同时配置了 cross_languages 时,该参数会被接口接受并持久化,但在内存检索路径中被静默忽略,不会触发跨语言翻译。优先排查你当前使用的是 dataset 路径还

快速结论:当你在 RAGFlow 的 Agent 里给 Retrieval 工具设置 retrieval_from: "memory" 并同时配置了 cross_languages 时,该参数会被接口接受并持久化,但在内存检索路径中被静默忽略,不会触发跨语言翻译。优先排查你当前使用的是 dataset 路径还是 memory 路径。

适用环境:Issue 中确认到的版本为 RAGFlow v0.26.4,涉及 agent/tools/retrieval.py,问题在 main 分支代码中同样存在。Issue 未提供操作系统、Python、CUDA、显卡或依赖版本信息。

最快修复方案:暂无确认的一步修复方案。Issue 讨论中给出的建议是在 _retrieve_memory() 的 query_message 调用前补上与 _retrieve_kb() 一致的 cross_languages 翻译步骤,或在 retrieval_from == "memory" 时隐藏/禁用该参数。这些均属于源码级修改建议,尚未有官方补丁或发版验证。

注意事项:上述补丁会额外引入一次 LLM 调用(dataset 路径实测约 245 tokens、约 1.9 秒),会拉长工具调用耗时并增加成本。若选择隐藏参数的方案,则需确认前端表单与后端 DSL 校验同步修改,否则历史 Agent 中已存的 cross_languages 仍会保留。

问题场景

在 RAGFlow 中搭建 Agent,并向其添加 Retrieval 工具,将检索来源设置为 retrieval_from: "memory" 并选定一个 memory,同时在该工具上设置 cross_languages: ["English"] 后保存 Agent。

通过 GET /api/v1/agents/<id> 读取 DSL 时,cross_languages 会正常出现在配置里,说明参数被接受并持久化。但用非英语提问并查看工具调用前后的 Agent 日志,可以发现没有任何翻译行为发生,表现等同于该参数不存在。

报错原文

[Bug]: Retrieval tool accepts cross_languages in memory mode and silently ignores it

Expected: either the query is translated before the memory search, or the parameter is rejected or visibly disabled for this mode.
Actual: no translation happens and there is no indication that the setting is inert.

原因分析

Retrieval 工具有两条执行路径,由 retrieval_from 决定:

  • retrieval_from == "dataset" 时走 _retrieve_kb(),其中在检索前调用了 cross_languages(...) 完成查询翻译。
  • retrieval_from == "memory" 时走 _retrieve_memory(),该函数从查询格式化直接进入 memory_message_service.query_message(...),没有等价的翻译步骤。

因此 cross_languages 在 memory 路径下被接受、写入 DSL 并在 API 返回,但从未被应用,属于“配置可见但行为静默无效”的问题。Issue 中还提到 memory 的 system_prompt / user_prompt 存在同类问题(已单独提交),即配置被存储却未传给抽取用的 LLM。

环境排查

  • 确认 RAGFlow 版本:Issue 在 v0.26.4 上复现,main 分支代码同样确认存在该问题。
  • 确认目标 Agent 中 Retrieval 工具的 retrieval_from 取值是 memory 还是 dataset;只有 memory 路径会触发本问题。
  • 通过 GET /api/v1/agents/<id> 检查 DSL 中 cross_languages 是否存在及其值,确认参数确实已保存。
  • 检查 Agent 日志中 [ToolCall] invoke 与 [ToolCall] done 之间是否出现额外的 LLM 翻译调用;memory 路径下不会出现。
  • Issue 未提供操作系统、Python、CUDA、显卡与依赖版本信息,这些项目无需作为本问题排查重点。

解决步骤

  1. 先确认问题是否命中 memory 路径:将同一工具改为 retrieval_from: "dataset",在日志中观察 [ToolCall] invoke 与 [ToolCall] done 之间是否新增一次 LLM 调用(Issue 实测约 245 tokens、约 1.9 秒)。若 dataset 路径有翻译而 memory 路径没有,则确认是该缺陷。
  2. 若需要继续使用 memory 检索且必须跨语言,可优先尝试在源码中为 _retrieve_memory() 补上翻译步骤:在 query = self.string_format(query_text, vars) 之后、query_message(...) 调用之前,加入与 _retrieve_kb() 对应的 cross_languages 翻译逻辑,使用已获取的 memory 对象的 tenant_id。cross_languages 函数在该文件中已被导入,一般不需要新增 import。
  3. 如果不希望 memory 检索引入额外 LLM 调用,可优先尝试在 retrieval_from == "memory" 时隐藏或禁用 cross_languages UI 选项,使前端展示、存储配置与运行时行为保持一致。
  4. 修改后重启相关服务,重新加载 Agent 配置,再重复第 1 步的对比验证。

验证方法

  1. 用非英语向 Agent 提问,检查 Agent 日志中 memory 检索工具调用内部是否出现翻译相关调用;如果补丁生效,应在 query_message 之前产生一次翻译调用。
  2. 若采用 UI 禁用方案,确认在 retrieval_from: "memory" 时表单不再展示或不允许编辑 cross_languages,且新保存的 Agent DSL 中不再携带该参数。
  3. 复测 retrieval_from: "dataset" 路径,确认原有翻译行为未受影响、无重复翻译调用。
  4. 确认新增翻译调用带来的 token 与耗时增量在可接受范围内(dataset 路径参考值约为 245 tokens、约 1.9 秒)。

参考来源

infiniflow/ragflow #18417

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 27643

发表回复

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