前言¶
在 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 能力,流程为:
knowledge_extract(mode="prompt", doc=路径)→ 返回抽取提示词与原文- 由模型按提示词产出 JSON
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 开始验证。