共计 2136 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点:技能系统为何需要规范定义
在开发技能平台时,我们经常遇到以下问题:

- 字段冗余:不同开发者定义的 skill 包含大量重复字段,导致存储浪费
- 语义歧义:相同字段名在不同 skill 中表示不同含义(如 ”context” 可能指运行环境或对话上下文)
- 版本冲突:缺少明确的版本控制机制,导致线上技能行为不一致
这些问题使得系统耦合度增加 50% 以上(根据内部项目统计),每次迭代都需要人工核对字段定义,严重拖慢交付速度。
技术方案:基于 DDD 的规范设计
1. 领域划分
采用 DDD 划分核心域与支撑域:
@startuml
package "Skill 领域" {[Skill 元数据] as meta
[输入参数] as input
[输出参数] as output
[版本控制] as version
}
package "支撑域" {[权限管理] as auth
[监控统计] as monitor
}
meta --> input
meta --> output
meta --> version
auth ..> meta
monitor ..> output
@enduml
2. 标准 JSON Schema 设计
核心字段包括:
interface SkillDefinition {
// 元数据
metadata: {
name: string; // 全平台唯一标识
description: string;
author: string;
tags: string[];};
// 输入输出
parameters: {
inputs: Record<string, ParameterDef>;
outputs: Record<string, ParameterDef>;
};
// 版本控制
version: {
major: number; // 遵循 SemVer 规范
minor: number;
patch: number;
compatibility: string[]; // 明确声明兼容版本};
}
interface ParameterDef {
type: 'string' | 'number' | 'boolean' | 'object';
required: boolean;
description: string;
example?: any; // 示例值
}
3. 版本控制机制
采用 SemVer 规范并扩展兼容性声明:
- MAJOR:不兼容的 API 修改
- MINOR:向下兼容的功能新增
- PATCH:向下兼容的问题修正
实现细节:从规范到工具链
自动化校验工具实现
使用 AJV 进行运行时校验:
import Ajv from 'ajv';
import skillSchema from './skill-schema.json';
const ajv = new Ajv({
allErrors: true,
strict: true,
});
// 预编译校验器
const validateSkill = ajv.compile(skillSchema);
function validateSkillDefinition(skill: unknown) {if (!validateSkill(skill)) {
throw new Error(`Invalid skill definition: ${ajv.errorsText(validateSkill.errors)}`
);
}
// 额外校验版本兼容性
checkVersionCompatibility(skill);
}
配套的单元测试:
describe('Skill Validator', () => {it('should reject invalid parameter types', () => {
const invalidSkill = {metadata: { name: 'test'},
parameters: {inputs: { foo: { type: 'array'} } } // 非支持类型
};
expect(() => validateSkillDefinition(invalidSkill))
.toThrow('必须是 string/number/boolean/object 之一');
});
});
生产环境考量
定义格式对比
| 格式 | 可读性 | 解析性能 | 工具链支持 |
|---|---|---|---|
| JSON | 中 | 高 | 完善 |
| YAML | 高 | 中 | 一般 |
| Protobuf | 低 | 极高 | 需要编译 |
建议选择 JSON 作为主格式,配合编辑器插件实现 YAML 的友好编辑体验。
版本迁移策略
- 双版本并行:新旧版本同时运行 3 - 6 个月
- 自动转换层:开发适配器处理版本差异
- 用量监控:当旧版本调用量 <5% 时下线
避坑指南
反模式预警
- 过度设计:避免为不存在的需求添加字段(如提前添加 AI 相关字段)
- 单一超大 skill:单个 skill 不应超过 20 个输入参数
- 魔法字段 :禁止使用
_前缀等特殊字段表示业务含义
多租户处理
采用三段式命名解决冲突:
{租户前缀}.{业务域}.{技能名}
// 示例:clientA.chatbot.weatherQuery
实践资源
我们开源了规范检查工具链:
github.com/skill-validator
欢迎提交 PR 改进以下方面:
– 新增参数类型校验规则
– 优化错误提示信息
– 扩展 IDE 插件功能
写在最后
这套规范在笔者团队落地后,技能系统的平均维护时间从 8 人日 / 月降至 2 人日 / 月。特别建议在项目早期就引入规范定义,越晚治理成本越高。对于已有历史债务的系统,可以采用增量迁移策略,新 skill 严格按规范开发,旧 skill 逐步改造。
正文完
发表至: 软件开发
近两天内
