search-layer

📁 blessonism/openclaw-skills 📅 13 days ago
9
总安装量
9
周安装量
#33443
全站排名
安装命令
npx skills add https://github.com/blessonism/openclaw-skills --skill search-layer

Agent 安装分布

cursor 8
opencode 8
github-copilot 7
codex 7
kimi-cli 7
gemini-cli 7

Skill 文档

Search Layer v2.2 — 意图感知多源检索协议

四源同级:Brave (web_search) + Exa + Tavily + Grok。按意图自动选策略、调权重、做合成。

执行流程

用户查询
    ↓
[Phase 1] 意图分类 → 确定搜索策略
    ↓
[Phase 2] 查询分解 & 扩展 → 生成子查询
    ↓
[Phase 3] 多源并行检索 → Brave + search.py (Exa + Tavily + Grok)
    ↓
[Phase 4] 结果合并 & 排序 → 去重 + 意图加权评分
    ↓
[Phase 5] 知识合成 → 结构化输出

Phase 1: 意图分类

收到搜索请求后,先判断意图类型,再决定搜索策略。不要问用户用哪种模式。

意图 识别信号 Mode Freshness 权重偏向
Factual “什么是 X”、”X 的定义”、”What is X” answer — 权威 0.5
Status “X 最新进展”、”X 现状”、”latest X” deep pw/pm 新鲜度 0.5
Comparison “X vs Y”、”X 和 Y 区别” deep py 关键词 0.4 + 权威 0.4
Tutorial “怎么做 X”、”X 教程”、”how to X” answer py 权威 0.5
Exploratory “深入了解 X”、”X 生态”、”about X” deep — 权威 0.5
News “X 新闻”、”本周 X”、”X this week” deep pd/pw 新鲜度 0.6
Resource “X 官网”、”X GitHub”、”X 文档” fast — 关键词 0.5

详细分类指南见 references/intent-guide.md

判断规则:

  1. 扫描查询中的信号词
  2. 多个类型匹配时选最具体的
  3. 无法判断时默认 exploratory

Phase 2: 查询分解 & 扩展

根据意图类型,将用户查询扩展为一组子查询:

通用规则

  • 技术同义词自动扩展:k8s→Kubernetes, JS→JavaScript, Go→Golang, Postgres→PostgreSQL
  • 中文技术查询:同时生成英文变体(如 “Rust 异步编程” → 额外搜 “Rust async programming”)

按意图扩展

意图 扩展策略 示例
Factual 加 “definition”、”explained” “WebTransport” → “WebTransport”, “WebTransport explained overview”
Status 加年份、”latest”、”update” “Deno 进展” → “Deno 2.0 latest 2026”, “Deno update release”
Comparison 拆成 3 个子查询 “Bun vs Deno” → “Bun vs Deno”, “Bun advantages”, “Deno advantages”
Tutorial 加 “tutorial”、”guide”、”step by step” “Rust CLI” → “Rust CLI tutorial”, “Rust CLI guide step by step”
Exploratory 拆成 2-3 个角度 “RISC-V” → “RISC-V overview”, “RISC-V ecosystem”, “RISC-V use cases”
News 加 “news”、”announcement”、日期 “AI 新闻” → “AI news this week 2026”, “AI announcement latest”
Resource 加具体资源类型 “Anthropic MCP” → “Anthropic MCP official documentation”

Phase 3: 多源并行检索

Step 1: Brave(所有模式)

对每个子查询调用 web_search。如果意图有 freshness 要求,传 freshness 参数:

web_search(query="Deno 2.0 latest 2026", freshness="pw")

Step 2: Exa + Tavily + Grok(Deep / Answer 模式)

对子查询调用 search.py,传入意图和 freshness:

python3 /home/node/.openclaw/workspace/skills/search-layer/scripts/search.py \
  --queries "子查询1" "子查询2" "子查询3" \
  --mode deep \
  --intent status \
  --freshness pw \
  --num 5

各模式源参与矩阵:

模式 Exa Tavily Grok 说明
fast ✅ ❌ fallback Exa 优先;无 Exa key 时用 Grok
deep ✅ ✅ ✅ 三源并行
answer ❌ ✅ ❌ 仅 Tavily(含 AI answer)

参数说明:

参数 说明
--queries 多个子查询并行执行(也可用位置参数传单个查询)
--mode fast / deep / answer
--intent 意图类型,影响评分权重(不传则不评分,行为与 v1 一致)
--freshness pd(24h) / pw(周) / pm(月) / py(年)
--domain-boost 逗号分隔的域名,匹配的结果权威分 +0.2
--num 每源每查询的结果数

Grok 源说明:

  • 通过 completions API 调用 Grok 模型(grok-4.1-fast),利用其实时知识返回结构化搜索结果
  • 自动检测时间敏感查询并注入当前时间上下文
  • 在 deep 模式下与 Exa、Tavily 并行执行
  • 需要在 ~/.openclaw/credentials/search.json 中配置 Grok 的 apiUrl、apiKey、model(或通过环境变量 GROK_API_URL、GROK_API_KEY、GROK_MODEL)
  • 如果 Grok 配置缺失,自动降级为 Exa + Tavily 双源

Step 3: 合并

将 Brave 结果与 search.py 输出合并。按 canonical URL 去重,标记来源。

如果 search.py 返回了 score 字段,用它排序;Brave 结果没有 score 的,用同样的意图权重公式补算。


Phase 4: 结果排序

评分公式

score = w_keyword × keyword_match + w_freshness × freshness_score + w_authority × authority_score

权重由意图决定(见 Phase 1 表格)。各分项:

  • keyword_match (0-1):查询词在标题+摘要中的覆盖率
  • freshness_score (0-1):基于发布日期,越新越高(无日期=0.5)
  • authority_score (0-1):基于域名权威等级
    • Tier 1 (1.0): github.com, stackoverflow.com, 官方文档站
    • Tier 2 (0.8): HN, dev.to, 知名技术博客
    • Tier 3 (0.6): Medium, 掘金, InfoQ
    • Tier 4 (0.4): 其他

完整域名评分表见 references/authority-domains.json

Domain Boost

通过 --domain-boost 参数手动指定需要加权的域名(匹配的结果权威分 +0.2):

search.py "query" --mode deep --intent tutorial --domain-boost dev.to,freecodecamp.org

推荐搭配:

  • Tutorial → dev.to, freecodecamp.org, realpython.com, baeldung.com
  • Resource → github.com
  • News → techcrunch.com, arstechnica.com, theverge.com

Phase 5: 知识合成

根据结果数量选择合成策略:

小结果集(≤5 条)

逐条展示,每条带源标签和评分:

1. [Title](url) — snippet... `[brave, exa]` ⭐0.85
2. [Title](url) — snippet... `[tavily]` ⭐0.72

中结果集(5-15 条)

按主题聚类 + 每组摘要:

**主题 A: [描述]**
- [结果1] — 要点... `[source]`
- [结果2] — 要点... `[source]`

**主题 B: [描述]**
- [结果3] — 要点... `[source]`

大结果集(15+ 条)

高层综述 + Top 5 + 深入提示:

[一段综述,概括主要发现]

**Top 5 最相关结果:**
1. ...
2. ...

共找到 N 条结果,覆盖 [源列表]。需要深入哪个方面?

合成规则

  • 先给答案,再列来源(不要先说”我搜了什么”)
  • 按主题聚合,不按来源聚合(不要”Brave 结果:… Exa 结果:…”)
  • 冲突信息显性标注:不同源说法矛盾时明确指出
  • 置信度表达:
    • 多源一致 + 新鲜 → 直接陈述
    • 单源或较旧 → “根据 [source],…”
    • 冲突或不确定 → “存在不同说法:A 认为…,B 认为…”

降级策略

  • Exa 429/5xx → ç»§ç»­ Brave + Tavily + Grok
  • Tavily 429/5xx → ç»§ç»­ Brave + Exa + Grok
  • Grok 超时/错误 → ç»§ç»­ Brave + Exa + Tavily
  • search.py 整体失败 → 仅用 Brave web_search(始终可用)
  • 永远不要因为某个源失败而阻塞主流程

向后兼容

不带 --intent 参数时,search.py 行为与 v1 完全一致(无评分,按原始顺序输出)。

现有调用方(如 github-explorer)无需修改。


快速参考

场景 命令
快速事实 web_search + search.py --mode answer --intent factual
深度调研 web_search + search.py --mode deep --intent exploratory
最新动态 web_search(freshness="pw") + search.py --mode deep --intent status --freshness pw
对比分析 web_search × 3 queries + search.py --queries "A vs B" "A pros" "B pros" --intent comparison
找资源 web_search + search.py --mode fast --intent resource