# dsh-prompt-optimizer **0.5 线**(上一代 · 仍可用) > ## ⚠️ 这是**上一代**的文档,不是当前版本的 > > - 它装的是**另一个包**:`@dsh-external/dsh-prompt-optimizer`(最后发布 `v0.5.0-beta.1`); > **当前主线是 0.6**(`@dsh-external/dsh-po06`),安装与用法见 [`README.md`](README.md) 与 [`po06/README.md`](po06/README.md)。 > - **不要把两者装进同一个 profile**:同装配会被 `DOUBLE_INTERCEPT` 守卫拒绝启用(这是刻意的), > 它们也**不共用配置**(0.5 用 `prompt-optimizer.json`,0.6 用 `po06.json`)。 > - 下面「七、实测数据与证明」里的数字**只属于 0.5 线**(那套判据、那套题、那一代策略), > **不能当作 0.6 的效果证据**:0.6 目前的诚实口径是"内部自洽有证据,**效果没有证据**"。 > - 0.5 **不再更新**,但照旧能用;架构与设计说明见 [`SPEC.md`](SPEC.md)。 --- > **从这里往下(`一` ~ `十`)都是 0.5 线的历史文档**:那是上一代,装的是**另一个包** `@dsh-external/dsh-prompt-optimizer`,最后发布 `v0.5.0-beta.1`(仓库里 0.5 线的源码版本号是 `0.5.2-beta.1`,没有单独发过 Release)。 > **0.6 的安装与用法看上面的 30 秒块与 [`po06/README.md`](po06/README.md)**。这一节留着,是因为 0.5 仍能用,而且它的设计说明([`SPEC.md`](SPEC.md))就是 0.6 的架构基线。 > **本版由 [SPEC.md](SPEC.md)(架构基线 v0.5)定义**:优化器不是"提示词作家",而是**依据搬运工 + 缺口补齐器**——把〔你的原话〕〔会话上下文〕〔项目文件〕里**与这次请求相关的依据**,补成一条下游**一次做对**的命令。 > ## ⚠️ 请务必注意:默认按 **PTC 执行体**给命令 > > 下游执行体(在「优化模型」弹层里)**默认 PTC**——本插件就是为 PTC 优化的:命令按"**一个程序一次做完**"投影(**清单优先、够用即止**、不写工序与暂停点);也可手动切「对话式」(阶段/步骤、篇幅不设限)或「自动」(看会话的 agent preset)。无论哪种,**依据与深度一条不减**。 > ### 0.5 是什么(一页看懂) > > 下游模型(v4.1-flash 这类)**不主动、不猜、一次做完**:你没写、它又推不出来的,就是**必然缺失**;你写了,它**一定会照做**。所以本插件只做一件事——**补齐它无法自知的缺口**,一句多余的都不写。 > **只补五类**:① 指代与定位("这个 bug"到底是哪个:文件/界面/症状)② 验收判据(什么算做完)③ 约束与边界(不能动什么、项目里**实际存在**的约定)④ 隐含决定(你没定的选项:有据按惯例,无据标「自由度」)⑤ 入口与锚点(从哪开始、做完**看哪里、什么算过**)。 > **每一条都带依据**:事实只能来自**这次实际读到**的上下文或文件(只列过目录 ≠ 知道内容);"这个 bug"这类指代,靠**会话上下文**落到具体对象——上下文读多少**只由「回合/全文」决定**,超预算时只压缩呈现、**不改范围**,并永远写明压缩了什么。 > **不写什么**:下游的本行(通用写法、常规 API、最佳实践、教学)与**没有具体指向**的验证套话("请充分验证")——对这类模型,提示词不是建议而是**指令集**,多写一条就多一条硬约束。 > 四档=**依据预算**:普通=只用你的原话+上下文(补①定位②判据);高级=按需读项目文件(五类全补);极端=深读交叉核对(五类全补 + **每条改动带出处** + 允许正向丰富)。三档都**不写流程仪式**(阶段闸门 / 打勾 / 贴证据)。 > ### 🌐 [**Read this in English →**](README-0.5.en.md) > > 跳到英文文档(英文文档顶部同样有回到中文的按钮) --- ## ⚠️ 请先读这五点(作者郑重声明) 1. **本插件目的是优化提示词**,节省因为书写提示词而消耗的时间,并帮助用户更准确地传达意思;**本质上是让 AI 可以多一步自我规划、约束**。 2. 本插件在 **DeepSeek-V4.1-Flash** 这种**能力较强、但发挥受提示词影响严重**的大模型上有**明显作用**。 3. 本人**仅使用此插件测试过部分 OneShot 类型**的任务。本 README 第七节给出的实测数字,都是**特定测试题 + 特定评分卡**上的结果,**不代表你的任务也一定提升**;**建议对此插件的实际作用持保守意见**。 4. 本插件**完全开源**,支持**任何人、任何形式**使用并修改此插件,也**欢迎提出建议,以及各种测试**。 5. **语言与兼容性**:界面**已支持中文与英文**(跟随 DSH「设置 → 通用 → 语言」,`zh` / `en` 即时切换);**主线 0.6.8-stable 面向 dsh-0.1.6-alpha.1**;**0.5 线的最后发布版本(`v0.5.0-beta.1`)面向同一版本**(本机已实测:下载 → 建 profile → 装 → 装配自检通过,见 `po06/RELEASE-CHECKLIST.md` 的装机演练)。升级 DSH 前请先看 [DSH-COMPAT.md](DSH-COMPAT.md);该文档记录了接口核对、升级步骤与升级后的逐项验收结果。 --- ## 🆕 更新介绍 > **0.6 之前的逐版更新日志已从这里移出**:完整历史见 [`CHANGELOG.md`](CHANGELOG.md)。 > 0.6 主线(当前版本)的更新说明见 [`CHANGELOG.md`](CHANGELOG.md) 顶部与 [`po06/README.md`](po06/README.md)。 ## 一、安装 ### 方式 A:像安装其它 DSH 插件一样(推荐) 两步:先把包装进 profile,再把包名登记为 bundle 层。 ```bash # 1) 装包(GitHub 仓库 / tarball / 本地目录都行) # ⚠️ 0.5 线的包名是 dsh-external-dsh-prompt-optimizer;**不要**照抄 releases/latest 那一页 # (它现在指向 0.6 线,包名不一样,链接会 404)。要 0.5 就钉住下面这个 tag: dsh plugin --profile web add https://github.com/WestFox-AwA/dsh-prompt-optimizer/releases/download/v0.5.0-beta.1/dsh-external-dsh-prompt-optimizer-0.5.0-beta.1.tgz # 或指定版本(把 <版本> 换成 v0.5.0-beta.1 之类) dsh plugin --profile web add github:WestFox-AwA/dsh-prompt-optimizer#<版本> dsh plugin --profile web add ./dsh-external-dsh-prompt-optimizer-0.5.0-beta.1.tgz # 2) 在 ~/.dsh/profiles/web/package.json 的 dsh.profile.bundles 里加一行: # "@dsh-external/dsh-prompt-optimizer" ``` > **0.5 线的下载页**: —— 0.5 的最后发布; > **0.6 线的下载页**见本页顶部与 [`po06/README.md`](po06/README.md)。 重启 DSH 即生效。**为什么还要改 bundles**:`dsh plugin` 只是把参数转发给 pnpm(只负责安装),而"哪些包作为 bundle 层参与装配"由 profile 的 `dsh.profile.bundles` 决定。本插件自带 `cordis.patch.yml`,会在装配时把自己的 entry 插进根条目表 —— 与 `@dsh-external/dsh-super-injector`、`@dsh-external/dsh-graded-mode` **完全同一写法**。 ### 方式 B:不动 bundles,用 profile patch 插入 不想改 `dsh.profile.bundles` 时,也可以直接在 profile 的补丁层插一条 entry: ```yaml # ~/.dsh/profiles/web/cordis.patch.yml (顶层 YAML 数组) - insert: - id: prompt-optimizer name: '@dsh-external/dsh-prompt-optimizer' config: {} ``` 包本身仍需可解析(`dsh plugin add` 装好,或手工放好 `node_modules` 软链/junction)。 > ⚠️ **方式 A 与方式 B 只能选一种**:两种都做会让同一条 entry 插入两次,启动时报 `duplicate loader entry id`。 ### 验证安装 ```bash dsh --dump-config --profile web | grep -A2 'id: prompt-optimizer' # 装配树里有它,且只有一条 node -e "console.log(require.resolve('@dsh-external/dsh-prompt-optimizer',{paths:['']}))" ``` ### 运行要求 - **DSH Web**(`dsh web`;本插件只在 web 平台提供 UI)。 - 至少一条可用的 LLM 路由(优化默认跟随当前会话模型;也可在插件的模型胶囊里单独指定)。 - 插件本身**零运行时依赖、无需构建**(`lib/` 里就是可直接运行的 JavaScript)。 --- ## 二、30 秒上手 1. 在输入框正常打字,按 **Enter**(或点发送)。 2. 消息被拦下,右下角弹出**迷你窗**,里面有两栏:**思考**(优化 AI 的推理过程,带本次思考 token 数)与**产出**(给你要发的那条命令)。 3. 权限为 **需要审查** 时:可以直接编辑产出文本 → 点 **确认提交** 发出;不满意就 **重新生成**(会让你先填一个方向)。 4. 权限为 **自动输出** 时:优化一完成就自动发出,无需操作。 5. 不想优化了:点 **‹ 回退**(停优化 + 关窗 + **不发消息** + 原文留在输入框),或点 **放行本条** 直接按原文发出。 > 输入框左侧的控件,从左到右是:**优化档位**(滑块)、**优化权限**(滑块)、**上下文**(滑块 + 右侧贴着「回合 / 全文」转化按钮)、**优化模型**(胶囊),再右边是 **使用帮助(?)**。点 `?` 有同样的简明教程 + 署名。 --- ## 三、控件怎么选 | 控件 | 取值 | 说明 | |---|---|---| | **优化档位** | 关闭 / 普通 / 高级 / 极端(英文界面:**Off / Low / High / Ultra**) | **档位 = 依据预算**。关闭=完全不拦截;普通=只用你的原话+上下文(补①指代定位 ②验收判据,不读项目);高级=**按需读项目文件**核实(五类缺口全补,每条改动可核对)+锚点;极端=**深读交叉核对**(每条改动都带出处),允许在不违背你意图的前提下**正向丰富** | | **优化权限** | 需要审查 / 自动输出 | 审查=产出可编辑,点「确认提交」才发;自动=优化完成即自动发出(**失败也会按原文发出**,绝不静默吞消息) | | **上下文** | 回合 **0~10** / 全文 **关 / 开** | 滑块右侧那枚按钮点一下换一态:**回合**=读最近 0~10 回合(**你一次 + AI 一次 = 1 回合**;**0 = 不读**);**全文**=把**工作 AI 现在看到的那一份**上下文(会话投影,双方全文)交给优化模型。**读多少只由这里决定**:超预算时只**压缩呈现**(先截断助手回复 → 再省略助手 → 再逐条截断),**范围不变**;只有最简形式仍放不下,才由远及近丢回合并写明丢了几条。注入块始终以**旁观者视角**呈现("你是旁观者与指挥者,不是执行者")——否则优化 AI 会以为自己是干活的那个 | | **优化模型** | 任意 provider/模型 | 只影响优化,不动对话模型;弹层里会标出「会话当前」模型;某家 provider 连不上会被标注「不可达」,不会拖慢整张列表 | | **界面语言** | 中文 / English | **跟随 DSH 设置里的语言**,插件内不单独设置 | > **想要发挥插件所有能力且自动化,建议【极端】+【自动】。** > > 上下文要用哪种?**平时用「回合 3~10」**(长迭代里"修复这个 bug"这类指代就靠它落地);**需要它对齐"工作 AI 现在看到的全部"时切「全文 → 开」**(代价是每次多花几万字符)。**不想让它读上下文就拨到 0**——此时它必须**明说"未找到指代来源"**,而不是替你猜一个 bug。 --- ## 四、迷你窗 - **可拖动**:按住标题栏拖。 - **可改尺寸**:拖右下角手柄,尺寸会**记住**(下次开窗沿用)。 - **不会跑丢**:窗口缩小/切换会话后再打开,会自动夹回可见区域。 - **按会话隔离**:窗口属于触发它的那个会话。 - **关键按钮永不消失**:底部是**常驻操作栏**(确认提交 / 重新生成 / 回退 / 放行 / 重试),不随内容滚动,窗口再小也点得到;窗口很矮时会自动压缩内容区。 - **思考 token 计数**:状态行显示本次总用量(如 `Σ 1.1k tok`),「思考」标题右侧显示**思考消耗的 token**(provider 不上报时显示 `— tok`),「产出」标题右侧显示输出 token,旁边还有字数。 --- ## 五、常见问题 | 现象 | 原因 / 处理 | |---|---| | 按回车没反应,消息也没发出去 | 说明已进入优化流程,看迷你窗的进度;若窗口不在视野,切到该会话即会出现 | | 优化很慢 | 高级/极端档需要 20 秒左右(极端档还会读项目结构)。想快就用**普通档** | | 提示"优化模型不可用 → 已按原文发出" | 所选模型连不上(例如本机 `ollama` 未启动)。插件会**自动回退到会话默认模型**,下次用默认模型 | | 想临时不用 | 把**档位**滑块拉到最左「关闭」 | | 弹层里某家模型标「不可达」 | 该 provider 当前不可用(未启动/无权限),不影响其它模型 | | 界面能换英文吗 | **能**。跟随 DSH「设置 → 通用 → 语言」:选中文则全中文,选英文则全英文,切换即时生效(v0.2.2-beta.1 起) | | 点了「放行本条」/「确定回退」,消息却又自动发出了一条(在会话里显示成「排队发送」) | 这是 **0.1.9 修掉的缺陷**:放行/回退后,迟到的"优化完成"事件仍会走自动发送,补发了第二条。现在运行一旦被用户终结(放行/回退)就带终态标记,`autoSend` 与 `done` 分支都会跳过;放行时还会同时中止后端运行。请升级到 **0.1.9beta1** 及以上 | | 命令里老是让我先建 goal / 列 todo,太啰嗦 | 这是**按难度判定**的结果:只有多点改动或命中高危信号才会要求建目标/分阶段;单点小改应当只给一句命令 + 一句完成标志。若简单任务被过度编排,请把该条输出发我 —— 判定用例与规则见 `PROMPT-OPTIMIZATION.md` | | 命令里反问我"请确认用哪个文件",明明它自己查得到 | 这是 **v0.2.1-beta.2 修掉的缺陷**(把"项目事实未知"误写成"停下等用户确认")。请升级;若仍出现,把该条输出发我 | --- ## 六、卸载 ```bash dsh plugin --profile web remove @dsh-external/dsh-prompt-optimizer ``` 若用"方式 B"安装,请同时删除 `cordis.patch.yml` 里那条 `insert`。插件设置存在 `~/.dsh/prompt-optimizer.json`(档位/权限/模型/上下文模式/迷你窗尺寸/按会话设置),如需彻底清理可一并删除。 --- ## 七、实测数据与证明(不吹嘘) **测量方式**(全部为宿主内一次性测量台,不进产品代码;脚本在 `evidence/`,可复现): ``` 题目(用户原话) --relay 优化--> 命令 --solve 执行--> 执行 AI 的回答 --judge 评分--> 分数 ``` - 固定执行 AI 与固定评分卡,每道题跑同一批条件;**判分时不给评分员看条件标签**(盲评)。 - **命令侧**:优化器产出的命令本身注入了多少实质要求,每题满分 5 分。 - **答案侧**:执行 AI 回答质量,每题满分 10 分(严格 0/1/2 逐点评分)。 - **单格噪声**实测 ±1 分(命令侧)/ ±2 分(答案侧),所以关键结论用**重复采样**(n=2~4)并如实标注落在噪声内的差异。 ### 命令侧(4 道题,满分 20) | 条件 | 高级档 | 极端档 | |---|---|---| | 无优化(对照) | 4 | ≈4 | | 0.1.1 旧提示词 | **19** | **18.7**(n=2~3) | | 0.1.9 退化版 | **16** | **15.3**(n=2~4) | | **0.2.1 修复后(现版基线)** | **18** | **18** | - 退化是**真实存在**的(极端档 18.7 → 15.3),不是主观感受;修复后回到 0.1.1 水平或更好:**极端档在 10/10 次配对比较中 ≥ 退化版**(符号检验 p≈0.001)。 - 四档都测过:**关闭**=无优化对照(4/20,说明优化确实带来变化);**普通**=按设计只做语言层修复、不新增需求,故不参与"实质注入"比较。 ### 答案侧(3 道硬题,满分 10) | 条件 | T5 条件概率陷阱 | T6 物理量级估算 | T4 工程题 | |---|---|---|---| | 无优化 | 8 | 4~5 | 9 | | 0.1.1 旧 | 10 | 9 / 7 | 9 | | 0.1.9 退化版 | 8 / 10 | 9 / 9 | **4** | | 0.2.1-beta.1 | 10 / 10 | 10 / 9 | **4** | | **0.3.1(先防后查)** | **93.9%** | **169/180** | **9 胜 0 负 1 平** | **必须一起读的四条限制**(否则会高估这些数字): 1. **极端档 T4 的低分(1~6/10)是测量台局限,不是提示词缺陷**:台里的执行 AI 没有文件系统/命令工具,而命令要求它"先扫工作目录",于是它只能停下。该命令本身经逐字检查是全场质量最高的,因此这一格不计入结论。 2. **答案侧在强模型上会饱和**:不少格"无优化"也能拿高分(例如 T4 的 9/10),所以答案侧的区分力**弱于**命令侧。 3. **样本量有限**:多数格 n=1~3,单格 1~2 分的差异属于噪声;本文只把"方向一致 + 活跃路径可见"的差异当作结论。 4. 以上数字来自**特定 4~7 道题**(条件概率陷阱、量级估算、工程改造等),**不能外推到你自己的任务**。 **复现入口**:`evidence/prompt-snapshot.cjs`(导出任意版本的三档提示词快照)、`evidence/prompt-invariants.cjs`(约束闸门:30 条正向 + 4 条反向断言,含 v0.2.2 新增的「输出语言跟随用户原话」)、`evidence/lab-build.cjs` / `lab-ans.cjs`(测量台)、`evidence/lab-ship.cjs`(结果汇总)。改提示词前先跑闸门,失败即回退。 **产物级验证(单文件 HTML,独立审计,不依赖浏览器)**:H1 法线盒体 / H2 操控 / H3 审计并修复反向面,**两条件各 7 份产物** —— **发布版 5/7 = 71.4% · v0.3 5/7 = 71.4%(打平)**;H1、H2 两条件**全部通过**(独立审计 `inwardFaces` 全为 0),H3 各 2/4,四份失败**全是"接口未暴露到全局"**(属执行 AI 的接口一致性,命令侧 4/4 都已要求)。**产物级目前不区分两个条件**,有区分度的是命令侧。验证器自证:正确夹具 15/15 PASS、绕序反转夹具 FAIL 且 `inwardFaces=12`。一键复跑:`node evidence/artifact-check.cjs`。 **产出语言跟随你(真跑实测,非模拟)**:走宿主生产路径各跑一条 —— 英文输入 `Add a rate limiter to the login endpoint.` → 产出全文 **3511 字符、中日韩字符 0**、首行 `First locate the login endpoint: …`;中文输入 `给登录接口加一个限流。` → 1353 字符、中日韩 **1037**(占 0.766)、首行 `任务:给登录接口加限流。`(`evidence/lang-probe.cjs` + `lang-probe.json`,统计基于全文快照而非 4000 字截断)。 --- ## 八、实现要点(给想改代码的人) - **两个半边**:`lib/index.js`(宿主:提示词部件化组装与传话框架、只读工具循环、SSE 流式运行、模型目录、状态落盘、HTTP 路由)+ `lib/client.js`(浏览器:控件行、模型/帮助弹层、迷你窗、捕获阶段拦截回车与发送按钮)。 - **提示词是部件化组装的**:`V6_CORE` → **档位正文(由轴渲染:`grounding` / `depth` / `sequence` / `budget`)** → 观察者上下文块 → **下游形态声明块(`delivery=ptc` 时)** → 产出收件人契约(`OUTPUT_ADDRESSEE_CONTRACT`),由 `buildSystem(tier, { historyMode, observerBlock, delivery })` 统一组装(工具路径下另有**依据索引** `renderEvidenceLedger`,随工具结果注入)——同一句规则只有一份,改一处全局生效。 **不变式**(SPEC 铁律 6):`delivery` 只投影 `sequence`(工序↔清单)与 `budget`(不设限↔够用即止),**绝不动 `grounding` / `depth` / `enrich`**;档位=**依据预算**(`depth`:precise / grounded / exhaustive),模型与 effort、上下文开关都与档位解耦。 **护栏**:`evidence/snapshot-v6-prompts.cjs --compare` 逐字节比对三档基线——**重冻基线必须带 `--reason`**(防止悄悄改判据);本轮基线为 SPEC v0.5,旧基线存档 `evidence/v6-prompt-baseline-beta6.json`,逐行差异见 `evidence/diff-v6-prompts.cjs`。当前长度(chat 形态、无观察者块):普通 **1541** / 高级 **1681** / 极端 **1794** 字符。 - **上下文只有一条注入路径**(SPEC W1b):`renderObserverBlock` 读会话投影 `derived`,范围**只由 UI「回合/全文」决定**(回合=用户一次+AI 一次,0=不读);预算不足**只降详细度、不改范围**;解析不到会话**不注入**(绝不回落到"列表里第一个会话")。单测:`evidence/verify-context-scope.cjs`(13/13)。 - **验收**(SPEC §7):① `evidence/audit-provenance.cjs` 出处审计(产物引用的路径必须在依据索引里;无出处的事实性断言=缺陷)② `evidence/compare-referent.cjs` 同题对照("修复这个 bug"有/无上下文)③ 一次交付可用率(人工记录)。 - **i18n 实现**:客户端读取 DSH 的 `locale` 服务(`getSnapshot().active` 为 `zh` / `en`)并订阅变化;文案表 `EN_TEXT` 以**中文原文为键**(179 条),查不到即原样返回中文,因此漏翻只会显示中文、**不会显示空白**;语言服务不可用时按中文兜底。 - **拦截是捕获阶段**在 `window` 上做的(早于 React 与编辑器自身处理):`Shift+Enter` 换行、`/` 命令、空草稿、仅附件、输入卡片之外的回车一律放行。 - **不改动官方发送链路**:确认发送时用官方 `inputActions.setDraft()` + `submit()`,与手动发送完全同一条路。 - **自检**:`evidence/` 下有可复现的自检(`range-demo` 滑块、`help-demo` 帮助面板在视口内、`i18n-demo` 强制 `en`/`zh` 双语断言);`ACCEPTANCE.md` 是逐格验收清单;`evidence/*.jsonl` 是机器留痕(客户端 beacon、遥测、对照数据)。 --- ## 九、隐私与边界 - 优化请求发送**你的输入文本**与按你的设置读入的**会话上下文**(回合 / 全文,见下条);**只读权限**开启时(默认开启),高级/极端档还会用 `read/glob/grep` **读项目文件**——限定在**本次运行所属会话**的工作目录内、**不写盘、不执行命令**;基础档始终不读项目。 **身份层**:会话 / 工作目录 / 下游形态只解析一次,且**解析不到就不猜**——不派工具、不注入观察者(形态不受影响:默认 PTC),退化成"纯需求重述",绝不会把别的会话目录里的现状当成你的项目事实。判定结果可在 `/runs` 的 `context` / `toolRoot` 里核对。 **依据索引**:只有**本次实际读到**的路径与符号才允许被写成"事实"(索引随工具结果一并注入,并给出可引用的 `路径:行号`);只列过目录不等于知道内容;一次都没读到就不写"事实 / 现状"段。 - 上下文只读**你指定的那个会话**(指不到就不读):**回合**=最近 0~10 回合的双方全文(0=不读);**全文**=与工作 AI 现在看到的一致的那份投影;超预算只压缩呈现、不改范围,且永远写明压缩了什么。注入块以**旁观者视角**呈现(明确声明"你不是执行者"),避免优化 AI 把自己当成干活的那个。 - 迷你窗默认不发送任何消息:只有「确认提交」/「自动输出」/「放行本条」三条路径会把内容交回官方发送链路。 - 本插件为客户端 + 宿主本地插件,不引入任何第三方服务。 --- ## 十、许可与协作 **BSD-3-Clause**。完全开源:**任何人、任何形式**使用与修改都欢迎;也欢迎提 Issue、提 PR、以及各种测试反馈。见 [LICENSE](LICENSE) 与 [CHANGELOG.md](CHANGELOG.md)。