OpenClaw 联网搜索改造:不靠外挂,直接调模型内嵌能力
微信里的个人助手是 OpenClaw 接着云端大模型搭的,日常问答都挺顺手,唯独碰到时效性问题就露馅。问它一只股票的收盘价,它给出的数字往往是训练数据截止前后的旧货;问天气更是直接坦白自己离线。给它补上搜索能力,主流的路子都是外挂工具。后来翻阿里云百炼的文档才发现,其实根本不用这么绕:百炼在 OpenAI 兼容的 Chat Completions 协议里原生支持联网搜索,搜索发生在模型服务端,费用直接并进模型调用的账单。
这些外挂方案——自己接入 Brave 和 Tavily 这类搜索 API,给助手装 skill,挂一个 MCP server,或者用眼下流行的 harness 工具把检索、抓取、总结整套流程编排起来——共通点是搜索发生在模型外面,接入、限流、维护、计费都落在自己这边,工具链越叠越厚。我的做法反着走:不外挂任何搜索组件,直接调用模型内嵌的联网搜索能力,百炼在服务端把网搜完,结果拼进上下文由模型自己整合,调用方只是在请求里多传几个参数。
请求是 OpenClaw 发的,参数怎么进请求体就是关键。OpenClaw 给模型配置留了一个 extra_body 字段,翻源码确认它会用 Object.assign 把这里的内容整个合并进请求体顶层,等于一条透传通道。于是把 enable_search 打开,配上 search_options 里的 forced_search 强制每条消息都搜,search_strategy 选 max 档多源深搜,再打开垂域搜索扩展,全走 extra_body 塞进去。顺带发现一个坑:OpenClaw 内置的原生 web_search 注入只对 OpenAI 官方端点生效,阿里云端点走不了那条路,extra_body 是唯一正确的入口。
只改请求层还不够,实测发生过模型拿到搜索结果却当没看见的情况。真正跑通是把配置想成三层对齐——请求层负责让搜索发生,提示词层负责让模型尊重搜索结果,服务端负责执行。AGENTS.md 里原本写着不得联网搜索,得删掉换成硬规矩:时效类问题必须以搜索结果作答、注明数据日期、“最新类”问题要多角度交叉核验、不确定就不断言;至于 SOUL.md,把身份从离线助手改成联网助手。改配置要重启网关,改提示词文件不用,新会话即生效。
验证很直接,问阿里股价,回来的是 9 月 18 日的收盘价 113.24 美元;问北京天气,除了当日数据还带上了行政区差异和农历宜忌,说明 max 策略和垂域数据源都真的在工作。最直观的变化落在两头:实时数据的获取从“无从谈起”变成“有据可查”,事实类问答的准确率也随之提高——模型不再只凭训练时的记忆作答,而是引用搜回来的新鲜信源,答错和答旧的概率都小了一圈。后来又做了一轮增强,把 tools.profile 从 minimal 切到 coding,让模型能用 web_fetch 打开网页原文而不是只看搜索摘要,同时 deny 掉 exec 和 write 这类高危工具,保住聊天助手的安全边界,再在 AGENTS.md 里固化一条调研 SOP:搜索定位信源、读原文核验、双来源交叉、按结论加依据加来源日期作答。效果对比很说明问题,同样是问智谱上周发布了什么,改前答“没有新模型”,改后准确找出 9 月 18 日发布的 GLM-5.3-FlashX 并注明来源。
账单方面,max 策略的搜索费是每千次 4 元,而且是一项独立计费,阿里云的 Token 资源包不覆盖;搜索结果拼进上下文带来的增量 Token 和模型本身的输入输出倒是都能走资源包抵扣。个人助手每天百条以内的用量,每月自付的成本大致几元,大头是搜索策略费。限制也记下来备忘:强制搜索让闲聊也慢上十几秒,嫌慢可以删掉 forced_search 交给模型自行判断;角标引用只在 DashScope 原生协议下开得了,而 OpenAI 兼容方式无解,只能靠提示词要求注明数据日期来替代。
整套改动集中在三个文件和一次 30 到 60 秒的网关重启,改完发消息验证,前后不过一个晚上。现在微信里问天气、问股价,答案后面都带着数据日期,偶尔慢上十几秒,那是在后台把网搜完了才回话。真正的验收要等账单:费用按天出账,小额还有延迟,过几天去费用中心翻百炼那一栏,核对一下实付数字,这层联网能力才算彻底交割清楚。