Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SPOT:Agent 工具预筛选的通用方法论与参考实现

简体中文 | English

Skill-driven Pre-filtering for Optimal Tooling

解决"Agent 工具过多导致 Token 浪费"的通用问题。 平台无关,可适配任何支持 function calling 的 Agent 框架。

License: MIT

⚠️ 独立社区项目,与任何 Agent 平台无官方关联。文中提及的具体平台名称仅用于适配指南的案例说明。


问题

当 Agent 平台注册了 50-200+ 个工具时,每轮 API 请求会将全部工具的 JSON Schema 注入上下文。但模型每轮实际只调用其中 1-5 个。

74 个工具 × ~650 chars/工具 = ~48K chars/轮(纯 Schema 开销)
50 轮对话 = ~2,400K chars(其中 90%+ 是浪费)

核心矛盾:模型每轮都看到全部工具,但只用到不到 15%。


解决方案

SPOT 在 API 调用之前,根据当前激活的 Skill(技能)和用户意图,将工具集从 N 个裁剪为 Top-K 个(通常 10-25 个)。主模型完全无感知,调用模式不变。

用户消息
   │
   ▼
Skill 路由(已有组件)→ 命中 Skill(0-5 个)
   │
   ▼
┌─────────────────────────────────────────┐
│  SPOT Filter(预筛选层)                  │
│                                         │
│  ① Skill 声明的 required tools → 强制纳入 │
│  ② 用户意图 → 语义匹配 → 补充 Top-K      │
│  ③ Conditional tools → 注入提示语        │
│  ④ 故障 → 静默回退全量                   │
└─────────────────────────────────────────┘
   │
   ▼
主模型 API 调用(只看到 Top-K 工具)
   │
   ├── 正常路径(95%+):直接调用
   └── 兜底路径(<5%):mcp_fallback → 二次筛选

核心原则:筛选层只做确定性高的事,不确定性留给主模型。筛选层的价值不在于"替模型做决策",而在于"缩小模型的决策空间"。


效果

以 N=74 为例(实际节省率与工具总数成正比)

场景 工具数 Schema 开销 节省率
全量打包(现状) 74 ~48K/轮
SPOT(0 技能激活) 17 ~11K/轮 77%
SPOT(1 技能激活) 19 ~12K/轮 74%
SPOT(5 技能全激活,最坏) 53 ~34K/轮 29%

实测数据(OpenSquilla 平台,88 工具 → 54 可见,34 工具 deny):

指标 全量打包 SPOT-E 静态裁剪 节省
工具 Schema 48,861 chars 34,188 chars -30%
可见工具 74 48 -26
  • 零额外 API 往返(筛选在本地完成)
  • 主模型调用模式完全不变
  • 任何故障静默回退全量,不影响可用性

快速开始

1. 理解方法论(10 分钟)

阅读 knowledge/ 目录下的现有文件:

文件 内容
red-lines.md 6 条红线经验教训(含来源事件)
acceptance-checklist.md 5 类验收清单
spot-tool-registry.yaml 工具分类模板(待建)
spot-description-norm.md 工具描述规范(待建)
spot-tool-descriptions.json 描述映射表(待建)

更多方法论文档(三级分类法、动态 K 值策略、兜底策略等)将在后续版本补充。请关注 Release 更新。

2. 使用模板(30 分钟)

模板目录 templates/ 为规划中,待社区贡献。以下为目录结构示意:

# 复制模板到你的项目(目录就绪后执行)
cp templates/tool-registry.yaml your-project/
cp templates/skill-frontmatter.yaml your-project/skills/
cp templates/config-template.yaml your-project/    # YAML 格式
cp templates/config-template.toml your-project/    # 或 TOML 格式
cp templates/config-template.json your-project/    # 或 JSON 格式

按模板中的注释填写你的工具清单和技能声明。配置文件提供三种格式,选你平台兼容的即可。

3. 参考实现(可选)

参考实现目录 examples/ 为规划中,待社区贡献。以下为 API 设计示意:

# 示例代码(目录就绪后可用)
# from examples.spot_filter import spot_filter_with_fallback

# 每轮 API 调用前
top_k_tools, conditional_hints = spot_filter_with_fallback(
    user_message="帮我审查这段代码的安全性",
    active_skills=[code_review_skill],
    tool_registry=all_74_tools,
    K=13,  # 10 + 1×3
)

# 只将 top_k_tools 的 Schema 注入 API 请求
response = call_llm_api(messages, tools=top_k_tools)

4. 适配你的平台

阅读 adapters/ 中对应你平台的适配指南。


两种实施路径

路径 A:SPOT 原版(改源码,79% 节省)

在 Agent 框架内部实现预筛选层。需要修改框架的 engine/runtime/dispatch 层。

  • 适用:你是框架开发者,或框架支持插件/中间件机制
  • 效果:动态预筛选,每轮按意图选不同 Top-K
  • 详见:docs/architecture.md(规划中,待社区贡献)

路径 B:SPOT-E 外置版(不改源码,40-67% 节省)

通过平台原生的工具裁剪机制(deny/禁用)+ 路由技能实现静态裁剪。

  • 适用:你无法修改框架源码,但能修改配置和技能
  • 效果:静态裁剪,按类别 deny 低频工具
  • 详见:docs/spot-e-externalized.md(规划中,待社区贡献)

SPOT-E 是 SPOT 的"阶段零"——它的所有数据产物(工具注册表、描述数据库、分类清单)在升级到 SPOT 原版时可以直接复用,零浪费。


核心设计原则

原则 实现方式
透明性 主模型不知道筛选层的存在,调用模式不变
可降级 筛选层任何故障 → 静默回退全量打包
轻状态 核心计算无状态;追加工具列表为会话级辅助状态
边界清晰 确定性(required + 语义匹配)归筛选层;不确定性(conditional when)归主模型
零额外往返 筛选在 API 调用之前完成,不引入新的 API 往返

项目结构

spot-framework/
├── knowledge/        知识层(方法论、规范、红线、验收清单)✅
├── adapters/         平台适配指南 + 案例实录 ✅
├── docs/             架构方法论(规划中,待社区贡献)
├── methodology/      核心方法论 6 份(规划中,待社区贡献)
├── templates/        通用模板(规划中,待社区贡献)
└── examples/         Python 参考实现(规划中,待社区贡献)

案例实录

SPOT 已在两个不同架构的 Agent 平台上验证了跨平台通用性:

维度 OpenSquilla Hermes
平台类型 桌面应用,Python 运行时 技能驱动,MCP 协议 + 原生函数
工具数 88 96(清理后)
裁剪方式 [tools] deny 配置列表 关闭 MCP Server / 删技能文件
路由方式 spot-router 技能(SKILL.md) 技能文件清理
代理服务 不需要(deny 工具无使用需求) 不需要(MCP 按需加载)
执行层工作量 34 行 TOML 删几个文件
实测节省 30% 工具 Schema ~25%(技能列表压缩)

两个案例展示了 SPOT 的适应性:无论平台是 Python 原生的 function calling 还是 MCP 协议 + 原生函数,方法论统一,实现方式因地制宜。


适用场景

工具数量 推荐方案
< 50 全量打包即可,无需 SPOT
50 - 200 SPOT / SPOT-E(本项目的核心适用区间)
> 200 SPOT 演进为 MCP Router(语义路由 + 连接池)

设计历程

SPOT 架构经过四轮多方交锋迭代:

轮次 焦点 产出
第一轮 三方案 Token 对比(全量 / Meta-MCP / 预筛选) 确定预筛选在 50-200 工具规模下最优
第二轮 Skill 融合 引入 frontmatter.tools.required 硬约束
第三轮 条件工具的运行时触发 确定条件判断归主模型,筛选层只注入提示
第四轮 工程治理 确定漂移检测、降级策略、落地路线图

完整设计决策记录见 docs/design-decisions.md(规划中,待社区贡献)。


贡献

  • 方法论改进、模板优化、参考实现 bug 修复:欢迎 PR
  • 新平台适配指南:欢迎 PR 到 adapters/ 目录
  • 讨论:请开 Issue

许可证

  • 代码(examples/):MIT
  • 文档(docs/methodology/templates/adapters/):CC BY-SA 4.0

声明

本项目为独立社区项目,与任何 Agent 平台无官方关联。 文中提及的平台名称仅用于适配指南的示例说明。

About

SPOT:Agent 工具预筛选的通用方法论(Skill-driven Pre-filtering for Optimal Tooling)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors