コンテンツにスキップ

会話履歴

長い会話は、モデルのコンテキストウィンドウという堅い壁にぶつかります。このページにあるものはすべて、その壁が存在するからこそ成り立っています。そして興味深いのは、何が捨てられ、何が残り、何が取り戻せるのかという点です。

これらはどれか 1 つを選ぶ代替案というより、安いものから順に並んだはしごのようなものです。

仕組み コスト 保持するもの 失うもの
省略 なし 物語の一言一句 特筆すべきことのない古いツール結果
画像の切り捨て なし それらの周囲のテキスト 古いスクリーンショット
スナップショット なし 一言一句をピクセルとして 非ビジョンモデルでの可読性
要約 モデル呼び出し 1 回 物語 拾わなかった詳細

省略と切り捨てが最初に実行されるのは、無料であり、重要な意味でロスレスだからです。どちらも、誰も読み返さないであろう大量のデータを落とします。

要約は 4 つの中で唯一モデル呼び出しを消費するものであり、唯一何が重要だったかをあなたに代わって決めるものです。どちらも実際のコストです。より興味深いのは呼び出しのほうで、それはいつ行われるかによります。

圧縮は通常、しきい値に基づいて壁の手前で実行されます。しかしリアクティブに、つまりプロバイダー自体がリクエストを大きすぎると拒否した後にも実行されます — ヒューリスティックな見積もりが、プロバイダーが実際に測定した量を少なく数えていたのです。この状況では、要約を行うコンパクターはコンテキストを縮めるためにリクエストを出さなければなりませんが、そのリクエストはたった今オーバーフローしたものと同じです。

スナップショット圧縮は、破棄された履歴をピクセルのグリフが密集したページに描画し、画像として返します。

前提にあるのは課金の癖です。ビジョンモデルは画像に対して、そこに何文字含まれるかとは無関係な、定額または面積比例のレートで課金します。破棄された会話の 12,000 文字は、12,000 文字分のテキストトークンを要します。同じ文字を 1 ページに描画すれば、コストは画像 1 枚分です。

これが単に巧妙というだけでなく採用する価値があるのは、モデル呼び出しもキーもネットワークも必要としないからです。オーバーフローからの復旧時に常に利用できる唯一の戦略です。

再構成の形は、先頭はそのまま、中間は画像化、末尾はそのまま、というものです。先頭はタスクと、後続のすべてが参照する制約です。末尾は現在作業が行われている場所です。中間は最も読み返されず、最もコストがかかる部分です。

スナップショットは毎回、保持されたソーステキストから再描画され、前回のピクセルから描画されることはありません。画像を画像化すると、圧縮のたびに 1 世代ずつグリフが劣化し、最終的には誰も読めなくなります。

これまで、ハーネスの実行はすべて空の履歴から始まり、プロンプト内の <context> ブロックから連続性を再構築していました — それは会話そのものではなく、会話の要約です。そこから 3 つのことが導かれました。

  • 再開は再話でした。 モデルは以前の自身の推論や、ツールが返した実際のバイト列を見ることはなく、それらの説明だけを見ていました。
  • 巻き戻しはプロセスの終了とともに消えました。 checkpoint はライブのメッセージリストへのインデックスであるため、再起動するとモデルが設定したすべてのラベルが失われました。
  • リトライは「リトライするものがない」と「何も読み込まれていない」を区別できませんでした。 再起動後はどちらの場合も、失敗したターンはライブ状態から消えています。

この 3 つはいずれも、トランスクリプトを永続化することで解決します。トランスクリプトは毎回のターン境界で保存され、ターンの途中で保存されることはありません。ツール呼び出しとその結果の間で取得された履歴は、どのプロバイダーも受け入れないものだからです。その瞬間にクラッシュしても、再生できない中途半端なターンではなく、前のターンが復元されます。

再開された実行は最新のメッセージまでに切り詰められ、孤立したツール結果ではない境界で切られます — 呼び出しが切り詰められた結果は、プロバイダーが即座に拒否するリクエストであり、送信できないトランスクリプトは短いものより悪いからです。

すべてのメッセージは、どのメッセージから続いているかを記録し、すべての会話は現在のブランチの先端を指します。この 1 つの決定が機能のすべてです。

ブランチを切っても何も書き込まれません。 移動するのはポインターだけです。離れたパスはそのまま残っているため、戻るのも復元ではなくもう一度ポインターを動かすだけです — また、プロンプトを編集して再実行しても、比較していた回答を失わなくなります。

これがなければ、あらゆる形の巻き戻しはメッセージを隠すか削除するしかなく、隠すことは次の読み手に見抜けない嘘になります。

ブランチ フォーク
何が起きるか ポインターが移動する パスがコピーされる
どこへ向かうか 同じ会話 新しい会話
コスト なし ブランチのコピー 1 つ

フォークは行を共有するのではなく、新しい id でコピーします。2 つの会話が行を共有すると、互いの以降のメッセージが見えてしまい、これはフォークが決して行ってはならないことです。

実行中の checkpoint / rewind のペアは、きれいなターン境界をマークし、探索の後にそこへ戻り、ダイジェストを保持します。チェックポイントはトランスクリプトとともに永続化されるため、再起動前にモデルが設定したラベルも、設定された場所にそのまま着地します。切り詰めを生き延びられなかったターゲットを持つチェックポイントは、クランプされるのではなく破棄されます — 「ラベルへ」巻き戻したのに別の場所に着地するのは、まさにラベルが防ぐために存在する失敗です。