NoLetMe 是 DeepSeek Harness(dsh)网页端的官方插件插槽(
shell.overlay)插件,在会话页右侧边缘挂载一块实时推理关键词统计面板——只统计模型**推理块(reasoning blocks)**中的词法指纹,用以区分当前推理是「直接行动」还是「第一人称试探」。
一句话:它做什么
模型流式输出时,NoLetMe 对每一块 reasoning 做增量词法计数,归入三类并实时可视化:
| 分类 | 信号词 | 含义 |
|---|---|---|
| 🟢 高效 · 直接行动 | We need… We should… We can… We will… Let's…;首行 Good. / Great. / Excellent. | 高分轨迹的集体行动框架 |
| 🟠 犹豫 · 第一人称试探 | Let me… I think… I'm not sure… I wonder… maybe / perhaps | 低分轨迹的第一人称犹豫 |
| ⚪ 中性 · 复述任务 | The user wants… The user asked… this task… the request… | Standard 工具目录的开场复述框架 |
0.3.x 灰测按轮判定再聚合(一轮抽中不再被旧 0813 轮稀释),不改 0813 词表。每轮独立给:verdict、I'm doing、列表密度、TTFT/吐字时长;TTFT 用会话自身历史轮估出的动态命中线(中位数基线 × 抖动),慢代理不会把每轮都误报成灰测。面板报命中态与完整数字(含按轮明细与网络画像);方法与阈值见 README 的灰测如何判定。这仍是观测性指纹,不是路由实锤。
面板本身是原生融入的悬浮层:复用 harness 的设计系统(--dsw-alias-* 语义令牌、DetailsPanel 头/体结构、CSS Modules、明暗与 prefers-reduced-motion),通过官方 shell.overlay 插槽挂载,不改动、不补丁任何既有 UI。数据只在浏览器本地计算与存储,不外发。
为什么要做这个面板:V4 Pro GA 0813 过拟合事件
这不是一个拍脑袋的关键词列表,它的背景是一次被完整记录的后训练过拟合。
2026 年 8 月,社区在 xiaobright/modeltest 中对 DeepSeek V4 Pro GA 0813 做跨 harness 复测时发现:同一权重在 dsh 的 Minimal 预设下表现显著优于 Standard / Creator / Code 等更宽的工具目录——典型如 Project2 V4.1b 上 99/96 分(Minimal) vs 91–92 分(Standard)。诊断指向 RL 阶段对 Minimal 双工具脚手架(bash + str_replace_editor、固定 persona、固定 schema)的过拟合。
关键分析文档(2026-08-14,modeltest docs/v4.1):
DEEPSEEK_V4_PRO_HARNESS_ANALYSIS_20260814.mdDEEPSEEK_V4_TRAJECTORY_ANALYSIS_20260814.mdDEEPSEEK_V4_TRIGGER_MECHANISM_EXPERIMENTS_20260814.md
NoLetMe 的价值,就是把这份事后分析变成事中可观测——当你在 dsh 网页端与模型对话时,不必事后导出轨迹再跑脚本,面板会实时告诉你:当前推理更接近哪一类轨迹。
证据链:从冻结数据集到可复现的词频分界线
本插件刻意把每一步都锚到可验证的公开产物上,而非「感觉像」。
1. 测试集是冻结的真实工程任务
所用测试集为 Project2 V4.1b——一个真实损坏的 ESP-IDF 嵌入式工程修复任务,已于 2026-07-23 正式冻结(PROJECT_FROZEN.md),评分规则与隐藏测试用例于 2026-07-19 做 SHA-256 固定。这保证了「Minimal 高分 / Standard 低分」不是 prompt 挑拣的结果。
2. 词频是指纹,而非猜测——看实测数据
modeltest 的 evaluator/trajectory_evidence/derived/trajectory_stats.json 对已完成的助手推理块做大小写不敏感的边界匹配(流式分块已去重,每次运行 SHA-256 固定),得到一条干净的分界线。NoLetMe 的三分类直接镜像于此:
| 运行(模型 / 配置) | 得分 | we | let me | let's | I | 可见回复数 |
|---|---|---|---|---|---|---|
| V4 Pro / Minimal WSL | 99 | 272 | 0 | 101 | 17 | 1 |
| V4 Pro / Minimal WSL | 96 | 231 | 0 | 117 | 18 | 1 |
| V4 Pro / anchored-standard Win | 98 | 179 | 1 | 88 | 17 | 1 |
| V4 Pro / anchored-standard Win | 99 | 165 | 0 | 98 | 18 | 1 |
| V4 Pro / Standard WSL | 91 | 11 | 208 | 2 | 137 | 55 |
| V4 Pro / PTC WSL | 92 | 16 | 194 | 0 | 237 | 33 |
规律是显式的:
- 高分运行(96–99)
we/let's密集,let me接近零; - 低分运行(91–92)
let me数以百计,I的总数也同步膨胀(137–237 vs 17–18); - 推理块更短(高分 p50 约 111–239 字符 vs 低分 437–550 字符),且高分只发布 1 条可见回复,低分则多达 33–55 条——前者把过程留在推理里,后者把过程外溢为可见文本。
完整矩阵与 p50 等细节见本仓库
docs/research.md。
3. 分类器是保守的词法规则,有原文可对
modeltest 自带精确词法分类器(evaluator/trigger_probe/src/classifier.mjs),NoLetMe 逐条对齐:
- 首行
We need→ minimal-like; - 有
we无let me→ +2; - 出现任何
let me→ standard-like; - 独立首行
Good./Great./Excellent.→ +1(弱信号,仅作辅助)。
触发机制探针则记录了开场帧的差异:Minimal / anchored 首块以 We need… / Need… 开场;Standard 25 工具目录则以 The user wants… Let me… 开场——这正是 ⚪ 中性类的来源。
4. 诚实边界:指纹不是身份
原始矩阵原文的警告被原样保留在插件与文档中:
「词法轨迹标签是观测性指纹,而非路由或身份标签。」
词频只反映推理风格,不能判定后端、路由或 checkpoint;V4 Flash 也会在分数不变时改变风格。本轮灰测探针同样只报告社区观测到的特征组合。NoLetMe 的定位因此是推理风格诊断工具,不是「模型鉴别器」。面板的 mode 徽章与占比条,回答的是「现在像哪类轨迹」,而不是「这是哪个模型」。
词表是怎么定的
三类词表的每一条都能在上表或探针记录中找到对应(实现见 src/client/keywords.ts,KEYWORD_TAXONOMY_VERSION = 1):
- 🟢 高效:
we need / we should / we can / we will(集体行动框架,Minimal 首帧)、let's(高分 88–117 次 vs 低分 0–2 次)、首行good / great / excellent(弱肯定信号)。 - 🟠 犹豫:
let me(核心指纹,Minimal 为 0,Standard/PTC 为 194–249)、i think / i'm not sure / i'm not certain / i wonder / i guess / i should、maybe / perhaps,以及原始I / I'm / I'll计数作为健康度量。 - ⚪ 中性:
the user wants / asked / is asking / needs / would like、this task / the request——覆盖 Standard 目录的复述开场与通用任务描述。
匹配规则:大小写不敏感、词边界匹配、最长连续 token 优先;good/great/excellent 仅在块首有效。
面板体验与工程细节
只统计推理,与证据一致关键词只对推理块计数,与
analyze_trajectory_exports.py的口径完全一致。若模型几乎全部以可见文本输出、推理块很少,面板会显示推理健康告警(附原始reasoning / text计数),而不是拿文本去凑数。
- 实时增量折叠:每个
reasoning-delta流式增量到达即折叠,每动画帧至多一次,不整段重扫会话。 - 切换会话不闪:先用
localStorage(dsh-noletme.stats.<sessionId>)的本地缓存重绘,再翻页载入完整历史,期间显示「同步中」。 - 本地持久化与健壮性:压缩重写只重置计数一次、历史翻页有上限且切走即中止、存储失败静默吞掉。
- 动效:胶囊 ↔ 卡片是同一表面的临界阻尼弹簧形变(可打断、锚定右 dock),
prefers-reduced-motion下降级为瞬时切换;开合状态会被记住。
浏览器包通过 window.__ModuleLoader__.load(...) 闭包工厂产物加载,与 harness 自带的 clientBundle 预设同形。平台模块只 require rc.7 ∩ rc.8 ∩ 0.1.1 ∩ 0.1.2 ∩ 0.1.3 ∩ 0.1.5 ∩ 0.1.6 ∩ 0.1.7 的冻结种子(react / react/jsx-runtime / react-dom / cordis / dsh-client-ui-slots / dsh-client-ui-primitives),其余内联;宿主种子表自 0.1.6 起扩到 9 项(新增 dsh-client-ui-dockkit,0.1.7 未变),这 7 项始终是子集,所以不 require 0.1.2 新增的 dsh-client-store,也不 require dsh-client-ui-dockkit。会话快照按结构子集读取:rc.7–0.1.1 用顶层 nodes/partial(必要时回退 chat.legacy);0.1.2+ 把节点从 SessionFace 拆到 uiConversation,插件惰性合并两路,且 dsh.client.inject 不再列出已删除的 dsh-client-runtime。所以 dsh 0.1.0-rc.7、rc.8、0.1.1-rc.x、0.1.2-rc.1、0.1.3-alpha.x、0.1.5-rc.x、0.1.6-alpha.1 以及 0.1.7-rc.1 都能装。注:客户端依赖只用于构建与类型检查,运行产物除宿主种子外不带任何 @deepseek-ai/*,跨版本兼容靠结构读取而非依赖范围。*.module.css 编译为哈希类名并自动注入样式。
安装与使用
前置:已安装 dsh CLI ≥ 0.1.0-rc.7(dsh --version)并建好目标 profile。NoLetMe 0.3.2 起随包提供 dsh-std Community v0.15 静态清单 dsh-plugin.json(facets.host.entry → lib/std/host.js),可被 @dsh-std/adapter-dsh 发现与 inventory;面板仍走原生 dsh.client / shell.overlay(标准 browser.ui.dsh/v1alpha1 尚无 overlay surface)。0.3.3 跟进 0.1.2 的 dsh-client-runtime 删除与 uiConversation 拆分;0.3.4 把 dev 锁升到 npm 上的 0.1.2-rc.1,并核对 GitHub 上的 0.1.3-alpha.1(Session persistence API / Session format v2 是宿主侧破坏性变更,overlay 契约未变);0.3.5 跟进 GitHub 上的 0.1.3-alpha.2(默认工具 / persona 前后缀拆分、subprocess handle 去掉 pid 等均为宿主侧变更,overlay 契约仍未变);0.3.6 跟进 npm 上的 0.1.5-rc.2(Session format V3、ctx.agent / Inbox、Web 插件面板 sidebar.panellist/main 均是宿主侧变更;shell.overlay 仍在,面板不迁到 Sidebar;dev 锁升到 0.1.5-rc.2);0.3.7 跟进 npm 上的 0.1.6-alpha.1(agent/session-start → 异步串行 agent/created、弃用同步历史接口 snapshotEvents/eventAt/ownEvents、ptc-runtime / workflow-ptc 改名、Messages 协议默认化、内置 E2B 移除等均为宿主侧变更;shell.overlay 仍是 {kind:'list', scope:'root'},chat.legacy 的 nodes/partial 语义未变,dev 锁升到 0.1.6-alpha.1,并在 dsh 0.1.6-alpha.1 本机无头 Edge 实测通过:面板渲染零报错、历史会话折叠(51 推理块 / 71.2K 字 / 按轮灰测明细)、刷新后持久化恢复);0.3.8 跟进 npm 上的 0.1.7-rc.1(Session 日志升 V4、Agent 生命周期 / 会话历史 / Shell 沙箱接口异步化、设置改由 Profile 插件配置保存、Agent 预设改由插件组合包声明、PTC 与工作流执行器改名、工具返回按统一 token 预算截断等均为宿主侧变更;shell.overlay 仍是 {kind:'list', scope:'root'}、chat.legacy 计数切片仍未变,dev 锁升到 0.1.7-rc.1,并把 cordis 对齐到宿主同款 ~4.0.4)。0.3.8 在已安装的 0.1.7-rc.1 上实机验证:boot manifest 正确读到本插件的 inject(locale + ui-layout)与 immediately,面板以 plugins/??dsh-noletme/client.js&rev=… 合并形式下发且只 require react,headless Edge 下面板渲染、胶囊↔卡片形变通过、零 console 报错;唯一未覆盖的是真实会话的计数链路——0.1.7 的 web profile 停在首次运行 API Key 引导上,没有可打开的会话。
0.1.7 新增的插件版本闸门不影响本插件。 宿主
evaluatePluginCompatibility()只校验插件在package.json里声明为peerDependencies的@deepseek-ai/dsh/@deepseek-ai/dsh-*范围(semver.satisfies,prerelease 参与比较),不满足就拒绝安装/启动并给出dsh plugin allow-version这一精确到「插件@版本 × dsh 版本」的例外入口;没有peerDependencies字段的插件直接跳过校验。NoLetMe 不声明任何 dsh peer——它的兼容性来自结构读取而不是版本区间,因此不会被拦,也不需要开例外。
更早的 rc 未保证兼容。
# 推荐:从 npm 安装(预构建,无需 allowBuilds 审批)dsh plugin --profile demo add dsh-noletme
# 或从 GitHub 安装(prepare 会自动构建 lib/)dsh plugin --profile demo add github:Yuer6327/NoLetMe
# 本地目录安装dsh plugin --profile demo add ./NoLetMedsh web --profile demo面板停靠于会话标题栏下方右上角(避开「Session log」按钮):折叠时为圆角胶囊(圆点 + “NoLetMe” + 模式;灰测命中/疑似时改显示该态),展开后为状态条、灰测数字(命中态后有 ? 链到 判定规则)、轨迹模式、占比条、we · let's · let me · I、关键词明细与犹豫压力。方法说明不进面板。
Windows 注意:
cordis.patch.yml的行名用包名dsh-noletme,行名写成原始绝对路径会因 ESM loader 拒绝D:\…而报ERR_UNSUPPORTED_ESM_URL_SCHEME。
相关链接
- 插件仓库:Yuer6327/NoLetMe(MIT)
- npm:dsh-noletme
- 上游分析:xiaobright/modeltest
docs/v4.1· CTOL Digital 深度报道 · QQ 新闻 / LOCDD 社区讨论 - dsh 官方:deepseek-ai/deepseek-harness · Awesome dsh-plugin
- dsh-std:Yan-Zero/dsh-std · dsh-ecosystem-spec
注:本文所述词频与分类均可通过 modeltest 仓库的 trajectory_stats.json 与 classifier.mjs 独立复现;NoLetMe 仅做可视化与实时化,不对文本内容做语义判定。