前言¶
在 DSH(DeepSeek Harness)裏做開發的人常會遇到一個成本與質量兩難的問題:每發一條消息,當前這次對話的完整上下文都要重發一遍;新開一個會話,模型對上一個會話做過的決定一無所知。於是你要麼重新解釋一遍背景,要麼把上下文整段貼過去,兩種情況下都要爲重複的輸入 token 買單。
下面介紹的 william20100221/dsh-context-graph 就是這個方向上的一個插件。它把會話裏做過的決定索引成一張小話題圖,之後的會話只追加幾行指向性內容,模型確認需要細節時再按 id 取回原文。
這是什麼¶
dsh-context-graph 是維護者 William20100221 提交到社區目錄的插件,分類爲「記憶」,在 GitHub 上目前爲 1 stars。它面向 DSH 插件生態:DSH 的理念是「一切皆插件」,會話、記憶、工具都以插件形式掛載在當前進程上,這個插件屬於其中給聊天提供長期記憶的一類。
它要解決的問題是上面說的重複上下文:不是靠摘要壓縮,而是把「已經決定過的事」以話題爲單位存下來,其他會話只看到幾行提示,需要原文再取。
核心功能¶
插件默認開啓記憶。它會在每個會話裏,每 4 個人類輪次索引一次,把會話裏已定事項寫進一張由話題組成的圖,話題與原始消息一起保存。索引落在工作區的 .context-graph/chats/<chat>/ 目錄,內含該會話的圖、逐字原文和一個記錄標題、日期和標誌位的 meta.json。
對同工作區的其他會話,插件最多在消息後追加幾行指向內容,例如:
[context-graph] Related past context from yesterday (by chat). Call recall(id) for the verbatim source.
- c3n12 builder timeout: builderMaxTokens raised to 8192 after the 524s (2026-11-01)
- c3n4 publish flow: npm version patch, npm publish (2FA), git push --follow-tags (2026-11-01)
這幾行只是指向。當摘要不夠精確時,模型調用 recall("c3n12") 取回逐字原文,而不是把整段歷史預先塞進上下文。插件的設計原則是:每條消息只加幾行,按需取原文,省輸入 token 但不犧牲質量。
記憶開關分兩檔:在 Plugins 頁面關掉插件,所有會話不再索引也不再注入任何內容;只想停某個會話,在該會話裏執行 /context-graph off,目錄保留,之後用 on 即可從斷點繼續。
安裝與啓用¶
安裝有兩種官方途徑,都寫在項目 README 裏。
圖形界面方式:在 Plugins 頁面選擇 Add plugin,用官方 npm registry,類型填 dsh-context-graph,安裝後完全重啓應用(新加的 slash 命令需要重啓才能用)。
命令行方式,桌面應用使用 desktop profile:
dsh plugin --profile desktop add dsh-context-graph
裝完正常聊天即可,插件會按每 4 輪的節律自行索引。想立刻索引一次,輸入 /context-graph,從菜單選中後接 build。
命令集¶
所有命令都是 /context-graph <word>:先輸入 /context-graph 從菜單選中,再輸入關鍵字。結果出現在 DSH 自身的命令卡片裏,首行摘要可展開爲詳情,不帶關鍵字時等同 stats。
常用命令:
on— 恢復當前會話的記憶,先索引一次,之後每 4 個人類輪次索引一次。每索引一次需要一次小型輔助模型調用,默認使用該會話自己的 model route。off— 只停當前會話的索引與注入,圖目錄仍留在磁盤上。share/unshare— 會話默認共享給同工作區的其他會話,unshare轉爲私有,share撤銷。共享不復制也不合並,圖仍在各自目錄,話題 id 帶會話編號(如c3n12),命中可回溯來源。stats— 默認命令。首行給出記憶開關、當前會話話題數、共享狀態、可見的共享會話數、等待索引的輪次;正文給出版本、記憶目錄,以及自應用啓動以來的構建次數與構建消耗的 token、注入塊數與體積、recall 次數,並把主會話的輸入拆爲 uncached、cache-read、cache-write 三部分並給出緩存命中率。build— 立即索引當前會話,不等下一個 4 輪節點。需要記憶處於開啓狀態。若模型返回不可讀,原始輸出會保存在該會話目錄的last-builder-output.txt,卡片會說明原因。map— 列出工作區內所有已索引會話,按新到舊,含會話 id、起始日期、標題、話題數和標誌(this chat、memory on、shared/private),並附每個會話關聯度最高的話題及其 id。這是圖的文本形式,可視化頁面尚在計劃中。find <words>— 用與插件運行時相同的匹配器搜索共享會話,可以直接看到模型將看到的內容。
匹配與回溯機制¶
匹配是詞法層面的,不做語義改寫。消息會被拆成單詞、標識符(clear_conversation 同時產出 clear 和 conversation)以及中文字符二元組。話題標籤與別名權重加倍,gist 權重單倍,關聯度高的話題有小幅加成;只有標籤或別名命中時該話題纔會被計入。最多返回 5 條命中;當某條命中明顯領先且來源較短時,會直接附帶逐字原文,省掉一次 recall 往返。被更新的決定會通過 supersedes 邊指向替代項,命中舊決定時會顯示新決定。
時間是第一層過濾。消息裏出現時間詞時,先在該時間段內搜索,無果再擴大範圍:
| 輸入 | 優先搜索範圍 |
|---|---|
yesterday、昨天 |
昨日活躍的會話 |
3 days ago、3天前 |
當天 |
last week、上週 / this week、本週 |
週一到週一 |
last month、上個月 |
該自然月 |
2026-11-01、11月1日 |
當天 |
若時間片和全局都沒有命中,插件會退而列出該時段的會話,保證「昨天我們做了什麼」這類問題仍有可用回答。
回溯 id 形如 c3n12,即會話 3 的主題 12,返回該話題對應的逐字原文。
一個實際對照:先在一個會話裏定下流程,再到同工作區新開會話提問,插件會先用幾行提示命中話題,模型判斷摘要不夠精確時再 recall 取原文。
適用場景與注意¶
適合常在多會話間切換、需要讓新會話快速接上舊結論的 DSH 使用者,尤其是工作區裏同時開着多個並行任務、又不希望每次帶全量歷史的人。stats 裏的緩存命中率可作爲判斷收益的參考:命中率高,說明記憶在省輸入;反之則要檢查話題數與共享範圍是否合理。
需要留意幾點。插件以當前 DSH 進程的權限運行,安裝前應查看源碼與許可證(該項目爲 MIT),確認 .context-graph/ 目錄的讀寫範圍符合預期。索引依賴輔助模型調用,會消耗少量 token,默認每 4 輪一次。共享默認開啓,涉及敏感結論的會話建議執行 unshare 轉爲私有。
結語¶
dsh-context-graph 的價值在於把「要不要帶歷史」拆成兩步:默認只給幾行方向,需要時按 id 取原文。它減輕了重複上下文帶來的輸入開銷,同時不靠摘要犧牲完整性。目錄頁見 https://www.skillhub.cn/plugins/William20100221/dsh-context-graph ,源碼見 https://github.com/William20100221/dsh-context-graph 。