智能体与技能的数据模型
公开教程 · 无需登录

智能体与技能的数据模型

本课有两个由教师维护的配置制品:智能体把角色提示词与「能用的技能」「能查的材料」绑在一起;技能以单一文本文件定义,空行以上是元数据,空行以下是引导规程。两者都按班级切分,一次回答只用会话选定的那一个智能体所绑定的部分。文末对照主流的 SKILL.md 格式,说明本课为什么这样选。

1智能体:提示词与两份绑定

智能体是本班的一个配置单位。它不复制技能与材料的正文,只保存绑定关系;技能与材料各自仍是班级级的行。

字段 / 关系含义约束
id主键自增
class_id所属班级跨班不可见;按编号直取他班智能体返回 404
name名称班内唯一,不超过 64 字
prompt角色提示词不超过 2000 字;为空时回退到默认角色设定,不因此拒绝请求
enabled启用状态为否时学生列不到、也选不了;已存在的会话不受影响
tutor_agent_skills绑定的技能只能绑本班技能,跨班或不存在按 404 处理;未绑定或已停用的技能不参与路由
tutor_agent_materials绑定的材料只能绑本班材料;空绑定是合法状态,此时检索为空
智能体 name · prompt enabled · class_id 一个班可以有多个 会话新建时选定 智能体 ↔ 技能 agent_id · skill_id 智能体 ↔ 材料 agent_id · material_id skills · 本班技能 未绑定的不参与路由 materials · 本班材料 未绑定的不进这次检索
绑定关系是两张关联表,不是智能体行里的字段快照:教师改了绑定,下一次提问即按新关系作答,不必重建智能体。

2技能的字段与来源

技能以单一文本文件定义:空行以上是元数据,空行以下是引导规程。服务端解析后写入 skills 表;一条技能要参与路由,还须被某个智能体绑定且处于启用状态。

字段含义约束
id主键自增
class_id所属班级跨班不可见,按编号直取他班技能返回 404
name名称班内唯一,不超过 32 字;含「解题引导」时触发不给最终答案的硬性要求
trigger_text适用条件不超过 120 字;按中英文逗号、顿号、分号或竖线切词,再逐词与提问比对
description说明空行以下的正文,不超过 2000 字,整段进入系统消息
tools_json工具列表本课只接受 knowledge_search,其他值在解析阶段即被拒绝
source_text文件原文保留教师写的整份文件,便于取回再编辑
subject_text资料范围不超过 32 字;非空时只保留标题含该词的材料
enabled启用状态为否时不参与路由,即使仍被智能体绑定着
seed_key种子幂等键预置技能专用;教师自建的技能为 NULL
教师写的技能文件 空行以上:名称 适用条件 资料 工具 启用 空行以下:说明 解析 校验字段与长度 原文一并保留 skills 表的一行 name · trigger_text · subject_text tools_json · enabled description ← 空行以下 source_text ← 整份原文
文件是教师唯一的输入接口;表的每一列均可溯源到文件中的字段,无需另行填写表单。

3两份样板

下面是 A 班预置的两份技能文件。空行之前是元数据,空行之后是引导规程;# 开头的行与空行在元数据区被忽略。

名称:数学解题引导
适用条件:方程,去括号,分数,通分,面积,应用题,未知数,行程
资料:数学
工具:knowledge_search
启用:是

学生正在自己做数学作业,往往已经写了一步。先看懂他卡在哪一步,只指出下一步该检查什么,例如去括号有没有乘到每一项、分母不同要不要先通分、该设哪个未知数。不要算出最终得数,不要把整道题做完。依据只用数学自学笔记,并标出材料标题和位置。
名称:语文解题引导
适用条件:春晓,默写,阅读,中心,作文,开头,古诗,词语
资料:语文
工具:knowledge_search
启用:是

学生正在自己背诵、做阅读或改作文,卡在某一句。先接住他已经写出的那一句,告诉他往前看哪一句、找哪类句子。不要把诗的下一句、中心句或改好的段落直接写出来。依据只用语文自学笔记,并标出材料标题和位置。
解析规则:文件不超过 8000 字;名称、适用条件与启用三项必填;同一字段重复出现、出现未定义字段、或空行以下缺少正文,均在提交时被拒绝,并返回面向教师的可读错误信息。

4本课格式与主流 SKILL.md 的差异

本课的技能文件是项目自定义格式,不是 Agent Skills 规范的 SKILL.md。两者的差别不在写法,而在于由谁决定「这次提问该用哪个技能」。

先交代对方的形态:规范要求一个技能是一个目录,目录中的 SKILL.md 以 YAML frontmatter 开头——即由两行 --- 夹住的一段键值元数据,其后才是正文;正文之外还可放脚本与参考文件,按需载入。

维度SKILL.md(Agent Skills 规范)本课实现
形态目录 skill-name/ 内含 SKILL.md,可再带脚本与参考文件单个纯文本文件,解析后写成 skills 表的一行
元数据YAML frontmatter,name 与 description 必填中文键行:名称、适用条件、资料、工具、启用
正文frontmatter 之后的 Markdown,写法不限空行以下的说明,不超过 2000 字
激活主体模型读 description,自行判断该不该用服务端按适用条件切词计分,至多选一个
加载方式渐进式披露:元数据常驻,正文与资源按需载入全量入库;命中后整段说明进入系统消息
执行参数只有 allowed-tools,且是实验性字段资料即检索范围,工具限定为 knowledge_search
可移植性跨产品通用,可拿到别的 Harness 里直接跑绑定本项目的表结构与路由实现
SKILL.md(Agent Skills 规范) 本课:服务端路由 元数据常驻上下文 name 与 description,约 100 tokens 模型自己判断要不要用 读 description 匹配当前任务 加载 SKILL.md 正文 激活后才读,正文即指令 技能整行存进 skills 表 名称、适用条件、资料、工具、启用 服务端按适用条件计分 逐词匹配提问,同分取编号较小者 至多选一个技能 选中技能的说明进入系统消息 分歧在第二步:由模型在运行时判断,还是由代码在请求内判定
分歧点只有一处,却决定了技能文件里能写什么。左边把判断交给模型,元数据就必须写给人看懂的描述;右边交给代码,就必须写可供切词比对的「适用条件」,以及服务端要拿去约束检索的「资料」与「工具」。
这是一次有取舍的选型,不是格式写错了。把选择权交给代码,换来的是确定性:同一次提问路由到哪个技能可以单测、可以在验证记录里复现、出错能定位到是哪个词没匹配上。代价是技能读不懂超出「适用条件」词表的意图。Agent Skills 规范反过来,覆盖面更宽,但同一次提问的结果不易复现——两种做法服务于不同的目标。

5写权限与生效时机

操作接口与角色生效时机
列出本班智能体已登录即可;学生只得到已启用的即时
创建、修改、启停智能体仅教师;同时提交绑定的技能与材料编号下一次提问即按新关系作答;已有会话立即改用它
列出本班技能已登录即可即时
新建、修改、删除技能仅教师下一次提问即按新配置路由;删除会同时清掉绑定
把技能从智能体解绑(或停用技能)仅教师该技能下一次提问起不再参与这个智能体的路由
配置不随会话创建时的快照(snapshot)固化:会话锁定的只是「用哪个智能体」,而该智能体当前绑了哪些技能与材料,每次提问重新读取。教师中途解绑某技能后,已存在的会话下一次提问即按新关系路由——验收时可解绑后重放同一提问,对比回答行为的差异。