2. 为什么默认搜索总觉得“不够用”?先搞清楚痛点在哪
3. 方案一:专为Agent而生的轻量级搜索API
4. 方案二:老牌通用搜索接口,胜在生态成熟
5. 方案三:聚合型搜索方案,拿来即用
6. 方案四:本地模型与混合检索的进阶玩法
7. 四个方案怎么选?我的选型思路和效果评估
8. 实战配置参考:OpenClaw与搜索工具对接的完整配置
9. 常见问题与排查思路速查
先说明一下:这篇博文里的方案配置和对比,都是我在OpenClaw这类Agent框架上实际试过的路子。OpenClaw是最近社区里热度很高的一个Agent执行环境,核心特点是技能(Skill)可插拔、工具调用方便、支持本地模型接入,所以很多人拿它来做自动化搜索、信息整理、内容抓取这类活儿。但真跑起来就会发现,OpenClaw自带的搜索能力往往只管“能搜”,不管“搜得好”——返回结果里噪音多、时效差、内容不精炼,最后喂给大模型做总结时,输出质量也就跟着拉胯了。
我写这篇东西的出发点很直接:把我在OpenClaw上打磨搜索质量的几种做法摊开讲,重点对比4个主流网络搜索方案,说清楚各自适合什么场景、配置上有什么讲究、哪些坑我踩过。不管你是刚把OpenClaw跑起来的新手,还是已经折腾过一段时间、想让搜索输出更干净的老玩家,这份对比应该都能给你一些可以直接落地的参考。我只讲自己实测过的内容,不堆参数、不复制文档,尽量说人话。
在进入具体方案之前,先解决一个基本问题:OpenClaw到底用什么搜索?
OpenClaw本身不是一个搜索引擎,它是个执行框架——通过你配置好的搜索工具(Search Tool)去调用外部搜索能力,然后把结果塞给大模型做进一步处理。换句话说,搜索质量的好坏,一半取决于你用哪个搜索服务,一半取决于你怎么配置它的参数、怎么清洗它的结果。
这就像你请了个助理帮你查资料,助理本身不生产知识,它得去图书馆、数据库、网上找。你给助理开的“权限”越大、告诉它的“查法”越具体,它拿回来的东西就越有用。反过来,助理只会用最笨的浏览器乱搜一通,你拿到手的自然是一堆乱七八糟的网页标题。
所以,提高OpenClaw搜索内容的质量,核心就两件事:选对搜索源,以及调好搜索行为。下面这套对比就是围绕这两件事展开的。
2. 为什么默认搜索总觉得“不够用”?先搞清楚痛点在哪
我在初版配置OpenClaw搜索时,用的是开发者文档里默认给的那个Web Search工具。当时跑了个很常见的需求:让Agent帮忙搜集某款开源框架近三个月的社区动态和技术演进。结果返回的内容让我哭笑不得——排在前面的全是SEO堆词的低质站点,一些真正的技术讨论串反而沉在第三四页,而且很多文章发布时间是几个月前的旧闻,Agent却把它们当“新鲜事”写进了总结。
这件事让我意识到,OpenClaw默认搜索的问题不是“不能搜”,而是搜索结果的相关性、时效性、结构化程度都满足不了Agent后续分析的需求。具体拆开看,痛点主要有四个。
第一,底层索引质量参差不齐。OpenClaw默认走的搜索服务真正覆盖的页面范围有限,对技术社区、GitHub、Reddit这类深度内容源的抓取和更新往往滞后。你让它搜“XX框架最新roadmap”,它可能给你返回一堆聚合站、转载站的页面,就是找不到源头仓库里的原始讨论。这种“二手信息”喂给大模型后,模型照着写出来的东西经常是错的和过时的。
第二,结果结构太“原始”。默认搜索返回的通常就是标题、链接、一小段摘要。这对人肉浏览够用,但对Agent来说信息密度太低了。大模型要判断“这段内容到底是讲什么的、值不值得采信”,光靠几十个字的摘要根本不够。这就是为什么很多人在OpenClaw上让Agent做深度调研时,经常看到它一本正经地引用一些不相关的页面——不是模型傻,是输入信息本身就缺乏足够的上下文。
第三,没有搜索意图的二次加工。默认工具基本是“关键词进、结果出”,不会对查询词做语义理解、不会自动做同义扩展,更不会把问题拆成多个子查询去并行搜。举个例子,你想了解“OpenClaw的安卓部署方式”,默认搜索会老老实实去匹配“OpenClaw 安卓 部署”,但忽略了用户真实意图里可能包含“Termux”“手机运行Agent”“本地模型调用”这些潜在分支,导致出来的结果都是泛泛的安装教程。
第四,缺少内容级清理。网页里可能满是导航、广告、弹窗、无关推荐,这些东西对搜索引擎排序无碍,但对Agent的内容分析来说是纯粹的噪音。默认搜索不会帮你去掉这些杂质,最终大模型要在一堆噪音里大海捞针,输出质量自然不稳定。
这四个痛点叠加在一起,结论就很清晰了:如果你只是偶尔搜一两条信息,默认搜索凑合用;但只要你让OpenClaw持续地做调研、竞品监控、选品分析这类依赖稳定信息源的工作,就必须换方案或者至少做一层深度配置。
我后面要对比的4个方案,本质上都是在不同层面解决上述痛点。有的解决了索引质量问题,有的解决了结果结构化问题,有的解决了老信息时效的问题,各有取舍。
3. 方案一:专为Agent而生的轻量级搜索API
先说我最推荐、也是目前OpenClaw社区里用得最多的方案:用Tavily Search API替换掉默认搜索。Tavily这个服务本身就是冲着“LLM Agent专用搜索”这个定位去的,它解决的问题正好是上文说的第二、第三个痛点——返回给大模型的不是一堆原始链接,而是经过提取和整理的摘要性内容,并且每次搜索都附带内容相关度和时效评分。
3.1 为什么它适合OpenClaw
Tavily的搜索结果里,每一条都会包含title、url、content(提炼后的正文片段)和score(相关性评分)。这意味着大模型拿到的已经是“半成品”——有来源、有摘要、有评分。OpenClaw的Skill机制可以非常方便地把它封装成一个自定义工具,我在配置里给它的定位就是“默认搜索的上位替代”,凡是Agent需要查外部资料时都优先走这个工具。
另一个很实在的好处是,Tavily支持搜索时间范围限定。它的API参数里有个days字段,可以控制只返回最近7天、30天或90天的结果。这个功能对“搜集最新动态”这类任务简直救命,能直接从源头屏蔽掉那些陈旧内容,省得Agent拿半年前的文章当新闻。
3.2 配置要点与实操参数
Tavily的接入方式很简单,注册拿到API Key后,在OpenClaw的技能配置文件里加一个搜索工具定义。我习惯这样设置参数:
max_results:控制在5到8之间。太少信息量不够,太多噪音大,5到8是Agent做总结时比较舒服的区间。search_depth:选advanced。基础模式返回的摘要太浅,advanced模式会抓取并理解更多页面内容,搜索质量提升非常明显。days:按任务类型动态设置,查新闻资讯用7,查技术趋势用30,查背景资料可以不限。include_raw_content:这个看需求,如果需要Agent做深度分析,可以打开,但响应会慢一些,token消耗也会上来。
我在OpenClaw里实际配置的代码大致是这样(简化版):
# openclaw skill config: tavily_search import requests def tavily_search(query: str, days: int = 30, max_results: int = 5) -> list: api_key = "你的key" url = "https://api.tavily.com/search" payload = { "api_key": api_key, "query": query, "search_depth": "advanced", "include_answer": True, "max_results": max_results, "days": days } resp = requests.post(url, json=payload).json() return resp.get("results", [])3.3 这个方案的优点和局限
优点前面说过了:结果结构化程度高、支持时效筛选、就是冲着Agent场景设计的。还有一个容易被忽略的优势是,它对中文内容支持也还可以,虽然索引不如专门的中文搜索引擎全,但配合高级搜索模式,搜技术类中文内容基本够用。
局限也比较明显:免费额度有限。Tavily免费版每个月只有大概1000次API请求,日常调试和轻量使用没问题,但如果你的OpenClaw跑的是高频监控类任务,比如每小时查一轮竞品动态,很快就会把额度烧完。这时候就得考虑付费,或者用我后面要说的方案二来分流。
再有一个坑:Tavily对非英语内容的搜索优化还是比英文差一截。搜英文技术资料时体验很顺滑,但换成中文长尾词,偶尔会返回一些不相关的结果,相关性评分也普遍偏低。我的处理办法是在查询词里补上英文关键词,或者让Agent先翻译查询意图再执行搜索,效果会好不少。
4. 方案二:老牌通用搜索接口,胜在生态成熟
第二个要说的方案,是接入Brave Search API。Brave这个搜索引擎的特点是独立索引、不做爬虫聚合、强调隐私,它的索引库跟Google、Bing不完全一样,所以经常能搜到一些其他引擎搜不到的技术长尾内容。对OpenClaw这种Agent工具来说,它最大的价值在于API接口非常稳定、返回数据结构清晰、免费配额比Tavily大方不少,适合作为日常主力搜索源或者Tavily的补充。
4.1 它解决了什么问题
Brave Search API免费版一个月可以跑差不多2000次查询,对个人使用来讲基本够了。它的返回结果里有title、url、description,还有一个safe_search参数可以控制内容安全级别,这些对Agent来说都够用。不过需要注意,Brave返回的是标准搜索结果,不是为LLM定制的摘要形式,所以拿到手之后通常要让Agent做一轮再清洗。
它真正擅长的是解决第一类痛点——索引差异化。我在OpenClaw上做技术调研时发现,有些品类的搜索(比如特定开源项目、小众论坛、Stack Overflow上的冷门讨论),Brave的召回结果比默认搜索和Tavily都更全。原因是Brave自建爬虫,对长尾网页的覆盖有自己的优势,不会像部分聚合搜索那样只盯着几个大站。
4.2 在OpenClaw中的接入方式
接入方式和Tavily没什么本质区别,只是接口路径和参数不一样。OpenClaw里我习惯把它封装成独立的“备用搜索”工具,和Tavily形成双通道策略:主通道用Tavily跑快速调研,发现结果不理想时自动降级到Brave再查一轮。
# openclaw skill config: brave_search import requests def brave_search(query: str, count: int = 5) -> list: api_key = "你的key" url = "https://api.search.brave.com/res/v1/web/search" headers = { "X-Subscription-Token": api_key, "Accept": "application/json" } params = { "q": query, "count": count, "safesearch": "moderate" } resp = requests.get(url, headers=headers, params=params).json() return resp.get("web", {}).get("results", [])4.3 一个很关键的差异化配置思路
Brave Search API有个参数叫search_lang和country,可以限定搜索的语言和地区。这个参数很实用,比如在OpenClaw上做电商竞品分析时,我会把country限定到目标市场,这样搜出来的本地化内容精准度明显提升。做英文技术搜索时,把search_lang设为en也能排除掉一些非英文的干扰页。
不过坦率讲,Brave的搜索结果结构化程度不如Tavily,它只返回description,没有提炼出的正文内容,所以Agent拿到结果后还需要额外一步去抓取页面正文。我的做法是在OpenClaw的技能链里给它挂一个jina reader或者自写的正文提取工具,这样Brave负责“找得全”,提取工具负责“读得深”,两者配合,最终效果其实比单用Tavily还扎实,只是链路长一点。
这部分的实操经验再补充一下:Brave搜中文的准确率相对弱一些,有时候会混入一些奇怪的无关站点。但在英文技术场景里,它经常能找到Google和其他引擎漏掉的细节页面,比如一些大牛的博客、冷门仓库的README,这对OpenClaw做技术研究是很有价值的补充。
5. 方案三:聚合型搜索方案,拿来即用
第三个方案可能很多人听说过:Serper.dev,一个Google搜索结果API的封装服务。严格说它不算搜索引擎,而是把Google的搜索结果以JSON格式返回给你,本质上就是让你能在程序里使用Google的搜索能力。这类方案在圈子里的另一个常见叫法是“Google SERP API”,Serper是其中口碑比较好的一个。
5.1 为什么要在OpenClaw里面接Google结果
原因很直白——Google的索引质量、中文内容覆盖和时效性,在绝大多数场景里依然是第一档的。默认搜索也好、Brave也好、Tavily也好,在“搜中文商业内容”“搜电商信息”“搜新闻事件”这几个场景下,索引广度和更新速度都不如Google。如果你让OpenClaw做的是电商选品分析、行业趋势调研这类任务,Google的搜索结果往往更贴近“人真实看到的东西”。
Serper最大的好处就是不用自己去维护Google搜索接口的逆向逻辑,注册拿Key,调用API,几秒内返回结构化的Google结果。它免费的额度是2500次,个人项目够跑了。
5.2 实际配置示例与关键参数
# openclaw skill config: serper_google_search import requests def serper_search(query: str, num: int = 10, gl: str = "cn", hl: str = "zh-cn") -> dict: api_key = "你的key" url = "https://google.serper.dev/search" payload = { "q": query, "num": num, "gl": gl, "hl": hl } headers = { "X-API-KEY": api_key, "Content-Type": "application/json" } resp = requests.post(url, json=payload, headers=headers).json() return { "organic": resp.get("organic", []), "news": resp.get("news", []), "knowledgeGraph": resp.get("knowledgeGraph", {}) }这里有两个参数值得细说。gl参数控制的是地区(geo location),比如cn代表中国、us代表美国、jp代表日本。hl控制的是界面语言,zh-cn就是简体中文。这两个参数组合起来,能极大影响搜索结果的排序逻辑——同样是搜“openclaw”,gl=cn和gl=us返回的页面侧重点完全不同。在做跨国内容调研时,这个参数是最便宜的提效手段,没有之一。
Serper返回的结果里,除了常规的organic(自然搜索结果),还有schema、news、knowledgeGraph(知识图谱卡片)等模块,这些模块里的信息密度往往非常高,大模型拿来就能用。
5.3 方案三的利弊分析
优点很突出:搜索结果质量最接近人肉Google搜索,中文内容覆盖好,商业类信息精准度高,而且支持图片搜索、新闻搜索、地点搜索等多种类型。我的经验是,凡是让Agent去查“某个产品在市场上的口碑”“某类目在电商平台上的趋势”这类商业信息,Serper几乎是这几个方案里的最优解。
缺点方面,它毕竟是第三方封装,存在两个潜在风险:一是成本和额度,免费额度用完后是按次数计费的,高频任务需要评估预算;二是它对“内容深度”没有帮助——返回的依然只是摘要和链接,不会自动提炼正文。再加上政策层面Google的SERP接口本身就处于灰色地带,Serper这类服务有一定的不稳定性,如果你做的是长期生产项目,需要考虑到某一天接口策略变动带来的适配成本。
6. 方案四:本地模型与混合检索的进阶玩法
前面三个方案本质上都是在“换一个更好的搜索源”,第四个方案思路不太一样:用本地模型 + 混合检索来提升搜索质量。这个方案的出发点很朴素——如果大模型Agent能够先把用户的问题理解得更准确,搜索本身就成功了一半。而这个问题理解能力,恰恰是可以利用本地部署的开源模型来增强的。
这个思路的技术底座是目前很流行的RAG(检索增强生成)框架。在OpenClaw里,你可以搭配Ollama部署一套本地模型,用它对用户输入的查询词做意图拆解,把一个大问题拆成多个子问题,再分别送进搜索工具查询,最后汇总。这个过程在搜索场景里叫“查询扩展”(Query Expansion),它能有效解决前面提到的“一个关键词搜不全”的问题。
6.1 查询意图拆解:让搜索者有章法
举个实际例子。假设用户给OpenClaw下达的任务是:“帮我整理OpenClaw在安卓手机上的部署方案,包括需要注意的事项。”如果直接把这句话丢给搜索引擎,出来的就是泛泛的安装教程,因为搜索词太“大”了。但如果你先在本地跑一个小模型(比如qwen2.5 7B或者更轻量的phi-3.5),让它把这句话拆成几个具体子查询,事情就变得不一样了:
OpenClaw Termux 安装步骤OpenClaw 安卓 本地模型 配置OpenClaw 移动端 性能 注意事项
三个子查询分别送出去搜索,返回结果的覆盖面和精准度都提高了一个量级。这不是什么玄学,本质就是把一个宽泛的搜索意图细化为多个明确的信息需求,Agent拿到的素材自然就立体了。
6.2 混合检索:把多个方案的优点串起来
比查询扩展更进一步的做法是混合检索(Hybrid Search)。我自己的配置是同时接入前面说的Tavily和Brave,再叠加本地向量库(比如Chroma)对历史搜索结果的索引,最后用一个rerank步骤对三个来源的结果做去重和排序。流程大概是:
- 本地模型拆解查询意图,生成3到5个子查询;
- 每个子查询并行送给Tavily和Brave;
- 所有结果汇总后,送入本地rerank模型(比如bge-reranker)按相关性打分排序;
- 把排名前5到10的结果返回给OpenClaw主Agent。
这套链路看起来复杂,但好处是真正从“搜得准”进化到了“排得准”。实际跑下来,内容质量的提升非常显著,尤其适合那些对信息完整度和准确性要求极高的调研类任务。
6.3 算力与资源考量
选这条路的代价是硬件要求。本地跑一个小模型做意图拆解,12GB显存的显卡就能勉强跑起来,但如果你要处理长上下文,或者并行跑多个子查询,内存消耗会快速增长。不具备本地硬件条件的,我也试过一种折中方案:用OpenAI或Claude这类云端API做意图拆解,只把搜索和重排放到本地。成本高一些,但效果同样不错。
这里要专门回应一下热搜词里提到的“OpenClaw只能用接入API的方式使用算力吗”这个问题。事实是OpenClaw完全支持本地算力,通过Ollama就能接入本地模型,搜索质量增强这个场景我已经在上面实测过了。不过本地模型的意图拆解质量确实跟大参数云端模型有差距,对复杂问题的拆解偶尔会“拆歪”,所以如果追求极致效果,还是建议云端API做理解、本地算力做检索和重排,各司其职。
7. 四个方案怎么选?我的选型思路和效果评估
方案都过了一遍,接下来直接给结论。我自己在OpenClaw上做选型时,主要看三个维度:任务的搜索类型、可接受的单次搜索成本、对结果结构化程度的要求。不同方案在不同维度上有明显的优劣分化,用一张表来对照可能更直观:
| 方案 | 索引质量 | 中文支持 | 结果结构化 | 免费额度 | 适用任务类型 |
|---|---|---|---|---|---|
| 默认搜索 | 中 | 中 | 差 | 无限 | 日常随意查 |
| Tavily | 良 | 中上 | 优 | 约1000次/月 | Agent深度调研、RAG |
| Brave | 良 | 中 | 中 | 约2000次/月 | 技术长尾搜索、英文内容 |
| Serper(Google) | 优 | 优 | 中 | 约2500次 | 电商、商业情报、中文内容 |
| 本地模型+混合检索 | 取决于上游 | 取决上游 | 优(经重排) | 仅算力成本 | 高要求深度调研 |
针对具体任务,我会这么分配:
- 快速确认事实、前沿动态更新→ 优先Tavily,
days设为7,速度快、摘要干净; - 技术长尾问题、找冷门资料→ 切Brave,常能和Tavily互补,搜到意料之外的关联页面;
- 电商/商业场景、中文市场调研→ 上Serper,
gl=cn,保存知识图谱模块数据; - 正式调研报告、高价值分析任务→ 本地模型拆解+多路并行+重排,链路虽然长,但输出最扎实。
评估效果时,我个人会看三个指标:结果相关性(返回页面和查询意图的契合度)、信息新鲜度(页面发布时间的平均值)、内容可读性(去掉噪音后,剩下有效内容的占比)。用这三个指标横向测过的经验是:默认搜索走一遍及格分可能都勉强,Tavily能到良好,混合检索链路则能跑到接近优秀的水平。
需要特别提示的是,不要在OpenClaw里同时挂四五个搜索工具。工具太多反而会让Agent的“决策开销”增加,模型每次都要纠结“该调哪个、调完怎么合并”,输出的稳定性和速度都会受影响。我的实践是主备两个搜索源就够,第三个只在高价值任务里临时启用。工具选型讲究的是精而不多,这是我在多次反复调试后得出的最直接的经验。
8. 实战配置参考:OpenClaw与搜索工具对接的完整配置
理论说再多,不如一套能跑通的配置。下面我把自己目前在OpenClaw上使用的探索型配置简化整理出来,供你参考。这套配置的核心思路就是:一个主搜索(Tavily)、一个备用搜索(Brave)、一个可选商业搜索(Serper),全部通过OpenClaw的技能机制注入。
OpenClaw的Skill机制允许你为每个技能定义输入参数、描述和底层执行逻辑。我在技能目录下建了三个配置文件:
~/.openclaw/skills/ ├── tavily_search/ │ ├── SKILL.md # 技能描述文件 │ └── main.py # 搜索主逻辑 ├── brave_search/ │ ├── SKILL.md │ └── main.py └── serper_search/ ├── SKILL.md └── main.pySKILL.md的编写规范很关键,因为它直接影响大模型什么时候会调用这个技能。我的SKILL.md大致是这样写的。
--- name: tavily_search description: 使用Tavily搜索引擎搜索网络内容。适合需要高质量、时效性强、结构化摘要的搜索场景。当用户需要最新资讯、技术趋势、深度调研时使用。 parameters: - name: query description: 搜索查询词,建议使用具体关键词组合 required: true - name: days description: 时间范围,只搜索最近N天的结果,默认30 required: false - name: max_results description: 返回结果数量,默认5 required: false ---description写得好不好,直接影响大模型能不能在合适的场景主动调用它。如果你把description写成“搜索工具”这种泛泛的话,模型经常会挑错工具或者啥都不调。把调用场景写清楚,模型的选择准确度能提升一个档次。
下面是主逻辑的简化代码,我会把API Key放到环境变量里,避免硬编码。
import os import requests def run(query, days=30, max_results=5): api_key = os.getenv("TAVILY_API_KEY") if not api_key: return {"error": "TAVILY_API_KEY not set"} resp = requests.post("https://api.tavily.com/search", json={ "api_key": api_key, "query": query, "search_depth": "advanced", "include_answer": True, "max_results": max_results, "days": days }, timeout=30) if resp.status_code != 200: return {"error": f"tavily search failed: {resp.status_code}"} data = resp.json() results = data.get("results", []) # 建议在返回前做一轮精简,把score低的结果过滤掉 filtered = [r for r in results if r.get("score", 0) > 0.3] return { "answer": data.get("answer", ""), "results": filtered[:max_results] }这里我加了score > 0.3的过滤阈值,这是我根据自己的数据观察定的。低于0.3的相关性结果,即便混进来通常也只是干扰项,过滤掉能有效提升Agent后续总结的质量。你可以根据自己的任务类型调整这个阈值,如果你的任务允许低相关结果作为“上下文补充”,可以把阈值降一点。
Brave和Serper的Skill配置文件结构完全一样,只是底层URL和参数不同。我就不重复贴代码了,直接把几个容易踩坑的细节说清楚:
- Brave的API Key要挂在请求Header里,不是放在请求体里,放错位置会一直报401;
- Serper必须是POST请求,而且API Key放在Header的
X-API-KEY字段,正文格式是JSON,我见过不少人在这上面浪费了半天; - 三个Skill的文件名和函数名不要重名,否则OpenClaw加载技能时可能冲突,哪个都调不到。
配置好之后,还有一个非常实用的调优技巧:在SKILL.md的描述里加入“禁用场景”。比如在Tavily的description里明确写“不要用于中文电商信息查询”,这样Agent碰到电商类问题时就会自动跳过Tavily、转到Serper。这种负向约束往往比正向描述更能提升工具选择的准确率,我实测下来非常有效。
9. 常见问题与排查思路速查
最后把我在OpenClaw + 搜索方案折腾过程中遇到的典型问题整理成速查表,供参考对照。这些问题我在调试时几乎挨个踩过。
| 问题现象 | 可能原因 | 排查思路 |
|---|---|---|
| API返回401 | API Key配置错误或过期 | 检查环境变量是否生效,去服务商后台重新生成Key |
| 搜索偶尔返回空结果 | 查询词过于口语化,搜索服务无法解析 | 让本地模型改写成更标准化的关键词组合后再搜 |
| 返回结果都是旧闻 | 没有设置时间过滤参数 | Tavily补days参数,Serper开启tbs=qdr:m1 |
| 中文结果相关性差 | 搜索服务对中文索引较弱 | 改用Serper并设置gl=cn;把查询词补充英文翻译 |
| Agent总是调用错搜索工具 | SKILL.md描述写得太泛 | 重新编写description,加入明确的适用场景和禁用场景 |
| 结果噪音大,总结质量差 | 直接用了原始返回数据 | 增加相关性过滤阈值、做正文清洗、用rerank模型排序 |
| 多个搜索结果合并有重复内容 | 不同搜索源的索引重叠度高 | 写一个去重逻辑,按URL域名做归一化再合并 |
| 单次搜索响应特别慢 | 高级模式下抓取页面过多 | 降低max_results、关闭include_raw_content |
这里挑几个重点展开说一下。
关于查询词改写。我在跑OpenClaw时发现,大模型直接生成的搜索词往往偏“自然语言化”,跟搜索引擎的匹配逻辑不对付。解决办法是在技能层内置一个“查询词标准化”函数,把疑问句转成关键词组合、把口语词替换成更通用的术语。这一步放在本地模型部署之后,效果会跟着推理能力一起提升。
关于正文清洗。前面提过,Brave和Serper都只给摘要,Agent要做深度分析就绕不开抓正文这一步。我用的是Jina Reader的免费接口,直接把URL转成Markdown干净文本,再送给模型处理。这个组合在OpenClaw社区里口碑不错,算是性价比很高的一条链路。如果你不想依赖外部服务,也可以自己写Python抓取<article>标签内容,但处理复杂页面时容易翻车。
关于检索重排。如果你走了混合检索路线,重排这一步千万别省。我试过不重排直接合并多个搜索源的结果,Agent经常被低质量的重复内容带偏。接入bge-reranker-base之后,效果改观非常明显。这个模型用FlagEmbedding的接口调就行,几十行代码能搞定,强烈建议有余力的话加进去。
最后分享一个我在真实项目里的体会:搜索质量的提升不是一次性配置完就完事的,它是个持续调优的过程。你得定期翻翻OpenClaw的日志,看看Agent实际都在搜什么、哪些搜索请求返回的效果差,然后针对性地调整技能描述、查询改写规则和过滤阈值。我自己的习惯是每两周花半小时看一次搜索日志,把失败案例整理出来,反哺到配置里。这样迭代几轮下来,搜索质量会稳定在很高的水平。以上就是我在OpenClaw上打磨搜索链路的一些心得,希望对正在折腾的你有参考价值。