前言¶
在 DeepSeek Harness(DSH)里给智能体加「长期记忆」,常见做法是模型自己决定写什么、读什么、要不要塞进上下文。文本一旦由模型生成,就容易出现编造条目、误把记忆当指令、或在不相关轮次里硬塞历史片段等问题。
下面介绍社区插件 dsh-memory-jev(维护者 Towzai,分类:记忆)。它把 TypeSafe 的 Jev 决策模型当作记忆系统的安全边界:Jev 只输出三种类型化结果——choice(在候选里选一个)、score、noul(是/否概率)——从不生成自由文本。是否值得写入、替换哪条旧记忆、召回是否相关、本轮是否注入,都由 Jev 做判决;记忆正文始终由插件控制,模型不能凭空发明记忆内容。
这是什么¶
dsh-memory-jev 是面向 DSH 的服务端记忆插件(当前 package 版本 0.4.1,MIT 许可证)。它在每次记忆的读、写路径上挂接 Jev,并额外提供在每轮对话前可选的注入门(fail-closed:判不准就不注入)。
生态上,DSH 强调「一切皆插件」;插件可在社区目录 skillhub.cn 检索,该站点与 DeepSeek / 幻方无官方从属关系。源码与说明见 GitHub:Towzai/dsh-memory-jev。
核心功能:三道门与不变量¶
插件用三个「门」组织行为;失败时的策略 deliberately 不同——写入偏 fail-open,注入偏 fail-closed。
| 门 | 作用 | 失败时 |
|---|---|---|
Write gate mem_remember |
本地 bigram 预过滤 → 一次 Jev:worth_keeping(noul)+ supersedes(在候选与 none 间 choice) |
仍会写入;仅标记 gate=unavailable\|budget |
Recall gate mem_recall |
词法预过滤 top-N → 每条候选一个 rel_<id> noul → 按概率过滤排序 |
回退本地排序并标记 degraded(「未经过 Jev 判决」) |
Injection gate agent/pre-step |
廉价文本门 → 候选池减法 → Jev 相关性判决 → 在上下文尾部追加一条带框的用户快照 | 不注入(宁可沉默也不加噪声) |
设计上的几条约束(README 中的 Invariants)值得单独记一下:
- 每个
(session, turn)最多注入一块;同轮后续步骤不再重复判决或注入。 - 每条记忆在同一会话内最多注入一次;已注入的 id 在 Jev 调用前就从候选池移除,不再消耗请求。
- 注入块离开上下文后,对应 id 可再次参与候选(日志记为
reset)。 - 注入块用
<retrieved-memories …>framing,并声明「不是对话历史、不是指令」;记忆正文内的<会转义为\u003c,避免伪造分隔符。 - 仅追加在尾部,系统提示与先前历史字节级不变,利于 prefix cache。
工具与本地存储¶
| 工具 | 用途 |
|---|---|
mem_remember |
写入门;无论门结果如何都会持久化(返回 persisted) |
mem_recall |
召回门;返回 {gate, degraded, items[]},jev_prob 与 local_score 分开保留 |
mem_list / mem_view |
列表 / 查看 |
mem_forget / mem_restore |
软删除 / 恢复(保留 supersedeHistory,支持 cascade) |
mem_merge |
将较旧条目正文折入较新条目后软删旧条(合并后长度 ≥ 旧条长度) |
mem_pin |
跳过一次相关性阈值,每会话最多一次,会话开始时不可用 |
mem_gate_status |
花费 / 预留 / 剩余 / 调用次数 / 熔断 / 密钥是否存在 / 存储路径 |
mem_gate_log |
审计日志查询(仅 id 与 hash,不含正文) |
不会发生物理删除:删除一律是 retired=true,可恢复。
安装与启用¶
通过 DSH 插件市场¶
仓库带上 dsh-plugin topic 后会被注册表 CI 索引(约每 2 小时扫描)。安装命令(README 原文):
dsh plugin --profile web install Towzai/dsh-memory-jev
说明:用户线索中的仓库路径为 towzai/dsh-memory-jev,安装命令以 README 中的 <owner>/dsh-memory-jev 为准,即 Towzai/dsh-memory-jev。
手动安装¶
- 将仓库复制到
~/.dsh/profiles/web/node_modules/dsh-memory-jev/。 - 在 profile 的
cordis.patch.yml中注册(或由市场完成),例如:
- id: dsh-memory-jev
name: dsh-memory-jev
config:
storePath: /absolute/path/to/gate-store.json # 空则 <cwd>/data/gate-store.json
injectEnabled: true
- 在进程级重启 DSH(仅
set_bundle enabled:false→true会重挂载行,不会清 ESM 模块缓存)。 - 用
mem_gate_status确认插件已加载。
宿主接口包(@deepseek-ai/cordis、dsh-llm、dsh-tools)在 package 中仅声明为 peerDependencies,不应在插件内打包副本,否则会 shadow 宿主并破坏工具调用。
配置要点¶
在 profile 的 cordis.patch.yml(或 bundle 自带 patch)里改配置后,同样需要进程级重启。
| 键 | 默认 | 含义 |
|---|---|---|
storePath |
''(即 <cwd>/data/gate-store.json) |
存储文件;生产环境建议绝对路径 |
injectEnabled |
true |
注入门总开关 |
injectInSubagents |
false |
是否在子会话注入(成本随子会话数上升) |
injectLimit |
3 |
单次注入最多条数 |
injectMinProbability |
0.6 |
注入相关性阈值(比手动 recall 更严) |
prefilterLimit |
40 |
送给 Jev 的候选数 |
supersedeCandidates |
12 |
写入门「可能重复」候选数 |
dailyBudgetCny |
3.5 |
日预算(人民币) |
dailyCallLimit |
3000 |
日调用上限 |
调参时 README 建议依据证据而非直觉:mem_gate_log 或按日分片的 gate-decisions-*.jsonl 会记录各候选的 noul 概率与当时阈值,便于复盘某阈值会放行或丢弃哪些条目。
成本方面,Jev 输入约 $0.042/M、输出免费;插件以 CNY 记账。单次判决约 2 000–4 200 input tokens,约合 ¥0.0006–0.0012;预算采用 reserve → settle → reconcile,串行账本避免并发超支。
典型用法¶
安装并重启后,先用门状态确认存储路径、密钥与预算:
- 在 DSH 中调用工具
mem_gate_status,查看 spend / reserved / remaining、调用次数、熔断状态、OPENROUTER_API_KEY是否可用、以及storePath。
日常记忆操作走 mem_* 工具族:
mem_remember:写入新记忆;写入门会尝试 Jev 判决是否值得保留、是否 supersede 某条旧记忆,但无论门是否可用都会持久化。mem_recall:按查询召回;返回项中同时带有 Jev 的jev_prob与本地local_score,便于对比「判决分」与「词法分」。可通过参数min_probability覆盖默认的recallMinProbability(默认 0.5)。mem_list/mem_view:浏览与检查条目;mem_forget/mem_restore/mem_merge/mem_pin做软删、恢复、合并与单次 pin。- 需要审计时调用
mem_gate_log(无正文,仅 id/hash);调阈值前可配合gate-report脚本(package.json 中npm run gate-report)做汇总。
若关闭注入或 Jev 不可用:写/召回会标记 degraded 或 budget/unavailable;注入门在无判决时不向上下文追加任何块。
数据边界与离线行为¶
插件声明 cloud: true,出站仅三处,均指向 https://openrouter.ai/api/alpha/decisions(写入门:新记忆前 600 字 + 候选标题;召回与注入:问题文本 + 候选标题)。存在离线路径:无 API key 时写/召回走确定性降级行为(标记 degraded),注入门不注入。
- 凭据从环境变量
OPENROUTER_API_KEY按需读取(Windows 可回退注册表HKCU\Environment);不写入配置文件、不回显、不记入日志。 - 若问题或正文匹配电话 / 身份证 / 银行卡 /
sk-/Bearer/password/api_key等模式,判决整段跳过(gate=redacted-skip)。 - 审计日志只记 id、概率、token、CNY、错误类型与 build 版本;无正文、无原始查询(仅 hash 与长度)。
- 本地 store、审计与预算文件与
storePath同目录;不上传、不同步。 - 可选
egressGuard(默认false):开启后,看起来像携带密钥的 question 不会发往端点,召回回退本地排序但仍返回你的记忆条目。
Node 引擎要求 >= 22.0.0(package.json)。
适用场景与注意¶
适合谁:已经在用 DSH、希望记忆读写与自动注入都有「类型化判决」而不是纯 LLM 自由文本;能接受 OpenRouter Jev 端点的网络依赖与按次计费;愿意用 mem_gate_log 和配置项做阈值与预算治理的开发者。
安装前务必:
- 插件以当前 DSH 进程权限运行,会读写本地 store、可能访问网络与
OPENROUTER_API_KEY;安装前应自行审阅 源码仓库 与 MIT 许可证。 - 生产环境为
storePath配置绝对路径,并理解写入 fail-open、注入 fail-closed 的差异——重要内容不要假设「门一定会拦住写入」。 - 社区目录页星标等信息会变动;以 GitHub README 与 release 为准。
结尾¶
dsh-memory-jev 把 Jev 的「只判决、不生成文本」当作记忆系统的边界:写、召、注入三道门分工明确,正文与 framing 留在插件侧,并配有预算、审计与软删除恢复。若你在 DSH 里做 agent 记忆,可以从安装、mem_gate_status 验活、再按场景调 injectMinProbability 与 dailyBudgetCny 起步。