第47篇:网络搜索与提取
Hermes 功能详解第47篇:Web Search & Extract。联网搜索、抓取网页。
这篇讲的是如何让 Hermes Agent 学会“上网冲浪”——既能搜索信息,又能抓取网页内容,而且全程不需要你手动复制粘贴。
两个核心技能
想象一下,Hermes Agent 是个能干的助手,它有两项看家本领:
web_search(搜索):像打开百度/Google 一样,输入关键词,返回排名结果。web_extract(提取):像打开某个网页并“阅读全文”,把正文内容抓取下来。
这两项技能背后有多个“服务商”可选,就像你可以用 Chrome、Firefox 或 Safari 上网一样。默认推荐 Firecrawl(免费额度每月 500 次),如果你有 Nous Portal 付费订阅,甚至可以通过 Tool Gateway 免密钥使用。
什么都不配也能用? 是的。全新安装、没有任何网络凭证时,web_search 和 web_extract 也能开箱即用:请求会在 Exa、Parallel、Firecrawl、Keenable 这几家的公共免费额度之间轮询,遇到限流就自动换下一家重试。这一层是“最后的兜底”——只要你配置了后端或填了任意 API 密钥,就会优先走你自己的配置。想彻底关掉它,设置 web.keyless_fallback: false。
兜底救援:如果你选的是带密钥的后端(包括 Nous Tool Gateway 那条路),某次调用失败(密钥失效、服务宕机、网关连不上、上游 5xx),这一次会自动改走免费轮询环,结果里会注明是哪家救的场、为什么(rescued_from / backend_error)。救援不会“粘住”——下一次调用还是先试你选的后端。想关掉设 web.keyless_rescue: false。
第1步:选择你的“浏览器”
运行 hermes tools 命令,进入 Web Search & Extract 界面,按提示选择服务商并填入 API 密钥(密钥在对应官网注册获取)。
不想折腾? 直接选默认的 Firecrawl,在 ~/.hermes/.env 文件里加一行:
FIRECRAWL_API_KEY=fc-your-key-here
想省钱? 用 SearXNG(免费、自托管、注重隐私)。用 Docker 一条命令跑起来:
docker run -p 8888:8080 searxng/searxng:latest
然后修改配置启用 JSON 输出(否则 Hermes 读不了),最后在 config.yaml 里指定:
web:
search_backend: "searxng"
第2步:按需搭配“搜索”和“提取”
搜索和提取可以分开选不同的服务商。比如用免费的 SearXNG 搜索,用 Firecrawl 提取网页内容:
web:
search_backend: "searxng"
extract_backend: "firecrawl"
这就像用免费的图书馆查资料,但请付费的翻译帮你精读——各取所长。
注意:Brave Search、DDGS、xAI(Grok)和 OpenAI Native 是只能搜索的,需要 web_extract 时得搭配 Firecrawl/Tavily/Perplexity/Keenable/Exa/Parallel 之一。
OpenAI Native 是什么? 它用的是 Codex Responses 接口上 OpenAI 自带的 web_search 工具,靠 ChatGPT/Codex 订阅登录(hermes auth add openai-codex),没有独立 API 密钥。搜索在模型服务端完成,结果直接融进它的回答里,Hermes 这边不跑客户端搜索。它只负责搜索,提取还得另配后端:
web:
search_backend: "openai-native"
第3步:理解“长文截断”机制
网页内容可能很长(比如论坛帖子、新闻评论区)。Hermes 默认只保留 15,000 字符(约 7500 个汉字),超出部分会截断并提示 [TRUNCATED]。完整内容会存到本地文件,Agent 可以按需分页读取。
如果截断影响了你,可以调大限制:
web:
extract_char_limit: 50000
或者改用 browser_navigate 工具直接操作浏览器,获取实时页面。
第4步:验证配置是否生效
配置好后,跑个测试搜索:
curl -s "http://localhost:8888/search?q=test&format=json" | python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d['results']), 'results')"
看到 10 results 就说明 SearXNG 正常工作了。
第5步:了解结果缓存
短时间内重复的网络请求会走缓存,而不是再次调用付费后端——这能省额度、降延迟。web_search 的相同查询(忽略大小写和空格)在同一进程内命中内存缓存;web_extract 的相同 URL 会把全文存到 ~/.hermes/cache/web/,在 CLI、网关、定时任务和子 Agent 之间共享。并发的相同搜索会被合并成一次后端请求,只有第一个调用者真正付费。
只有成功的响应才会被缓存,而且会按服务商回报的请求 URL 归档——如果某页服务商没给出对应的请求 URL,就只返回不缓存,避免一批结果里张冠李戴。失败一律重试后端;免费救援那一次的结果永不缓存(下次还是先试你选的后端);被 security.website_blocklist 拦下的 URL 也不会从缓存里取。缓存过的提取会重新走一遍截断流程,所以第二次换个 char_limit 也能复用同一份抓取结果。
缓存默认开启,新鲜度窗口是 20 分钟,可在 config.yaml 里调整:
web:
cache_enabled: true # 默认;设为 false 可同时关闭两种缓存
cache_ttl_minutes: 20 # 新鲜度窗口,范围 1–1440
如果你在查真正实时的数据(比分、价格、突发新闻),把 TTL 调低或直接设 web.cache_enabled: false。另外,本地开发地址(localhost、127.0.0.1、*.local、私有 IP 段等)永远不会被缓存,每次都是实时抓取。
公网上的测试环境怎么办? 预发布部署和隧道 URL 是公网 DNS,本地开发那条规则管不到——把它们写进 web.cache_exempt_hosts,也会每次都实时抓取。支持精确匹配、*. 通配和域名后缀(写 mysite.dev 也覆盖 preview.mysite.dev):
web:
cache_exempt_hosts:
- mysite.vercel.app
- "*.ngrok-free.app"
总结一下:搜索和提取是 Agent 的“眼睛”,选对服务商、配好密钥、理解截断机制,就能让它帮你高效获取网络信息。
下篇预告:Agent 能“看”能“搜”了,下一步该学“动手”——敬请期待第48篇:浏览器自动化操作。
📖 官方文档
本文根据 Hermes Agent 官方文档编写,原文见:官方文档 › user-guide/features/web-search