先看整體:你看到的對話,不是送出去的流量
組件 02 用預先編寫的任務走迴圈;這一頁用你自己的記錄走一次同樣的迴圈。
你在工作台裡看到的是一段對話:你一句、它一句。但模型沒有記憶(組件 05),所以 Harness(工作台的外殼程式)每一次請求(request)都把整段歷史重新送出去——第 20 次請求送出的,是前 19 次的全部內容加上新的一句。而且一個「回合」(turn,即你說一句)裡面,Agent 每叫一次工具就要再請求一次模型。所以一段看起來 10 句的對話,背後可能是 30 次請求、幾十萬個詞元(token)。工作台會把這些寫進會話記錄(session log);本頁把它讀出來給你看。
載入你的會話記錄
支援三種格式:dsh(DeepSeek Harness)會話記錄(session.jsonl.zstd,可直接拖入,頁內解壓;或已解壓的 .jsonl)、Claude Code 會話記錄(~/.claude/projects/…/*.jsonl)、一般 messages 陣列(.json)。沒有檔案就先按「用範例記錄」。
全部在瀏覽器本機解析:本頁沒有任何網絡請求,檔案不會離開你的裝置。記錄裡若有個人資料,仍請先自行檢視;記錄檔本身不要傳給同學或老師,要分享成果,只截第 2 節的數字。注意:Agent 讀過的檔案(例如整份筆記或網頁)會原文寫進記錄,第 3 節會顯示這些內容——投影或截圖時請先摺疊第 3 節。
這段記錄的流量
新內容(這次才加入)重發的歷史重發但快取命中(cache hit,便宜)
逐回合看
一個回合(turn)=你說一句。回合裡每張橙邊卡是一次模型請求;卡內是這次新加入上下文(context,即模型這次收到的全部內容)的訊息,卡頭是這次送出的總量。
看原始記錄(前 40 行)
對話很短,流量很長
累計送出的詞元遠大於對話本身的大小,倍數就是「歷史平均被重發了幾次」。對話愈長,後面每一句愈貴——與組件 01 的曲線一致,只是這次是你自己的數字。
一句話不等於一次請求
Agent 每用一次工具,就要把工具結果送回模型再請求一次。你說一句、它跑五步,就是五次請求、五次重發歷史。這就是組件 02 的迴圈——現在有實證。
快取命中能省下大半費用
重發的歷史若與上一次開頭完全相同,供應商可以按「快取命中」另計價格——以 DeepSeek 為例約為未命中價的三十分之一(見頁尾 2;其他供應商折扣不同)。所以不要改動前面的內容、把長文件放在對話開頭,都是省錢的習慣(組件 05 的另一面)。
想一想
- 找出記錄裡最貴的一次請求。它為甚麼最貴——是你貼了長文件、工具回傳了很多內容、還是純粹因為它排在最後?
- 如果在第 N 個回合前開一個新對話、只帶一段摘要,後面的請求會便宜多少?用組件 05 的壓縮想一想。
- 你的記錄裡有沒有一個回合跑了很多步卻沒有結果?那幾步的錢花在哪裡?人在哪一步應該叫停?
- 記錄裡哪些內容是你不想送出去的(個人資料、別人的檔案)?它們被重發了多少次?
教師提示(討論後展開)
第 1 題:通常是「最後一次」,因為歷史最長;若不是,看那一步的新內容——大多是一次工具結果(讀了整份 PDF 或整個網頁)。第 2 題:新對話的第一次請求只有系統提示+摘要+新問題,通常是原來的一成以下;代價是細節遺失。第 3 題:繞圈的回合是組件 02 任務 4 的真實版;一個實用的叫停判準是「同一個工具、同樣參數、出現第二次」。第 4 題:一旦進了上下文,每一次請求都重發,直到你開新會話(Claude Code 是 /clear;dsh 是另起一個 session)——這是私隱界線(第 8 堂)的伏筆。
問你的 Agent(動手時間開頭 10 分鐘):匯出前先確認那段對話沒有貼過別人的檔案或個人資料(見想一想第 4 題)。然後請它「把我們這段對話的記錄匯出成檔案」(dsh:介面右上「Session 日志 ⬇」,或 $DSH_HOME/sessions/<工作區>/session-<id>/session.jsonl.zstd;Claude Code:~/.claude/projects/),拖進本頁;再問它「你剛才為我這個任務請求了模型幾次?每次送了多少?」把它的答案與本頁的數字核對。
同一概念、不同名字
| 概念 | dsh(DeepSeek Harness) | Claude Code | 本頁 |
|---|---|---|---|
| 會話記錄 | append-only session log(session.jsonl.zstd,zstd 壓縮的 JSONL;每行 type/seq/time/data,首行 type: "session") | ~/.claude/projects/<專案>/<session>.jsonl(每行 type/message) | 記錄 |
| 你說一句 | turn/start、user/message(data.content[] 文字區塊) | type: "user"(不含 tool_result) | 回合 |
| 一次模型請求 | step/start → assistant/message(data.message.content[] 含 text/tool-call 區塊;data.usage) | type: "assistant"(message.usage) | 請求 |
| 工具往返 | tool/call、tool/result(tool-result 區塊,帶 isError) | tool_use、tool_result 內容塊 | 工具呼叫/工具結果 |
| 詞元帳目 | usage.inputTokens/outputTokens/totalTokens,快取為 cacheReadTokens/cacheWriteTokens(源碼;PoC 假端點未回報快取欄) | input_tokens/output_tokens/cache_read_input_tokens/cache_creation_input_tokens | 輸入/輸出/快取命中 |
| 壓縮 | compaction/summary(log-only) | /compact | —(本頁不重算,只作標記) |
| 權限狀態 | permission/preset、sandbox/mode、approval/policy、approval/asked | —(不寫入記錄) | 第 2 節的「權限」一行 |