對話紀錄
一段長時間的對話終會撞上一道硬牆:模型的上下文窗口。本頁的一切都因這道牆而存在,而真正有意思的部分在於:哪些東西會被丟棄、哪些會被保留,以及哪些還能再找回來。
回收上下文的四種方式
標題為「回收上下文的四種方式」的章節與其說它們是幾種替代方案,不如說它們是一架梯子,由代價最低的開始。
| 機制 | 代價 | 保留 | 丟失 |
|---|---|---|---|
| 省略 | 無 | 敘述中的每一個字 | 平淡無奇的舊工具結果 |
| 圖像剝離 | 無 | 它們周遭的文字 | 舊截圖 |
| 快照 | 無 | 以像素保存的每一個字 | 對非視覺模型的可讀性 |
| 摘要 | 一次模型呼叫 | 一段敘述 | 它沒有挑選的細節 |
省略與剝離先執行,因為它們是免費的,而且在真正要緊的意義上無損:它們丟掉的都是沒有人會再讀的大量內容。
為何摘要是最後手段
標題為「為何摘要是最後手段」的章節摘要是這四種之中唯一花掉一次模型呼叫的,也是唯一會替你決定甚麼才重要的。兩者都是實實在在的代價。而更有意思的是那次呼叫,因為它出現的時機。
壓縮通常按門檻、早於撞牆而執行。但它也會被動觸發:在供應商自己以請求過大為由拒絕之後——啟發式估算低估了供應商實際量度到的數量。在這種情況下,採用摘要的壓縮器必須再發一次請求來縮減上下文,而它發出的這次請求,恰恰就是剛剛溢出的那一次。
快照壓縮把被丟棄的歷史渲染成佈滿像素字形的密集頁面,再以圖像形式交還。
其前提源於一個計費上的怪癖:視覺模型對圖像按固定費率或按面積比例計費,與圖像裏有多少字元毫無關係。一萬二千個字元被丟棄的對話,要花掉相當於一萬二千個字元的文字 token。同樣的字元渲染到一頁上,只花一張圖像的錢。
它之所以值得擁有、而不只是顯得聰明,是因為它不需要模型呼叫、不需要密鑰,也不需要網絡。它是溢出恢復期間唯一始終可用的策略。
重建的形態是:原文照錄的頭部、轉為圖像的中段、原文照錄的尾部。頭部是任務以及下游一切都要回指的各種約束;尾部是工作當前所在之處。中段被重讀得最少,代價卻最高。
快照每一輪都從保留的來源文字重新渲染,絕不基於上一輪的像素。把圖像再成像,字形每壓縮一次便損失一代,直到沒有任何東西能讀懂它們。
一次執行實際上是從甚麼恢復
標題為「一次執行實際上是從甚麼恢復」的章節以往,每一次執行框架的執行都從空白歷史開始,並靠提示中一個 <context> 區塊重建連貫性——那是對話的摘要,而不是對話本身。由此帶來三個後果:
- 恢復等於重新講述。 模型從未看過自己先前的推理,也沒看過工具實際返回的位元組,只看到對它們的描述。
- 回退隨進程一同消亡。
checkpoint是即時訊息清單中的一個索引,因此重啟會丟失模型設定的每一個標籤。 - 重試無法分辨「沒有可重試的內容」與「甚麼都沒載入」。 重啟之後,無論哪一種情況,失敗的那一回合都已從即時狀態中消失。
這三個問題都藉由持久化對話紀錄得到解決。對話紀錄在每一個回合邊界儲存,絕不在回合中途儲存:在工具呼叫與其結果之間擷取的歷史,沒有任何供應商會接受,因此若在那一瞬間崩潰,還原的是上一個完整回合,而不是一個無法重播的半截回合。
恢復後的執行會裁剪至最新的訊息,剪切點是不留下孤立工具結果的那種邊界——若一個結果的呼叫已被裁掉,這種請求會被供應商直接拒絕,而一份無法送出的對話紀錄,比一份較短的紀錄更糟。
對話樹
標題為「對話樹」的章節每則訊息都記錄自己所承接的那一則,而每個對話都指明自己當前的分支末端。這一個決定就是整個特性的全部。
建立分支不會寫入任何內容。 它只是移動指標。你離開的那條路徑仍然在那裏,所以切換回去只是再移動一次指標,而不是做一次還原——而且為了重跑而修改提示,也不再會讓你失去那個正在用來對照的答案。
沒有它,任何形式的後退都必須隱藏或刪除訊息,而隱藏是一個後來的讀者看不穿的謊言。
分支與分叉
標題為「分支與分叉」的章節| 分支 | 分叉 | |
|---|---|---|
| 發生的事 | 指標移動 | 路徑被複製 |
| 去向 | 同一個對話 | 一個新對話 |
| 代價 | 無 | 分支的一份副本 |
分叉會以全新的 id 複製,而不是共用資料列。兩個共用資料列的對話會互相看到對方後來的訊息,而這正是分叉絕不該做的事。
回退沿用同一個指標
標題為「回退沿用同一個指標」的章節執行期間的 checkpoint / rewind 組合會標記一個乾淨的回合邊界,並在一次探索之後回到該處,同時保留一份摘要。由於檢查點與對話紀錄一併持久化,模型在重啟前設定的標籤仍然會落在它當初被設定的位置。目標沒有在裁剪中存活的檢查點會被丟棄,而不是被就近鉗制——「回到該標籤」卻落在別處,恰恰是標籤存在的意義所在:防止這種失敗。
- 分支一則對話 — 樹狀導覽器、分叉與匯出
- 工具上下文與提示快取 — 填滿上下文窗口的另一半
- 斜線指令 —
/compact、/shake、/context、/tree