ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Agent-Skills:智能体能力契约与CLI调度实践指南

Agent-Skills:智能体能力契约与CLI调度实践指南 1. 项目概述Agent-Skills 不是插件而是智能体的“肌肉记忆”你最近在技术社区里频繁刷到agent-skills这个词它不像传统 npm 包那样被npm install就完事也不像浏览器扩展那样点一下“添加到 Chrome”就生效。它本质上不是一段可独立运行的代码而是一套定义智能体Agent能力边界的契约式接口规范——你可以把它理解成给 AI 智能体装上的“手、脚、眼睛和耳朵”但这些器官不会自己长出来必须由开发者用明确的协议去“接线”、供电、校准。我第一次接触 agent-skills 是在调试一个本地部署的 Claude-based 工作流时。当时想让智能体自动读取 Excel 表格并生成周报结果它反复说“我没有访问文件系统的权限”。不是模型不会而是它根本不知道“读取本地文件”这个动作该调用哪个函数、传什么参数、怎么处理错误。直到我把一个叫file-read的 skills 描述文件YAML 格式注册进 runtime 环境再在 prompt 中声明“你具备 file-read 技能”它才真正开始执行fs.readFileSync()—— 这一刻我才意识到skills 不是功能而是能力授权书agent 不是万能神而是持证上岗的操作员。这个词高频出现在 CLI 工具链中比如 codex cli、zcode cli、trae cli是因为命令行是最贴近“能力调度中枢”的交互形态你输入/search 2024年Q3营收数据背后不是调用搜索引擎 API而是 CLI 解析 slash command → 匹配已注册的web-searchskill → 注入 query 参数 → 执行封装好的 HTTP 请求逻辑 → 返回结构化结果 → 再交还给 LLM 做语义整合。整个过程对用户透明但每一步都依赖 skills 的精准定义与可靠实现。它和 API 的关系很像“驾照”和“汽车”API 是车本身有引擎、方向盘、油门skills 是你考下来的 C1 驾照——没有驾照你连坐进驾驶座的资格都没有有了驾照你才能合法、安全、可控地驾驶不同品牌、不同型号的车即对接不同服务商的 API。这也是为什么你会看到大量搜索词围绕deepseek api如何调用和agent skills测试并存前者问的是“车怎么开”后者问的是“怎么证明我会开车”。适合谁看如果你正在用 LangChain、LlamaIndex 或自研框架搭建 Agent 应用却卡在“LLM 知道要做什么但系统不知道怎么做”这个断层上如果你厌倦了每次加一个新功能就要硬编码一堆 if-else 调用逻辑如果你希望团队里非算法背景的后端或前端同学也能参与“能力开发”而不是只等 prompt engineer 发指令——那 agent-skills 就是你当前技术栈里最该补上的那一块承重墙。2. 核心设计逻辑为什么不用纯 API 调用而要抽象出 skills 层2.1 本质矛盾LLM 的泛化能力 vs 系统的确定性要求我们先看一个真实踩坑案例。某电商 SaaS 团队想让客服 Agent 自动查询订单状态直接在 system prompt 里写“你可调用拼多多 API 查询订单地址是 https://api.pinduoduo.com/v2/order/detail需传参 order_sn 和 access_token”。上线后问题频发LLM 有时把order_sn拼错成order_sn_导致 400有时漏传access_token返回 401更严重的是当拼多多 API 升级为 v3 接口时prompt 里写的 v2 地址失效整个功能静默崩溃监控无告警。问题根源在于把 API 调用细节塞进 prompt等于让语言模型承担本该由程序逻辑保证的确定性职责。LLM 擅长推理“用户想要什么”但不擅长保证“HTTP 请求头里 Authorization 字段格式绝对正确”。skills 层正是为解耦这两类责任而生。它强制规定每个技能必须声明三要素——what能力描述用自然语言说明技能用途供 LLM 理解上下文如 “查询指定订单的物流轨迹和当前状态”how执行契约用 JSON Schema 定义输入参数结构、输出字段类型、错误码映射如{order_sn: {type: string, minLength: 12}}where执行载体指向具体实现——可能是本地函数、远程 HTTP endpoint、Docker 容器甚至另一个 Agent。这样LLM 只需做一件事根据用户 query从已注册 skills 列表中选择最匹配的一个并填充参数。参数校验、网络请求、重试策略、密钥管理全部交给 skills runtime 处理。就像你告诉司机“去首都机场T3航站楼”他不会现场查地图算路线而是调用自己的导航系统——skills 就是那个预装好、已校准、可审计的导航系统。2.2 CLI 为何成为 skills 的天然载体观察所有热词里的 CLI 工具codex cli、zcode cli、trae cli你会发现它们共享一个核心行为模式以 slash command 为入口驱动 skills 执行闭环。这不是偶然而是由 CLI 的底层特性决定的强上下文隔离性每个 CLI 命令天然运行在独立进程自带环境变量、工作目录、信号处理机制。当你执行codex /search --query AI 编程工具CLI 会启动一个干净沙箱加载searchskill 的配置和依赖避免与file-writeskill 的 Node.js 版本冲突。这比在 Web Server 里用同一个 Express 实例挂载几十个 API 路由要健壮得多。参数解析标准化CLI 框架如 Commander.js、yargs对--flag、required、[optional]的解析已极度成熟。skills 的输入契约JSON Schema可直接映射为 CLI 参数规则。例如一个需要url和timeout_ms的http-getskill其 schema 中timeout_ms: {type: integer, minimum: 1000}会被自动转为--timeout-ms number且输入校验在命令解析阶段就完成无需 LLM 传递无效值。可观测性内建CLI 默认支持--verbose、--dry-run、--trace等调试开关。codex cli --trace /db-query --sql SELECT * FROM users会打印完整执行链路skill 加载路径 → 参数绑定日志 → HTTP 请求详情 → 响应体截断 → LLM 输入摘要。这种粒度的 trace 能力在纯 API 网关里需要额外集成 OpenTelemetry 才能实现。提示不要把 CLI 当成“给终端用户用的玩具”。在生产环境中CLI 是 skills 的注册中心、执行沙箱和调试探针。我们团队将zcode cli容器化后作为 Kubernetes Job 模板调度 skills 执行比用 Python subprocess 调用脚本稳定 3.7 倍基于 6 个月线上 error rate 统计。2.3 Skills 与 API 的分层协作模型很多人混淆 skills 和 API认为“写个 API 就是做了 skills”。这是危险的认知偏差。下表对比了二者在典型场景中的角色分工维度API如 DeepSeek 官方 APISkills如deepseek-invokeskill定位基础服务提供方暴露原始能力能力封装者定义使用规则与上下文输入raw JSON payload含 model、messages、temperature 等原始字段结构化参数如{prompt: 写一首诗, style: 七言绝句, max_tokens: 256}经 skills 层转换为 API required format错误处理返回 429rate limit、400bad request、503service unavailable等 HTTP 状态码统一映射为 skills 自定义错误码如SKILL_RATE_LIMITED、SKILL_INVALID_INPUT并附带 human-readable message 供 LLM 生成友好提示密钥管理需在客户端硬编码或从环境变量读取 API_KEYskills 配置中声明auth: { type: header, name: Authorization, value: Bearer ${DEEPSEEK_API_KEY} }密钥由 CLI runtime 注入不暴露给 LLM context版本演进v1/v2 接口并存客户端需适配skills version 字段如v1.2.0与 API 版本解耦旧 skills 可通过 adapter 兼容新 API关键洞察skills 是 API 的“翻译官守门人保险丝”。它不创造新能力而是让已有 API 能被 LLM 安全、稳定、可解释地调用。这也是为什么llm-deepseek: no api key for provider route deepseek-official这类报错总伴随 skills 配置缺失——runtime 找不到对应 route 的 auth 配置不是 API 本身故障而是 skills 的“翻译官”没上岗。3. 实操拆解从零构建一个可注册、可调用、可调试的 skills3.1 技能定义用 YAML 描述能力契约以web-search为例skills 的定义文件通常为.skill.yaml是整个体系的基石。它不是代码而是机器可读的“能力说明书”。以下是我们生产环境使用的web-search.skill.yaml精简版# web-search.skill.yaml name: web-search version: 1.3.0 description: | 使用 Bing 搜索引擎获取网页摘要。支持指定时间范围、语言和地区。 注意结果按相关性排序不保证实时性仅用于辅助信息检索。 author: infra-teamcompany.com license: MIT # LLM 调用时的语义标识 intent: - search the web for information about {topic} - find recent news on {event} - look up definition of {term} # 输入参数契约JSON Schema input_schema: type: object properties: query: type: string minLength: 2 maxLength: 200 description: 搜索关键词避免使用模糊表述如一些东西 time_range: type: string enum: [any, day, week, month, year] default: any description: 时间过滤范围 market: type: string pattern: ^[a-z]{2}-[A-Z]{2}$ default: zh-CN description: Bing 市场代码如 zh-CN, en-US required: [query] # 输出结构契约 output_schema: type: object properties: results: type: array items: type: object properties: title: type: string url: type: string format: uri snippet: type: string date_published: type: string format: date-time total_estimated_matches: type: integer minimum: 0 # 执行载体配置 execution: # 本地函数方式Node.js handler: ./src/handlers/web-search.js # 或远程 HTTP 方式推荐生产环境 # endpoint: https://api.company.com/skills/web-search # method: POST # 认证配置密钥不写死 auth: type: header name: Ocp-Apim-Subscription-Key value: ${BING_SEARCH_API_KEY} # 资源约束防滥用 limits: timeout_ms: 8000 max_retries: 2 rate_limit: requests_per_minute: 30这个 YAML 文件包含五个核心区块name/version/description人类可读的元信息LLM 在 planning 阶段会扫描 description 判断是否匹配需求intentLLM 的“触发词库”当用户说“帮我搜一下马斯克最新动态”{topic}被替换为“马斯克最新动态”匹配成功input_schema比 Swagger 更严格的参数校验minLength: 2防止空搜索pattern确保 market 格式正确execution声明技能如何执行本地 handler 适合快速验证endpoint 适合微服务化部署auth/limits安全与稳定性控制${BING_SEARCH_API_KEY}是环境变量占位符CLI runtime 启动时注入。注意不要在 YAML 里写value: abc123...这样的明文密钥我们曾因某次 Git commit 泄露BING_SEARCH_API_KEY导致 API 配额被刷爆。正确做法是value: ${BING_SEARCH_API_KEY}并在 CI/CD 流水线中通过 secret manager 注入。3.2 技能实现编写可复用的执行逻辑Node.js 示例skills 的实现代码必须严格遵循 YAML 中定义的input_schema和output_schema。以下是./src/handlers/web-search.js的核心逻辑已脱敏// src/handlers/web-search.js const axios require(axios); // 从环境变量读取配置与 YAML 中 auth.value 对应 const BING_SEARCH_ENDPOINT https://api.bing.microsoft.com/v7.0/search; const SUBSCRIPTION_KEY process.env.BING_SEARCH_API_KEY; /** * param {Object} input - 符合 input_schema 的参数对象 * returns {PromiseObject} 符合 output_schema 的响应对象 */ async function execute(input) { // 1. 参数预处理YAML 未覆盖的业务逻辑 const { query, time_range, market } input; // 清洗 query移除控制字符截断超长文本 const cleanQuery query .replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, ) .substring(0, 200); // 构建 Bing API 请求参数 const params new URLSearchParams({ q: cleanQuery, count: 10, safeSearch: Strict, }); // 添加时间过滤Bing API 特有参数 if (time_range ! any) { const now new Date(); let from, to; switch (time_range) { case day: from new Date(now.setDate(now.getDate() - 1)); to new Date(); break; case week: from new Date(now.setDate(now.getDate() - 7)); to new Date(); break; // ... 其他时间范围 } params.append(freshness, Custom); params.append(setLang, market.split(-)[0]); params.append(cc, market.split(-)[1]); } try { const response await axios.get(BING_SEARCH_ENDPOINT, { headers: { Ocp-Apim-Subscription-Key: SUBSCRIPTION_KEY, User-Agent: AgentSkills/1.0, }, params, timeout: 7000, // 小于 YAML 中 limits.timeout_ms留缓冲 }); // 2. 响应结构转换适配 output_schema const rawResults response.data.webPages?.value || []; const results rawResults.map(item ({ title: item.name || , url: item.url || , snippet: item.snippet || , date_published: item.dateLastCrawled || null, })); return { results, total_estimated_matches: response.data.webPages?.totalEstimatedMatches || 0, }; } catch (error) { // 3. 错误标准化关键 if (error.response?.status 401) { throw new Error(SKILL_AUTH_FAILED: Bing API key invalid or expired); } if (error.response?.status 429) { throw new Error(SKILL_RATE_LIMITED: Bing quota exceeded); } if (error.code ECONNABORTED) { throw new Error(SKILL_TIMEOUT: Request timed out); } throw new Error(SKILL_EXECUTION_ERROR: ${error.message}); } } module.exports { execute };这段代码体现三个实操要点输入清洗YAML 的minLength只做基础校验实际业务中还需移除控制字符、截断长度防止 XSS 或 DoS响应适配Bing API 返回的webPages.value结构与 skills 要求的results[]不同必须做字段映射错误标准化所有异常统一为SKILL_*前缀的字符串错误便于上层 runtime 统一处理避免 LLM 收到原始401 Unauthorized这种无法理解的报错。3.3 CLI 注册与调用让 skills “活”起来假设你已安装codex clinpm install -g codex/cli现在将web-search.skill.yaml注册进本地 skills registry# 1. 注册技能CLI 自动校验 YAML 格式、schema 有效性 codex skills register ./web-search.skill.yaml # 2. 查看已注册技能列表 codex skills list # 输出 # NAME VERSION DESCRIPTION STATUS # web-search 1.3.0 使用 Bing 搜索引擎获取网页摘要... ACTIVE # 3. 手动触发技能调试用 codex /web-search --query 量子计算最新进展 --time-range week --market zh-CNCLI 执行/web-search时的内部流程解析 slash command提取web-search作为 skill name从本地 registry 加载web-search.skill.yaml验证input_schema与传入参数匹配注入BING_SEARCH_API_KEY环境变量到执行上下文调用./src/handlers/web-search.js的execute()函数捕获返回值或标准化错误格式化为 JSON 输出。实操心得首次注册失败90% 是因为handler路径不对或 Node.js 版本不兼容。建议用codex skills validate ./web-search.skill.yaml先校验再codex skills register。另外CLI 默认使用当前目录下的node_modules如果 skills 依赖axios确保package.json中已声明或全局安装npm install -g axios。3.4 与 LLM 集成让 Agent 真正“学会”使用 skillsskills 注册后还需让 LLM 知道它的存在。以 LangChain 为例我们不修改 prompt template而是用Tool Calling机制动态注入from langchain.agents import AgentExecutor, create_tool_calling_agent from langchain_core.tools import tool from langchain_openai import ChatOpenAI # 1. 从 CLI registry 动态加载 skills伪代码 def load_skills_from_cli(): # 调用 codex cli 获取所有 active skills 列表 result subprocess.run([codex, skills, list, --json], capture_outputTrue, textTrue) skills_data json.loads(result.stdout) tools [] for skill in skills_data: # 将 YAML 中的 intent 和 description 转为 LangChain Tool tools.append( tool( nameskill[name], descriptionskill[description], funclambda input, sskill: call_skill_via_cli(s[name], input) ) ) return tools # 2. 创建 Agent自动识别 skills 并调用 llm ChatOpenAI(modelgpt-4-turbo) tools load_skills_from_cli() agent create_tool_calling_agent(llm, tools, prompt) agent_executor AgentExecutor(agentagent, toolstools, verboseTrue) # 3. 调用LLM 自动决定何时调用 web-search result agent_executor.invoke({input: 帮我查一下过去一周关于 Stable Diffusion 3 的技术评测})关键点在于load_skills_from_cli()它绕过硬编码实时读取 CLI registry 状态。当运维同学新增一个github-pr-reviewskill 并codex skills register后Agent 无需重启下次调用时自动发现并可用。这才是 skills 体系的真正威力——能力可热插拔Agent 可持续进化。4. 常见问题排查与避坑指南那些文档里不会写的实战教训4.1 技能注册失败的 5 类高频原因及解决路径现象根本原因快速诊断命令解决方案Error: Failed to parse YAML: unexpected tokenYAML 文件存在不可见 Unicode 字符如零宽空格或缩进混用空格Tabcat -A web-search.skill.yaml | head -n 5查看控制字符用 VS Code 以 UTF-8 无 BOM 格式保存禁用 Tab 插入全部用 2 空格缩进Skill validation failed: input_schema is invalidinput_schema中引用了未定义的$ref或type字段拼写错误如string写成stirngcodex skills validate ./web-search.skill.yaml --verbose使用 JSON Schema Validator 在线工具校验 schema 语法避免复杂嵌套优先用propertiesrequiredHandler not found: ./src/handlers/web-search.jsCLI 执行时工作目录不是 skills 文件所在目录相对路径失效codex skills register ./web-search.skill.yaml --debug在 YAML 中使用绝对路径handler: /full/path/to/src/handlers/web-search.js或确保 CLI 在 skills 目录下执行SKILL_AUTH_FAILED: API key invalid环境变量BING_SEARCH_API_KEY未在 CLI 进程中设置或大小写不匹配YAML 写BING_SEARCH_API_KEY但 export 写bing_search_api_keycodex /web-search --query test --debug查看注入的 env vars在 shell 中export BING_SEARCH_API_KEYyour-key或在 CI/CD 中通过--env参数传入codex --env BING_SEARCH_API_KEYxxx /web-search ...Execution timeout after 8000msskills 实现代码中axiostimeout 设置大于 YAML 中limits.timeout_ms导致 CLI 强制 kill 进程codex skills list --verbose查看 loaded timeout严格遵守 YAML 中的limits.timeout_ms在 handler 代码中设置更短的 timeout如timeout: 7000留 1s 缓冲实操心得我们建立了一个skills-ci流水线每次 PR 提交 skills YAML 时自动运行codex skills validatecodex skills registercodex /test-skill --dry-rundry-run 模式只校验不执行阻断 99% 的低级错误。别指望人工 review 发现 YAML 缩进问题交给机器。4.2 Slash Command 解析歧义为什么/search有时调用错技能CLI 的 slash command 解析看似简单实则暗藏陷阱。例如你注册了两个 skillsweb-search.skill.yamlname:web-searchdb-search.skill.yamlname:db-search当用户输入/search coffee pricesCLI 该调用哪个答案是它会报错Ambiguous command: search matches multiple skills。因为/search是web-search的 alias在 YAML 中aliases: [search]也是db-search的 aliasaliases: [search]CLI 无法确定。解决方案有三强制唯一 alias每个 skill 的aliases数组中确保至少有一个全局唯一 alias。如web-search用[search-web, bing]db-search用[search-db, postgres]上下文感知路由在 CLI 中实现 context-aware resolver。例如当 Agent 正在处理数据库相关 query含SELECT、WHERE等关键词优先匹配db-search否则匹配web-searchLLM 显式指定在 system prompt 中要求 LLM 调用 skills 时必须用全名如/web-search kubernetes tutorial而非/search kubernetes tutorial。我们采用方案 1 方案 3 组合。在web-search.skill.yaml中定义aliases: [search-web, bing, google]支持多引擎在db-search.skill.yaml中定义aliases: [search-db, sql, query]并训练 LLM 在生成 tool call 时始终使用全名。实测将歧义率从 12% 降至 0.3%。4.3 API Key 泄露的 3 层防护实践超稳-q绑在线查询api、免费大模型api这类热词背后是无数开发者因密钥泄露导致的资损。skills 体系若不设防就是新的泄露温床。我们的防护体系分三层第一层环境变量注入基础所有 skills YAML 中的${API_KEY}占位符由 CLI runtime 在进程启动时从 OS 环境变量读取。绝不允许在 YAML、代码、Git history 中出现明文密钥。第二层密钥轮换自动化进阶我们用 HashiCorp Vault 管理密钥CLI 启动时通过 Vault Agent 注入临时 token# 启动 CLI 时自动获取短期密钥 vault agent -configvault.hcl codex --vault-token-file /tmp/vault-token /web-search ...Vault 配置vault.hcl中定义 TTL如 1 小时过期自动失效杜绝长期密钥风险。第三层密钥使用审计生产必需在 skills handler 中埋点记录每次 API 调用的调用 skill 名称调用者 IPCLI 客户端 IP调用时间戳请求参数摘要脱敏如query: kubernetes*响应状态码日志发送至 ELK设置告警规则“同一 IP 1 分钟内调用web-search超过 100 次”或“deepseek-invoke返回 401 频次突增”第一时间定位泄露源头。踩过的坑曾有实习生把DEEPSEEK_API_KEY写在docker-compose.yml的environment字段里容器启动时注入到所有服务导致密钥在 Prometheus metrics 中暴露。教训任何配置文件都不应包含密钥只允许 CLI runtime 从可信源Vault、K8s Secret动态注入。4.4 性能瓶颈定位当 skills 响应慢先查这 4 个点skills 响应延迟直接影响 Agent 体验。我们用codex --trace输出的 trace log 定位瓶颈重点关注四个耗时环节Registry Load Time注册加载CLI 从磁盘读取所有.skill.yaml并解析的时间。如果 skills 超过 50 个YAML 解析可能达 300ms。优化启用 CLI cachecodex skills register --cache首次解析后缓存 ASTInput Validation Time参数校验JSON Schema 校验库如ajv对复杂 schema 的校验耗时。优化简化input_schema避免深层嵌套用maxLength代替正则校验Handler Execution Time执行耗时skills 代码本身的执行时间。这是主要瓶颈需 profiling。Node.js 用--inspectPython 用cProfileNetwork Latency网络延迟skills 调用外部 API 的时间。优化为 skills 配置limits.timeout_ms和max_retries并启用连接池如 axios 的http.Agent。一次典型慢查询分析codex --trace /db-query --sql SELECT * FROM huge_table耗时 4.2strace log 显示Handler Execution占 4.1sRegistry Load仅 12ms进入 handler 代码发现未加索引的SELECT *查询加EXPLAIN ANALYZE后发现全表扫描优化 SQL 为SELECT id, name, status FROM huge_table WHERE created_at 2024-01-01耗时降至 87ms。结论90% 的 skills 性能问题不在 CLI 或 YAML而在 handler 代码本身。把 skills 当作普通微服务来优化而不是当作“LLM 插件”忽略。5. 生态延展skills 如何融入现代 AI 开发工作流5.1 从 CLI 到 IDEVS Code 插件让 skills 开发可视化命令行高效但对新手不友好。我们开发了AgentSkills ToolkitVS Code 插件开源在 GitHub将 skills 开发流程图形化YAML 智能提示输入input_schema:后自动补全 JSON Schema 关键字type,properties,required并实时校验语法Schema 可视化编辑点击input_schema右侧 图标打开树形编辑器拖拽添加字段自动生成 YAML一键调试右键 skills 文件 →Debug Skill自动启动 CLI 并注入 mock 参数断点调试 handler 代码Registry 管理面板侧边栏显示所有已注册 skills点击可查看 version、description、last updated并支持Unregister。插件下载量超 2.3k用户反馈“终于不用背 JSON Schema 语法了”。这印证了一个观点skills 不是极客玩具而是需要降低门槛的基础设施。5.2 Skills Market企业级能力共享平台当团队规模扩大skills 会爆发式增长。我们搭建了内部Skills Market基于 Next.js PostgreSQL实现技能发布开发者提交 skills YAML 和 handler 代码经 CI 测试validate dry-run后自动发布版本管理每个 skills 支持 v1.0.0, v1.1.0, v2.0.0Agent 可指定web-search1.2.0调用权限控制financeteam 发布的sap-queryskill只对financegroup 开放使用统计Dashboard 展示各 skills 调用频次、成功率、平均耗时驱动优化决策。最成功的案例是hr-onboardskillHR 部门发布后新员工入职流程中 73% 的重复操作发邮箱、开权限、分配设备由 Agent 自动完成HR 专员从每天处理 20 入职事务降至 3~5 个异常 case。5.3 前端开发 skills让网页也具备“智能体能力”热词中前端开发skills、cli anything wps暗示一个趋势skills 不再局限于后端 API 调用。我们已落地两类前端 skillsDOM 操作 skills如click-button.skill.yamlhandler 用 Puppeteer 执行document.querySelector(selector).click()让 Agent 能操作任意网页WPS Office 集成 skills如wps-export-pdf.skill.yamlhandler 调用 WPS SDK 将 Word 文档转 PDF再上传至 OSS。这类 skills 的挑战在于安全沙箱。我们用 Chromium 的--no-sandbox--disable-web-security启动专用实例并限制其只能访问白名单域名如公司内网 WPS API。前端 skills 的价值在于把浏览器变成 Agent 的“手和眼”不再依赖后端代理。最后分享一个小技巧在 skills YAML 的description字段里刻意加入 LLM 常用的 trigger words。例如web-search的 description 写“查找网页信息可用于回答事实性问题、验证用户陈述、补充知识盲区”比单纯写“调用 Bing API”更能引导 LLM 正确调用。我们 A/B 测试显示优化 description 后skills 调用准确率提升 22%。这提醒我们skills 不仅是工程产物更是人机协作的语言桥梁。
返回列表