dsh-llm-injection-filter:给 DSH 的 LLM 响应流加一层注入过滤

前言

DSH 的插件机制可以把新增能力挂到运行流程中。对 LLM 流式响应来说,一个实际问题是:模型输出按 token 粒度分片到达,单个 delta 可能看起来很短、很普通,但组合后可能包含控制字符、协议标记、异常脚本或垃圾关键词。

dsh-llm-injection-filter 面向这个问题。它挂载在 llm/stream waterfall 上,在模型流式响应进入 agent 之前,对响应做检测和处置,不改动任何运行时源码。

这是什么

下面介绍这个插件的基本定位。

  • 插件名:dsh-llm-injection-filter
  • 维护者:XiaoYuOvO
  • 许可证:MIT
  • 运行环境:Node >=18
  • 交付形态:动态插件 / npm 包,纯 JS、无 import、无运行时依赖
  • 作用范围:挂载于 llm/stream waterfall,对所有适配器生效
  • 核心目标:检测疑似提示词注入 / 污染内容,并按配置处置

它通过 dsh.bundle.patch 自动加入 dsh.profile.bundles,安装后随 DSH 插件机制挂载。

核心功能

轨道 A:罕见脚本硬性阻断

轨道 A 处理的是脚本层面的异常。

当模型输出中出现不属于允许脚本集合的 Unicode 字符时,插件会直接中断。轨道 A 是最高优先级,命中时不做 strip / reject,直接中断响应流。

默认允许脚本为:

Latin
Han
Common
Inherited
Greek

也就是说,默认允许集合不含日文假名、韩文谚文、俄文西里尔等脚本。如果合法输出包含这些脚本,会被轨道 A 硬阻断。可以通过 allowedScripts 放行相应脚本。

maxScanLen 只约束轨道 B 的逐段扫描 / 替换,轨道 A 不设上限。

轨道 B:评分规则处置

轨道 B 基于评分规则处理内容。规则类型包括:

CTRL
PROTO
SCRIPT
KW

同时支持组合加成。触发阈值为 minScore,默认值为:

100

轨道 B 的处置模式支持:

audit
strip
reject

其中有两条限制:

  • KW 永不单独触发;
  • SCRIPT 必须与至少一个 PROTO / CTRL 同现才计入总分。

reject 模式依赖 block-end 携带完整 arguments。在不发 block-end 的 delta-only 流中,tool-call 参数无法整块改写,此时仅审计。

审计与 WebUI

插件会输出结构化审计日志,规则类型为:

HARD_BLOCK | CTRL | PROTO | SCRIPT | KW

拦截记录不落盘,随插件 fiber 输出到结构化日志通道,进程内环形缓冲受 maxRecords 限制。

WebUI 中可以在:

设置 → LLM 注入过滤器

进行查询和配置调整。设置页支持实时调整配置,改动即时生效,无需重启。

需要注意,配置状态持久化在 localStorage。Host 重启后配置会回到默认值,需要在设置页重新保存。

停止 / 卸载插件时,监听器随插件 fiber 自动清理,无定时器 / 全局订阅残留。

安装与启用

下面给出几种安装方式。

从 GitHub 默认分支安装

dsh plugin --profile web add github:XiaoYuOvO/dsh-llm-injection-filter

按 tag 安装

按 tag 安装可以锁定已验证版本。

dsh plugin --profile web add github:XiaoYuOvO/dsh-llm-injection-filter#v1.1.0
dsh plugin --profile web add "link:G:/DEEPSE~1/data/dsh/plugins/LLM-IN~1"

验证安装

安装后执行:

dsh --profile web --dump-config

这一步用于确认插件已经进入当前 profile 的配置 / bundle 组合。

典型用法

安装后,可以先打开 WebUI 设置页查看配置。

设置 → LLM 注入过滤器

可以调整的配置项包括:

CFG.enabled
CFG.hardBlockRareScripts
CFG.allowedScripts
CFG.mode
CFG.minScore
CFG.applyToProviders
CFG.applyToModels
CFG.skipProviders
CFG.skipModels
CFG.maxRecords
CFG.extraKeywords
CFG.maxScanLen
CFG.maxSampleLen
CFG.recordMaxLen

常见调整路径如下:

  1. 先确认 CFG.enabled 是否开启。
  2. 如果合法输出包含日文、韩文、俄文等脚本,在 CFG.allowedScripts 中追加相应脚本。
  3. 如果只想观察不改输出,把 CFG.mode 设为 audit。
  4. 如果需要提高触发门槛,调整 CFG.minScore。
  5. 如果只想检查部分 provider / model,可以配置 CFG.applyToProviders、CFG.applyToModels。
  6. 如果需要跳过某些 provider / model,可以配置 CFG.skipProviders、CFG.skipModels。
  7. 在 WebUI 查询最近拦截记录,确认规则命中情况。

适用场景与注意

这个插件适合使用 DSH 的 LLM 流式响应,并希望在响应进入 agent 之前做一层安全过滤的用户。

使用前需要注意:

  • 插件以当前 DSH 进程权限运行,安装前应检查源码与许可证。
  • 轨道 A 的默认允许脚本比较严格,默认不含日文假名、韩文谚文、俄文西里尔等脚本。
  • 轨道 B 只有总分达到 minScore 才会触发。
  • KW 不会单独触发,SCRIPT 需要与 PROTO / CTRL 同现才计入。
  • reject 模式依赖完整 arguments,对某些 delta-only 流只能审计。
  • 拦截记录不落盘,只保留在进程内环形缓冲中,受 maxRecords 限制。
  • WebUI 配置保存在 localStorage,Host 重启后需要重新保存配置。

结尾

dsh-llm-injection-filter 提供的是 DSH LLM 响应流层面的注入 / 污染过滤能力。它的核心是轨道 A 的罕见脚本硬阻断,以及轨道 B 的评分规则处置,并配合结构化审计日志和 WebUI 设置页。

GitHub 仓库地址:

https://github.com/XiaoYuOvO/dsh-llm-injection-filter

如需在 DSH 社区目录查找,可搜索插件名:

dsh-llm-injection-filter
羽毛球分组比赛记分
小程序二维码

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

小夜