← 記事

保存したあと——私はどうやって記憶に「忘れる」ことを教えたか

· 33 分で読めます
memvault · Background Track

保存したあと——私はどうやって記憶に「忘れる」ことを教えたか

毎朝四時の夢のループ、知識の健康診断、関心のプロフィール。保管庫にしまうだけでは足りません。古くなったものを忘れられてこそ健全です。

人が忘れることを覚えられるのは、天からの贈り物です。ノイズも古くなった情報も一つひとつ、現実世界に対する私たちの認識を歪めます。事実だと思っていることにはどれも有効期限があり、のちの根拠によって覆されるのを待っています。だから、しがみつかないでください。

—— Background Track を設計しているあいだ、ずっと机に置いていた言葉

前回の記事では Write Track——三つの gate と二系統の書き込みで、会話を保管庫に収めました。今回はその続きです。収めたあとには、誰か(あるいは何らかの pipeline)が整理し、淘汰しなければなりません。それが Background Track の仕事です。バックグラウンドで動き、前面の Write と Read には触れません。

「夢を見る」という名前は私の発明ではありません。2026 年 3 月末、Claude Code の sourcemap がうっかり漏れ、そこに未公開の feature が隠れていました。その名前は Auto Dream——バックグラウンドで記憶を整理するサブエージェントで、起動条件は「前回から 24 時間超が経過し、session が 5 個以上蓄積したこと」です。この条件がもともと私の考えていた設計とほぼ重なったので、名前をそのまま借りました。神経科学になぞらえるのも同じです。人が眠ると、脳はその日の記憶を圧縮し、組み替え、選択的に忘れます。

まず、当初の構想から話します

今、このトラックでは四つが動いています。夢のループ、知識の健康診断、関心のプロフィール、それに細かなバックグラウンド処理です。

出発点はかなり乱暴なルールベースのスクリプトでした。初版は毎日一回、重複や壊れたものを片づける清掃 job を走らせていましたが、二週目に壁にぶつかりました。「古いかどうか」はルールだけでは判断できません。文脈を読ませ、LLM による振り返りを一層加えてようやく立て直せました。

毎日 4AM cron trigger 二つのゲートを確認 >24h AND >=5 sessions 満たさなければ → スキップ 五段階を順に実行(Dream Loop) 位置づけ 今日どれだけ進んだか確認 シグナル 矛盾を探す + 中心を見つける 振り返り LLM がスナップショットを読む 定着 統合 / 置換 刈り込み 孤立したもの / 古いものを除去 5 つのシグナルの重み 裁判官が新旧を判定 人格化 + 答案の採点 古い写真を白黒に より軽い記憶 drift を抑える 能動的な探索 — 橋 / 欠落を見つける 掃除だけでなく、思いがけないつながりも積極的に掘り出します 毎日日記を書く + 本棚の空きを印づける 関心レポートを自動生成 · 何度探しても見つからないものに印をつける 誤り、重複、古いものは徐々に退場し、文脈は残ります LLM による振り返りは最後に加えた層です——ルール層では「古いもの」を見抜けませんでした

一、夢のループ — 五段階

夢のループは五段階を順に実行し、矛盾する記憶や古い記憶をふるいにかけます。

  1. 位置づけ(Orient)——今日新しいものがどれだけ蓄積したか、最後に夢を見たのはいつかを確認
  2. シグナル(Signal)——矛盾を探し、グラフ内の中心ノードを見つける
  3. 振り返り(Reflect)——LLM が統計スナップショットを読み、洞察と知識の欠落を示す
  4. 定着(Consolidate)——実際に統合・置換し、形式を正規化する
  5. 刈り込み(Prune)——孤立ノードを取り除き、古い記憶を処理する

夢のループに付随する小さな仕事:時間的な矛盾の仲裁

夢の中でよく扱うのは、同じことについて三か月前と言っていたことと先週言っていたことが違う場合です。どちらが有効なのでしょうか。

システムが勝手に一方を選ぶことはありません。遺言を審理する裁判官のように、古い説明と新しい説明、それぞれのタイムスタンプを並べ、裁定者(つまり、より賢い頭脳)に読ませて、次の三つから一つを判定してもらいます。

  • 統合——二つとも実は同じことを別の角度から語っているので、一つにまとめる
  • 置換——新しいものが古いものを上書きし、古いものはタイムスタンプつきの注釈として残す
  • 併存——実は別々のことなので、それぞれ独立させる

判断がつかない場合は、より賢い裁定者に引き上げます。少し遅くなっても、外部の助けを借りても、誤った版を事実として固定したくありません。判定後は各事実に「いつから有効か」「いつ失効したか」という二つのタイムスタンプがつき、次に思い出すとき古い版を現状と取り違えずに済みます。

二つのゲートが夢のループの起動条件です——最後に夢を見てから 24 時間超が経過し、かつ 5 個の session が蓄積した場合にだけ実行します。満たさなければスキップします。記憶がまだ落ち着かないうちに整理すると、ノイズをシグナルと取り違えてしまいます。

2026 年 3 月に漏れた Claude Code Auto Dream と比べてみましょう。向こうは四段階(Orient → Gather → Consolidate → Prune)。こちらは Gather と Consolidate の間に Reflect を一つ加え、LLM に統計スナップショットを読ませて洞察と知識の欠落を出します。もう一つの違いは、向こうの夢を見るサブエージェントは読み取り専用で、見ても変更はしません。memvault は実際にデータを変更し、三段階の確認制度をブレーキにしています。

二、知識の健康診断 — 四層を順に進む

グラフにはいつも壊れるものが出てきます——孤立ノード、存在しないエンティティを指す関係、自己矛盾するトリプル。知識の健康診断はそれらを見つけるためのもので、四層を低コストから高コストへ順に確認します。

  1. グラフ構造——孤立、ループ、形式の問題。ルール層で検出できます
  2. Ground Truth——canonical な定義で値域が妥当かを確認する
  3. LLM による判定——最初の二層では検出できないもの。たとえば「意味的には矛盾するが、構造は正しい」場合
  4. 三段階の確認制度——影響の大きい変更は、まず印をつけ、再確認してから最後に実行します。直接 mutate しません

最後の層は、何度か失敗してから加えました。LLM は一回の判定で hallucination を起こすことがあり、すぐ手を下すと良いものまで消してしまいます。

ついでに改善した点:エッジは「一緒に出たか」だけでは判断しません

もともとは、二つの概念が同じ会話に出てきさえすれば、システムはその間に線を引いていました。でも、それでは雑すぎました。同じ会議で触れられただけの無関係な用語まで、無理やり結びつけられます。

二人が本当に親しいかを見極めるように変えました。一度同じ場にいたかだけでは足りず、次の五つを合わせて見ます。

  • 一緒に出た回数——何回一緒に現れたか
  • 同じ時期に重なるか——同じ時期によく現れるか
  • 共通の友人が多いか——つながっている別の点がどれだけ重なるか
  • 種類の組み合わせは妥当か——人と場所の関係の強さを、人と人の関係と同じ基準で測ることはできません
  • 意味が似ているか——話している内容の意味が近いか

五つにはそれぞれ重みをつけ、合計点を出します。十分な点ならつなぎ、足りなければ保留します。つながった線の質は以前よりずっと良くなりました——エッジの重みを改善して、最も実感した違いです。

グラフは事実だけでなく、好みと熟練度も記録します

事実の層で答えられるのは「何をしたか」だけです。でも、日常の一言には「どんなスタイルが好きか」「どれほど上達したか」もよく含まれます。この二つは以前、分類せずにノートに放り込んでいましたが、のちにそれぞれ独立した層にしました。

好みの層は十種類に分かれます。文章のスタイル、技術の選び方、設計原則、作業のペース、美的な傾向……。各種類に版の連鎖があり、古い版は消さずに重みを下げ、長く裏づけられないものは自然に薄れていきます。今日「私は簡潔なほうが好き」と言っても、その後三か月触れなければ、その好みの信頼度は自動的に下がります。将来の判断を永久に縛りません。

熟練度の層は、ロールプレイングゲームのレベル表に近いものです。第一段階は基礎、第二段階は熟達、第三段階は創造。あるスキルを実際に使うたびにレベルが少しずつ上がり、長く練習しなければ少しずつ下がります。これで「聞いたことがある」「やったことがある」「人に教えられる」を区別できます。

掃除だけでなく、能動的に探索する

健康診断の本来の仕事は掃除です。でも同じグラフを見続けると、別のことにも気づきます。自分でも見落としていた面白いつながりがあるのです。たとえば、一見無関係な二分野についてずっと話していても、グラフ上には曲がりくねった道がすでに通っていることがあります。まだ自分で思いついていないだけです。

探索では、次の三種類の発見を掘り出します。

  • コミュニティをまたぐつながり——それまで交流のなかった二つの輪の間に、新しい道が現れる
  • 遠くにある強いつながり——表面上はまるで無関係でも、二回ほどたどると確かなつながりがある
  • 自分でも気づいていない欠落——ある輪にあるはずの重要な点が、まだ埋まっていない

見つけてもすぐには動きません。「これは見たいかもしれません」という小さな受信箱に入れ、いつか自分から開いたときにだけ見せます。普段の会話の流れは邪魔しません。

曖昧なものは先生に戻して見てもらう

健康診断で判断に迷うものは、自動的にいったん保留します。試験の答案を採点する助手のようなものです。ほとんどの問題は自分で採点できますが、信頼度が低すぎる、新旧双方に理がある、影響範囲が大きすぎる場合は、必ず試験官に返します。

小さな問題の大半は、助手が決められた答えに従って採点し、そのまま通します。本当に判断がつかないものだけが、小さな審査エリアに入ります。時間のある日に「正しい」か「違う」を押せば、その判断を覚え、次の似た事例は助手が自分で処理できるようになります。

こうすれば自動処理は速く進みますが、速すぎて良いものを誤って消すことも防げます。少しずつ育つ判断力は、一度決め打ちしたルールより長持ちします。

三、関心のプロフィール — 7 / 30 / 90 日

関心のプロフィールは知識の健康診断とは別です。ここでは何を気にかけているか、何への関心が冷めているかを捉えます。直近一週間、一か月、三か月の三つの時間窓を重ねて見ます。

毎日、一ページの日記を自動で書く

毎日未明、システムが「今日のあなた」を一ページの日記にします。今日最もよく考えたこと、よく言及した人や物事、昨日と比べて何への関心が高まり、何が冷めたか。自分で記録する必要はありません。

この日記は今のあなたではなく、未来のあなたのためのものです。半年後に「あの頃、何に忙しかったか」を知りたくなったら、全会話を読み返すより、この一ページを見るほうがはるかに楽です。知識の健康診断の比較対象にもなり、大切に思っているつもりでも実は一か月触れていないものが見えてきます。

役立つとは思っていなかった機能が一つあります。知識の欠落の検出——「A についてはよく話すのに、関連する B については話したことがない」とシステムが気づき、知らせてくれます。「これが好きかもしれない」ではなく、「ここが抜けているかもしれない」です。

もう一種類の欠落:本棚の同じ場所がいつも空いている

別の欠落は少し違います。同じことを何度も尋ねるのに、そのたびにシステムが答えを見つけられません。本棚の同じ場所に何度も本を探しに行き、そこがいつも空っぽなのと同じです。一、二回なら偶然かもしれませんが、三回目になるとシステムはそこに印をつけます。「ここは必要なのに、何もありません」と。

印をつけても、答えを自動で補充はしません。次に探しに来たとき、システムが「ここは前にも空だった。先に何か見つけて置こうか」と気づけるようにします。やがて、同じ質問を繰り返しているのに答えが得られていないことに気づくでしょう。そのシグナルは答えそのものより役立ちます。どこを自分から補うべきかを教えてくれるからです。

四、バックグラウンドでひそかに動く、そのほかの小さな処理

バックグラウンドでは、ゆっくり考える処理の先読みや記憶の温度別の階層化を含め、さらに五つの小さな仕事が支えています。

  • ゆっくり考える処理——次に来そうな質問をバックグラウンドで予測し、先に検索して結果をキャッシュに入れる
  • 熱・温・冷・凍結の階層化——よく呼び出すものは全文を残し、冷めたものは要約に圧縮し、凍結したものは summary だけにする(法的な追跡のために保持)
  • 形式の正規化——encoding、空白、切り詰めの処理(定着段階で併せて行う)
  • 信頼度の低いものの審査——信頼度が閾値を下回る記憶は、自動で人による再確認のキューへ入れる
  • 閉ループのフィードバック——いいね、クリック、事後の判定(正しい/誤り)を記憶の重みに書き戻す

降格時の圧縮:古い写真を白黒のサムネイルにして倉庫にしまう

記憶はただ置いておくわけではなく、熱・温・冷・凍結という四つの温度層に分けます。最近よく呼び出したものは全文を残し、冷めたものは約四百字の要約に圧縮し、凍結したものには非常に短い見出しのような要約だけを残します。主な用途は法的またはコンプライアンス上の追跡です。

肝心なのは、圧縮が一方向だということです。熱から凍結へ向かうときは圧縮しますが、凍結から熱へ戻っても自動では復元しません。古い写真を白黒のサムネイルにして倉庫にしまうようなもので、いつか取り出しても勝手に色はつきません。理由は単純です。展開しても、今の頭で過去の細部を想像して埋めるだけです。それは記憶ではなく創作です。厳密であるなら、「覚えていません」と認めるほうがいいのです。

なぜ「覚えている」より「忘れられる」ことが大切なのか

記録するばかりで忘れないシステムでは、時間がたつと同じことについて答えの版がいくつもたまります。それぞれはある時点の事実でも、つなぎ合わせると実態を歪めます。

Write Track は「正しいものを取り込む」役目を、Background Track は「誤ったものを退場させる」役目を担います。両方がそろって初めて、システムは混乱せずに済みます。

このトラックは、私としてはだいたい整理できたと思います。次の記事は Read Track——記憶をどう呼び戻すかです。memvault で最も複雑な部分で、scoring だけで十一層あります。

初期構想

Background Track(バックグラウンドトラック)では現在、Dream Loop(夢のループ)、Knowledge Lint(知識の健康診断)、Interest Profile(関心のプロフィール)の三本柱と、一連の雑務的なバックグラウンド処理が動いています。

初版はルールだけの清掃スクリプトで、毎日の cron(スケジュール処理)で一回実行していました。進めるうちに、ルール層では「古さ」や「矛盾」を判定できないとわかり、LLM(大規模言語モデル)による振り返りを一層加えました。稼働前にはまず dry-run(試験実行)でログの質を確認し、安定してから実際の書き込みを有効にしました。

毎日 4AM Cronicle によるスケジュール処理 Dual-Gate >24h AND sessions_since >= 5 満たさなければスキップ Dream Loop · 五段階の統合 Orient 差分の統計 Signal 矛盾の走査 + PPR Reflect LLM が文脈を読む Consolidate 衝突の解決 + 正規化 Prune 孤立したもの + 古いもの 5-signal edges temporal verdict attitude · review tier_digest 統合完了 drift を抑える SurpriseDiscovery (parallel) cross-community · indirect-strong · knowledge-gap DailySnapshot · KnowledgeGapDetector SQL aggregation top-N · verdict=INCORRECT ≥ 2 resolve_conflict() を二回実行:Dedup の書き込み時 + Consolidate のバッチ処理時 ルール層では staleness を判定できないため、Reflect で LLM に文脈を読ませて補います

一、Dream Loop(夢のループ)の五段階

Dream Loop(夢のループ)は dream.py の中で五段階を順に実行し、矛盾や古い記憶をふるいにかけます。

  1. _orient() ——今回の session の差分統計。Redis 内の last_dream_at
  2. _gather_signal() ——矛盾の走査と PPR(Personalized PageRank)による中心性の検出
  3. _reflect() ——LLM が統計スナップショットを読み、洞察と知識の欠落を生み出す
  4. _consolidate() ——バッチで resolve_conflict()、バッチで重複を取り除き、内容を正規化する
  5. _prune_and_report() ——孤立ノードを整理し、古い項目を片づける

Temporal Conflict Resolution(時間的な矛盾の仲裁)

夢の中の裁判官——同じ subject に新旧の矛盾が生じたとき、LLM の三方向の裁定で収束方法を決めます。

  • パス:memvault.kg.temporal_conflict.resolve()で、 _consolidate() がバッチで呼び出します
  • 入力 prompt には時制を含めます:valid_at / invalid_at と source session を一緒に渡し、LLM が現在の視点で過去の事実を誤判定しないようにします
  • 三方向の判定:MERGE(意味的に統合できる)/ SUPERSEDE(新しい事実で上書きし、古い項目は降格して保持)/ COEXIST(互いに矛盾しない)
  • 信頼度が低い場合は昇格:confidence < threshold の場合、RLM(Reasoning Language Model)に自動で昇格して再判定します
verdict = await resolve(old_triple, new_triple, ctx)
match verdict.action:
    case "MERGE":     merge_triples(old, new)
    case "SUPERSEDE": old.invalid_at = new.valid_at
    case "COEXIST":   keep_both(old, new)

Dual-Gate(二つのゲート)の条件:(now - last_dream_at) > 24h AND sessions_since >= 5。満たさなければそのままスキップします——記憶がまだ落ち着かないうちに実行すると、ノイズをシグナルとして扱ってしまいます。

2026 年 3 月に漏れた Claude Code Auto Dream(自動的な夢)の構成と比べると、向こうは四段階(Orient 位置づけ → Gather 収集 → Consolidate 定着 → Prune 刈り込み)。memvault は Gather と Consolidate の間に Reflect(振り返り)を挿入し、LLM にスナップショットを読ませて洞察と知識の欠落を出します。権限モデルも違います。Claude Code の dream subagent(夢を見るサブエージェント)は read-only(読み取り専用)の bash ですが、memvault はデータを直接 mutate(変更)し、三段階の確認制度を safety gate(安全ゲート)にしています。

二、Knowledge Lint(知識の健康診断)の四層

安い検査を先に、高い検査を最後に——Knowledge Lint(知識の健康診断)の四層はこの順番で並んでいます。

  1. グラフ構造層——孤立ノード、ループ、形式が壊れたトリプル(ルールだけで判定可能)
  2. Grounding(根拠づけ)層——canonical(標準化された)定義を使い、述語の値域が妥当か確認する
  3. LLM 層——構造は正しいが意味が矛盾する微妙な問題。ルールでは見つけられません
  4. 三段階の確認——影響の大きい変更は「印づけ → 再確認 → 確定」の順に進め、直接変更しない

volatile predicate(変化しやすい述語)の検出と孤立エンティティの整理もこの層で行います。三段階の確認は、何度か誤判定を経験してから加えました。一回の LLM 判定は不安定なので、高リスクの操作には人による審査ゲートが必要です。

Multi-Signal Edges(複数シグナルによるエッジの重み)

「一緒に出たか」だけでは見ません。一度の共起でつなぐと偽のエッジだらけになるので、五つのシグナルを組み合わせます composite_weight。

  • パス:memvault.kg.edge_ops(build_edge() + compute_composite())
  • 5 signals:
    • co_occurrence — 共起頻度(log-scaled)
    • session_overlap — Jaccard over session sets
    • adamic_adar — 共通隣接ノードを次数の逆対数で重みづけ(Adamic-Adar index)
    • type_affinity — ソース / ターゲットの entity_type の prior matrix
    • semantic_similarity — embedding cosine
  • composite:weighted sum。下流の Leiden によるクラスタリングは、この列を edge weight として直接読みます
w_edge = (0.25 * co_occ_log
        + 0.20 * session_jaccard
        + 0.20 * adamic_adar_norm
        + 0.15 * type_affinity
        + 0.20 * semantic_cosine)

Attitude Layer + Skill Proficiency(人格化層)

グラフは facts だけでなく preferences と mastery も記録します。この二層は generic entity table から切り離して独立にモデル化しました。

  • Attitude Layer:10 種類の態度(writing_style / tech_choice / design_principle / pace / aesthetic ...)。各 attitude には version_chainがあり、古い版には superseded_at と印をつけ、強制的には消しません
  • Confidence decay:新しい証拠による裏づけがなければ、confidence *= exp(-λ * Δt)。いつまでも判断を縛らないためです
  • Skill Proficiency:L1(exposure) → L2(competent) → L3(generative)。毎回の record_skill_use() で経験値が加わり、半減期に従って減衰します
  • 分ける理由:preference と fact では矛盾解決のルールが違います(preference は過去の版の併存を許し、fact は SUPERSEDE で処理します)
attitude.upsert(
    category="tech_choice",
    statement="prefer modular monolith",
    confidence=0.85,
    evidence=[session_id_1, session_id_2],
)
skill.record_use("rust_async_runtime", proficiency=L2, evidence=session_id)

Surprise Discovery(思いがけない発見の探索)

健康診断に付随する逆向きの仕事です。掃除するだけでなく、グラフ内の見えにくいつながりを能動的に探します。

  • パス:memvault.discovery.surprise_ops。dream loop の _signal() 段階で起動します
  • 三種類の発見:
    • cross_community — Leiden が分けた異なるコミュニティの間に生まれた bridge edge
    • indirect_strong — 2-hop の経路の点数は高いのに direct edge がないもの(PPR で検出)
    • knowledge_gap — 構造上あるはずの隣接 entity が欠けているもの
  • 起動条件:Leiden による weighted クラスタリング後、コミュニティをまたぐ新しいエッジの composite weight が動的な閾値を超えた場合にのみキューへ入れます
  • 自動ではプッシュしない: discovery_inboxに書き込み、前面の Read Track が idle のときに取り出します。主な会話を邪魔しないためです

Review Queue(人による再審査の fallback)

助手による採点方式です。低リスクの大半は自動で approve し、曖昧または影響の大きいものは審査キューに入れ、人間の最終判断を待ちます。

  • パス:memvault.review_ops。Knowledge Lint と Conflict Resolver に接続します
  • auto-approve rules:confidence > 0.8 かつ impact_score < threshold なら、そのまま通します
  • キューに入れる条件:信頼度が低い、conflicting verdict、batch size > N、または Attitude / Skill など影響に敏感な層に関わる場合
  • human-in-loop fallback:キューの項目が期限までに処理されなければ、SUPERSEDE を PENDING に戻します。黙って確定しません
  • 学習フィードバック:人の裁定結果を auto-approve の impact_score に戻して補正します

三、Interest Profile(関心のプロフィール)7 / 30 / 90 日

Interest Profile(関心のプロフィール)は Knowledge Lint とは別のものを捉えます。ここでは移動する注意の時間窓(7、30、90 日の三層)に、知識の欠落の検出と日次スナップショットを加えます。

Daily Snapshot(日次の関心レポート)

毎日一ページの日記を自動で書きます。SQL で当日のプロフィール表を集計し、クエリごとに 7/30/90 の時間窓を再計算せずに済むようにします。

  • パス:memvault.profile.daily_snapshot。dream loop の _orient() のあとに書き込みます
  • フィールド:top_intents(頻度順の top-N)、top_entities(PPR 中心性の top-N)、delta_vs_yesterday(出現 / 消失した entity の集合)
  • 用途:Read Track が recall するとき、この表を直接 join して fresh-bias を高速化します。長期的には Knowledge Lint が「気にかけていると言うこと vs 実際の関心」を比較するのにも使えます
  • 保持期間:snapshot は dream loop で prune しません。読み書きを分離し、Block とは異なるライフサイクルで保持します
SELECT intent_label, COUNT(*) AS freq
FROM memvault.recall_log
WHERE created_at::date = CURRENT_DATE
GROUP BY intent_label
ORDER BY freq DESC LIMIT 10;

知識の欠落の検出は協調フィルタリングではありません。グラフ構造上の「隣接ノードへの訪問の偏り」を見ます。あるクラスターの A ノードについて頻繁に話す一方、つながる B に一度も触れなければ、「ここが抜けているかもしれない」と印をつけます。

Knowledge Gap Detection(知識の欠落の検出)

もう一つの欠落検出です。本棚の同じ場所がずっと空いているように、利用者が繰り返し検索しても recall に失敗する query を扱います。

  • 起動条件:同じ intent / 同じ entity の recall のうち、verdict = INCORRECT 累計 ≥ 2 failures(CRAG による判定シグナル)
  • 印づけ: knowledge_gap 表に書き込み、フィールドには query_signature、fail_count、last_fail_at
  • 自動では補わない:システムは空白を埋めるために幻覚的な内容を生成しません。次の recall 時に、前面の処理へ「この問題は過去に fail しています。資料の補充を推奨」と伝えるだけです
  • 構造的な欠落との違い:前の節(隣接ノードへの訪問の偏り)はグラフのトポロジーから、この節は recall の失敗 log から得ます。両者は補完し合います

四、その他のバックグラウンド処理

Background では、 SlowThinker の先読みと TierDigest の温度別の階層化を含む五つの小さなコンポーネントも動きます。

  • SlowThinker(ゆっくり考える処理)——五段階の予測的な先読みパイプライン。VoiceAgentRAG(音声エージェント RAG、Salesforce AI Research)から着想を得ました
  • ContentNormalizer(内容の正規化)——エンコーディング、空白、切り詰めを処理し、 _consolidate() の中に組み込まれています
  • GRCAdapter(ガバナンス/リスク/コンプライアンスのゲート)——信頼度の閾値を下回る記憶は人による審査キューに入れます
  • 閉ループのフィードバック——Background は三種類の重みのシグナルを尊重します(自分では書き込みません)。Feedback Boost(ユーザーの +/-)、Access Reinforcement(FG recall 時にリアルタイムで record_accessし、effective half-life を最大 10x に延ばし、30 日で自然減衰)、CRAG による判定です。curate はこれらのシグナルを読み、再び関心を集めた block を誤って消さないようにします
  • TierDigest(降格時の圧縮)——古い写真を白黒のサムネイルにして倉庫にしまう、一方向の過程です。
    • パス:memvault.lifecycle.tier_digest
    • 起動条件:lifecycle のライフサイクル warm → cold、cold → frozen 降格時に LLM を呼び出して要約する
    • 制限:要約は ≤ 400 chars、書き込み先は BlockFrozen.summary
    • 一方向性:上向き(cold → warm)では解凍も原文の復元もしません。理由は、今の LLM で過去の細部を復元すること = hallucination であり、fidelity に反するからです

「忘れること」をアーキテクチャの基本要素にする

追加するだけで消さない(append-only)システムでは、時間とともに drift(ずれ)が蓄積するのは避けられません。すべての事実には有効期間(TTL)、すべての述語には変化しやすい期間(volatile window)があり、すべてのエンティティは過去の自分と食い違うようになります。

Write Track(書き込みトラック)が書き込みを、Background Track が退場を担当します。両方があって初めて、グラフは発散せずに収束(converge)します。

バックグラウンドの話はここまでです。次は Read Track に進みます——クエリ意図の分類、スコアリングパイプライン、注意のゲートによる再順位づけ、段階的な想起。スコアリングだけでも 11 層あります。

ツール

このゲートなら、あなたの夜間処理はどれくらいの頻度で動きますか

二つのゲートは「前回から 24 時間超」と「5 個の session が蓄積」の両方です。両方満たしたときだけ実行します。自分の利用頻度を入力すると、自分の場合に何日おきに起動し、一度に何個の session を処理するか計算できます。三つの欄はすべて自分でわかる数字です。計算はすべてブラウザ内で行われ、データはどこにも送られません。

二つのゲート条件はいずれもこの記事にあるものです。「最後に夢を見てから 24 時間超が経過し、かつ 5 個の session が蓄積した場合にだけ実行する」。ここで計算するのは起動間隔であり、効果ではありません——この記事には「整理前 vs 整理後」の想起品質のデータがないため、「実行すべきか」という問いにはこのツールでは答えられません。session の定義もサービスによって異なり、入力した数字とこの記事の sessions_since が同じものとは限りません。

この部分を持ち帰る

あなたの AI Agent にコピー

記憶は多く保存すればよいわけではありません。バックグラウンドで整理しないと、矛盾、古い情報、孤立した関係が積み重なって乱れ、使うほど想起の質が下がります。この記事では「忘れることを覚える」仕組みを、memvault の五段階の整理(位置づけ、シグナル、振り返り、定着、刈り込み)に分けます。LLM が統計スナップショットを読んで振り返るのであって、ルールだけで消すわけではありません。比較表として使ってください。

以下をあなたの AI に貼り、この記事のバックグラウンド整理の設計と、あなたの記憶層を一つずつ照らし合わせてもらってください。

私は〈保存したあと——私はどうやって記憶に忘れることを教えたか〉という記事を読んでいます (https://blog.joneshong.com/zh/blog/memvault-background-track)。 著者は記憶のバックグラウンド整理を五段階に分け、LLM に統計スナップショットを読ませて振り返りを行っています。 この記事のバックグラウンド整理の設計と私の記憶層を照らし合わせ、どの段階が欠けているか、どこで蓄積ばかりして整理できていないかを指摘してください。一般論は不要です。 私の状況: - 今は [Claude Code / Cursor / ChatGPT / 自作 RAG / その他] で AI との会話を保存しています - 保存した記憶はおよそ [件数 / 期間] です - 現在の整理方法:[なし / 古いものを定期的に削除 / 手作業で整理 / 自動 pipeline あり] 次の点を確認してください: 1. 矛盾する記憶をどう扱っていますか?(同じことに新旧二つの版がある、または直接衝突する場合) 2. 古くなった情報を識別できますか?「古い」と判断するシグナルは何ですか? 3. グラフ型の記憶では orphan entity / 無効な関係を整理していますか? 4. 時間窓を使った注意の追跡がありますか?(「最近何を気にかけているか」がわかるか) 5. バッチ整理 vs リアルタイム整理——どれをどちらに置くべきですか?理由は? 6. LLM が一回の判断で誤ったものを消さないよう、「三段階の確認制度」のような保護がありますか? 7. グラフのエッジの重みには複数のシグナルを組み合わせていますか?(共起回数だけでなく、共通の隣接ノード、種類の適合性、意味の近さも) 8. グラフには独立した「好みの層」(態度の版の連鎖)と「熟練度の層」(L1→L2→L3 の経験値)がありますか? 9. cross-community の橋、indirect-strong の仲介、knowledge-gap の欠落を探す、能動的な探索 pipeline がありますか? 10. 矛盾の仲裁はルールによる判定ですか、それとも LLM による三方向の裁定(統合/置換/併存)ですか?信頼度が低い場合は、より強いモデルへ昇格しますか? 11. 記憶の降格(warm→cold→frozen)には LLM による要約圧縮があり、一方向で復元しない仕組みですか? 12. 日次の関心 snapshot を自動で書いていますか?何度も fail する query を知識の欠落として印づけていますか? 参考:memvault は整理を五段階、位置づけ、シグナル、振り返り、定着、刈り込みに分けています。LLM に統計スナップショットを読ませて reflection を行い、ルールだけには頼りません。 まず現状を診断し、優先度が最も高い改善点を 3 つ挙げてください。 記憶の量がまだ少なく、たまに手作業で整理すれば十分なら、バックグラウンドの pipeline 全体はまだ不要だとはっきり言ってください。形を整えるためだけに無理に追加しないでください。
参考資料

さらに読む

作業中に実際に参照し、設計判断に影響した資料です。

資料 重要な理由
Claude Code Dreams: Anthropic's Auto Dream Feature Claude Code から漏れた Auto Dream の設計を最も詳しくまとめた記事です。私の「夢のループ」という名前も二つのゲートの条件も、ここから借りました
Piebald-AI: Auto Dream Leaked System Prompt 漏洩後に整理された Claude Code dream subagent の元の prompt です。これを読んでから、Reflect 段階を追加し、mutation の権限を緩めることに決めました
From Local to Global: A Graph RAG Approach(Microsoft) Dream Loop の第三段階 Reflect で、LLM にスナップショットを読ませて insights を生み出す発想はここから来ています——Community detection + LLM summary という流れです。L1 / L2 のバッチ統合も同様です
From Louvain to Leiden: guaranteeing well-connected communities L1 のコミュニティ検出に使うアルゴリズムです。Louvain より連結性を保証し、multi-resolution パラメータで異なる粒度のコミュニティを調べられます
LightRAG: Simple and Fast Retrieval-Augmented Generation 軽量な自己更新型 KG の手法です。照らし合わせてみて、バックグラウンド整理を一度きりの rebuild ではなく段階に分けることにしました
memvault Write Track — 会話が終わったあと 三部作の第一回。記憶はどう保管庫に入るのか。三つの gate、二系統の書き込み、L0 のトリプル抽出を扱います
memvault Read Track — 思い出したあと 三部作の第三回。Background による整理のあと、記憶をどう呼び戻すか——意図の分類、Cascade Recall、Slow Thinker の先読みを扱います
✦ プロンプトをコピー