你讓助手記住「出差跟著主管的交通安排」,後來主管改搭客運,助手卻繼續答高鐵。這篇 RAW-RAG 教學要帶你查清楚:更正被摘要省掉了、檢索漏找了,還是回答模型拿到證據仍推錯?
本文寫給第一次檢查 Agent 記憶的人。先用一份繁中假對話看懂原理,再學會保留原文定位、分層記分與切換 reader。動手部分需要會建立文字檔、執行 Python;不先下載整套 benchmark,也能驗算評分方法。
依 2026 年 10 月 25 日查閱的RAW-RAG 論文與作者程式整理。本文執行的是自製評分小例子;向量檢索、模型回答與弱 reader 對照提供操作方法,未宣稱完成論文重現或模型效能測量。
先說結論:記憶診斷=找齊證據+用對證據
記憶診斷=找齊證據+用對證據。像查帳:找到一張發票,不代表找到整筆交易的來龍去脈;單據齊全,也要有人算對。先把這兩層拆開,才知道下一步要修檢索、加工方式,還是回答模型。
- 原文留作可追溯底稿,檢索只取本題需要的片段。
- 答案值、時間與人物關係分開標;不能只檢查正確名詞有沒有出現。
- 用相同證據餵給不同 reader,再比較推導與拒答。
- 成本拆成建庫、檢索、重排與回答;小考卷通過後才擴大。
一、RAW-RAG 教學:先把四個零件拆開
RAW-RAG 是把原始歷史當成檢索材料的基準方法。RAG(檢索增強生成)就是先找資料,再讓模型據此回答。它像開卷考:書庫負責保留,目錄負責找頁,最後由考生讀懂。想先補基本搜尋差異,可接著讀BM25、embedding 與混合檢索。
- 切窗:「把長卷宗分頁」。保留說話者、時間戳與來源位置,切成有重疊的片段;重疊讓跨頁句子較有機會一起被找到。
- 向量檢索:「先找像在談這件事的頁」。Embedding 把文字編成可比較的數值表示,先取一批候選;語意相近仍可能是錯人物或舊日期。
- 重排:「把候選逐頁複查」。Reranker 同時看問題與片段,重新排序,挑少量送進回答上下文。
- Reader:「讀卷宗的人」。回答模型依證據處理更正、關係與條件,輸出答案和定位。這層也會失手。
Sentence Transformers 的兩階段檢索文件說明了先召回候選、再用 Cross-Encoder 重排的分工。白話說,先大量找可能相關的頁,再用較細的檢查排序;這個流程本身不保證把每條依賴關係都找齊。
二、這次研究帶來什麼?別把「簡單」讀成「沒有成本」
2026 年 10 月 22 日公開的研究,把原始歷史檢索與多種加工記憶系統比較;作者報告主表七組 benchmark/reader 設定中,六組在所比較的記憶系統裡居首。這是限定題庫、配置與比較對象的研究結果,不是所有產品都該移除記憶加工的結論。
真正值得帶走的是診斷方式:找到答案值,與找齊推導路徑,要分開驗。論文附錄也指出,reader 能力會影響狀態重建;加工是否有助較弱的 reader,仍需另做實驗。作者在Hugging Face 問答回覆尚未測試更小的 reader。
這與本站Lossless Memory 的原文/摘要 A/B相鄰,但這篇多做一層:用「人工找齊的證據」當診斷對照,判斷錯誤停在哪個環節,而非重新宣布原文或摘要勝出。
三、RAW-RAG 教學第一步:「先寫答案本」,建立關係題
測資每句都一致時,難以看出記憶加工漏了什麼。請建立 history.jsonl,每行是一筆 JSON;下列人物與工作全為教學假資料,時間統一含時區,避免把電腦本地時間當成事件順序。
{"id":"e1","ts":"2026-10-01T09:00:00+08:00","speaker":"user","text":"林岑是蘇禾的主管。"}
{"id":"e2","ts":"2026-10-02T09:00:00+08:00","speaker":"user","text":"蘇禾這次出差,交通方式跟著主管最後批准的方案。"}
{"id":"e3","ts":"2026-10-03T09:00:00+08:00","speaker":"user","text":"林岑批准這次出差搭高鐵。"}
{"id":"e4","ts":"2026-10-04T09:00:00+08:00","speaker":"user","text":"更正:林岑批准改搭客運,先前的高鐵方案作廢。"}
{"id":"e5","ts":"2026-10-04T10:00:00+08:00","speaker":"user","text":"茶水間今天補了咖啡豆。"}
第一題問「截至 10 月 4 日中午,蘇禾這次出差搭什麼?」答案是客運。嚴格的來源推導需要 e1+e2+e4:誰是主管、跟隨哪個規則、方案如何更正。只取到 e4,讀者知道林岑搭什麼,仍缺少把它套到蘇禾的關係。
第二題問「截至 10 月 3 日中午呢?」答案改成高鐵,需 e1+e2+e3;這輪檢索前先依查詢時間排除 e4、e5。第三題問林岑最後批准什麼,所需證據只有 e4。再加一題「蘇禾住哪間旅館?」標準答案為 unknown,另考拒答。
把題目、可見時間、正解與完整證據集合存成獨立答案本;實際 reader 只能看問題與可見片段。若有多種充分證據組合,就列多組可接受集合。這個小例子把來源要求定得較嚴,是便於人工判斷的教學規則。
四、第二步:「保住頁碼」,接起檢索與唯讀工具
先讓每個 window 保留 window_id、來源 id、起訖字元與時間範圍。若一條訊息被切開,回傳的引用必須能定位到實際送入 reader 的文字;不能因片段帶著 e4 的 ID,就把整條 e4 的關鍵更正視為已送達。
以下是接線用偽碼,不是可直接執行的 SDK。embed 與 rerank 需接你已有授權的服務;介面、批次與錯誤處理依所選服務實作,兩階段原理可對照前述 Sentence Transformers 文件。
visible = filter_before(history, question_time)
windows = split_with_source_offsets(visible)
index = embed(windows) # 保存模型與設定
candidates = cosine_topK(embed(question), index, K)
ranked = rerank(question, candidates)
evidence = pack_and_deduplicate(ranked[:k], token_budget)
answer = reader(question, evidence) # 要求 answer + citations
小樣本可以先取全部候選,再只送少量證據;將 K、k 與 token 預算寫入紀錄。若採 256-token 窗、32-token 重疊,切分工具也要固定;字元數與 token 數不是同一單位。
接到 Agent 時,工具只提供 search_memory(query, as_of) 與受限的 read_source(id, start, end)。工具回傳原句、時間與定位,不授予改寫或刪除歷史的操作;資料範圍由程式依已驗證使用者限制,不由問題文字指定別人的資料集。如何安排工具與停止條件,可讀Agent Harness 入門與Harness 實作。
歷史裡即使出現「忽略前面指令」,也只應當成引用資料。把來源包成明確的資料欄位,限制工具權限,並加入帶此句的假資料測試;提示詞表達規則,實際隔離仍由應用程式控制。
五、第三步:「先查卷宗再查考生」,分開三張成績單
先逐題看完整證據覆蓋率 C:送進 reader 的內容足以回答嗎?再看條件利用率 U:在已判定證據充分的題目裡,答對多少?最後另報全部題目的答題正確率 A。這與論文附錄 C.1的區分一致;充分性本身也需要可靠標註。
A 不一定等於 C×U。證據不足仍可能碰巧答對,所以總分還包含那一部分。本篇採每題等權、答案完全吻合的簡化規則;它不是論文各 benchmark 的完整判分器。拒答題另記,不把空證據集合自動算成充分。

把下面存為 score_demo.py,執行 python3 score_demo.py。三列是刻意填入的示範資料,不是模型輸出;程式只示範怎麼記分。正式資料要先人工確認片段涵蓋所需原句,才能填入 seen。
# 教學手填案例;不是檢索或 reader 的實測結果
rows = [
{"need": {"e1", "e2", "e4"}, "seen": {"e1", "e2", "e4"},
"gold": "客運", "answer": "客運"},
{"need": {"e1", "e2", "e3"}, "seen": {"e1", "e2", "e3"},
"gold": "高鐵", "answer": "客運"},
{"need": {"e4"}, "seen": {"e3"},
"gold": "客運", "answer": "客運"},
]
sufficient = [r["need"] <= r["seen"] for r in rows]
correct = [r["answer"] == r["gold"] for r in rows]
n, covered = len(rows), sum(sufficient)
c = covered / n
u = (sum(s and y for s, y in zip(sufficient, correct))
/ covered) if covered else None
print({"C": c, "U": u, "A": sum(correct) / n})
這份手填例子中,三題有兩題證據充分,其中一題答對;全部三題則答對兩題。第三題示範「答案對、證據不足」。若沒有任何題目充分,U 輸出 None,不能寫成零。還要另查引用是否逐字存在、時間是否符合題目,答對不會替錯引用加分。
六、第四步:「人工把頁找齊」,做完整證據對照
同一題先用原管線回答,再由評測者依答案本挑出可見原文交給相同 reader。後者叫 oracle 對照,意思是「有人先把所需資料找齊」。LongMemEval也提供 oracle 資料變體,幫助把讀取能力與檢索問題分開。
- 一般檢索錯,完整證據對。優先查候選池、重排、去重與截斷;這是瓶頸線索,仍要逐題核對差異。
- 兩者都錯。先查題目與答案本;確認證據充分後,再查 reader 的時間推理、關係推導與輸出規則。
- 加工記憶錯,原文對。檢查加工後是否仍有 e1、e2、e4 所表達的語意。讓 reader 讀完整加工儲存內容,仍須遵守同樣預算並記下截斷。
- 加工內容本來就有,卻沒送達。這是檢索或打包問題的線索,不能直接歸罪摘要遺漏。
Oracle 會使用答案本挑資料,只能放在離線診斷;正式檢索不得看正解。原文與摘要的完整儲存量不同時,「讀完整個儲存」和「固定輸入預算」也要分成兩個實驗,別把一組截斷、另一組不截斷的結果混用。
七、第五步:「只換考生」,測弱 reader 並記成本
先固定原文、摘要、加工記憶三條路徑,各自凍結資料版本、建庫方法、檢索設定與最終證據。再讓你已有額度的兩個 reader 讀完全相同的證據包;先把較小或較便宜者稱為候選 reader B,是否較弱由你的題庫決定。
記錄模型版本、提示詞、輸入上限、輸出上限、取樣設定與重試規則;調整提示就另開版本。跨記憶系統的 U 可能來自不同充分題目集合,所以還應另報「所有待比系統都充分」的共同題目子集;不要只用不同分母的 U 排冠軍。
成本帳分四格:建庫的 embedding/摘要用量,查詢的 embedding,用於重排的請求或計費單位,以及 reader 的實際輸入輸出與重試。每題保存候選數、送入 token、各段耗時與服務 usage。沒有回報的欄位填缺值,不填零;本機則另外記設備、記憶體峰值與模型載入時間。
作者固定版本的 paper profiles列出主配置使用 text-embedding-3-small 與 Cohere Rerank-v3.5,另有兩個 4B Qwen 模型的替代配置。本機索引不代表模型推論全在本機。先辨認 API 路徑,再談下載權重;本文不據此估算你的本機費用或承諾免費。
想走作者的完整流程,可先取程式並固定本文查閱版本;下列只下載程式碼、顯示版本,不啟動模型、下載 benchmark 或呼叫付費服務。
git clone https://github.com/Litmeb/RAW-RAG.git
cd RAW-RAG
git checkout bce0b2437118226b6e717026b7ae353c20738b4f
git rev-parse HEAD
進一步執行前,按同一版 README 準備 Python 3.12、PowerShell 7、隔離環境、服務憑證與有權使用的資料,再檢查 scripts/paper/README.md 的條件清單。原作者的批次配置不是繁中小樣本的既定最佳值;自行換資料、reader 或預算,就記為延伸實驗。
八、常見問題:八個直接答案
RAW-RAG 是把整份聊天都塞進模型嗎?
不是。這條基準路徑先切窗、找候選與重排,再把選定證據交給 reader;保存原文與每次傳送全文是兩件事。
摘要一定比原文差嗎?
不一定。摘要可能降低閱讀負擔;要看有沒有保留這題需要的條件、時間與關係,並用相同任務預算比較。
只找到「客運」就算成功嗎?
不夠。關係題還要能連到蘇禾、主管與跟隨規則。只找到答案字串可另記值覆蓋,不能代替完整證據覆蓋。
C×U 就是整體正確率嗎?
不一定。它只涵蓋已判充分題目的得分貢獻;證據不足的題目也可能答對。請三項分開報。
把 K 調大就會更準嗎?
不一定。先看必要片段是否進候選,再看重排與最後截斷;更多無關文字也可能占掉證據預算。
更小的 reader 也會維持 RAW-RAG 優勢嗎?
尚待這個條件的實驗。作者問答明說未測更小 reader;本文提供固定證據包的比較方式,不替它填結果。
保留原文可以取代刪除與權限嗎?
不能。原文、索引、向量、備份與快取各有資料副本;定點刪除與使用者隔離要另設驗收,不由答題分數推導通過。
新手今天最小的一步是什麼?
先存五行假對話和答案本,執行評分小例子;接著用自己的管線回答前三題,保存實際片段,再決定修哪一層。
給新手的三個重點
- 先標出推導需要的原句,人物與時間也是證據。
- 先分開覆蓋、利用與答案,再用完整證據對照縮小問題。
- 比較 reader 時先凍結證據,成績與成本都留原始紀錄。
接著閱讀
左右滑動查看更多推薦
下一步:替一個錯誤答案找出斷點
今天先問一次「蘇禾最後搭什麼」,保留實際送入的片段,圈出 e1、e2、e4 是否齊全;再補齊原文問一次。回到開頭那句:記憶診斷=找齊證據+用對證據。你能指出斷在哪裡,下一次改動就有了可驗收的目的。
想把這份小考卷接成持續回歸測試,可以從AlphaLab AI 文章選下一個系統元件,或到AlphaLab 課程練習完整工作流;先讓一題可追溯,再擴大題庫。






