dsh-memory-retrieval:在 DSH 裏用本地關鍵詞召回「差點忘掉的」上下文

前言

在 DSH 裏和 Agent 連續協作時,對話會不斷變長、會話也會拆成很多個。模型每輪只能看到當前窗口裏的內容,三天前查過的結論、上週踩過的坑、或者角色設定裏從沒在當輪對話裏出現過的私事,往往不會再被主動帶上。常見做法是手寫 memory.jsonl、靠 compaction 摘要,或讓模型每輪自己去「記筆記」——這些要麼要人維護,要麼摘要會丟細節,要麼成本高、噪聲大。

dsh-memory-retrieval(維護者 TASHKENT-SN,分類:記憶)做的是另一件事:按當前用戶消息做本地關鍵詞匹配,把可能相關的舊片段當作「線索」附在 system prompt 後面,由模型決定用不用、要不要追問出處。全量在本地建索引,但一次只注入千餘字量級的候選塊;不調 embedding、不調外部 API,默認零額外依賴。社區目錄頁:skillhub.cn 插件頁。

這是什麼

一句話定位:在 DeepSeek Harness 進程內,對筆記、會話集合、本會話較早歷史、memory.jsonl、以及可選的角色全量記憶卡做字面檢索,把 top-k 片段注入提示詞,並可選提供 memory_recall / memory_note 工具。

當前資料中的包版本爲 0.9.71(package.json),許可證 MIT;要求 engines.dsh 爲 >=0.2.2-rc.1 <0.3.0,@deepseek-ai/cordis 與 @deepseek-ai/dsh-tools 爲對等依賴。GitHub 倉庫星標在目錄線索中爲 0,以頁面爲準。

設計上有三條原則(改行爲前值得對齊):召回優先於精確(假陽性便宜、假陰性貴);全量索引 ≠ 全量注入;默認零依賴(內置近義詞組是加分項,不是運行前提)。

五種召回來源與主路徑

下面五種來源共用同一條注入通道:按當前消息關鍵詞匹配 → 取 top-k → 附在 system prompt 後 → 模型判斷是否採用。

來源 檢索什麼 默認
筆記 模型通過 memory_note 寫下的結論(帶出處) 開
會話集合 GUI 拖成一組的多個會話,彼此可檢索 開(配置了集合即有)
自己的歷史 本會話更早內容(約 15 分鐘前,避免與當前上下文重複) 開
全量記憶卡 角色獨立的 memory-card 文件(非會話日誌部分) 需配置路徑
memory.jsonl 手寫記憶條目 有文件才用

注入塊會標明類型與出處,例如「集合記憶」「自己的歷史」「筆記 · 我自己記下的」。模型拿到的是線索,不是被斷言的「事實」;塊內也寫明不相關可忽略。

主路徑是被動聯想(開口時按消息匹配注入)。可選工具 memory_recall 供模型主動查舊賬,支持 scope=collections | self | card | notes | all;README 強調主動檢索是補充,不是主路徑。純本地運行;默認單次注入候選約 1400 字上限(集合相關配置裏 collectionMaxChars: 1400 等與之一致)。

筆記層:結論寫入與出處

從 0.9.54 起,筆記是「已經判斷過的結論」,在注入優先級上排在其他來源之前(order: 0)。插件不在後臺偷偷抽記憶;模型理解上下文後可調用 memory_note 寫入 ~/.dsh/dsh-memory-retrieval/notes.jsonl(append-only)。重複內容按哈希去重;作廢用 retire 追加記錄,不物理刪行。

典型調用形式(摘自 README):

memory_note(text="這個項目用 pnpm 不用 npm", kind="decision")
memory_note(text="用戶偏好:先給結論,再給理由", kind="preference")
memory_note(list=true)
memory_note(origin="a3f9")
memory_note(retire="a3f9")
memory_recall(query="pnpm 相關", scope="notes")

可見範圍跟着來源會話走:本會話 + 同集合內會話;集合外看不見。無相關筆記時仍可注入最近 1–2 條 preference/decision(notesAlwaysInject 等配置,默認 true)。

相關配置項包括:notesEnabled(默認 true)、notesTopK(3)、notesMaxChars(600)、notesAlwaysInject(true)。

會話集合與記憶卡

會話集合適合不想手維護 memory.jsonl 的場景:在設置頁把多個會話拖進同一集合,集合內每個會話的完整正文進索引(user/assistant 文本塊與 compaction 摘要等),檢索時只注入最相關片段。每個集合可獨立開關;設置頁提供「試檢索」與真實注入同一套邏輯。

全量記憶卡讀角色插件目錄下的 memory-card-full.jsonl(或 0.9.66 起支持的 .json / .jsonl)。memoryCardSessionIds 是訪問白名單:只有名單內會話能注入或通過 memory_recall(scope=card) 讀取,沒有「全局可讀」。若 memoryCardPath 指到被裁剪的 memory-card.json 而非全量 .jsonl,表現爲「記憶總差一點」——README 建議用 wc -l 覈對條數,或直接讓角色彙報讀到的條數。

集合索引的是對話日誌裏出現過的內容;記憶卡里從未出現在對話中的條目,加入集合不會讓其他會話自動讀到卡。

匹配方式

檢索爲關鍵詞 + 可選近義詞,不做向量語義(未改詞表時,「網速慢」與「網絡卡頓」不會自動等同)。minHits(默認 2)要求查詢至少命中多個詞以壓泛詞假陽性;極短查詢會放寬到 1。近義詞表可放 ~/.dsh/dsh-memory-retrieval/synonyms.json 或由 synonymPath 指定;否則用內置 55 組。另有 synonymWeight(默認 0.7)等參數,詳見倉庫配置示例。

配置項 recallMidTask:false 只在開口時聯想一次;true 任務中途也繼續注入新片段(更擬人,也更容易跑題)。

安裝與啓用

官方 README 給出的安裝方式是本地路徑加入 profile,並寫入 bundles,而非憑名稱拼接 dsh plugin add github:...:

# 1) 把本目錄加入 profile 依賴(示例:web profile)
dsh plugin --profile web add <你的本地路徑>\dsh-memory-retrieval

# 2) 在 profile 的 package.json 裏把包加入 bundles
#    "dsh": { "profile": { "bundles": [ ..., "dsh-memory-retrieval" ] } }

# 3) 重啓 DSH

也可以把倉庫中的 cordis.patch.yml 合併進 profile 的 cordis.patch.yml。

若使用作者發佈的插件市場索引(倉庫 market/index.json,經 GitHub Pages 發佈):

  1. 插件 → 實驗性插件 → 打開「自定義插件市場」
  2. 發現 → 添加索引源 → 粘貼 https://tashkent-sn.github.io/dsh-memory-retrieval/market/index.json
  3. 在卡片上安裝(索引鎖定 commit,與 engines.dsh 一致)

默認手寫記憶文件路徑:

~/.dsh/dsh-memory-retrieval/memory.jsonl

不存在會自動創建空文件;可複製倉庫內 memory.example.jsonl 試用。

典型配置片段

在 profile 的 cordis.patch.yml 中,README 給出如下結構(節選,完整字段以倉庫爲準):

- insert:
    - id: dsh-memory-retrieval
      name: 'dsh-memory-retrieval'
      config:
        enabled: true
        label: 'Memory'
        topK: 5
        maxChars: 800
        minScore: 1
        perRecordChars: 180
        askWhenUnsure: true
        includeSessionPatterns: []
        excludeSessionPatterns: []
        collectionRetrieval: true
        collectionTopK: 5
        collectionMaxChars: 1400
        collections: []
        recallMidTask: false

memoryPath 可顯式指定;includeSessionPatterns / excludeSessionPatterns 控制會話級啓用範圍;workspaceGlobalRetrieval、sessionOverrides 等可由 GUI 寫入。

適用場景與注意

適合:長期在 DSH Web 或多會話裏做項目協作、需要「被當前一句話勾起」舊結論或跨會話上下文,且希望離線、可控 token 的開發者。

務必注意:

  • 插件隨 當前 DSH 進程權限運行,安裝前請閱讀源碼與 MIT 許可證,自行評估會話日誌與記憶路徑的隱私範圍。
  • 匹配偏寬鬆,有意換回復召率;注入塊已提示模型可忽略不相關項。
  • 角色私人記憶卡通過白名單隔離;不要把敏感路徑配到不應訪問的會話。
  • DSH 生態是「一切皆插件」;SkillHub 目錄 爲社區站點,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-memory-retrieval 把「全量本地索引」和「每輪少量線索注入」拆開,用關鍵詞召回讓 Agent 有機會想起筆記、集合會話、較早輪次與記憶卡里的內容,並用 memory_note 把結論沉澱成可再召回的一層。若要覈對行爲與版本,以倉庫 README 與 cordis.patch.yml 爲準。

  • 目錄頁:https://www.skillhub.cn/plugins/TASHKENT-SN/dsh-memory-retrieval
  • GitHub:https://github.com/TASHKENT-SN/dsh-memory-retrieval
羽毛球分组比赛记分
小程序二维码

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

小夜