クエリ遷移モデル
このページへ戻るべき場面
エラー回復・文脈圧縮・予算制御・hook が重なり始めたときに、query がなぜ次のターンへ続くのかを補う資料です。
いっしょに読むと効く章
この bridge doc は次の一点を解くためのものです。
高完成度の agent では、なぜ query が次の turn へ続くのかを明示しなければならないのか。
なぜこの資料が必要か
主線では次を順に学びます。
s01: 最小 loops06: context compacts11: error recovery
流れ自体は正しいです。
ただし、章ごとに別々に読むと多くの読者は次のように理解しがちです。
「とにかく
continueしたから次へ進む」
これは toy demo なら動きます。
しかし高完成度システムではすぐに破綻します。
なぜなら query が継続する理由は複数あり、それぞれ本質が違うからです。
- tool が終わり、その結果を model に戻す
- 出力が token 上限で切れて続きが必要
- compact 後に再試行する
- transport error の後で backoff して再試行する
- stop hook がまだ終わるなと指示する
- budget policy がまだ継続を許している
これら全部を曖昧な continue に潰すと、すぐに次が悪化します。
- log が読みにくくなる
- test が書きにくくなる
- 学習者の心智モデルが濁る
まず用語
transition とは
ここでの transition は:
前の turn が次の turn へ移った理由
を指します。
message 内容そのものではなく、制御上の原因です。
continuation とは
continuation は:
この query がまだ終わっておらず、先へ進むべき状態
のことです。
ただし continuation は一種類ではありません。
query boundary とは
query boundary は turn と次の turn の境目です。
この境界を越えるたびに、システムは次を知っているべきです。
- なぜ続くのか
- 続く前にどの state を変えたのか
- 次の turn がその変更をどう解釈するのか
最小の心智モデル
query を一本の直線だと思わないでください。
より実像に近い理解は次です。
1 本の query
= 明示された continuation reason を持つ
state transition の連鎖
例えば:
user input
->
model emits tool_use
->
tool finishes
->
tool_result_continuation
->
model output is truncated
->
max_tokens_recovery
->
compact_retry
->
final completion
重要なのは:
システムは while loop を漫然と回しているのではなく、 明示された transition reason の列で進んでいる
ということです。
主要 record
1. query state の transition
教材版でも次のような field は明示しておくべきです。
state = {
"messages": [...],
"turn_count": 3,
"continuation_count": 1,
"has_attempted_compact": False,
"transition": None,
}
この field は飾りではありません。
これによって:
- この turn がなぜ存在するか
- log がどう説明すべきか
- test がどの path を assert すべきか
が明確になります。
2. TransitionReason
教材版の最小集合は次の程度で十分です。
TRANSITIONS = (
"tool_result_continuation",
"max_tokens_recovery",
"compact_retry",
"transport_retry",
"stop_hook_continuation",
"budget_continuation",
)
これらは同じではありません。
tool_result_continuationは通常の主線継続max_tokens_recoveryは切れた出力の回復継続compact_retryは context 再構成後の継続transport_retryは基盤失敗後の再試行継続stop_hook_continuationは外部制御による継続budget_continuationは budget policy による継続
3. continuation budget
高完成度システムは単に続行するだけではなく、続行回数を制御します。
state = {
"max_output_tokens_recovery_count": 2,
"has_attempted_reactive_compact": True,
}
本質は:
continuation は無限の抜け道ではなく、制御された資源
という点です。
最小実装の進め方
Step 1: continue site を明示する
初心者の loop はよくこうなります。
continue
教材版は一歩進めます。
state["transition"] = "tool_result_continuation"
continue
Step 2: continuation と state patch を対にする
if response.stop_reason == "tool_use":
state["messages"] = append_tool_results(...)
state["turn_count"] += 1
state["transition"] = "tool_result_continuation"
continue
if response.stop_reason == "max_tokens":
state["messages"].append({
"role": "user",
"content": CONTINUE_MESSAGE,
})
state["max_output_tokens_recovery_count"] += 1
state["transition"] = "max_tokens_recovery"
continue
大事なのは「1 行増えた」ことではありません。
大事なのは:
続行する前に、理由と state mutation を必ず知っている
ことです。
Step 3: 通常継続と recovery 継続を分ける
if should_retry_transport(error):
time.sleep(backoff(...))
state["transition"] = "transport_retry"
continue
if should_recompact(error):
state["messages"] = compact_messages(state["messages"])
state["transition"] = "compact_retry"
continue
ここまで来ると continue は曖昧な動作ではなく、型付きの control transition になります。
何を test すべきか
教材 repo では少なくとも次を test しやすくしておくべきです。
- tool result が
tool_result_continuationを書く - truncated output が
max_tokens_recoveryを書く - compact retry が古い reason を黙って使い回さない
- transport retry が通常 turn に見えない
これが test しづらいなら、まだ model が暗黙的すぎます。
何を教えすぎないか
vendor 固有の transport detail や細かすぎる enum を全部教える必要はありません。
教材 repo で本当に必要なのは次です。
1 本の query は明示された transition の連鎖であり、 各 transition は reason・state patch・budget rule を持つ
ここが分かれば、開発者は高完成度 agent を 0 から組み直せます。