blessonism

search-layer

Multi-source search and deduplication layer with intent-aware scoring. Integrates Brave Search (web_search), Exa, Tavily, and Grok to provide high-coverage, high-quality results. Automatically classifies query intent and adjusts search strategy, scoring weights, and result synthesis accordingly. Triggers on "deep search", "multi-source search", or when high-quality research is needed.

blessonism 55 4 Updated 6mo ago

Resources

2
GitHub

Install

npx skillscat add blessonism/openclaw-skills/search-layer

Install via the SkillsCat registry.

About this skill

We need to produce a 2-3 sentence plain-text summary in English, objective, factual, no marketing language, no superlatives, no calls to action. Must be at most 60 words. No quotes, no bullet points, no headings, no markdown. Just plain text. We need to explain what the skill does, what problem it solves, when to use it. From description: Multi-source search and deduplication layer with intent-aware scoring. Integrates Brave Search, Exa, Tavily, Grok. Classifies query intent, adjusts search strategy, scoring weights, result synthesis.

SKILL.md

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 的 apiUrlapiKeymodel(或通过环境变量 GROK_API_URLGROK_API_KEYGROK_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