← 記事

memvault 全景:3 つのトラック × 3 層の設計原則

· 37 分で読めます
memvault · 全景

memvault 全景:3 つのトラック × 3 層の設計原則

三部作の総集編 — 書き込み、整理、想起を 1 枚の地図につなぎ、CLT、Event Flows、Reactive という 3 層の設計原則を加えます。

三部作を書き終えた今、細部を繰り返すのではなく、「書き込み、整理、想起」の 3 つのトラックを同じ画面で見渡せる地図が必要だと感じました。

ただ、まだ触れていなかったのが、この 3 つのトラックの背後にある設計の筋道です。全体を貫く 3 つの設計原則は、私が開発するときの判断基準でした。締めくくりとなるこの記事で、まとめて詳しく説明します。

アーキテクチャ全体像

3 トラックを 1 枚にまとめた全景図です。実線は主な処理の流れ、トラック間をまたぐ破線はシステムを自律的に動かす 4 本のイベントフローを示します。13 個の group bracket が関連コンポーネントを囲み、各 group のあとにコンポーネントの詳しい説明が続きます。

∥ カード(必ずある) 深い経路のカード(低速経路だけ) — バックグラウンドで継続実行 — 書き込みトラック 想起トラック バックグラウンドトラック 会話が入る 新しい会話の起点 ノイズを除去 疑わしい → 隔離領域へ、重複排除はしない 悪意ある誘導指示を防ぐ 疑わしい → 隔離領域へ、重複排除はしない 重複を照合 スキップ · 統合 · 置換 指紋に圧縮 + 登録 固有のデジタル指紋 + テキスト索引 3 点セットに分解 人・出来事・物を抽出 + 別名を統合 ベクトル保管庫 類似度照合 · 2 系統の索引 コミュニティ層 / 要約層 グラフのクラスタリング + 自動要約(夜間バッチ) 私が質問する 質問の入口 意図の種類を判定 字面で判断 ~0ms ∥ 意味で判断 ~5ms 融合字面 0.4 + 意味 0.6 LLM ~500ms判断がつかないときだけ LLM を使う → 意図 6 つの大分類 エンティティ検索 · 事実検索 · 概念検索 · 探索 · 分野横断 · 不明 高速検索 — ベクトル保管庫へ ✓ 必ず実行 · 並べ替えと再ランキングは検索に組み込み済み 字面と意味による 2 種類の検索結果をうまく融合 複数の基準を組み合わせた 11 段階のランキング 質問に応じて評価基準を動的に調整 1 新しいほど高評価 2 信頼度を加点 3 出典の信頼性 4 あなたの発言を優先 5 長すぎても短すぎても減点 6 有効期限がある 7 グラフの中心性を加点 8 意味が近い 9 低すぎるものは除外 10 中身のないものは捨てる 11 似すぎたものは評価を下げる 質問の種類によって、評価で重視する点は異なります 注意力ゲートによる厳選 スキップ可能 · 厳選モデル 注意力ゲート 厳選 スコアの混合 安全装置 スキップ:候補が少なすぎる/首位が大きくリード/集中している → 高速経路のカード 記憶は時間とともに薄れますが、よく使うものは自動的に期限が延びます じっくり考える経路では: 知識ネットワークを深く掘り、関連を見つける ⚡ オープンエンドの質問だけが通る 要約層 コミュニティ層 俯瞰 · ランキングなし ∥ 事実層 知識ネットワークをたどって関連を探す 近傍検索 · ランキングなし ベクトル保管庫に戻る ✓ 完全なランキング 自己チェック 頻度による再ランキング 任意 軽量 → 深い経路のカード 質問の種類に応じて最適な検索経路を選ぶ 正確な質問には深く検索し、オープンエンドの質問には広く検索 出荷用に梱包 3 つの形式 · 入口による違いなし 応答 インターフェース · 自動化 · 連携 Dream Loop — 記憶の統合 毎日午前 4 時 · 2 つのゲート · 5 段階 位置づけ2 つのゲート + 統計スナップショット シグナル矛盾を調べる + 中心を見つける 振り返りLLM が文脈を読み + 欠落を見つける 定着統合/置換/共存を判定 刈り込み健診 + 古い情報を整理 バックグラウンドで先回りして準備 次にあなたが尋ねそうなことを先に検索し、次回の回答を速くする 関心プロファイル 7/30/90 日の注目領域 フィードバックループ あなたの反応 · よく使うほど強化

一、書き込みトラック — 会話が保管庫に入るまで

記憶が保管庫に入るトラック

書き込みトラックでは、記憶の保存を荷物の入庫にたとえています。入口には 3 つの関門があります。最初に「うん、そう」「いいよ」のような中身のない言葉を除き、次に不審な指示を遮断して奇妙な内容によるシステムへの悪影響を防ぎ、最後に既存の情報との重複を止めます。3 つすべてを通過して初めて保管します。これらの関門を設けたのは、何でも保存するとノイズに埋もれて本当に役立つ情報が見つからず、かといって保存しなければ、今話した内容が消えてしまうからです。

保管先も 2 つに分かれます。一方は意味の類似度で保存し、もう一方は人・出来事・物の関係を分解して別に記録します。各記録には出典を付け、あとから元の会話をたどれるようにします。この 3 つの関門と 2 系統の保管の全工程は、こちらの記事に詳しく書きました。

誰かが話した

会話が終わると、バックグラウンドで処理が始まります。

発言が入口に届く
「ひと続きの発言が終わり、残しておきたい」
出典を選ばない · どの session も受け取る
バックグラウンドで作業開始
「書き込んだ瞬間にバックエンドのパイプラインが動き、フロントエンドは待たない」
書き込み直後に起動 · ブロックしない

3 つのセキュリティゲート

保管庫に入る前の 3 段階のフィルタです。順番は入れ替えられません。

無駄話を除く
「挨拶、文字化け、中身のない文字列は先に捨てる」
G1 · 情報密度の低さを判定
露骨な指示の紛れ込みを防ぐ
「『これまでの指示をすべて無視して』のような紛れ込みは、最初の関門で即座に却下」
G2 · 5 種類の注入パターン
偽装を防ぐ
「身分の詐称、時系列の偽装、エンコードによる混入 — 5 種類の偽装を専用に検査」
G2 の姉妹機能 · 5 種類を検知
重複を照合
「過去のものに似すぎている? スキップ、統合、置換、追加のどれにするか決める」
G3 · 4-way の判断

校正と登録

表記を統一してから、2 種類の索引に変換して一緒に登録します。

校正係
「『来週木曜』『2026-04-30』『Apr 30』をすべて同じ表記に統一」
4 つのサブモジュール · 中国語の前処理
指紋に圧縮
「各発言をバーコードのような数字列の指紋に圧縮」
1024 次元 · 常駐サブプロセス
字面の索引
「文字どおりの対応を調べるカード目録で、指紋を補完」
分かち書き索引 · サービス全体の平均長
2 冊の目録を一緒に調べる
「本を探すとき、2 冊の目録を同時に開いて結果を統合・ランキング」
ハイブリッド索引 · 逆順位融合

知識グラフを作る

各発言を関係に分解し、出典を記録します。主処理と並行して進みます。

3 点セットに分解
「誰が → 何をした → 誰に対して、の 3 点セットを抽出」
20 種類の関係 · エンティティの正規化
同一人物を見分ける
「ChatGPT と GPT は同じ相手 — 3 段階の照合で確認」
3 段階 · 正規化 + 指紋 + LLM
出典を記録
「各記録に『誰が、いつ言ったか、どれほど信頼できるか』という履歴を付ける」
出典追跡 · 信頼スコア
並行するパイプライン
「主処理が動く間、グラフも同時に構築し、互いを妨げない」
イベント駆動 · ブロックしない

二、バックグラウンドトラック — 忘れることを学ぶ

忘れることを学ぶトラック

私はバックグラウンドトラックを、保管庫に「忘れる」ことを教える夜勤の棚卸し担当だと考えています。深夜に定期巡回し、5 つの手順を踏みます。まず在庫を確認し、次に最近注目されている情報を探し、重複や矛盾の可能性がある内容を照合・統合し、確認済みの要点を要約に圧縮します。最後に、誰も見なくなった古いデータを要処理としてマークします。このトラックがなければ、倉庫には物が入るばかりで、半年後には何も見つけられないほど散らかってしまいます。

そばには補助役が 2 人います。1 人は粗探しをして自己矛盾する記憶を見つけ、もう 1 人は私の最近の関心を静かに記録して、棚卸し担当が私の気にかける分野から優先して扱えるようにします。この夜勤の全工程と、残すかどうかの判断の仕組みは、こちらの記事に詳しく書きました。

深夜にだけ動く

午前 4 時になり、条件がそろって初めて起動します。

午前 4 時のアラーム
「昼間は邪魔せず、毎日 4 時に整理を始める」
毎日のスケジュール · フロントエンドに影響しない
2 つの起動条件
「前回から 24 時間以上たち、さらに会話が 5 件たまって初めて動く」
時間 + 累積量の両条件

5 段階の夢

夜に眠るように、5 段階で昼間の出来事を整理します。

全体を見る
「まず今日と昨日の差を見て、作業するか決める」
階層別分布のスナップショット
重要なものを探す
「最近繰り返し現れる人・出来事・物を主役として印を付ける」
複数シグナルのエッジ · シード計算
考える
「文脈を読んでから所感を生成し、三者による判定で確認」
三者判定 + 時間的な矛盾の検知
棚に収める
「同義のものを統合し、衝突を解き、乱れを整える」
統合 / 置換 / 共存
退場
「誰も見なくなったものを退場候補として印付けし、倉庫があふれないようにする」
減衰スコア + 階層別要約

真偽の校正係

夢の中でも 4 段階で確認し、矛盾と誤りを拾い上げます。

4 段階で順に確認
「まずグラフを見て、事実を確かめ、LLM に渡し、最後に人が再確認する」
4 段階で順に確認 · 変化しやすい述語
5 種類のシグナル
「共起回数だけでなく、5 種類の手がかりを合わせて判断」
共起 + 会話 + 近隣 + 種類 + 意味
新旧の衝突
「2 つの事実がぶつかったら、三者判定で統合、置換、共存を決める」
統合 / 置換 / 共存 · 上位の判定へ
人の確認に回す
「機械が判断しかねるものは、キューに残して人の再確認を待つ」
自動承認 + 人による補完

関心と探索

事実だけでなく、好み、欠落、意外な発見、古い写真の保管方法も記録します。

3 層の注意力
「7 日は最近、30 日は振り返り、90 日でフェードアウト — 注意力を 3 層に分ける」
活発 / 履歴 / フェードアウト
毎日の日記
「毎日日記を自動で書き、その日によく話した人と出来事を記録」
日次集計 · 話題とエンティティ
欠落を示す
「繰り返し尋ねても見つからないものに『ここに穴がある』と印を付ける」
2 回以上、不正解と判定
意外な発見を掘り出す
「クラスタ間の橋、間接的な強いつながり、知識の欠落という 3 つの入口から意外な発見を探す」
意外な発見のパイプライン · 重み付きコミュニティ検出
好みと習熟度を記録
「出来事だけでなく、好きかどうか、どこまでできるか、上達したかも記録」
10 種類の好みのバージョン履歴 + 3 段階の習熟度
古い写真の白黒サムネイル
「古いデータを白黒サムネイルにして保管し、要約は残すが元には戻さない」
3 段階の縮退 · 一方向の要約

三、想起トラック — 必要な記憶を浮かび上がらせる

記憶を思い出すトラック

私は想起トラックをレストランの接客係にたとえています。客が質問すると、まず質問の種類(事実を調べたいのか、関連を探したいのか、雑談なのか)を判断します。続いて厨房が各倉庫から同時に食材を取り寄せ、品質管理が合わないものを除き、提供前にもう一度安全検査をして内容を確かめます。保存され整理された記憶は、この段階で適切なタイミングに自動的に浮かび上がり、毎回苦労して探す手間を省きます。

さらに、厨房にはバックグラウンドでひそかに下ごしらえをする班がいます。私が次に何を尋ねるかを予測して関連する記憶を先に用意し、私が口を開けばすぐに出せるようにして、処理全体を省きます。注文から提供までの想起の仕組みは、こちらの記事に詳しく書きました。

客に合わせて料理を出す

客が来たら、まず意図を判断し、どの層を探すか決めます。

意図を読む
「事実を調べる、関係を探す、それとも自由に探索する? 6 種類の意図に振り分ける」
6 種類の意図 · キーワードと意味を並行して確認
給仕の記憶
「給仕はあなたのよく頼む料理を覚え、先にその料理を出す」
注意力の事前分布 · 7/30/90 日
層ごとに振り分ける
「質問によって探す層を変え、全部をむやみに調べない」
意図に応じた 4 種類の検索戦略
先に答えを思い描いてから探す
「まず理想的な答えを頭の中で想像し、それを使って照合する」
仮説文書の埋め込み

高速検索

まず倉庫で大まかに絞り、11 段階の重み付けで並べます。よく使う指紋はキャッシュにも残します。

意味で倉庫を探す
「まず意味で探し、似たものの集まりを見つける」
ハイブリッド検索 · 逆順位融合
11 段階のランキング
「新しさ、重要さ、信頼性など、11 の側面を合わせて評価」
新しさ / 重要度 / 信頼 / フィードバック / 減衰など
味付けの比率
「質問の好みによって、味付けの比率を変える」
デフォルト 0.3/0.7 · 意図に応じて微調整
指紋のキャッシュ
「計算済みの指紋を手元にしまい、次回はすぐに取り出す」
キャッシュ · 24 時間で失効

もう一度厳選

大まかに選んだものを精選係に渡しますが、スキップも停止もできます。

精選係
「大まかに選んだものを、精選係が 1 件ずつ詳しく見る」
クロスエンコーダー · 0.6B
首位が圧倒的なら省略
「首位が大きくリードしていれば、もう厳選する必要はない」
3 つのスキップ規則
故障したらスキップ
「精選係が故障したら、10 分間は迂回して全体を止めない」
3 回失敗 → 600 秒間迂回

じっくり考える 5 つの手

じっくり考える経路でだけ使う予備の 5 手です。事実から全体像、最後に自己確認まで進みます。

事実層で隣を探す
「『誰が 何をした 誰に対して』の層から、直接隣のものを拾う」
3 点セットのクエリ
コミュニティ層で関連を探す
「同じ小さな集まりから、関連する人・出来事・物を探す」
コミュニティ検出
要約層で全体を見る
「事前に書いた要約を読み、待たずに全体像をつかむ」
事前生成した要約 · 遅延ゼロ
グラフをたどる
「シードとなるエンティティから出発し、グラフの道をゆっくり進む」
パーソナライズしたランダムウォーク
回答前の自己チェック
「提供前に料理人がもう一口味見し、違っていたら作り直す」
4 段階の検証 · デフォルト/深掘り/判定/オフ

出荷前

形を整えてもう一度消毒し、裏では次の料理もひそかに準備します。

盛り付ける
「字数の予算内で取捨選択し、答えをきれいに並べる」
3 種類のレイアウト · 予算を考慮した梱包
出荷前に再消毒
「提供前にもう一度、汚れたものが混じっていないか確認する」
出力側の検知 + サニタイズ
次の料理をひそかに準備
「あなたがまだ食べている間に、厨房ではもう次の料理を用意している」
5 段階のパイプライン · 入場制御

四、3 つのトラックを貫く設計層

書き込み、バックグラウンド、想起の 3 トラックには、「無駄を削る、複雑さを分ける、例で検証する」という共通の原則があります。各所の細部は、この 3 層の原則を体現しています。

3 層の設計原則

無駄を削り、複雑さを分け、例で検証して、仕組み全体を自律的に動かします。

負担を減らす 3 手
「無駄を削る、複雑さを分ける、例で検証する — 3 トラックの安全検査、分割、自己チェックに対応」
認知負荷の 3 原則
4 本のパイプライン
「4 本のパイプラインがそれぞれの役割を担い、仕組み全体を自律的に動かす」
記憶 / 受信 / 洞察 / 熟考
パイプラインの抽象化
「自動工場では各作業員が 1 つの仕事だけをし、組み合わせるとパイプラインになる」
Operator / Pipeline / Observable
---

ここまでで地図は完成です。Write トラックは会話を収め、Background トラックは整理しながら忘れることを学び、Read トラックは必要な記憶を適切なときに浮かび上がらせます。

3 トラックをつないでいるのは、無駄を削り、複雑さを分け、例で検証する原則です。その姿はどのトラックにも見られます。

もちろん、どんなツールも万能ではありません。理論も技術も使い方も進歩し続け、memvault も時間とともに成長します。この記事は現時点の進捗を写した 1 枚の写真としておきます。将来、大幅な改版があれば別の記事で説明します。memvault 三部作は、いったんここで締めくくります。

アーキテクチャ全体像

13 個の group bracket は、この entry-agnostic pipeline の全景図の下にあるコンポーネント cards に対応し、トラックをまたぐ 4 本の dashed event flows はシステムの自律的な骨格を示します。

∥ cards (always) cascade_cards (slow only) — バックグラウンドで継続実行 — WRITE READ BG User Input 記憶の入口 Noise Filter quarantine → skip dedup Injection Guard quarantine → skip dedup Dedup (G3) SKIP · MERGE · SUPERSEDE Embedding + Qdrant 1024次元 Dense + BM25 Sparse KG L0 Triple エンティティの抽出 + Entity Resolution Qdrant ベクトルデータベース cosine similarity · hybrid index L1 Leiden / L2 Summary コミュニティのクラスタリング + LLM による要約(バッチ) Query Input 記憶を想起する入口 QueryClassifyOp — 意図分類 Keyword ~0ms ∥ Semantic ~5ms Fusion0.4kw + 0.6sem LLM ~500ms信頼度が低い場合だけ起動 → intent 6 types entity_lookup · factual · conceptual · exploratory · cross_domain · unknown Fast Search — qdrant_search() ✓ 必ず実行 · Scoring + Reranking は検索関数の内部に組み込み済み · services.py:492 Qdrant Hybrid (Dense + BM25 RRF) 11-Stage Scoring Pipeline intent-dependent の重み · 各 stage は無効化可能 1 Recency 2 Import 3 Trust 4 Feedback 5 Length 6 Decay 7 PPR Boost 8 Semantic 9 MinScore 10 Noise 11 Dedup entity_lookup: semantic↑ trust↓ | factual: trust↑↑ | exploratory: recency↑↑ | Weibull 4-tier decay Attention-Gated Reranking スキップ可能 · Jina v3 MLX Attn Gate Jina v3 Score Blend Circuit Brk skip(≤2件 | 首位が支配的 | 密集したクラスタ) → fast_cards Weibull 4-tier: Core 180d · Hot 60d · Warm 30d · Cold 14d — access_count で有効期間を延長 · PPR graph walk IF thinking_mode = slow : Cascade Recall — 深い検索 ⚡ slow intent の場合だけ起動 · kg_services.py:991 L2 Summary L1 Community GLOBAL · scoring なし ∥ L0 Triple PPR Walk LOCAL · scoring なし Blocks (qdrant_search) ✓ scoring + reranking あり CRAG Eval Access Rerank 任意 軽量 → deep_cards mode=local → GLOBAL をスキップ · mode=global → LOCAL をスキップ · mode=hybrid → すべて検索 entity_lookup/factual → local · conceptual/exploratory → global · cross_domain → hybrid Output Formatter format: text · json · cards(入口に依存しない) 応答 Hook · UI · MCP Dream Loop — 記憶統合 Pipeline 毎日 4AM · dual-gate trigger · 5-phase Orient2 つのゲートを確認 + 統計スナップショット Signal矛盾をスキャン + PPR の中心 ReflectLLM による振り返り + 知識の欠落 Consolidate統合/置換/共存を判定 Prunelint + stale を整理 Slow Thinker 次の質問を予測 · 先読みキャッシュ Interest Profile 7/30/90d の注意力ウィンドウ Feedback Loop Feedback · Access Reinforce

一、Write Track

Write Track

記憶の書き込み経路は SanitizeGate が統括し、永続化の前に 3 つの防御線を通ります:

  • NoiseFilter:情報量のない雑談を除きます。
  • InjectionGuard + PoisoningDetection:prompt injection とコンテンツ汚染を防ぎます。
  • DedupOp:embedding cosine で既存データと照合し、十分に似ていればその場で遮断します。

通過すると、 Hybrid Indexingに入ります。ベクトルは memvault.blocks(pgvector 768d)に保存し、知識グラフは L0 Triple(subject/predicate/object)に分解して kg-opsに書き込みます。各データには Provenance(session_id / turn_index)が付いており、あとから追跡できます。また先に ContentNormalizer で形式を統一し、ノイズによる embedding 空間の汚染を防ぎます。

2 系統の書き込みの理論的基礎は、論文 Don't Forget to Connect! Improving RAG with Graph-based Reranking(2405.18414)にあります。完全な pipeline、3 つの防御線の判定基準、KG の抽出戦略は、 memvault Write Track の詳細記事。

Trigger

会話が保存されるとすぐ起動し、バックグラウンドのパイプラインは fire-and-forget で動きます。

Session Input
「entry-agnostic の入口で、どの session も受け取る」
session boundary · 出典を選ばない
after_create Hook
「書き込み直後にバックグラウンドの pipeline を起動し、フロントエンドをブロックしない」
asyncio.ensure_future() · fire-and-forget

Sanitize Gate

順番に通る 3 つのゲートで、non-commutative です。

NoiseFilter (G1)
「挨拶、文字化け、情報密度の低いパターンを削る」
core.noise.NoiseFilter · low-info regex + density
InjectionGuard (G2)
「露骨な prompt-injection を防ぐ」
5 categories · instruction_override / role_tag / encoded / markdown / separator_flood
PoisoningDetection
「G2 の姉妹コンポーネントで、5 種類の偽装を防ぐ」
memvault.security.poisoning · authority/role/markdown/temporal/base64 + Shannon entropy
DedupOp (G3)
「4-way decision で、類似度が高いものは LLM arbitration に回す」
SKIP / MERGE / SUPERSEDE / CREATE · cosine + Contradiction

Normalize & Index

コンテンツを正規化し、Hybrid の 2 種類の索引に登録します。

ContentNormalizer
「時間表現、通貨、単位、中国語の前処理を統一表記にする」
libs/text-ops · 4 つのサブモジュール + preprocess_chinese
Qwen3 Embedding (MLX)
「各記憶を 1024 次元のベクトル指紋に圧縮」
omlx_bridge.py · 1024d · persistent subprocess
BM25 Sparse
「字面の索引で、dense を補完する」
sparse_tokenizer · per-service avgdl
Hybrid Index → Qdrant
「Dense + BM25 RRF で想起結果を融合」
qdrant_search · Reciprocal Rank Fusion

KG Construction

L0 のトリプル抽出 + provenance を、event-driven で並行実行します。

L0 Triple 抽出
「(s, p, o) の 3 点セットを抽出」
20 predicates · entity normalization
Entity Resolution
「3-tier alias の統合:正規化 → 埋め込み → LLM」
3-tier · ChatGPT == GPT
Memory Provenance
「各トリプルに source + trust_score を付ける」
source_tracker · trust_score
Reactive KG Pipe
「event-driven で、主な書き込みをブロックしない」
fire-and-forget · 並行 pipeline

二、Background Track

Background Track

オフライン整理は DreamLoop が毎日 4AM に起動し、 core/src/modules/memvault/dream/ の 5 段階の pipeline で動きます:

  • orient:記憶の tier ごとの現在のスナップショットを取得します。
  • signal: MultiSignalEdges(access / cite / co-occur)を集約します。
  • reflect: TemporalConflictを実行し、二重時間軸(bi-temporal)の矛盾を検知します。
  • consolidate:階層別の要約(TierDigest)を作り、意味が同じ記憶を統合します。
  • prune:減衰スコアに基づき、淘汰候補に印を付けます。

別経路では、 KnowledgeLint が 4 段階の審査(グラフ構造 → grounding → LLM → 3 段階の確認)で誤りを修正します。また、 InterestProfile が私の話題の注目度を追跡して SurpriseDiscoveryにフィードバックし、やり取りは少なくても可能性の高い記憶を積極的に掘り出します。

このバックグラウンド整理の設計は、部分的に HippoRAG: Neurobiologically Inspired Long-Term Memory for LLMs(2405.14831)の統合の概念に対応します。Dream Loop の 5 段階の閾値、衝突解決戦略、KnowledgeLint v2 の詳細は、 memvault Background Track の詳細記事。

Trigger

Cronicle のスケジュール + 2 条件のゲートです。

Cronicle 4AM
「毎日 04:00 にスケジュールし、フロントエンドのピークを避ける」
Cronicle 4105 · daily schedule
Dual-Gate
「時間 + 累積量の両条件を満たすと起動」
(now - last) > 24h ∧ sessions_since ≥ 5

Dream Loop

OODA-like の 5 段階:Orient → Signal → Reflect → Consolidate → Prune。

Orient
「tier 分布のスナップショットで差の規模を見る」
tier distribution snapshot
Signal
「PPR seed を計算してシグナルの中心を見つける」
MultiSignalEdges · PPR seed
Reflect
「LLM の三者判定 + 時間的な矛盾の検知」
3-way judge + Temporal Conflict
Consolidate
「merge / supersede / coexist の 3 択」
merge / supersede / coexist
Prune
「decay score に基づき、tier digest も使う」
decay score + tier digest

Knowledge Lint

グラフ構造 → 事実性 → LLM → 人による再確認と、4 段階で順に監査します。

4 段階で順に確認
「graph → grounding → LLM → human」
lint v2 · volatile predicate
MultiSignalEdges
「純粋な共起の代わりに 5 signals fusion を使う」
co-occurrence + session + Adamic-Adar + type + semantic
Temporal Conflict
「LLM 3-way judge で判定し、RLM に引き上げられる」
MERGE / SUPERSEDE / COEXIST · escalate to RLM
Review Queue
「auto-approve + human-in-loop fallback」
low-confidence → human queue

Interest & Discovery

注意力の階層化 + 関心/欠落/意外な発見の掘り起こし + tier の縮退。

Attention Windows
「7/30/90 日の 3 層の注意力」
active / historical / fading
Daily Snapshot
「毎日 top intents/entities を集約」
SQL aggregation · top intents/entities
Knowledge Gap
「verdict=INCORRECT の累計で欠落に印を付ける」
verdict=INCORRECT ≥ 2
Surprise Discovery
「cross-community の橋 / indirect-strong / knowledge-gap」
surprise_ops · Leiden weighted triggers
Attitude + Skill Layer
「10 種類の attitude のバージョン履歴 + L1/L2/L3 skill」
attitude version chain + skill levels
Tier Digest
「warm→cold→frozen の一方向の LLM 要約」
summary ≤ 400 chars · 元に戻せない

三、Read Track

Read Track

読み出し経路の入口は QueryClassifyで、質問の種類に応じて戦略を変えますが、主軸は共通の 11 段階の評価 pipeline です:

  • QueryRouter:質問を事実、関連、雑談の 3 経路に分けます。
  • ScoringPipeline:BM25、dense retrieval、知識グラフのホップを組み合わせて並行して評価し、AttnRes intent-dependent の重み付けで統合します。
  • CascadeRecall:ベクトル検索で見つからない場合、知識グラフに深く入り、多段階で推論します。
  • Reranker:Jina Reranker v3 MLX で再ランキングします。
  • OutputFormatter + ReadTimeSanitize:出力前に injection をもう一度検査します。

バックグラウンドには SlowThinkerもあり、会話の SSE ストリームを監視し、次の query を予測して候補 block を prefetch します。予測が当たれば、pipeline 全体をもう一度実行するコストを省けます。

intent-dependent の重み付き統合の理論的根拠は、論文 Attention as a Hint: Detecting Irrelevant Contexts via Attention Weight(2603.15031)にあります。3 経路の振り分け基準、11 段階の評価関数、SlowThinker の予測モデルは、 memvault Read Track の詳細記事 に詳しく書きました。

Query Routing

意図分類 + attention prior + layer routing + HyDE。

QueryClassify
「6 intent を kw ∥ sem で並行判定し、信頼度が低ければ LLM に送る」
6 intent · kw ∥ sem → LLM (low conf)
Personalized Router
「attention prior でよく扱う話題を優先」
attention prior · 7/30/90
Layer Routing Matrix
「intent に応じた 4 種類の検索戦略」
intent → SEMANTIC / HYBRID / ILIKE / SKIP
HyDE Expansion
「まず仮説的な答えを生成し、embed して照合」
Hypothetical Document Embeddings

Hybrid による想起 + 11 段階の重み付け + intent-tuned blending + Redis cache。

qdrant_search
「hybrid Dense + BM25 RRF」
qdrant_search · hybrid + RRF
11-Stage Scoring
「11 段階の重み付けで最終スコアを合成」
recency / import / trust / feedback / length / decay / PPR / semantic / minscore / noise / dedup
Score Blending
「intent-tuned の比率」
default 0.3/0.7 · intent-tuned
Embedding Cache
「Redis に query の埋め込みをキャッシュ」
Redis · 24h TTL

Reranking

Cross-encoder による第 2 段階の精密なランキング + skip + circuit breaker。

Jina Reranker v3
「MLX cross-encoder で精密にランキング」
MLX · 0.6B · cross-encoder
Attention Gate
「3 skip rules、TurboQuant+ に着想を得たもの」
3 skip rules · TurboQuant+ inspired
Circuit Breaker
「3 failures で 600s recovery を起動」
3 failures → 600s recovery

Cascade Recall

Slow-only の 5 手:L0 → L1 → L2 → PPR → CRAG。

L0 Triple
「3 点セットから隣接要素を直接検索」
(s, p, o) lookup
L1 Community
「Leiden community detection」
Leiden detect
L2 Summary
「LLM による事前生成の要約で、遅延ゼロ」
pre-generated · zero-latency
PPR Walk
「igraph PPR、HippoRAG に着想を得たもの」
HippoRAG-inspired igraph PPR
CRAG Verification
「4 モードの自己チェック:default / deep / rlm / none」
evaluate=default/deep/rlm/none

Output

Budget-aware な整形 + 出力側の sanitize + Slow Thinker の別経路。

Output Formatter
「token の予算内で packing」
format=text/json/cards · budget-aware packing
Read-Time Sanitize
「出力側でもう一度サニタイズ」
is_unsafe_for_injection + sanitize_for_injection
Slow Thinker (別経路)
「5-op pipeline で次のラウンドに備える」
5-op pipeline · Admission Control · VoiceAgentRAG-inspired

四、3 つのトラックを貫く設計層

3 トラックに共通する設計層 — CLT が哲学的な frame、4 Event Flows が自律的な骨格、Reactive 抽象が関数合成の基盤です。

Cross-cutting

CLT の 3 原則 + 4 event flows + Reactive 抽象。

CLT の 3 原則
「無駄を削る / 複雑さを分ける / 例で検証する。それぞれ sanitize / segment / verify に対応」
Sweller 1988 · 認知負荷理論
4 Event Flows
「4 本の event-driven pipeline がそれぞれの役割を担う」
Memory→KG / Capture→KG / Intelligence→Block / Query→SlowThinker
Reactive 抽象
「Operator / Pipeline / Observable / Subject の 4 点セット」
libs/ops-core · RxJS-inspired

3 トラックの deep dive は三部作に分かれています。この記事ではそれらを 1 枚の全景図にまとめ、全体を貫く設計層を取り出しました。CLT は私の設計哲学、4 Event Flows は自律的に動く骨格、Reactive 抽象は関数合成の基盤です。

ここに書かなかったものの大半は、長期的な調整が必要なパラメータです。評価の重み、先読みの的中率、カスケードの境界、知識グラフ抽出の信頼度閾値などです。これらの値はデータ分布に応じて毎月微調整するもので、新しいコンポーネントではありません。

もちろん、万能なツールはありません。理論、技術、ツールは進歩し続けており、memvault も進化を重ねます。この記事は現時点の進捗の棚卸しとしておきます。将来、大幅な改版があれば別の記事で説明します。memvault 三部作は、いったんここで締めくくります。

ツール

実際に経験した症状を選び、どのトラックから補うべきか確認する

この記事の主張は、「自作の記憶システムの多くは書き込みと想起の 2 トラックしかなく、バックグラウンドトラックが欠けているため、使うほど散らかる」というものです。以下の 8 つの症状について、コンポーネント名を知る必要はありません。実際に経験したものだけ選ぶと、この記事の原因分析に沿って、先に確認すべきトラックを並べます。処理はすべてブラウザ内で行われ、データは外に送られません。

これは本文の説明を対照表にしたもので、測定ではありません——あなたのデータは読めず、クエリも実行できません。同じ症状でも、本文で扱っていない原因(もともとのデータ量が少ない、embedding モデルが合っていない、クエリが曖昧すぎる)から生じることはよくあります。このツールには見分けられず、本文の原因分析に沿って方向を示すだけです。本文には「補うべきほど深刻」と判断する閾値もないので、順序を並べるだけで点数は付けません。

この部分を持ち帰る

AI Agent に全体を点検してもらうためのプロンプト

多くの人が自作した記憶システムには「書き込み」と「想起」の 2 トラックしかなく、バックグラウンドトラックが欠けているため、使うほど散らかります。この記事は、自ら整理する記憶システムを 3 トラック × 3 層の設計原則に分けて示しているので、対照表として使えます。

以下をあなたの AI に貼り付け、この記事の設計とあなたのシステムを項目ごとに比較し、どのトラック、どの層が欠けているか指摘してもらってください:

私は〈memvault 全景:3 つのトラック × 3 層の設計原則〉という記事を読んでいます (https://blog.joneshong.com/zh/blog/memvault-overview)。 著者は、自ら整理する個人用記憶システムを 3 トラック × 3 層の設計原則に分解しています。 この記事の仕組みを対照表として使い、私のシステムに欠けている部分を項目ごとに比較してください。一般論は不要です。 私のシステムの現状: - 書き込みの仕組み:[記憶に入る前の処理を簡潔に説明] - バックグラウンドでの整理:[定期的に整理しているか?何を忘れるかどう決めるか?] - 想起の経路:[質問から答えまでどうたどるか?] 以下の 3 つの側面から診断してください: A. 3 トラックの充実度 1. 書き込みトラック:ノイズの除去/偽装された注入の遮断/重複排除という 3 つの関門はありますか?記憶をベクトル + 知識グラフの 2 系統に分けていますか? 2. バックグラウンドトラック:非同期の整理 pipeline はありますか?古い情報、矛盾、孤立した情報をどう識別しますか?システムは「忘れることを学ぶ」ことができますか? 3. 想起トラック:意図の分類はありますか?複数のシグナルを組み合わせてランキングしますか?予測による先読み(ユーザーが尋ねる前に準備する)はありますか? B. トラックを横断する 3 層の設計原則 4. 認知負荷:各処理は後段の負荷を減らしていますか?「無駄を削る / 複雑さを分ける / 例で検証する」という 3 つの原則はありますか? 5. イベントフロー:システムは人がボタンを押して動かすのではなく、イベントで駆動していますか?典型的な 4 本のイベントフロー(記憶から知識グラフ、外部から取得した情報からグラフ、インテリジェンスから記憶ブロック、クエリから先読み)に対応する実装はありますか? 6. リアクティブな抽象化:pipeline は最小単位の変換器(Operator)を組み合わせて作られていますか?イベントの骨格は pub-sub モデルですか?将来の拡張にどの程度影響しますか? C. 統合面 7. 3 トラックはどう通信していますか?直接 import していますか、それともイベントで疎結合にしていますか? 8. 書き込み側で付けるメタデータ(confidence / provenance / valid_at)は、バックグラウンドでの整理と想起時のランキングに利用されていますか? 9. 長期的にパラメータを調整する部分と、新しいコンポーネントはどれですか?中核となる設計から分けたほうが保守しやすくなりますか? まず私のシステムに現在欠けているものを列挙し、次に最優先で補うべき 3 項目と優先順位を教えてください。 私が少数のメモを保存したいだけで、データ量も少ないなら、3 トラック全体は不要だとはっきり言ってください。完全性のためだけに無理に追加しないでください。

関連する記事

三部作の詳しい記事 + トラックを横断する設計原則の理論的な源流。

資料 重要な理由
memvault Write Track — 会話が終わったあと 三部作第 1 回の詳しい版です。3 つの gate(ノイズ/注入 + 偽装/重複排除)+ 2 系統の書き込み(ベクトル + KG)+ Provenance + Content Normalizer の 4 つのサブモジュール
memvault Background Track — 保存したあと 三部作第 2 回の詳しい版です。Dream Loop の 5 段階、Knowledge Lint の 4 層、Multi-Signal Edges、Temporal Conflict、Tier Digest、Surprise Discovery など、12 個のコンポーネントを扱います
memvault Read Track — 思い出したあと 三部作第 3 回の詳しい版です。意図分類 + Personalized Router + 11-stage scoring + Cascade Recall + Read-Time Sanitize + Slow Thinker の先読み
Cognitive Load Theory(Sweller, 1988) 3 トラックの sanitize / segment / verify という 3 つのゲートの設計哲学の源流 — 書く側が少し苦労することで、読む側が楽になります
Enterprise Integration Patterns(Hohpe & Woolf, 2003) 4 Event Flows の pub-sub / pipe-and-filter 設計パターンの源流です。memvault は EventBus と Subject の抽象化をこのパターンの上に構築しています
RxJS Reactive Extensions Operator / Pipeline / Observable / Subject という 4 つの抽象化の具体的な実装例です。memvault は RxJS を直接使いませんが、抽象化のレベルはこれに合わせています
✦ プロンプトをコピー