https://ark.cn-beijing.volces.com/api/v3ep- 开头)或模型名系统的核心是:角色和任务包分离。换一节课 = 新建一个任务包, 引用已有的角色(不满意就复制一份改),完全不动代码。
在提示词里写"禁止超过 120 字",模型是尽量遵守;在环节的「输出约束」里配
maxChars: 120,则是超了直接截断。后者才是能兜底的。
可配置的约束项:maxChars(字数上限)、mustEndWithQuestion(必须以问句结尾)、
forbidAnswer(禁止给答案)、bannedWords(禁语)、
deflectPhrases + deflectReply(敏感话题兜底)、
oneQuestionOnly(收敛为单一问句)、questionSuffix(未成问句时追加的话)。
| 原来的做法 | 问题 | 现在 |
|---|---|---|
教师手打 【追问】 等指令 |
赛课现场手忙脚乱 | 环节本身就是按钮,指令由配置生成 |
| 关键词打分判断学生说的是哪条线 | 词表盖不住课堂表达,漏了就答非所问 | 按环节切换,历史完整传给模型自己判断 |
| 铁律只写在提示词里 | 模型是"尽量遵守",会漏 | 约束下沉到引擎,超字数直接截断、命中禁语直接拦 |
| AI 教师固定在场 | 很多课根本不需要老师发言 | AI 教师是一个可插拔环节,用不用你定 |
| 断网就白屏 | 赛课现场断网是真实风险 | 每个环节可配 fallback 话术顶上 |
lesson-agent/ ├─ src/ │ ├─ config.js 全局配置(火山默认值 + env 覆盖) │ ├─ store.js JSON 存储,原子写 │ ├─ llm.js openai SDK 封装,兼各类报错 │ ├─ promptComposer.js 三层提示词拼装 │ ├─ guard.js ★ 守卫层:字数/问句/禁语/禁答 │ ├─ stageRunner.js ★ 环节执行器(类型见「环节类型」表) │ └─ server.js Express 路由 ├─ public/ 课堂界面 + 设置中心 └─ data/ ├─ roles/ 角色卡(可独立复用) ├─ tasks/ 任务包(一节课) └─ sessions/ 课堂记录