將四套常用 CLI Coding Agent 的本機對話紀錄統一接入單一 agent-raw-rag-mcp 服務:保留 Raw-RAG 「寫入端零 LLM 呼叫、增量尾部切塊、兩階段檢索 + 動態回合展開」核心,同時針對 Coding 場景濾除巨型 Tool Stdout 噪音,並直接以 CLI Agent 自身的主力模型作為 Reader LLM。
Qwen3-Embedding-4B + Qwen3-Reranker-4B (4-bit MLX),無長上下文 KV 膨脹。/compact 失憶/compact 損失 21.9% 細節時,可隨時從 Raw-RAG 撈回完整歷史回合。
四套 CLI 工具各自透過 Hook 或增量游標(Cursor)把新完成的對話回合推入寫入管線;讀取時則統一透過 MCP 工具 raw_rag_search 取得經過時序重排與完整回合展開的 Top-15 記憶。
在你的機器上,~/.local/share/opencode/opencode.db 高達 3.19 GB,因為 Coding Agent 的原始紀錄有 90% 以上是 Read 檔案全文、grep 列表或長篇編譯輸出。若直接切塊會嚴重稀釋向量檢索精度。我們在不使用 LLM、100% 保留人類與 Agent 對白原文的前提下,對 Tool 紀錄做確定性瘦身:
{
"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_ 前綴,導致字典查找為空。"
}
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() 加入前綴剝除邏輯並驗證通過。
/compact(上下文壓縮)造成的失憶問題
當你在 Claude Code、OpenCode 或 Oh My Pi 長時間開發並觸發 /compact 時,系統內建的 LLM 摘要正是論文實證會造成 21.9% 永久表徵損失 的有損壓縮(丟失具體變數名、嘗試過的失敗方案與修改原因)。接上 Raw-RAG 後形成「雙軌記憶」:
根據你機器上的實際安裝路徑,以下為四套 CLI 工具接入 agent-raw-rag-mcp 的具體設定方式:
~/.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"
}
}
}
~/.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 = []
~/.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
}
}
}
~/.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"]); }); }
/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。 |