ForeSight:为 DSH 带上「体×锚」的长期记忆

前言

在 DeepSeek Harness(dsh)里给智能体加长期记忆,常见做法是把对话摘要塞进上下文,或依赖厂商提供的滚动记忆窗口。这类做法往往管不好两件事:已经结束的项目仍占注入配额,以及「昨天做过」和「刚才说过」在存储里没有时间边界。

ForeSight 是社区维护者 dawn-471 发布的 dsh 插件(分类:记忆),把记忆当作可调度、带有效时间的数据来管,而不是只靠提示词堆叠。DeepSeek Harness 的理念是「一切皆插件」;社区目录 skillhub.cn 是独立站点,与 DeepSeek / 幻方无官方从属关系。仓库当前标注为 experimental,GitHub 上约 2 stars,许可证 MIT。

这是什么

ForeSight(@foresight/memory,当前 release 0.2.1)的定位是:面向 dsh 的时相化(temporal-aspect)长期记忆插件。每条记忆携带显式的「体」(aspect)与「锚」(anchor):体描述事实处于进行、完成、未然、恒常或不确定兜底等阶段;锚描述语句何时为真(时点、区间、开放或无锚)。生命周期由策略与机制执行——锚到期归位、TTL、续期 nudge、未然体审查、预测验证、不确定兜底,以及由单一系数 β 控制的冲突消解——而不是把过期和注入资格完全交给模型即兴判断。

与聊天产品里「越聊越多、窗口滚动」的记忆不同,ForeSight 把已实现的可调项(过期/TTL、续期节奏、激活 β、检索权重、注入预算等)集中写在数据目录下的 policy.yaml;尚未接线的字段在仓库 eval/DECISIONS.md §13 登记为 reserved,避免静默装饰。

核心设计:体与锚

下面用 README 中的表格概括两个轴(取值在策略里可配置,taxonomy 仍是早期最小集):

轴 取值 作用
体 (aspect) 进行体 / 完成体 / 未然体 / 恒常体 / 不确定兜底 生命周期:归位完成、永久、待验证、按检索注入、可再分类
锚 (anchor) 无锚 / 时点 / 区间 / 开放 语句的有效时间

进行体示例:「正在写报告」——进行中,锚到期后会归位为已完成事实并保持可检索;完成体为已定论事实;未然体待后续验证;恒常体与其他体一样入库并按语义检索,只有全局重要内容写入始终注入的 IMPORTANT.md。

核心能力(已发布行为)

存储与检索:SQLite(foresight.db)+ 混合检索(CJK trigram / Latin FTS 与向量);精确内容去重;sqlite-vec 不可用时降级为 FTS + 已存向量余弦,不因扩展加载失败整体不可用。

写入与治理:turn 结束时 observer 经写入门处理重要度、分类、向量与冲突;可选 Ollama embedding(默认 nomic-embed-text-v2-moe,768 维)与 DeepSeek 兼容 LLM 做分类/推导,规则兜底可在无模型时维持生命周期;Ollama 连续失败触发 embedding 熔断。

dsh 集成:Release tarball 自带 dsh.bundle.patch,自动注册六个 cordis 条目:core / tools / inject / nudge / observer / server。

工具(Agent 侧):memory_write、memory_update、memory_delete(软删)、memory_restore、memory_renew、memory_query、memory_reason。

HTTP API:在 policy.server.enabled: true 时提供 /v1/health、/v1/memories 等端点;认证头 X-ForeSight-Token,peer 隔离头 X-ForeSight-Peer。

管理与隔离:per-peer scope、可选 server.peer_tokens、更新/软删/恢复/续期、embedding 回填;v0.2.1 修复新版 dsh 下 memory 工具 JSON Schema 须为 object-root 的问题。

环境要求

组件 要求
Node ≥ 22.13(使用 node:sqlite)
dsh DeepSeek Harness 0.2.0-rc.2+,cordis 插件系统;桌面 Electron 需内置 Node ≥ 22.13
Embedding 默认 Ollama,可选
LLM 可选 DeepSeek 兼容 API
向量扩展 预编译 sqlite-vec 支持 Windows x64、Linux x64/arm64、macOS x64/arm64

安装与启用

官方支持的路径是 GitHub Release tarball(npm 发布尚未完成),不要用 github:owner/repo 自行拼接安装命令。

1、下载 0.2.1 包:

curl -LO https://github.com/dawn-471/foresight/releases/download/v0.2.1/foresight-memory-0.2.1.tgz

2、加入指定 dsh profile(路径改为你本机 tarball 的绝对路径):

dsh plugin --profile <name> add "file:/absolute/path/to/foresight-memory-0.2.1.tgz"

包内已含 bundle patch,无需手工添加六个 cordis 条目。若需自定义数据目录,在 profile 级 cordis.patch.yml 覆盖 foresight-core(注意:整份替换 config,非深合并):

# cordis.patch.yml(profile 级)
- id: foresight-core
  config:
    memoryRoot: '<absolute data directory>'

3、首次启动后,数据在仓库外的 memoryRoot 下,典型结构为:

<memoryRoot>/
├── SOUL.md
├── IMPORTANT.md
├── policy.yaml
└── foresight.db

缺失的 policy.yaml 会从包内模板播种;新目录或空目录还会播种 SOUL.md / IMPORTANT.md,已存在文件不覆盖。目录解析顺序为:adapter 显式配置 → 环境变量 FORESIGHT_MEMORY_DIR → 平台默认(Unix 默认 ~/.local/share/foresight;Windows 新装默认 %LOCALAPPDATA%/foresight,旧 %APPDATA%/foresight 可继续沿用)。

常用环境变量(节选):

设置 环境变量 默认
数据目录 FORESIGHT_MEMORY_DIR 见上
embedding URL FORESIGHT_EMBED_URL http://localhost:11434
embedding 模型 FORESIGHT_EMBED_MODEL nomic-embed-text-v2-moe

典型用法

在会话里:启用 profile 后,Agent 通过上述 memory 工具写入与检索;系统提示中的 memories 段与 memory_query 共用同一排序路径。进行体/未然体到期会由 nudge 触发复审,可通过 memory_update / memory_delete / memory_restore / memory_renew 处理。

调策略:编辑 memoryRoot/policy.yaml 调整 TTL、注入预算、β、nudge 频率、server 端口与 token 等;bundle 配置变更可热加载,但 lib/*.js 代码变更需重启 dsh。

HTTP 写入与检索(需先在 policy 中启用 server):例如健康检查 GET /v1/health;混合检索 POST /v1/memories/search;写入 POST /v1/memories。请求需携带 X-ForeSight-Token;多 peer 场景使用 X-ForeSight-Peer。

从 policy v3 升级:v0.2.0 起为 policy_version: 4。显式迁移(带备份)可在已安装包内执行:

node node_modules/@foresight/memory/scripts/migrate-policy.mjs <memoryRoot> --write

预演可去掉 --write,只生成 policy.yaml.v4-<ts>。

适用场景与注意

适合:希望在 dsh 中长期运行、需要区分「仍在进行 / 已结束 / 待验证」事实,并愿意用一份 policy.yaml 统一管理过期、检索与注入预算的开发者。

注意:

  • 插件以当前 dsh 进程的权限运行,安装前应阅读 GitHub 源码 与 MIT 许可证,自行评估数据目录与 HTTP server(若启用)的暴露面;共享 token 时 HTTP 建议仅监听 loopback。
  • 状态为 experimental,分类与策略模型仍在演进;0.2.0 起 bundle 不再默认 memoryRoot: './memory',旧安装依赖 cwd 相对路径时需在 profile patch 中显式设绝对路径再升级。
  • 卸载时可 dsh plugin --profile remove @foresight/memory 并清理 profile 中的 bundle 与 FORESIGHT_* 环境变量;保留或删除 memoryRoot 由你决定,删除即硬清除库与 WAL 文件。

结尾

ForeSight 把长期记忆从「多写几句 prompt」拉回数据管理:体×锚标注有效时间,机制驱动过期与冲突,dsh 侧通过 tarball 与 cordis bundle 一次接入。进一步了解可查看社区目录页 dawn-471/foresight 与仓库 github.com/dawn-471/foresight(含中文 README README.zh-CN.md 与 CHANGELOG)。

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

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

小夜