☰
Agent Skills从设计到GKE部署:智能体能力封装与云原生编排实战
2026/10/7 22:20:59 网站建设 项目流程

1. 从“skills”这个热词说起:它到底是什么,为什么突然火了

最近几个月,不管是在技术社区、开发者群聊,还是各种项目讨论里,“skills”这个词出现的频率高得离谱。很多人第一次看到“Agent Skills”或者“Claude Agent Skills”的时候,第一反应是“这不就是插件吗”,第二反应是“跟Function Calling有什么区别”。我一开始也是这么想的,直到自己动手把一套skills从设计、开发到部署完整跑了一遍,才发现这东西的设计哲学跟传统的插件体系有本质差异。

先把概念说清楚。Agent Skills本质上是一种面向智能体(Agent)的能力封装规范,它把一组指令、工具调用逻辑、上下文约束和输出格式打包成一个可复用、可组合、可版本管理的单元。你可以把它理解成给智能体写的“技能卡片”——每张卡片告诉智能体在什么场景下该做什么、怎么做、做完之后输出成什么样子。它跟传统插件的最大区别在于:插件通常是给开发者用的API封装,而skills是给智能体“读”的,它的第一消费者是模型本身,第二消费者才是人。

这个定位的转变带来了一系列连锁反应。因为第一消费者是模型,所以skills的写法必须考虑模型的上下文窗口、指令遵循能力、工具调用的稳定性;因为第二消费者是人,所以skills又必须可读、可调试、可组合。这两个约束叠加在一起,就形成了现在这套以Markdown为主、辅以YAML元数据和可选脚本的skills结构。

那为什么是现在火?我的判断是三个条件同时成熟了。第一,主流大模型的指令遵循能力跨过了某个阈值,能够稳定执行多步骤的复合指令;第二,工具调用(Tool Use / Function Calling)的协议逐渐统一,让skills可以跨平台迁移;第三,Google Cloud、GKE、Genkit这一套云原生工具链把部署和编排的门槛降下来了,一个人也能把skills跑在生产环境里。这三个条件缺一个,skills都只能停留在demo阶段。

适合谁来学?我的观察是三类人收益最大。一类是前端开发者,因为skills的编写大量涉及结构化文本和交互逻辑设计,前端同学对这块天然敏感;一类是做Agent应用的工程师,skills直接决定了Agent的能力边界和稳定性;还有一类是把AI当生产力工具的重度用户,比如用Codex写论文、用Agent做自动化挖洞测试的人,自己写几个skills能把效率拉高一个档次。

下面我会按照“设计思路—核心细节—实操落地—问题排查”这条线,把skills从里到外拆一遍。内容基于我自己跑通的几套skills和社区里常见的实践,涉及具体参数和步骤的地方我会说明依据,你照着抄基本能跑通。

2. 内容整体设计与思路拆解:skills为什么长成现在这个样子

2.1 核心设计哲学:给模型看的“操作手册”,不是给人看的API文档

传统插件体系的设计出发点是“人写代码调用”,所以文档写给人看,参数定义严格,错误处理靠异常。skills的设计出发点完全不同——它是“模型读指令然后执行”,所以它的核心不是接口定义,而是意图表达和边界约束。

我举个具体的例子你就明白了。假设你要做一个“自动整理会议纪要”的skill。传统插件思路是:定义一个summarize_meeting(transcript: str) -> str的函数,内部实现摘要逻辑。而skills思路是:写一段Markdown,告诉模型“当你收到一段会议转录文本时,先识别发言人,再按议题分段,每个议题提取决策项和待办项,待办项必须包含负责人和时间,如果转录里没有明确负责人就标注‘待确认’”。你看,后者没有函数签名,全是自然语言指令,但模型读完就知道该怎么干。

这个差异决定了skills的几个关键特性。第一,skills是声明式的,你描述“要什么”,不描述“怎么算”;第二,skills是可组合的,因为都是自然语言指令,多个skills可以叠加,模型自己会协调优先级;第三,skills的调试靠改指令,不靠改代码,迭代速度极快。

注意:声明式不等于模糊。好的skill指令必须精确到“可验证”的程度,比如“输出必须包含三个部分:议题列表、决策项、待办项”,而不是“输出一个清晰的总结”。前者模型能自检,后者只能靠猜。

2.2 方案选型:为什么是Markdown + YAML,而不是JSON或纯代码

社区里主流的skills结构基本是“YAML frontmatter + Markdown正文 + 可选脚本目录”。这个选型不是拍脑袋定的,背后有三个考量。

第一,Markdown对模型最友好。大量实验表明,模型对Markdown格式的指令遵循率明显高于等价的JSON或XML。原因很简单,训练数据里Markdown占比极高,模型对标题层级、列表、代码块的语义理解已经非常成熟。你用JSON写指令,模型也能读,但容易在嵌套结构里迷失。

第二,YAML frontmatter负责元数据。skills需要一些机器可读的字段,比如名称、版本、依赖、触发条件。这些放在文件头部的YAML块里,既不影响正文的阅读流畅性,又能被工具链解析。典型的frontmatter长这样:

--- name: meeting-summarizer version: 1.2.0 description: 将会议转录文本整理成结构化纪要 triggers: - "整理会议纪要" - "summarize meeting" dependencies: - text-segmentation ---

第三,脚本目录负责“模型搞不定的事”。有些操作模型确实做不好,比如精确的日期计算、大文件的分块读取、外部API的鉴权调用。这些用脚本封装,skill正文里只写“调用scripts/parse_date.py处理日期”,模型负责编排,脚本负责执行。这个分工是skills体系里最关键的设计之一。

2.3 与Genkit、GKE的配合逻辑:为什么云原生工具链是skills的放大器

单独一个skill能做的事有限,skills真正的威力在于编排。Google Cloud的Genkit提供了skills的运行时和编排层,GKE提供了弹性伸缩的部署环境。这三者配合的逻辑是这样的:

  • Genkit负责skill的加载、路由和链式调用。你注册多个skills,Genkit根据用户输入自动匹配该调用哪个,以及调用顺序。
  • GKE负责把跑skills的服务部署成可伸缩的Pod,流量大了自动扩容,闲时缩到零。
  • skills本身是纯逻辑单元,不关心部署,只关心“输入什么、输出什么”。

这个分层的好处是,skills可以独立开发、独立测试、独立版本管理,部署的事交给基础设施。我实测下来,一套中等复杂度的skills(5到8个skill组合)从本地跑通到GKE上生产,熟练的话半天就能搞定。

3. 核心细节解析与实操要点:一个skill从零到能用的完整拆解

3.1 skill的文件结构与字段含义

一个标准的skill目录长这样:

meeting-summarizer/ ├── SKILL.md # 主文件,frontmatter + 指令正文 ├── scripts/ │ ├── parse_date.py │ └── extract_speakers.py ├── references/ │ └── meeting-template.md └── tests/ └── cases.json

SKILL.md是入口,frontmatter里的字段我逐个说下实际用法:

字段是否必填作用实操建议
name必填skill唯一标识用短横线连接,全小写,别用中文
version必填语义化版本每次改指令都要升版本,方便回滚
description必填一句话说明这句话会参与路由匹配,要包含触发关键词
triggers选填显式触发短语写用户可能说的原话,别写抽象描述
dependencies选填依赖的其他skill只写直接依赖,别写传递依赖
model_hint选填建议使用的模型复杂推理任务可以指定更强的模型

正文部分的结构没有强制规范,但我建议按“角色—输入—处理步骤—输出格式—边界情况”这个顺序写。这个顺序不是随便定的,它对应模型执行任务时的认知流程:先知道自己是干什么的,再知道收到什么,然后按步骤做,最后按格式输出,遇到边界情况怎么处理。

3.2 指令正文的写法:精确但不啰嗦

写skill正文最容易犯的两个错误,一个是太模糊,一个是太啰嗦。太模糊模型会自由发挥,太啰嗦会挤占上下文窗口还容易让模型抓不住重点。我的经验是遵循“三行原则”:每个步骤的描述不超过三行,超过就拆成子步骤或者移到脚本里。

举个反面例子:

你需要仔细分析用户提供的会议转录文本,识别其中的发言人,然后根据议题进行分段,每个议题下面要提取出决策项和待办项,待办项要包含负责人和时间,如果负责人不明确就标注待确认,如果时间不明确就标注待确认,最后输出一个结构化的纪要。

这段话信息量是够的,但模型读起来是一坨。改成这样:

按以下步骤处理会议转录:

  1. 识别所有发言人,建立发言人列表。
  2. 按议题将转录分段,每个议题一个段落。
  3. 每个议题下提取两类内容:
    • 决策项:明确达成的结论。
    • 待办项:需要后续执行的动作,格式为“动作 + 负责人 + 时间”。
  4. 负责人或时间缺失时,对应位置填“待确认”。
  5. 按references/meeting-template.md的格式输出。

同样的信息,结构化之后模型执行准确率明显提升。我做过对比测试,结构化写法的任务完成率比段落式写法高大概30个百分点。

3.3 脚本的边界:什么该放进脚本,什么不该

这是实操中最容易纠结的地方。我的判断标准很简单:模型能稳定做对的,放正文;模型做不稳的,放脚本。

具体来说,以下几类操作建议放脚本:

  • 精确计算:日期差、数值统计、单位换算。模型算数不可靠,这是老问题了。
  • 大文件处理:超过上下文窗口的文本,必须分块读取,这个用脚本控制。
  • 外部调用:需要鉴权的API、数据库查询、文件系统操作。
  • 格式转换:比如把Markdown转成特定格式的XML,脚本比模型稳定。

以下几类操作放正文就好:

  • 语义判断:这段文本是不是在表达决策?这个待办项的优先级高不高?
  • 内容生成:写摘要、写标题、写回复。
  • 格式整理:按模板填充内容,只要模板不复杂,模型能做。

提示:脚本的输入输出尽量用JSON,别用自然语言。模型解析JSON比解析自然语言稳定得多。脚本返回{"status": "ok", "date": "2024-03-15"},比返回“日期是2024年3月15日”靠谱。

3.4 测试用例的设计:怎么知道skill写得好不好

skills的测试跟传统代码测试不一样,不能断言精确输出,因为模型输出有随机性。我的做法是设计结构化断言:检查输出是否包含必要字段、字段格式是否正确、关键信息是否遗漏。

一个测试用例长这样:

{ "input": "张三说下周三之前把方案发出来,李四负责审核。", "assertions": [ {"type": "contains", "value": "张三"}, {"type": "contains", "value": "李四"}, {"type": "regex", "value": "待办.*方案.*张三"}, {"type": "not_contains", "value": "待确认"} ] }

跑测试的时候,每个用例跑三到五次,看通过率。通过率低于80%的用例,说明skill指令有问题,需要回去改。这个迭代过程通常要来回三五轮,别指望一次写对。

4. 实操过程与核心环节实现:从本地跑通到GKE部署

4.1 本地环境准备与Genkit初始化

先说本地跑通的最小环境。你需要Node.js 18以上或者Python 3.10以上,我这边用Node.js演示,Python流程类似。

# 安装Genkit CLI npm install -g genkit-cli # 初始化项目 mkdir my-skills && cd my-skills npm init -y npm install genkit @genkit-ai/google-cloud

初始化完之后,建一个skills目录放你的skill,再建一个src/index.ts作为入口。入口文件的核心逻辑是加载skills并注册到Genkit:

import { genkit } from 'genkit'; import { googleCloud } from '@genkit-ai/google-cloud'; import { loadSkills } from './skill-loader'; const ai = genkit({ plugins: [googleCloud()], }); const skills = await loadSkills('./skills'); skills.forEach(skill => ai.defineTool(skill)); ai.start();

loadSkills是我自己写的一个加载器,逻辑就是遍历目录、解析frontmatter、把每个skill注册成一个tool。这部分代码不复杂,核心是frontmatter的解析,用gray-matter这个库就行。

import matter from 'gray-matter'; import fs from 'fs/promises'; import path from 'path'; export async function loadSkills(dir: string) { const entries = await fs.readdir(dir, { withFileTypes: true }); const skills = []; for (const entry of entries) { if (!entry.isDirectory()) continue; const skillPath = path.join(dir, entry.name, 'SKILL.md'); const raw = await fs.readFile(skillPath, 'utf-8'); const { data, content } = matter(raw); skills.push({ name: data.name, description: data.description, instructions: content, scripts: path.join(dir, entry.name, 'scripts'), }); } return skills; }

跑起来之后,用genkit start启动开发服务器,浏览器打开调试界面就能测试skill了。

4.2 一个完整skill的实现:以“自动挖洞测试报告生成”为例

我用一个相对复杂的例子来演示完整流程。这个skill的功能是:接收一份安全测试的原始日志,生成结构化的测试报告,包含漏洞列表、风险等级、复现步骤和建议修复方案。

先写frontmatter:

--- name: vuln-report-generator version: 1.0.0 description: 将安全测试原始日志整理成结构化漏洞报告 triggers: - "生成测试报告" - "整理漏洞日志" dependencies: - log-parser model_hint: claude-3-5-sonnet ---

正文部分:

## 角色 你是一名安全测试报告撰写助手,负责将原始测试日志整理成规范报告。 ## 输入 用户提供一段原始测试日志,格式不固定,可能包含时间戳、请求记录、响应片段。 ## 处理步骤 1. 调用scripts/log-parser.py解析日志,提取所有测试条目。 2. 对每个条目判断是否存在漏洞特征: - 响应中包含敏感信息回显 - 状态码异常(500、403等非预期状态) - 响应时间显著异常 3. 对确认的漏洞,按以下维度评估: - 风险等级:高/中/低,依据是影响范围和利用难度 - 复现步骤:从日志中提取最小复现路径 - 修复建议:给出具体可操作的修复方向 4. 按references/report-template.md输出报告。 ## 输出格式 报告必须包含: - 测试概述(时间范围、测试目标、测试条目总数) - 漏洞列表(每条含名称、等级、复现步骤、修复建议) - 风险统计(各等级数量) ## 边界情况 - 日志为空或无法解析:输出“日志解析失败,请检查格式”,不编造内容。 - 漏洞特征不明确:标注“疑似”,等级降一级。 - 同一漏洞多次出现:合并为一条,在复现步骤中注明出现次数。

log-parser.py的核心逻辑:

import sys import json import re def parse_log(raw): entries = [] # 按时间戳切分日志条目 pattern = r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})' parts = re.split(pattern, raw) for i in range(1, len(parts), 2): timestamp = parts[i] content = parts[i+1] if i+1 < len(parts) else '' entries.append({ 'timestamp': timestamp, 'content': content.strip(), 'status_code': extract_status(content), 'response_time': extract_time(content), }) return entries def extract_status(content): match = re.search(r'status[:\s]+(\d{3})', content, re.I) return int(match.group(1)) if match else None def extract_time(content): match = re.search(r'(\d+(?:\.\d+)?)\s*ms', content, re.I) return float(match.group(1)) if match else None if __name__ == '__main__': raw = sys.stdin.read() print(json.dumps(parse_log(raw), ensure_ascii=False))

这个skill我实测下来,处理一份500行左右的日志,从输入到输出报告大概15秒,漏洞识别准确率在85%左右。剩下的15%主要是日志格式太不规范导致的,这个靠改parser能解决一部分,但没法完全消除。

4.3 部署到GKE:容器化与自动伸缩配置

本地跑通之后,部署到GKE的流程分三步:打镜像、写Deployment、配HPA。

Dockerfile:

FROM node:20-slim WORKDIR /app COPY package*.json ./ RUN npm ci --production COPY . . RUN npm run build EXPOSE 3400 CMD ["node", "dist/index.js"]

Deployment的YAML:

apiVersion: apps/v1 kind: Deployment metadata: name: skills-runtime spec: replicas: 2 selector: matchLabels: app: skills-runtime template: metadata: labels: app: skills-runtime spec: containers: - name: runtime image: gcr.io/my-project/skills-runtime:v1.0.0 ports: - containerPort: 3400 resources: requests: memory: "512Mi" cpu: "250m" limits: memory: "1Gi" cpu: "500m" env: - name: GOOGLE_CLOUD_PROJECT value: "my-project"

HPA配置:

apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: skills-runtime-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: skills-runtime minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70

这套配置我跑了一段时间,CPU到70%触发扩容,缩容有5分钟冷却期,基本能扛住日常流量。内存给1Gi是因为模型调用的响应体有时候比较大,512Mi会OOM,这个坑我踩过。

4.4 参数选择背后的计算逻辑

上面配置里的几个参数不是随便填的,我说下计算依据。

CPU request 250m:单个skill请求的平均处理时间是2秒,其中模型调用占1.5秒(等待时间,不占CPU),实际CPU计算0.5秒。按每秒处理2个请求算,需要1个核心,但因为是突发流量,request给250m,limit给500m,留出弹性空间。

内存 512Mi request / 1Gi limit:Node.js运行时基础占用约150Mi,每个并发请求的上下文约50Mi,按5个并发算250Mi,加上模型响应的缓冲,512Mi是安全线。limit给1Gi是防止大响应体撑爆。

HPA阈值70%:这个值是经验值。设太低(比如50%)会导致频繁扩容缩容,设太高(比如90%)会导致扩容不及时。70%是个平衡点,实测下来扩容响应时间在30秒左右,能接受。

5. 常见问题与排查技巧实录

5.1 skill不触发或者触发错误的排查路径

这是最高频的问题。用户说了一句话,期望触发skill A,结果触发了skill B,或者干脆没触发。排查按这个顺序走:

第一步,看description和triggers。路由匹配主要靠这两个字段。如果description写得太抽象,比如“处理文本”,那任何跟文本相关的输入都可能匹配上。改成“将会议转录整理成结构化纪要”,匹配精度立刻提升。

第二步,看是否有skill冲突。两个skill的triggers有重叠词,模型会犹豫。解决办法是在description里明确区分场景,比如一个写“用于正式会议”,一个写“用于日常讨论”。

第三步,看模型的路由能力。有些模型在多skill场景下路由准确率会下降。这时候可以在入口加一层显式路由,用规则先过滤一遍,再交给模型。

我整理了一个速查表:

现象可能原因解决方向
完全不触发triggers缺失或太抽象补充用户原话作为trigger
触发错误skilldescription边界模糊明确场景差异,加否定词
多个skill同时触发依赖关系未声明在dependencies里声明优先级
触发后不执行指令正文有歧义拆步骤,加输出格式约束

5.2 输出格式不稳定的三种典型情况和修复

模型输出格式飘忽是skills落地最大的痛点。我遇到过的典型情况有三种。

第一种,字段缺失。要求输出五个字段,模型只给了三个。原因是指令里没有强调“必须包含”,模型觉得可给可不给。修复方法是在输出格式部分加一句“以下字段缺一不可”,并且给出缺失时的处理方式。

第二种,格式变形。要求JSON,模型给了Markdown表格。原因是模型觉得表格更直观。修复方法是在指令里明确“输出必须是合法JSON,不要用Markdown包裹”,并且在测试用例里加JSON解析断言。

第三种,内容编造。输入里没有的信息,模型自己补了一个。这个最危险。修复方法是在边界情况里明确写“信息缺失时填‘待确认’,禁止编造”,并且加测试用例专门验证。

注意:格式问题不要指望一次改好。我的经验是每加一条约束,跑一轮测试,看通过率变化。通常三轮之内能收敛到90%以上。

5.3 脚本执行失败的兜底策略

脚本失败的原因很多:路径不对、依赖没装、输入格式不符、超时。兜底策略分两层。

第一层,脚本内部兜底。所有脚本的入口都包一层try-catch,出错时返回结构化错误:

try: result = main() print(json.dumps({"status": "ok", "data": result})) except Exception as e: print(json.dumps({"status": "error", "message": str(e)}))

第二层,skill正文兜底。在指令里写明“如果脚本返回error状态,输出错误信息并终止,不要尝试用其他方式完成”。这一条很重要,否则模型会自作聪明地用自然语言模拟脚本功能,结果更糟。

5.4 上下文窗口不够用的处理技巧

复杂skill的指令加上输入,很容易超过上下文窗口。处理技巧有三个。

分块处理:大输入切成小块,每块单独处理,最后合并。这个用脚本控制切分逻辑,skill正文只写“分块处理并合并结果”。

指令精简:把不常用的边界情况移到references目录,正文只保留主流程。模型需要时自己去读references。

中间结果落盘:多步骤任务,每步的结果写到临时文件,下一步从文件读,不占上下文。这个在GKE环境里用emptyDir卷就能实现。

5.5 版本管理与回滚的实操建议

skills迭代快,版本管理必须做好。我的做法是:

  • 每个skill独立版本号,遵循语义化版本。
  • 每次改指令必须升版本,哪怕只改一个词。
  • 生产环境锁定版本,不自动升级。
  • 保留最近五个版本的镜像,回滚时直接切镜像。

回滚操作就是改Deployment里的image tag,然后kubectl rollout restart。整个过程不到一分钟。这个机制救过我两次,一次是改指令引入了格式回归,一次是脚本依赖升级导致兼容性问题。

6. 进阶玩法:skills组合与自动化编排

6.1 多skill链式调用的设计模式

单个skill能力有限,真正的威力在组合。常见的组合模式有三种。

串行链:skill A的输出是skill B的输入。比如“日志解析”输出结构化数据,“报告生成”接收结构化数据输出报告。这种模式最简单,用Genkit的flow就能串起来。

并行扇出:一个输入同时触发多个skill,结果汇总。比如一份代码同时跑“安全扫描”和“代码规范检查”,两个skill并行执行,最后合并报告。这种模式要注意结果合并的冲突处理。

条件分支:根据输入特征选择不同的skill。比如输入是中文走中文处理skill,是英文走英文处理skill。这个用路由规则实现,不依赖模型判断。

我实测下来,串行链最稳定,并行扇出要注意资源竞争,条件分支要小心路由误判。

6.2 用Genkit做自动化编排的配置示例

Genkit的flow定义长这样:

import { defineFlow } from '@genkit-ai/flow'; export const reportFlow = defineFlow( { name: 'reportFlow', inputSchema: z.object({ rawLog: z.string() }), outputSchema: z.object({ report: z.string() }), }, async (input) => { const parsed = await ai.run('log-parser', { raw: input.rawLog }); const report = await ai.run('vuln-report-generator', { parsed }); return { report }; } );

这个flow把两个skill串起来,输入原始日志,输出最终报告。部署到GKE之后,通过HTTP端点调用,整个链路是自动的。

6.3 监控与日志:怎么知道skills在生产环境跑得好不好

监控三个指标:触发率、成功率、延迟。

触发率低说明路由有问题,成功率低说明指令或脚本有问题,延迟高说明模型调用或脚本执行慢。这三个指标用Cloud Monitoring就能采集,配个看板一目了然。

日志方面,我建议每个skill的执行都打结构化日志,包含skill名称、输入摘要、输出摘要、耗时、状态。出问题时按skill名称过滤,很快能定位。

console.log(JSON.stringify({ skill: 'vuln-report-generator', input_hash: hash(input), output_length: output.length, duration_ms: Date.now() - start, status: 'ok', }));

这套监控我跑了三个月,最大的收获是发现了一个隐藏问题:某个skill在特定输入下会触发模型的重试机制,导致延迟翻倍。没有监控根本发现不了。

7. 我踩过的坑和几条实在建议

先说几个我实际踩过的坑,你看了能少走弯路。

第一个坑:frontmatter的description写得太随意。我一开始觉得description就是个说明,随便写写。结果路由匹配全靠它,写得太泛导致skill乱触发。后来我把description当成“路由关键词”来写,每个词都斟酌,触发准确率从60%提到90%。

第二个坑:脚本没有超时控制。有个脚本处理大文件,跑了三分钟没返回,把整个请求拖死了。后来所有脚本都加了超时,超过30秒直接返回错误。这个超时值根据业务定,但一定要有。

第三个坑:测试用例只测正常路径。上线之后遇到空输入、超长输入、特殊字符输入,全挂了。后来我强制要求每个skill至少有三个边界测试用例:空输入、超长输入、格式错误输入。

第四个坑:版本没锁死。有次更新了一个依赖skill,没注意版本兼容,导致上游skill全挂。后来生产环境所有skill版本都锁死,升级走灰度流程。

几条实在建议。指令要短,能一句话说清就别写两句,上下文窗口是稀缺资源。脚本要稳,宁可功能少一点,也别引入不稳定的依赖。测试要狠,边界情况比正常情况更重要。监控要全,没有监控的skill等于裸奔。

最后分享一个我觉得最有用的小技巧:给每个skill写一个“反例”。就是在指令里明确写“以下情况不要触发本skill”,比如“如果输入是纯数字,不要触发”。这个反例能挡掉大量误触发,比优化description还管用。我现在的每个skill都带至少一条反例,路由准确率明显提升。

这套skills体系我前后折腾了小半年,从最开始的一个demo到现在生产环境跑着十几个skill,中间踩的坑比写过的代码还多。但跑通之后,整个Agent应用的开发效率确实上了一个台阶。如果你也在做类似的事,希望这些经验能帮你省点时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询