1. 从纯技术到通用

最初的 study-coach 只教技术概念。但 6 条核心原则——校准直觉、开场预告、形式化+直觉双轨、苏格拉底提问、错而不否定、现象→根因→解法——没有一个依赖“技术“二字。

所以第一件事:去掉所有“技术概念“的限定,把领域扩展到文学、物理、思维方法。改的不是原则,是 self-description。

2. 6 条原则为什么刚好够

原则功能
① 校准直觉如果学习者带着猜测来,先评估再讲,不要无视他的心智模型
② 开场预告一句话说清接下来从哪个角度切入,不要灌输式铺陈
③ 形式化 + 直觉同一知识点给两种表达——公式/图/表 + 比喻/一句话总结
④ 苏格拉底提问推理链最关键的一步抛回给学习者,让他自己接
⑤ 错而不否定答偏时不判对错。有对的碎片就摘出来;全错就顺逻辑追到矛盾处
⑥ 现象 → 根因 → 解法收束时把零散表现压进一个根因,再给统一解法

闭环逻辑:校准 → 预告 → 双轨 → 提问 → 接住偏差 → 收束。缺任何一条都会断链。

3. 子文档是怎么被反复推翻重建的

最初的子文档是“形式化表达列表“——只告诉 AI 用什么工具画,没告诉它怎么用。

改了两版:

  1. 加了完整教学示例(physics 的 5 轮对话最完整)
  2. 把“常见陷阱“从抽象警告改成 ❌ 触发 / ✅ 修正对

narrative 的拒绝召唤是最惨的例子。 第一版提问是“如果一部电影没有拒绝召唤,观众会觉得差在哪儿?“——这句话预设了“缺少 = 差”。我作为读者回答“我不会觉得虚假“,直接证伪了这个预设。然后改成了反问查理(《献给阿尔吉侬的花束》)的好处——引导思考“拒绝召唤到底服务于哪类故事“。

而且这个提问恰好违反了子文档自己的第一条陷阱——“不要把套路当规则”。一个例子教 AI 不要做的事,例子自己正在做。

教训:写完任何示例,必须拿子文档自己的 ❌ 触发过一遍。如果示例在触发自己警告的陷阱,AI 学到的不是规则,是“规则不重要“。

4. 核心概念的命名决定复用

physics 原来的直觉句是“你不是没重量,是没人称你的重量“。这句话对,但不够结实——后续所有场景(电梯、宇航员、过山车)都回不到同一个词上。

改成“本质是支持力“之后,一切通了:秤测的是支持力 N,不是重力 mg。失重 = N = 0。宇航员在轨道上也是 N = 0。所有场景回到同一个公式 N = m(g-a)。

教训:例子里的第一直觉句不是装饰。它是学习者后续解释新场景时的把手。把手不结实,迁移就断。

5. 触发机制:从宽到窄

最初触发

祈使:"教我 X" / "讲讲 X"
陈述:"我想学 X" / "搞懂 X"
猜测:"X 是不是___?" / "为什么 X 这样设计?"
判定准则:用户想要"理解(why/how)"而非"查询(what)"

问题

“帮我写一个用 Promise 调接口的函数”——这个请求中没有触发展示词。但模型走了判定准则,把它理解为“用户想学 how to write Promise“→ 触发 skill → 给了教学式回答。

误触发。

根因

“判定准则:用户想要理解而非查询“是一条推断规则。它让模型替用户决定意图。对于搜索或 debug skill,推断可能合理。但对于教学 skill——侵入性强、会改变整个对话节奏——推断很危险。

修复

砍掉:

  • “X 是不是___?” 和 “为什么 X 这样设计?”(模糊触发)
  • “判定准则:用户想要理解而非查询”(是误触发的直接根因)
触发仅保留:教我 / 讲讲 / 我想学 / 搞懂 / 帮我理解
不启用明确列出:帮我写 X(要代码)、X 的语法/API 怎么用(查用法)

设计立场:触发权从模型还给用户。你说“教我“,我教。你没说,我不猜。

6. 测试验证

测试矩阵

11 条用例,两种模型(deepseek-v4-pro / v4-flash),逐条跑:

类型例句
应触发教我 Promise 链怎么传值
应触发我想搞懂 Raft 为什么需要 leader
应不触发Promise.all 的语法是什么
应不触发帮我 debug 这段代码
应不触发(曾误触发)帮我写一个用 Promise 调接口的函数
观察Raft 论文哪年发表

结果

模型应触发应不触发误触发漏触发
pro4/47/700
flash4/47/700

两个模型完全一致。触发修正有效。

7. 从这次设计里拿走什么

  1. 写完示例先拿自己的陷阱过一遍。 示例犯规,AI 学犯规。
  2. 苏格拉底提问去问号读剩余陈述句。 如果那句经不起推敲,这个提问在偷运结论。
  3. 核心概念第一轮就命名。 它是后续所有推理的把手,不能是绕圈的直觉句。
  4. 触发权给用户。 对侵入性强的 skill,推断式触发是 bug 不是 feature。
  5. 测试必须跑双模型。 一个干净不代表另一个干净。