快速结论:该报错发生在 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 Retrieval 和 Bypass 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中相关代码路径是否存在,行号可能会因版本不同而有偏差。
解决步骤
- 确认问题存在:按复现步骤操作,在触发 search_web 后的模型轮次中检查注入到模型的实际 prompt,确认是否存在多处空的、同名的
source标签。 - 检查是否有已合并的修复:切换到最新 dev 分支或查看是否有针对此问题的 PR 被合并。Issue 作者在
fix/search-web-citation-sources分支实现了修复,可尝试将该分支的改动应用到本地测试。 - 检查相关 Issue:Issue 评论中关联了多个类似报告:#24195(MCP 工具结果被路由到 RAG 引用模板)、#22154(Web 搜索工具引用模板重复)、#21780(RAG 模板重复注入)、#26229(原生 Web 搜索的 RAG 风格内容检索功能请求)。这些可能包含对相关代码路径的补充修复或讨论。
- 临时缓解方案(可优先尝试):如果只是需要避免模型产生猜测性的错误引用,可以尝试在提示词中明确告知模型“当 source 标签内容为空且无法与工具结果明确对应时,不要输出引用”,但这未在 Issue 中验证,仅为权宜之计。
验证方法
修复后,触发 search_web 工具并检查注入模型的下一个上下文字块:每个搜索结果对应的 source 标签应包含可区分的属性(如实际 URL 或与工具 JSON 输出明确对应的 id),且不再出现无法映射的空标签。同时可以观察模型是否能稳定输出与结果对应的正确引用编号,而不是自我怀疑式地猜测引用。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


