System Integration Blueprint · Apple Silicon (64GB Unified Memory)

Claude Code · Codex · OpenCode · Oh My Pi 接入 Raw-RAG 架構藍圖

將四套常用 CLI Coding Agent 的本機對話紀錄統一接入單一 agent-raw-rag-mcp 服務:保留 Raw-RAG 「寫入端零 LLM 呼叫、增量尾部切塊、兩階段檢索 + 動態回合展開」核心,同時針對 Coding 場景濾除巨型 Tool Stdout 噪音,並直接以 CLI Agent 自身的主力模型作為 Reader LLM。

跨工具記憶互通
4 Agents → 1 Index
Claude Code、Codex、OpenCode、Oh My Pi 共用同一專案記憶池,跨工具切換不斷脈絡。
本機 Reader LLM 記憶體開銷
0 GB (免跑 Reader Server)
直接由 CLI 工具本身的 Claude / GPT / Gemini 模型擔任 Reader,省去最大宗 KV Cache 負擔。
MLX 檢索雙模型統一記憶體佔用
~4.8 GB (按需喚醒)
Qwen3-Embedding-4B + Qwen3-Reranker-4B (4-bit MLX),無長上下文 KV 膨脹。
完美免疫 /compact 失憶
100% 原始對白隨時救援
當 Session 觸發 /compact 損失 21.9% 細節時,可隨時從 Raw-RAG 撈回完整歷史回合。

1 系統總體架構圖:四端增量採集 → 確定性降噪 → 統一 MCP 檢索

四套 CLI 工具各自透過 Hook 或增量游標(Cursor)把新完成的對話回合推入寫入管線;讀取時則統一透過 MCP 工具 raw_rag_search 取得經過時序重排與完整回合展開的 Top-15 記憶。

1. 四大 CLI Agents (寫入源 & Reader) Claude Code (claude) ~/.claude/projects/<slug>/*.jsonl 觸發:Stop Hook + MCP Client Codex CLI (codex) ~/.codex/sessions/**/rollout-*.jsonl 觸發:config.toml notify + MCP OpenCode (opencode) ~/.local/share/opencode/opencode.db 觸發:session.idle Plugin + SQLite 游標 Oh My Pi (omp / pi) ~/.omp/agent/sessions/<slug>/*.jsonl 觸發:Extension turn_end / compact 增量寫入 2. 零 LLM 增量寫入管線 O(ΔL) 保留對白原文,過濾巨型 Tool Stdout Step A: 確定性降噪器 (Sanitizer) ✓ 100% 保留 User Prompt 與 Assistant 對白 ✓ 保留修改檔案路徑、Bash 命令與錯誤尾部 ✗ 剝除數千行 Read 檔案全文 / 巨型 Diff Step B: 增量尾部切塊 (Tail Chunker) • 沿用 add_incremental_message 機制 • 鎖定已滿 256-tok 區塊 (stable_chunks) • 僅重切尾部區塊 (overlap 32) + turn_spans Step C: 統一儲存庫 (Storage) • SQLite + Vector / PostgreSQL pgvector • 索引標籤:project_path, agent, branch, date 3. 本機 MLX 兩階段檢索核心 常駐記憶體僅 ~4.8 GB,零 LLM 生成延遲 1. 專案與時序預過濾 依 project_path (預設當前 repo) 與日期範圍 _filter_chunks_for_question_date 2. Dense 粗排 Top-128 MLX Qwen3-Embedding-4B (4-bit) 餘弦相似度快速召回 128 個 256-tok 切片 3. Cross-Encoder 精排 Top-15 MLX Qwen3-Reranker-4B (4-bit) 支援 dynamic_top_k (score > 0.5 自動截斷) 4. 時序升冪重排 + 展開完整 Turn _expand_chunk_to_turns 還原完整問答回合 4. 統一 MCP 介面 raw-rag-mcp MCP Tools: • raw_rag_search() • raw_rag_recent() • raw_rag_ingest() 回傳 ~3.8K tokens 完整時序對話證據 由當前 CLI Agent 擔任 Reader LLM: • Claude Opus / Sonnet • GPT-5 / o3 • Gemini 2.5 Pro 直接閱讀原始演進鏈!

2 Coding Agent 專屬改造:為什麼要先過一層「確定性降噪器 (Deterministic Sanitizer)」?

在你的機器上,~/.local/share/opencode/opencode.db 高達 3.19 GB,因為 Coding Agent 的原始紀錄有 90% 以上是 Read 檔案全文、grep 列表或長篇編譯輸出。若直接切塊會嚴重稀釋向量檢索精度。我們在不使用 LLM、100% 保留人類與 Agent 對白原文的前提下,對 Tool 紀錄做確定性瘦身:

原始 Session JSONL / SQLite (未過濾:90% 噪音) 直接切塊會淹沒檢索器
{
  "role": "user",
  "content": "為什麼 MEME No-Filler 的 Complete-Store Oracle 分數是 0?"
}
{
  "role": "assistant",
  "tool_use": "Read(rag_adapter.py, lines 1..1980)",
  "tool_result": "... [長達 68,000 字元的 Python 原始碼傾印,佔用 85 個 Chunks] ..."
}
{
  "role": "assistant",
  "content": "找到了!因為 conv_id 多了 meme_nofiller_ 前綴,導致字典查找為空。"
}
經 Deterministic Sanitizer 轉換後送入 Raw-RAG 的文件 對白 100% 原文 + 動作路徑保留
Conversation ID: claude_raw-rag_8f91a2
Project: /Volumes/Samsung970EVOPlus/dev-projects/raw-rag | Agent: claude-code

[2026-10-25 21:10] User: 為什麼 MEME No-Filler 的 Complete-Store Oracle 分數是 0?
[2026-10-25 21:11] Assistant (Actions): [Read] rag_adapter.py | [Edit] run_meme_nofiller_reverse_ablations.py | [Bash] pytest (exit 0)
[2026-10-25 21:12] Assistant: 找到了!因為 conv_id 多了 meme_nofiller_ 前綴,導致字典查找為空。已在 normalize_conv_id() 加入前綴剝除邏輯並驗證通過。

3 核心價值:徹底解決 CLI Agent /compact(上下文壓縮)造成的失憶問題

當你在 Claude Code、OpenCode 或 Oh My Pi 長時間開發並觸發 /compact 時,系統內建的 LLM 摘要正是論文實證會造成 21.9% 永久表徵損失 的有損壓縮(丟失具體變數名、嘗試過的失敗方案與修改原因)。接上 Raw-RAG 後形成「雙軌記憶」:

長對話開發 Session 累積 150K tokens 歷史 即將觸發 Context 上限 軌道 A:Agent 內建 /compact (有損滾動摘要) • 壓縮成 2K tokens 摘要留在主視窗,但遺失 21.9% 細節 • 忘記 2 小時前已證實無效的參數或特定錯誤訊息 軌道 B:Raw-RAG 旁路原文索引 (零表徵損失) • 壓縮前每一輪對白皆已增量寫入 256-token 區塊索引 • turn_spans 完整保留每一輪對話的先後順序與原文 壓縮後精準救援 (On-Demand Recall) 當 Agent 需要回想壓縮前的具體細節時: 呼叫 raw_rag_search(query="...") → 瞬間取回壓縮前的 Top-15 完整原始對話回合 → 兼具「短 Context 速度」與「100% 原文記憶」!

4 四大工具接線規格與設定檔藍圖

根據你機器上的實際安裝路徑,以下為四套 CLI 工具接入 agent-raw-rag-mcp 的具體設定方式:

1. Claude Code (~/.claude/settings.json) Hook + MCP

利用 Stop Hook 在每輪回答完成時觸發背景增量更新(只讀新增 byte offset),並掛載 MCP Server:

{
  "hooks": {
    "Stop": [{
      "hooks": [{
        "type": "command",
        "command": "raw-rag-ingest --agent claude --incremental"
      }]
    }]
  },
  "mcpServers": {
    "raw-rag": {
      "command": "raw-rag-mcp"
    }
  }
}
2. Codex CLI (~/.codex/config.toml) notify + MCP

利用 Codex 原生 notify 機制在每輪 Turn 結束時同步 ~/.codex/sessions/**/*.jsonl 尾部區塊:

# 每輪對話完成自動執行增量切塊與嵌入
notify = ["raw-rag-ingest", "--agent", "codex", "--incremental"]

[mcp_servers.raw_rag]
command = "raw-rag-mcp"
args = []
3. OpenCode (~/.config/opencode/opencode.json) SQLite 游標 + MCP

針對 3.19 GB 的 opencode.db,依 message.time_created > last_cursor 只抽取文字 Part(跳過巨型 Tool output):

{
  "mcp": {
    "raw-rag": {
      "type": "local",
      "command": ["raw-rag-mcp"],
      "enabled": true
    }
  }
}
4. Oh My Pi (~/.omp/agent/config.yml & Extension) Extension + MCP

透過 ~/.omp/agent/extensions/raw-rag.ts 監聽 turn_end 與 session_compact,壓縮時自動建立檢查點:

// ~/.omp/agent/extensions/raw-rag.ts
export default function (pi) {
  pi.on("turn_end", async () => {
    await pi.exec("raw-rag-ingest", ["--agent", "omp", "--incremental"]);
  });
}

5 落地實作藍圖:/Volumes/Samsung970EVOPlus/dev-projects/agent-raw-rag-mcp

若要將此設計實作為常駐工具,建議於 /Volumes/Samsung970EVOPlus/dev-projects/agent-raw-rag-mcp 建立以下輕量架構:

模組檔案 核心職責 對應 Litmeb/RAW-RAG 機制
src/parsers/{claude,codex,opencode,omp}.py 讀取四套工具的 JSONL / SQLite,維護增量游標(byte_offset / last_rowid),並執行 Deterministic Sanitizer 剝除長篇 Tool stdout。 對應 _format_conversation 與 _format_message_line。
src/engine/incremental_chunker.py 維護 stable_chunks 與尾部可變 tail_chunks(256 tokens, overlap 32),建立 turn_spans 與日期索引。 直接移植 RAGAdapter.add_incremental_message 與 _build_turn_context。
src/engine/mlx_retriever.py 載入 MLX Qwen3-Embedding-4B 與 Qwen3-Reranker-4B,執行時序過濾 → Dense Top-128 → Rerank Top-15 → 時序升冪重排 → 展開完整對話回合。 移植 _filter_chunks_for_question_date、_selected_chunk_time_sort_key 與 _expand_chunk_to_turns。
src/mcp_server.py 提供標準 stdio MCP 服務(raw_rag_search、raw_rag_ingest、raw_rag_status),一鍵掛載至四大 CLI 工具。 取代原本實驗框架的內部 Reader 呼叫,直接將 _format_context 結果回傳給 CLI Agent。