架構總覽#
三軌道一張全景。實線是主流程,跨軌虛線是 4 條讓系統自己跑的事件流。13 個 group bracket 把相關元件圈起來,每個 group 後面接元件詳述。
一、寫入軌 — 對話進保險庫#
記憶進保險庫這一軌#
對話結束最怕空氣突然安靜,剛聊的內容不收就灰飛煙滅。但全收也不行,會被大量雜訊淹沒,真正有用的反而找不到。這一軌就是要解決這兩難。
我把記憶寫入比喻成貨物進倉,入口有三道關卡:第一關過濾「嗯哼、好喔」這類沒營養的廢話;第二關防堵可疑指令,避免系統被奇怪的內容搞壞;第三關擋下已經有過的重複資訊。三關都過了才能歸檔。
歸檔還分兩條路線:一條按語意相似度存放,另一條則把人、事、物之間的關係拆解出來獨立建檔。每筆紀錄都標示來源,確保以後能找到原始對話。這套三關卡、雙軌歸檔的完整流程,細節全寫在這篇裡了。
有人講話了#
對話一落地,背景就開始動。
話進門
「一段話講完了,想要把它留下來」
不挑來源 · 任何 session 都收
背景就開工
「寫進來那一刻,後台流水線立刻啟動,前台不等」
寫完即觸發 · 不阻塞
三道安檢閘門#
進保險庫前的三關過濾,順序不能換。
過濾廢話
「寒暄、亂碼、沒料的字串先丟」
G1 · 低資訊密度判定
擋直白偷渡
「『忽略前面所有指令』這類偷渡,第一關當場退件」
G2 · 5 種注入樣板
擋偽裝
「假冒身份、假時序、編碼夾帶 — 五類偽裝專門檢驗」
G2 姊妹 · 5 類偵測
比對重複
「跟舊的長太像?決定跳過、合併、取代或新增」
G3 · 4-way 決策
校稿與上架#
文字統一寫法,再壓成兩種索引一起上架。
校稿員
「『下週四』『2026-04-30』『Apr 30』全部統一寫法」
4 子模組 · 中文預處理
壓成指紋
「把每段話壓成一串數字指紋,像條碼」
1024 維 · 常駐子程序
字面索引
「字面對字面的卡片目錄,跟指紋互補」
分詞索引 · 服務級平均長度
兩本目錄一起查
「找書時兩本目錄同時翻,再合併排序」
混合索引 · 倒數排名融合
蓋知識圖#
把每段話拆成關係,記下出處,跟主線並行跑。
拆三件套
「誰 → 做什麼 → 對誰,三件套抽出來」
20 種關係 · 實體正規化
認人
「ChatGPT 跟 GPT 是同一位 — 三層比對確認」
三層 · 正規化 + 指紋 + LLM
記出處
「每筆都附『誰說的、什麼時候說的、有多可信』履歷」
來源追蹤 · 信任分數
並行流水線
「主線在跑,圖也同步在蓋,互不耽誤」
事件驅動 · 不阻塞
二、背景軌 — 學會忘#
學會忘這一軌#
記憶進倉後,事情還沒結束。倉庫如果只進不出,半年後就會雜亂到什麼都找不到。所以這一軌很安靜、但至關重要:它在學習如何「忘記」。
我把這過程想成一個夜班盤點員,固定在深夜巡視倉庫。他有五個步驟:首先盤點庫存現況,接著找出近期熱門的資訊,然後比對並整合可能重複或矛盾的內容,再把確認過的精華濃縮成摘要,最後把無人問津的舊資料標記為待處理。
旁邊還有兩個幫手:一個專門挑毛病,揪出那些自相矛盾的記憶;另一個則默默記錄我最近的興趣,讓盤點員可以優先處理我關心的領域。這套夜班作業的完整流程,以及它如何決定去留的判斷邏輯,都在這篇裡了。
半夜才動#
只有凌晨四點、條件齊全才肯啟動。
凌晨四點鬧鈴
「白天不打擾,每天四點才開始整理」
每日排程 · 不影響前台
雙重門檻
「上次超過 24 小時,又累積 5 段對話,才肯動」
時間 + 累積量 雙條件
五段夢#
夜裡像睡覺一樣,五個階段把白天的事整理乾淨。
看全局
「先看今天跟昨天差多少,再決定要不要做事」
分層分布快照
找重點
「最近反覆出現的人事物,標出來當主角」
多訊號邊 · 種子計算
想一想
「讀完脈絡再產出一段心得,三方裁判把關」
三向裁判 + 時間衝突偵測
收進櫃子
「同義的合併、打架的解開、亂的擺正」
合併 / 取代 / 並存
退場
「沒人再看的標記退場,不會把倉庫塞爆」
衰減分 + 分層摘要
真假校對員#
夢裡再找四道把關,把矛盾跟錯誤撈出來。
四層遞進
「先看圖、再核事實、再交給 LLM、最後人複審」
四層遞進 · 易變述詞
五種訊號
「不只看共現幾次,五種線索一起融合判斷」
共現 + 對話 + 鄰里 + 類型 + 語意
新舊打架
「兩筆事實互槓,三方裁判決定要合、要換、還是並存」
合併 / 取代 / 並存 · 升級裁判
送回人工
「機器拿不準的,留在隊列裡等人複審」
自動通過 + 人工後援
興趣與探索#
不只記事實,還記偏好、缺口、驚喜,跟老照片要怎麼存放。
三層注意力
「7 天最近、30 天回顧、90 天淡出 — 注意力分三層」
活躍 / 歷史 / 淡出
每日日記
「每天自動寫一篇日記,記今天最常聊的人和事」
每日聚合 · 主題與實體
標出缺口
「反覆問卻找不到的,標『這裡有洞』」
兩次以上判定不正確
挖驚喜
「找跨群的橋、間接強連結、知識缺口,三種驚喜入口」
驚喜流水線 · 加權社群偵測
記偏好與熟練
「不只記事,還記你喜不喜歡、會多少、進步沒」
10 類偏好版本鏈 + 三級熟練
老照片黑白縮圖
「老資料轉黑白縮圖存倉,留摘要不還原」
三級降階 · 單向摘要
三、召回軌 — 讓對的記憶浮上來#
記憶被想起這一軌#
記憶存進去、也整理好了,最後要解決的是「召回」— 怎麼在對的時機,讓對的記憶自動浮現。如果每次都要費力翻找,那倉庫再好也沒用。
我把這軌比喻成餐廳前台。客人一問,先有人判斷問題類型:查事實、找關聯,還是閒聊?接著,後場同步從各倉區調貨,貨到後由品管篩選,剔除不合的,留下最相關的。上菜前再過一次安檢,確保內容沒問題。
更絕的是,有個角色在背景偷偷備料。他會預判我接下來想問什麼,提前把相關記憶準備好。等我一開口,就能直接端上桌,省去整套流程。這套從接單到上菜的完整召回邏輯,細節全在這篇裡。
看人下菜#
來客一進門,先判意圖,再決定去哪幾層找。
看意圖
「是查事實、找關係、還是發散探索?六種招呼分流」
六種意圖 · 關鍵字並行語意
服務生記性
「服務生記得你常點什麼,先把那幾道菜端上來」
注意力先驗 · 7/30/90 天
分層派工
「不同問題去不同層找,不亂全翻」
意圖對應 4 種搜尋策略
先想答案再找
「先在腦中模擬一份理想答案,再拿那份去比對」
假設文件嵌入
快速搜#
進倉庫先粗篩,再用 11 層加權排好,常用的指紋還會留快取。
語意進倉
「進倉庫先問語意,找像的那一群」
混合搜尋 · 倒數排名融合
11 層排序
「新不新、重不重要、可不可信⋯ 11 個面向綜合打分」
時近 / 重要 / 信任 / 反饋 / 衰減等
調味比例
「不同口味的問題,調味比例不同」
預設 0.3/0.7 · 依意圖微調
指紋快取
「算過的指紋先收進口袋,下次秒取」
快取 · 24 小時過期
二度精挑#
粗選好的再交給精挑員,但他能跳過、能停機。
精挑員
「粗選好的,再請精挑員一筆一筆細看」
交叉編碼器 · 0.6B
領先太多就免
「第一名遠遠領先,那就不用再精挑了」
三條跳過規則
壞掉就跳過
「精挑員壞了,先繞過十分鐘,別把整條線拖垮」
三次失敗 → 600 秒繞行
慢思五招#
慢思路才開的後備五招,從事實到全貌再自查。
事實層找鄰居
「從『誰 做什麼 對誰』那層直接撈隔壁」
三件套查詢
社群層找關聯
「從同一個小圈子裡找相關的人事物」
社群偵測
摘要層看全貌
「先讀預先寫好的摘要,零等待看大景」
預生成摘要 · 零延遲
沿圖散步
「從種子實體出發,沿著圖的小路慢慢走」
個人化隨機遊走
回答前自查
「上菜前廚師再嚐一口,不對就退回去」
四檔驗證 · 預設/深/裁判/關
出貨前#
整形、再消毒一次,背景還偷偷準備下一道。
整形上盤
「字數預算內取捨,把答案擺得整齊」
三種版型 · 預算感知打包
出貨前再消毒
「上桌前再檢查一次有沒有夾帶髒東西」
出貨側偵測 + 清洗
下一道偷偷備
「服務生看你還沒吃完,後廚已偷偷在備下一道」
五段流水線 · 入場控制
四、三條軌道貫穿的設計層#
軌道的脈絡從哪來?其實是共用了三層心法,每一處細節都是這些心法的體現。
三層心法#
砍多餘、拆複雜、校範例,讓家自己會運轉。
三招減負擔
「砍多餘、拆複雜、校範例 — 對應三條軌道的安檢、分段、自查」
認知負荷三原則
四條管線
「四條管線各司其職,讓整個家自己會運轉」
記憶 / 收件 / 洞察 / 慢思
流水線抽象
「自動工廠,每個工人只做一件事,組起來就是流水線」
運算子 / 流水線 / 觀察者
---
地圖到此完整。Write 軌道負責收納對話,Background 軌道邊整理邊學會遺忘,Read 軌道則讓對的記憶在對的時候浮現。
讓三條軌道連成一氣的,是:砍多餘、拆複雜、校範例。這套原則的影子,在每條軌道都看得到。
當然,沒有哪種工具能一勞永逸。理論、技術、用法一直都在前進,memvault 也會跟著時間繼續長。這篇就當作目前進度的一次合照——日後若有大改版,會再用新的文章來講。memvault 三部曲,先收在這裡。
架構總覽#
三軌道的 entry-agnostic pipeline 全景圖。13 個 group bracket 對應底下的元件 cards;4 條跨軌 dashed event flows 標出系統自驅動骨幹。
一、Write Track#
Write Track#
記憶寫入路徑由 SanitizeGate 統籌,在持久化前跑三道防線:
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 空間。
這個雙軌寫入的理論基礎來自論文 Don't Forget to Connect! Improving RAG with Graph-based Reranking(2405.18414)。完整的 pipeline、三道防線的判準與 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#
三道循序閘門,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 雙索引上架。
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) 三件套抽取」
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/ 的五階段 pipeline:
orient:抓取記憶分層的當前快照。
signal:聚合 MultiSignalEdges(access / cite / co-occur)。
reflect:執行 TemporalConflict,偵測雙時態(bi-temporal)矛盾。
consolidate:產出分層摘要(TierDigest)並合併語意相同的記憶。
prune:根據衰減分數標記出待淘汰的候選者。
旁路還有 KnowledgeLint 透過四層遞進審核(圖結構 → grounding → LLM → 三階段確認)糾錯,以及 InterestProfile 追蹤我的主題熱度,回饋給 SurpriseDiscovery,主動挖掘那些低互動但高潛力的記憶。
這個設計部分對應 HippoRAG: Neurobiologically Inspired Long-Term Memory for LLMs(2405.14831)的整合概念。Dream Loop 五階段的閾值、衝突解析策略和 KnowledgeLint v2 細節,都記錄在 memvault Background Track 細節篇。
Trigger#
Cronicle 排程 + 雙條件閘門。
Cronicle 4AM
「每日 04:00 排程,避開前台尖峰」
Cronicle 4105 · daily schedule
Dual-Gate
「時間 + 累積量雙條件才觸發」
(now - last) > 24h ∧ sessions_since ≥ 5
Dream Loop#
OODA-like 五階段: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 三選一」
merge / supersede / coexist
Prune
「decay score 驅動,搭配 tier digest」
decay score + tier digest
Knowledge Lint#
四層遞進審計,圖結構 → 真實性 → LLM → 人複審。
四層遞進
「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 天三層注意力」
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:將問題分為事實、關聯、閒聊三路。
ScoringPipeline:結合 BM25、dense retrieval 和知識圖譜跳躍,並行打分,AttnRes intent-dependent 加權合併。
CascadeRecall:當向量搜尋找不到時,自動深入知識圖譜進行多步推理。
Reranker:使用 Jina Reranker v3 MLX 進行重排序。
OutputFormatter + ReadTimeSanitize:輸出前再跑一次 injection 檢查。
背景還有個 SlowThinker,它監聽對話的 SSE 串流,預測下一個 query 並 prefetch 候選 block。如果猜中,就能省掉一次完整 pipeline 的成本。
其中 intent-dependent 加權合併的理論依據來自論文 Attention as a Hint: Detecting Irrelevant Contexts via Attention Weight(2603.15031)。三路分流的判準、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
Fast Search#
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 快取查詢嵌入」
Redis · 24h TTL
Reranking#
Cross-encoder 二階段精排 + 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 五招:L0 → L1 → L2 → PPR → CRAG。
L0 Triple
「三件套直接鄰居查詢」
(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
「四檔自查: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
四、三條軌道貫穿的設計層#
三軌道共用的設計層 — CLT 為哲學 frame、4 Event Flows 為自驅動骨幹、Reactive 抽象為函式合成基底。
Cross-cutting#
CLT 三原則 + 4 event flows + Reactive 抽象。
CLT 三原則
「砍多餘 / 拆複雜 / 校範例,對應 sanitize / segment / verify」
Sweller 1988 · 認知負荷理論
4 Event Flows
「四條 event-driven pipeline 各司其職」
Memory→KG / Capture→KG / Intelligence→Block / Query→SlowThinker
Reactive 抽象
「Operator / Pipeline / Observable / Subject 四件套」
libs/ops-core · RxJS-inspired
三軌道的 deep dive 分散在三部曲中。這篇則把它們收攏到一張全景圖下,並抽出貫穿全局的設計層:CLT 是我的設計哲學,4 Event Flows 是自驅動骨幹,Reactive 抽象則是函式合成的基礎。
那些沒寫進來的,多半是需要長期調校的參數——評分權重、預取命中率、級聯邊界、知識圖譜抽取的信賴閾值。這些數值會隨資料分佈每月微調,不算新組件。
當然,沒有什麼工具能一勞永逸。理論、技術、工具都還在不斷突破,memvault 也會跟著繼續迭代。這篇 blog 就當作目前進度的一次盤點——日後若有大改版,會再以新的文章交代。memvault 三部曲,先收在這裡。