这个 Plugin 让 OpenClaw 减少Skill 90%Token消耗
别让 Skill 列表烧光你的 Token——用一个 Plugin 让 OpenClaw 瘦身 90%95 个 Skill每轮对话就消耗 5000 多个 Token本文将分享我们如何通过 Elasticsearch 语义搜索和一个 OpenClaw Plugin将 Skill 列表从“全量注入”变为“按需加载”将 Token 消耗减少 92%并且即时生效。一、你的 OpenClaw正被 Skill 列表“偷走”Token玩 OpenClaw 的人都知道安装 Skill 一时爽Token 消耗火葬场。起初你只装了 5 个 Skill体验非常好。但随着你不断添加天气、GitHub、飞书文档、企业微信、腾讯云、Elasticsearch等功能系统中逐渐堆积了 50 个、80 个甚至 100 个 Skill。你可能觉得“多就是好”但 OpenClaw 每次对话都会将所有Skill 的名称和描述放入 System Prompt。我们的实测结果是•95 个 Skill→ System Prompt 占用~5,238 Token• 用户即使只说一句“你好”这 5000 个 Token 也先被耗掉• 按 OpenRouter 的价格计算每轮对话仅 Skill 列表就烧掉约 $0.005更要命的是——无关的 Skill 还会干扰 LLM 的判断导致“幻觉率上升”。明明是问天气模型却在纠结是否应该用 GitHub Skill。二、思路为 OpenClaw 安装一个“智能筛子”解决方案非常直观——按需供给。用户问天气就只提供天气相关的 Skill。用户问代码就只提供 GitHub 相关的 Skill。其他 90 个 Skill 不注入Token 自然节省。这本质上就是 RAG检索增强生成的思路先用语义搜索筛选再将结果提供给 LLM。但这里面临一个技术选型的问题用什么做语义检索用什么 Embedding 模型三、技术选型为什么选择 Elasticsearch Jina v5市面上有一些方案——基于本地 ONNX 模型和对象存储向量桶。它们的思路是使用本地量化模型生成向量写入对象存储查询时再次生成向量进行检索。整个流程需要Embedding API、向量存储和手动管理维度与距离度量。我们选择了Elasticsearchsemantic_text Jina Embeddings v5原因如下1. 一步到位零 Embedding 管理传统方案需要两步先调用 Embedding API 生成向量然后写入向量存储。查询时也需两步先将用户消息向量化再去向量库检索。而 ES 的semantic_text字段类型自动处理一切——只需写入文本ES 会在内部自动调用推理端点生成向量。查询时也一样直接传文本ES 内部完成 Embedding 和向量检索。不需要外部 Embedding API也不需要管理向量维度。2. Jina Embeddings v5紧凑型顶尖多语言模型我们的 Embedding 推理端点使用的是Jina Embeddings v5——由 Jina AI 和 Elastic 联合发布的新一代文本嵌入模型在多语言 MTEBMMTEB基准测试中同级别第一。jina-embeddings-v5-text-small的核心数据•677M 参数远小于许多同类模型•32,768 Token输入上下文窗口•1024 维嵌入向量• 支持211 种语言中英文均衡不偏科它的杀手锏是LoRA 插件架构一个基础模型加上四个任务专用的 LoRA 插件检索、文本匹配、聚类、分类在不增加模型体积的前提下每个任务都能做到最优。ES 在索引和检索时会自动选择合适的 LoRA 插件。更进一步Jina v5 支持Matryoshka 表示学习——嵌入截断。默认 1024 维可以截断到 512 甚至 256 维存储和计算成本成倍下降精度损失极小。加上二进制量化嵌入大小可以从 2KB 压缩到 128 字节减少 94%性能几乎无损。对我们的场景意味着什么95 个 Skill 描述的语义索引即使全量存储也只需极小的空间。而且因为 Jina v5 原生多语言中文查询“企业微信发消息”能精准匹配英文 description 的wecom-msgSkill不偏科。jina-embeddings-v5-text MMTEB 得分3. 检索延迟从秒级降到百毫秒级基于本地模型和对象存储的方案链路是用户消息 → 本地模型推理500ms→ 网络请求到向量存储500ms→ 返回结果。总计~1-2 秒。ES 方案用户消息 → ES 集群内完成 Embedding 和检索~100ms。推理在集群内完成没有额外的网络往返。用户几乎无感知。4. 关键发现——异步 Hook 方案存在“永远差一轮”的致命缺陷我们在深入研究过程中发现了一个严重问题很多方案使用message:received事件 Hook 来做路由——这个 Hook 在 Gateway 层面异步执行与 Agent Loop 是并行的。代码语言javascriptAI代码解释1 2 3 4 时间线 00:00 消息到达Agent 开始加载 Skill用旧的配置 00:20 Hook 才完成向量检索写入配置文件 00:21 SIGUSR1 热重载——但 Agent 已经在运行了结果是Agent 永远用的是上一轮的 Skill 配置当前轮永远失效。而且因为每轮都会覆盖配置连续对话时 Skill 列表一直在变Agent 永远追不上。我们的方案绕过了这个问题使用 OpenClaw 的Plugin 机制注册before_prompt_buildHook。这个 Hook 在 Agent Loop内部同步执行——检索、过滤、注入一气呵成当轮就生效。四、效果实测我们在 95 个 Skill 的环境下测试指标无 Router有 ES Skill Router变化System Prompt Token~5,238~391-92.5%单轮成本$0.0053$0.0004-92.5%Top-1 Skill 命中率N/A80%—检索延迟N/A~100ms零感知几个真实场景场景 A查天气• 用户“深圳明天天气怎么样”• Router 推荐[weather, tavily-search, gemini, ...]• Token 节省97.8%场景 B企业微信发消息• 用户“企业微信发消息”• Router 推荐[wecom-msg, bluebubbles, wacli, ...]wecom-msg 命中0.87 分• Token 节省92%场景 C创建飞书文档• 用户“创建飞书文档”• Router 推荐[feishu-doc, wecom-doc-manager, tencent-docs, ...]feishu-doc 命中0.83 分• Token 节省92%场景 D中文查英文 Skill• 用户“腾讯云开发者社区任务”• Router 推荐[tencent-cloud-community, tencent-cos-skill, ...]0.81 分命中• 跨语言语义理解零配置[图片位置6Token 消耗对比柱状图——95 Skills vs 5 Skills]五、5 分钟安装教程前置条件• 一个 Elasticsearch 集群Elastic Cloud 或自建• 集群已配置.jina-embeddings-v5-text-small推理端点Elastic Cloud 默认可用• Python 3 pip install elasticsearch pyyaml步骤 1安装 Plugin代码语言javascriptAI代码解释1 2 git clone https://github.com/oldcodeoberyn/es-skill-router.git openclaw plugins install -l ./es-skill-router步骤 2配置 ES 连接编辑~/.openclaw/openclaw.json在plugins.entries中添加代码语言javascriptAI代码解释{ plugins: { entries: { es-skill-router: { enabled: true, config: { esUrl: https://your-cluster:9243, esUser: elastic, esPassword: your-password, index: openclaw-skills, topK: 5, minScore: 0.5 } } } } }也可以用环境变量ES_URL、ES_USER、ES_PASSWORD。步骤 3索引你的 Skill代码语言javascriptAI代码解释export ES_URLhttps://your-cluster:9243 export ES_USERelastic export ES_PASSWORDyour-password python3 es-skill-router/skills/es-vector-skill/scripts/index_skills.py \ --index openclaw-skills --recreate输出代码语言javascriptAI代码解释Found 95 skills Created index: openclaw-skills {success: true, indexed: 95, errors: 0}步骤 4重启 Gateway代码语言javascriptAI代码解释1 openclaw gateway restart步骤 5验证发一条消息给你的 Agent然后检查日志代码语言javascriptAI代码解释1 grep es-skill-router\|ready.*index /tmp/openclaw/openclaw-$(date %Y-%m-%d).log你应该看到代码语言javascriptAI代码解释1 2 ready: indexopenclaw-skills topK5 minScore0.5 message_id: om_x100b53fc8 → [tencent-cloud-community(0.74), tlon-skill(0.71), session-logs(0.71), wecom-msg(0.71), tencent-cos-skill(0.69)]大功告成六、进阶配置参数默认值说明topK5保留的 Skill 数量建议 3-10minScore0.5最低相关度分数低于此值的 Skill 不注入indexopenclaw-skillsES 索引名enabledtrue开关设 false 可临时禁用安装新 Skill 后重新运行索引脚本即可增量更新不会覆盖已有的代码语言javascriptAI代码解释1 python3 es-skill-router/skills/es-vector-skill/scripts/index_skills.py --index openclaw-skills七、总结传统本地对象存储方案ES Skill Router本文Embedding需要外部 API 或本地模型ES 内置Jina v5路由机制异步 Hook SIGUSR1同步 Plugin Hook生效时序永远差一轮当轮生效部署复杂度Embedding 服务 向量存储 Hook一个 Plugin延迟1-2 秒~100ms多语言取决于模型选择Jina v5 原生 211 语言Token 节省~92%~92%一句话做减法才是工程功底的试金石。为大模型减轻上下文负担它反而会表现得更聪明。开源地址github.com/oldcodeoberyn/es-skill-router
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2492884.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!