dsh-alert-inject:在 DSH 回答前把「你可能忘了」的东西摆回眼前

前言

在 DeepSeek Harness(DSH)里跑 agent 时,上下文会越来越长:目标被改过、同一段话重复出现、引用了不存在的路径,模型仍可能照常往下答。常见做法是外挂记忆库或 MCP,让模型「需要时再调工具」取回信息;这类方案往往工具多、占用前缀 token,且召回容易打断缓存前缀。

dsh-alert-inject 走的是另一条路:在正式回答之前,用可核对的规则(外加可选的本机向量检索)生成一份短提醒,不阻断回答、也不替模型做「这两句是否矛盾」这类生成式判断。下面介绍它是什么、能做什么,以及如何在 DSH 里装起来并验证。

这是什么

dsh-alert-inject 是维护者 juanbaiing 发布的 DSH 插件,社区目录分类为「记忆」。当前 GitHub 星标为 0;package.json 版本为 0.5.0。

定位可以概括为三类「声音」:

声音 含义
「你本来在干什么」 目标、子目标,以及目标是否被改动
「这个之前好像发生过」 与当前内容语义相近的较早位置(只给位置,不给原文)
「这不对吧」 引用不存在、自我重复、判据表命中等

它明确不是记忆数据库(不负责长期存取),不是拦截器(只提醒不阻断),也不做语义矛盾判断(作者文档写明 NLI 与向量方向实测未达预期)。

与「记忆库」类方案对比,作者总结的差异包括:本插件对外主要是 2 个工具、通过「工具 + 静态前置指令」触发,静态文本落在缓存前缀侧,目标偏向「没人问的时候也要响」,而不是「存得下、取得到」。

运行环境限定在 DSH:通过 @deepseek-ai/dsh-tools 注册工具,并读取 DSH 会话日志(~/.dsh/sessions/*/session.jsonl.zstd)。不能直接在 Claude Code、Cursor 等通用环境里当普通插件用。

核心功能

工具入口(推荐用法)

模型在正式回答前调用 alert_check,得到简短报告后再作答。另有 knowledge_extract,用于从文档抽取知识(见下文)。

插件核心逻辑不调 LLM;package.json 的 dependencies 为空,零第三方 npm 依赖。

不装 Ollama 也能用的部分

以下检测为纯程序实现,README 写明一次 alert_check 约 0.3~0.9 秒(未装 Ollama):

  • 判据扫描(需项目内提供判据表)
  • 重复检测
  • 引用存在性检查
  • 锚点(目标/子目标/约束,含「目标被动过」)
  • 语境分块(按用户每次发言切分,用于降误报)
  • 知识层遍历(需知识图)
  • knowledge_extract 的校验阶段(子串核对 evidence/quote)

可选:Ollama + bge-m3

不装 Ollama 不会报错,alert_check 仍会返回;输出中会说明未运行的项(例如语义检索因无索引缓存而跳过)。仅以下 3 项 依赖本机 embedding:

  • 语义检索(会话内「 déjà vu 」式位置提示)
  • 知晓感(FOK)
  • 新颖性

安装与验证步骤(摘自 README):

# 安装 Ollama 后拉取模型(约 1.1 GB)
ollama pull bge-m3

# 验证服务
curl http://localhost:11434/api/tags

装好后还需对会话文件建一次索引,否则上述 3 项仍不可用:

node lib/librarian.js ~/.dsh/sessions/<工作区>/<会话>/session.jsonl.zstd
node lib/librarian.js <会话文件> "查询文本"

索引默认上限 LIBRARIAN_MAX=120 条;覆盖不足时会在输出里告警(例如只覆盖会话的 22%)。README 实测:120 条约 15 秒建索引,全量约 1100 条约 8 分钟。

knowledge_extract 分工

插件不提供 LLM 能力,流程为:

  1. knowledge_extract(mode="prompt", doc=路径) → 返回抽取提示词与原文
  2. 由模型按提示词产出 JSON
  3. knowledge_extract(mode="verify", json=..., source=原文) → 程序逐字核对证据;对不上则丢弃,对得上进入待审记(不直接写入图)

输出形态

设计目标是「像一个声音,不像一份报告」:没值得说的就不出声(借助 dsh-plugin-save-token 的 never-worse 门控);一旦出声需指向具体位置(pos=…)或明确模式。对外文本不回显触发词,避免下一轮自我匹配。

安装与启用

环境要求:Node ≥ 18(使用 node:zlib 的 zstd);DSH 已安装并可用。

README 给出的安装方式是在 DSH profile 的 node_modules 中放置本包,并在 profile 的 cordis.patch.yml 中增加:

- insert:
    - id: dsh-alert-inject
      name: dsh-alert-inject

完成后必须重启 DSH(若 dsh-super-injector 被禁用,则没有热注入通道)。

社区目录页:https://www.skillhub.cn/plugins/juanbaiing/dsh-alert-inject
源码与详细说明:https://github.com/juanbaiing/dsh-alert-inject

SkillHub 为社区插件目录,与 DeepSeek/幻方无官方从属关系。

典型用法

1、提供「参照物」

只安装、不配置参照物时,插件会安静返回「无异常」——这是预期行为,不是故障。

插件按约定在下列相对路径中查找(第一个命中生效):

参照物 候选路径
判据表 ※世界模拟/回想/.警报判据.json、回想/.警报判据.json、.dsh-alert/judges.json、alert-judges.json
术语表 同上目录下的 _术语表.md
知识图 同上目录下的 _graph.json

最小可行:在项目根放置 alert-judges.json:

{
  "meta": ["(自指防护词,命中则不报,防止讨论机制本身时刷屏)"],
  "judges": [
    { "id": "我常犯的错", "sources": ["正文"],
      "signals": ["应该已经", "都改好了", "肯定能跑"],
      "anomalies": [], "requireTermHit": false, "enabled": true }
  ]
}

在上下文中出现信号词(如「应该已经」)后调用 alert_check,应能看到对应提醒。

2、诊断是否在工作

不要靠猜,用内置诊断(README 示例):

import { diagnose, renderDiagnose } from './lib/config.js'
console.log(renderDiagnose(diagnose({ cwd: '你的工作区路径' })))

会逐条说明:哪些路径未找到、缺哪一项会关闭哪项功能。

3、作为库调用

import { buildReport } from './lib/report.js'
const r = await buildReport(cwd)      // { sections, text, meta }
console.log(r.text)

4、可选环境变量(节选)

均有默认值,不改也能跑:

DSH_ALERT_MAX_LINES=8      # 判据段最多几行
ALERT_BUDGET=2400          # 报告总字数预算
ALERT_NO_RETRIEVAL=1       # 关掉需要 embedding 的部分
LIBRARIAN_MAX=120          # 索引上限

完整列表见仓库 README「可调参数」一节。

适用场景与注意

适合谁:已在 DSH 里开发或调试 agent,希望在回答前自动得到目标漂移、重复、错误引用、自定义判据等可规则核对的提醒;愿意在项目里维护判据表/术语表/知识图时,能力更完整。

不适合期待:长期记忆库替代、自动拦截错误回答、或靠插件判断两句话是否语义矛盾。

安全与权限:插件以当前 DSH 进程权限读取工作区与会话日志,并可按配置写入学习样本等待审数据。安装前请阅读源码与许可证,确认路径与数据落盘行为符合你的环境策略。

性能:除首次用 librarian.js 建索引外,单次 alert_check 通常在 1 秒量级;装 Ollama 后 embedding 再增加约 0.1~1.2 秒(视文本长度而定)。

结尾

dsh-alert-inject 把「回答前自检」做成 DSH 内的轻量工具链:零 npm 第三方依赖、核心不依赖 LLM,可选 bge-m3 补足会话内语义位置提示。若你已经在 DSH 里做上下文工程,可以从一份根目录 alert-judges.json 和一次 alert_check 开始验证。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye