issue: Native search_web citations unmappable — context block emits empty tags all named “search_web”

该报错发生在 Open WebUI 内置 search_web 工具配合原生函数调用(Native Function Calling)时,注入给模型的 上下文块全是空的、同名的标签,模型无法将 id 与实际搜索结果对应,导致引用混乱。优先排查 search_web 工具结果中是否缺少可映射的唯一标识

快速结论:该报错发生在 Open WebUI 内置 search_web 工具配合原生函数调用(Native Function Calling)时,注入给模型的 上下文块全是空的、同名的标签,模型无法将 id 与实际搜索结果对应,导致引用混乱。优先排查 search_web 工具结果中是否缺少可映射的唯一标识,以及相关代码路径中引用源的构建逻辑。

适用环境:Open WebUI dev 版本(commit 0cf48a0),Docker 安装方式,Web Search Engine 配置为 exa。Issue 中未确认操作系统、浏览器、Ollama 版本、Python、CUDA 或显卡信息。

最快修复方案:暂无确认的一步修复方案。Issue 作者提及已在分支 fix/search-web-citation-sources 实现修复,但该修复尚未合并到主线,也未经过官方验证。

注意事项:开发者明确指出,不应每次都将工具引用追加到完整历史中,因为那会导致上下文快速膨胀。当前覆盖最新用户消息的行为是有意设计的,目的是支持极小的本地模型或老旧模型。此问题的修复需要考虑保留这一设计约束。

问题场景

用户在 Docker 中运行 Open WebUI dev 版本(0cf48a0),在管理设置中将 Web Search Engine 配置为 exa 并启用 API 密钥,保持启用 Bypass Embedding and RetrievalBypass Web Loader。当使用支持原生函数调用的模型发送触发内置 search_web 工具的消息后,模型收到注入的 RAG 上下文块,其中包含 8 个空的、同名 source 标签。

报错原文

issue: Native search_web citations unmappable — context block emits empty <source> tags all named "search_web"

The model receives a context block like:
<source id="1" name="search_web" resource-id="search_web"></source>
<source id="2" name="search_web" resource-id="search_web"></source>
...
<source id="8" name="search_web" resource-id="search_web"></source>

原因分析

根据 Issue 中的代码路径分析,问题涉及多个层面的嵌套逻辑:

  • get_citation_source_from_tool_result 中 search_web 分支将所有结果包装成一个单一的引用源,使用工具级别的 source(name 固定为 search_web),而每个结果实际的 title/link 只存于 metadata 中,从未被渲染到 source 标签里。
  • get_source_context 只从 source['source']['name'] 渲染 name(永远是 search_web),忽略 meta['name']meta['url']
  • 原生工具调用循环以 include_content=False 构建上下文(有意的设计,避免重复工具消息内容),导致每个标签 body 为空。
  • 默认 RAG 模板指示模型“仅当 source 标签包含显式 id 属性时以内联引用格式 [id] 引用”。由于所有标签都有 id,模板强制模型输出无法映射的引用

Issue 评论中维护者指出,id 编号本身理论上就是映射——工具结果携带相同的编号。但实际测试发现:

  • search_web 返回结果中不包含编号(builtin.py 第 323 行),引用分支只存储 source/name/url。
  • source id="N" 是由一个共享的插入顺序计数器生成的(middleware.py 第 951-953 行),该计数器会先为文件/RAG 源编号,且跨迭代持续累加。例如:单独 3 个结果 → 1,2,3;加上 1 个附件文件 → 2,3,4;第二轮(2 个文件源)→ 3,4,5 然后是 6,7,8。
  • 因此 id 与实际 search_web 结果的一一对应关系被破坏,模型无从验证。

环境排查

  • 确认 Open WebUI 版本是否为 dev @ 0cf48a0(可通过 git log 或版本页面查看)。
  • 确认安装方式为 Docker。
  • 确认 Web Search Engine 配置为 exa,且 API 密钥有效。
  • 确认模型是否支持原生函数调用(Native Function Calling)。
  • 检查 backend/open_webui/utils/middleware.py 中相关代码路径是否存在,行号可能会因版本不同而有偏差。

解决步骤

  1. 确认问题存在:按复现步骤操作,在触发 search_web 后的模型轮次中检查注入到模型的实际 prompt,确认是否存在多处空的、同名的 source 标签。
  2. 检查是否有已合并的修复:切换到最新 dev 分支或查看是否有针对此问题的 PR 被合并。Issue 作者在 fix/search-web-citation-sources 分支实现了修复,可尝试将该分支的改动应用到本地测试。
  3. 检查相关 Issue:Issue 评论中关联了多个类似报告:#24195(MCP 工具结果被路由到 RAG 引用模板)、#22154(Web 搜索工具引用模板重复)、#21780(RAG 模板重复注入)、#26229(原生 Web 搜索的 RAG 风格内容检索功能请求)。这些可能包含对相关代码路径的补充修复或讨论。
  4. 临时缓解方案(可优先尝试):如果只是需要避免模型产生猜测性的错误引用,可以尝试在提示词中明确告知模型“当 source 标签内容为空且无法与工具结果明确对应时,不要输出引用”,但这未在 Issue 中验证,仅为权宜之计。

验证方法

修复后,触发 search_web 工具并检查注入模型的下一个上下文字块:每个搜索结果对应的 source 标签应包含可区分的属性(如实际 URL 或与工具 JSON 输出明确对应的 id),且不再出现无法映射的空标签。同时可以观察模型是否能稳定输出与结果对应的正确引用编号,而不是自我怀疑式地猜测引用。

参考来源

open-webui/open-webui #29569

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21677

发表回复

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