探究模式 · Inquiry Mode
简体中文 · English
一个 DSH 模式预设:把"有变量可调、有结果可看"的概念,变成一个学习者亲手操作的任务。

上图是一次真实会话的完整一轮:模型先用普通文字要了两个可证伪的预测("每次动手之前都得先押注, 而且要说出来,心里猜不算"),学习者答完才拿到那张带滑块的实时曲线——整张图只有一个可动的量。 图下的数值表不是装饰:图表渲染失败时它是保底项。
任务单位是单个交互任务,不是一门课。 不建课程树、不排进度、不做题库。它是你在某个概念上"想亲手摸一下"时切进去的模式。
它和已有的东西有什么不同
| 常见做法 | 探究模式 | |
|---|---|---|
| 产物 | 讲解 + 题目 | 一个可以拖的东西 + 一个必须回答的预测 |
| 学习机制 | 看讲解 → 做题 → 判分 | 预测 → 操作 → 观察 → 对质 → 自己说出规律 |
| 结束条件 | 答对 | 他用自己的话说出这个关系 |
| 判分 | LLM 或规则判分 | 不判分——观察结果是事实,"算不算懂"由他说 |
市场上做"学习模式"的产品几乎都收敛到 讲解 + 客观题 + 间隔重复。本预设的差异化在形态 A:亲手拖出直觉(下面第 2 节),而不是再做一个刷题器。
安装
# 1) 装围栏渲染器(可选,但强烈建议——没有它就拖不动图)
dsh plugin --profile web add @changfenhuang/dsh-genui
# 2) 装本插件
dsh plugin --profile web add github:GrowingPPP/dsh-inquiry-preset
把 web 换成你实际在用的 profile(桌面端是 desktop;不确定就跑 ls ~/.dsh/profiles)。
装好后新建会话,在模式列表里选 探究模式。如果列表里没有它,重启一次 DSH 宿主再看—— 插件行的变动有时要重启才进运行中的实例。
关于渲染器
它不是硬依赖。没有渲染器时 dsh-ui 围栏退回普通代码块,任务按 SKILL.md 里写好的降级路径
继续成立(改问数值、列选项、手工算)。
但形态 A(带参数滑块、拖动即时重绘的函数图)是本产品的旗舰做法,没有渲染器就用不了。
所以你至少该装一个——任何支持 dsh-ui 围栏的渲染插件都行,上面那个是实测过可用的。
本地开发:改从仓库目录装 bundle(plugin_manager install_bundle,target 传本仓库根的绝对路径),
这样改动能直接反映到会话里;换成 github: 安装则固定在某个 commit。
权限与兼容性
这个预设挂了什么、没挂什么(都可在 cordis.patch.yml 里核对):
| 内容 | |
|---|---|
| 注册的工具 | skill(按需加载技能)、web_search(联网搜索) |
| 不注册 | 任何 shell、文件读写、子代理、自动化工具 |
| 也不注册 | web_fetch(配置里 fetch: false,只搜不抓网页) |
也就是说:装它不会给你的会话开任何新的执行面。 它改的是"教学行为", 不是"能做什么"——预设内的工具面比标准模式更窄。
外部服务:只有 web_search 会出去,且发往你自己配置的搜索服务。除此之外不访问任何外部端点。
除非你主动切到别的模式,否则它不会碰你的文件、不会跑命令。
兼容性:
DSH:在
0.2.1-alpha.2和0.2.0-rc.2(官方latest)两个版本上都实测通过。 依赖的都是官方包 (dsh-persona/dsh-skill-filesystem/dsh-tool-skill/dsh-tool-web/dsh-compaction-*), 不依赖任何社区插件。两个版本之间逐项比对过我们用到的全部配置面:
agent-preset的 Config 字段、persona.prefix、skill-filesystem.customSkillDirs、tool-web.fetch、三个压缩包的 Config、 以及!!js求值器(with (ctx) { return eval(expr) })——六项全部同形。在
0.2.0-rc.2上做了完整一份隔离安装:组装树正确、启动零告警、技能发现探针全通过, 并跑了一轮真实会话(模型先要一个可证伪的预测并要求说出推理,然后才给带滑块与虚线参照的曲线图)。注:官方
latest是0.2.0-rc.2,而0.2.1-alpha.*是更新的一条 alpha 线, 两条线的代码并不相同——上面两个都是实测过的。平台:只在 macOS + Web profile 上实测过。其他平台未验证(预设本身是声明式的,理论上可移植)。
渲染:旗舰形态需要一个支持
dsh-ui围栏的渲染插件;没有则降级为纯文字任务。见上一节。已知限制:
- 预设的显示名与技能正文是中文
- 图表组件可能渲染空白(实测踩到过两次),所以形态 B 强制配数值表兜底
plot的表达式语法很窄:自变量只能叫x、乘法必须写*、参数只能单个字母—— 写错时什么都不画也不报错- 如果你的 profile 只挂了
@deepseek-ai/dsh-base(例如用dsh plugin add手工建的最小 profile), 预设会停在pending (waiting for service: agentPresets)——agentPresets由@deepseek-ai/dsh-web-app提供,dsh-base不含它。正常走dsh web建出来的 profile 两个 bundle 都有,不受影响
怎么用
切到探究模式,说一个你想搞懂的关系:
我想搞懂阻尼振动里那个阻尼系数到底在干什么
它应该先问你一个具体的、可证伪的预测("你猜 d 从 0.2 加到 1.5,波形会怎样?"),然后才把带滑块的东西给你,最后要你自己说出规律。
如果你发现它一上来就画图、或者直接开始讲解——那是 bug,不是设计。
设计要点
核心循环(skills/inquiry-task/SKILL.md)
预测 → 操作 → 观察 → 对质 → 命名
其中两条是硬性的:
- 没有预测就没有探究。 要一个具体的、可证伪的预测,并且要他说出来——承诺感来自"在看结果之前必须表态"。说不出预测时,说明缺前置知识,应该回去讲最小必要的那一点,而不是硬给任务。
- 对质不能滑过去。 猜错了要先问"你按什么推的",针对那个推理修;直接讲正确结论等于把他刚暴露的错误模型又盖回去了。
四种任务形态
| 形态 | 往返 | 用途 |
|---|---|---|
| A 实时函数探究 | 零 | 旗舰。plot 组件自带参数滑块,拖动即时重绘 |
| B 预计算族 | 零 | 离散/数据类:多序列图、标签页、可本地过滤的表 |
| C 单点探针 | 一次 | 状态无法用表达式表达时,验证一个具体判断 |
| D 本地自检 | 零 | 收尾专用,不做主菜 |
形态 A 能零往返是因为渲染器的 plot 组件内建了参数滑块(params + 拖动即时重绘 + y 轴锁定 + animateTo 动画),不是我们实现的。
硬纪律(六条)
- 绝不等待回合——渲染完就结束回合,学习者的操作下一轮从正常输入框回来
- 不剧透——观察前任何地方不出现结论,包括组件标题和
explanation字段 - 围栏里只放可操作对象,教学文字放围栏外(保证降级可读)
- 没有渲染器就问数值——降级路径必须始终存在
- 不硬塞组件——一段话能讲清就别画图
- 先讲最小必要概念,再给任务
skills/inquiry-task/references/anti-patterns.md 列了 8 个反模式,前两条(回合空转、剧透)是一票否决级。
为什么"不等待"是第一条
这是从一次真实的失败里学到的:有人真做过交互式学习活动这条路,后来主动砍掉了整条链路,理由是旧的 Question → Reveal 双工具结构"天然重复轮次,并让模型回合在等待用户期间一直处于运行状态"。
围栏是回答的一部分,不是工具调用。模型一旦"等",回合就挂在运行中直到用户点一下——界面显示在思考,其实在发呆。所以:渲染完就结束,把回答交还给普通输入框。
目录
package.json dsh-inquiry-preset(bundle 根)
index.js 入口桩:市场预检要求有入口文件才收
cordis.patch.yml 预设声明(persona + 4 组子插件)
skills/inquiry-task/
├── SKILL.md 核心循环 + 硬纪律
└── references/
├── task-shapes.md 四形态 + 表达式硬约束 + 降级路径
└── anti-patterns.md 8 个反模式
tools/probe-skill-dir.mjs 技能被发现链路的逐环探针
docs/demo.png 上面那张截图
VERIFICATION.md 实测证据
AGENTS.md 维护者/AI agent 的工作规范(改这个仓库前先读)
排查"技能没出现"时先跑探针——这条链路上任何一环断了都是静默的(路径错返回空列表、frontmatter 不合规只打一条 warn):
node tools/probe-skill-dir.mjs # 退出码 0 = 全通过
两个不能动的约束(改包时容易踩)
- 不要给
package.json加exports字段。 技能目录路径靠createRequire(baseUrl).resolve('dsh-inquiry-preset/package.json')解析,而exports一旦存在, 子路径访问默认被封锁,会抛ERR_PACKAGE_PATH_NOT_EXPORTED——表现是技能静默消失。 若确实要加,必须同时显式导出"./package.json": "./package.json"。 - 不要删
index.js。 它从未被 import,但市场装前预检会从包根解析入口文件 (exports["."]→main→ 兜底index.js),拿不到就判"缺入口文件"并拒收。
状态
已在真实会话中实测通过。 装配层(preset-inquiry → active、组装树正确)、静态层(技能名与
frontmatter 合规、persona 变量引用全部已注册、内嵌 spec 语法合法)、端到端(技能被加载并影响模型
行为、模型先问预测再给图、dsh-ui 围栏渲染成带参数滑块的曲线图)三层全部验过。
首次真实会话测试未发现功能性问题。
详见 VERIFICATION.md。
No comments yet. Be the first to write one.