llm-as-a-verifier
LLM-as-a-Verifier plugin for DeepSeek Harness (DSH): best-of-N 候选并行生成 + 概率枢轴锦标赛(PPT)验证器择优, 官方样式设置卡片, lav_status/lav_set 会话工具 | DSH 插件: 让 AI 回答经过多候选验证器选优
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 25, 2026
- Updated
- Aug 25, 2026
Introduction
LLM-as-a-Verifier — DSH 插件
DeepSeek Harness(DSH)的 LLM-as-a-Verifier 插件:拦截 llm/stream 瀑布,对每条用户请求并行生成 N 个候选回答,再用「概率枢轴锦标赛(PPT)」让一个验证器 LLM 对候选做两两评分,选出最优候选作为最终回复。附带设置页卡片(官方 PluginCard 样式)与 lav_status / lav_set 会话工具。
工作原理
一次用户请求(numCandidates=3, repeats=2 时):
主请求 ──拦截──┬─> 候选 A ─┐
├─> 候选 B ─┼─> PPT 锦标赛:环赛 3 对 + 枢轴赛 3 对,
└─> 候选 C ─┘ 每对由验证器按 1-20 分打分(repeats 次取均值)
└─> Bradley-Terry 胜率累计 → 最高分候选流式返回
- 验证器默认复用被拦截请求的 provider/model(可用
verifierProvider/verifierModel覆盖)。 numCandidates <= 1或enabled=false时完全直通,零额外开销。- 会话工具:
lav_status—— 查看全局配置、计数,以及当前会话的生效状态lav_set—— 运行时热调全局参数lav_session—— 按会话开关:{"enabled": false}只关闭当前会话(覆盖全局默认,持久化到$DSH_HOME/llm-verifier-sessions.json,重启保留);无参数调用读取当前状态。对 AI 说"关闭本会话 verifier"即可。
目录结构
├── src/index.ts # Host 半侧:llm/stream 拦截 + PPT + lav 工具 + 设置命名空间
├── src/client/ # Browser 半侧:设置卡片(官方 PluginCard 样式)
│ ├── index.ts # 入口:注册 settings.plugin.item 卡片
│ ├── LlmVerifierCard.tsx # 卡片主体(标题/下拉框/输入框)
│ ├── PluginCard.tsx/.module.css# 官方风格可折叠外壳
│ ├── fields.tsx/.module.css # 字段控件(Checkbox/Select/Input)
│ └── card-form.ts # staged 表单(dirty/save/reset)
├── lib/ # 预构建产物(与本仓库源码对应,可直接安装)
├── llm-verifier.patch.yml # --patch overlay 模板
├── install.mjs # 一键安装(跨平台 Node 脚本,幂等,自动备份)
├── install.sh # 等价 bash 版(macOS/Linux)
└── docs/ # 测试与验证报告
安装(其他 DSH 用户)
前置:已安装 DSH 并至少成功运行过一次 dsh web(存在 ~/.dsh/profiles/web)。
方式一:一键安装(推荐,Windows/macOS/Linux 通用)
tar xzf llm-as-a-verifier-v0.1.3.tar.gz && cd llm-as-a-verifier
node install.mjs # 默认 ~/.dsh;DSH_HOME=/path node install.mjs 指定其他 home
# macOS/Linux 也可用等价的 bash 版:./install.sh
脚本幂等且自动备份(.backup/<时间戳>/)。完成后按提示重启:
launchctl kickstart -k gui/501/com.hanks.deepseek-harness-web # launchd 部署
# 或手动重启你的 dsh web 进程
然后浏览器强制刷新(⌘⇧R),在 设置 → 插件配置 里即可看到带标题、带下拉框的 LLM-as-a-Verifier 卡片。
方式二:手动
- 把本包(含
lib/)放到~/.dsh/profiles/web/plugin-packages/ui-llm-verifier/,并复制一份到~/.dsh/profiles/web/node_modules/@deepseek-ai/dsh-client-ui-llm-verifier/; - 在
~/.dsh/profiles/web/cordis.patch.yml追加llm-verifier.patch.yml的 insert 块; - 在
~/.dsh/settings.yaml加入:
llm-verifier:
repeats: 2
enabled: true
numCandidates: 3
verifierProvider: ""
verifierModel: ""
- 重启 dsh web(Windows 直接重启你的 dsh web 进程/服务),强刷浏览器。
配置
生效值 = settings.yaml 的 llm-verifier: 命名空间 覆盖 行级 config(两处保持一致最稳)。设置页卡片改的就是命名空间。
| 键 | 默认 | 说明 |
|---|---|---|
enabled | true | 总开关;false 时完全透明 |
numCandidates | 1 | 0=禁用 1=单候选直通 2..5=best-of-N |
repeats | 2 | 每个有向对的验证器评审次数 |
verifierProvider / verifierModel | 空 | 留空复用请求路由;可指向其他已配置路由 |
seed | 0 | PPT 环赛洗牌种子 |
成本提示:N=3/r=2 时一条消息 ≈ 3 条候选流 + 12 条评审流;实测约 3-4 分钟(评审并行)。时延敏感场景建议 N=2 或 repeats=1。
会话级开关:全局 enabled 是默认值;单个会话可用 lav_session 覆盖(例如日常聊天关掉、重要任务开着)。优先级:会话覆盖 > 全局设置。子 agent(subagent)会话目前跟随全局默认。
验证
- 启动日志:
grep "repo plugin started" <web 日志>应出现{"enabled":true,"numCandidates":3,...}; - 会话内调用
lav_status观察total/selected计数;lastError非空说明锦标赛异常(会自动回退首个候选)。 - 详细测试报告见
docs/。
从源码构建(开发者)
依赖 deepseek-harness 仓库的共享 tsdown preset 与类型环境:
# 1) 克隆 harness 仓库并完成 pnpm install
# 2) 用本包的 src/ 覆盖 harness 仓库内 packages/client/ui-llm-verifier/src/
cp -R src/* <harness>/packages/client/ui-llm-verifier/src/
# (client 入口约定为 src/client/index.ts;若卡片是 .tsx 请加一层 re-export 包装)
# 3) 在 harness 仓库根目录:
pnpm exec tsc -b tsconfig.client.json
pnpm --filter @deepseek-ai/dsh-client-ui-llm-verifier bundle
# 4) 产物在 packages/client/ui-llm-verifier/lib/ —— 用它替换本包 lib/ 后重新 install.sh
注意:两条 tools.register(...) 语句之间不要让后一条以 ( 开头(ESI 合并陷阱,见 git 历史);已用 const tools = ... 规避。
已知限制
- 浏览器半侧(原版官方样式卡片)的源码是从旧构建产物的 sourcemap
sourcesContent逐字节恢复的,与lib/client.js完全对应; - 验证器评分依赖模型自觉输出
<score_A>/<score_B>标签,解析失败按 0.5 中位处理; - 引擎与卡片同包名同命名空间(
llm-verifier),不可与其他实现并存。