LLM を使ったエージェントやプロンプト制御は、動かしてみると思わぬ形で暴れます。出力が崩れる、同じ所を回り続ける、記憶があふれる。人形遣いのコレットが、持ち込まれたからくり人形の暴走を、Python のコードで制御構造に編み直していく全12話の連載です。
どの話からでも読めます。直す前のコードがなぜ壊れるかを追い、直した後の構造と見比べれば十分です。
このページは目次を兼ねた案内板です。初めてなら「まず読むなら」の3本から、手元に困っているコードがあるなら「困りごとから探す」から選んでください。
まず読むなら
- Structured Outputs — LLM の出力を正規表現で取り出して崩れる回。LLM をプログラムに組み込むなら最初に当たる困りごとで、型で受け取る考え方が全話の土台になる
- ReAct Loop — エージェントが同じ所を回り続けて止まらない回。終了条件を LLM に任せた設計がなぜ危ういかが、コストの減り方と一緒に分かる
- RAG — 過去ログを全部渡して「今」が埋もれる回。名前だけ知っている RAG が、何を解決する仕組みなのかを手を動かして確かめられる
困りごとから探す
LLM の出力が崩れる、道具を思い通りに使わせられない
- Structured Outputs — 自由な文章から値を取り出す正規表現が崩れる
- Function Calling — 余計な場面でツールを呼んでしまう
役割や道具が増えて、判断が混ざる・重くなる
- Router — 1体に複数の役割を持たせて、プロンプトが継ぎ足されていく
- Dynamic Tool Selection — ツールが増え、説明を全部渡して動きが鈍る
- Blackboard Pattern — 複数のエージェントが互いの内部状態に頼って止まる
ループが終わらない、同じ失敗を繰り返す
- ReAct Loop — 終了条件を LLM に任せて回り続ける
- Self-Correction Loop — 失敗のたびに再試行して、レート制限を使い切る
- Reflection Loop — 自己評価が「もう十分」と言わず、描き直しが終わらない
長い対話で、記憶が足りない・あふれる
- RAG — 過去ログを全部渡して、必要な記憶が埋もれる
- Sliding Window Memory — 履歴が膨らみ、最初の命令を忘れて止まる
人の確認を挟みたい、設計を盛りすぎていないか不安になる
- Human-in-the-Loop — 確認待ちの input() が全体を止める
- KISS Principle — 学んだ備えを全部使いたくなる(完結編)
全話一覧
- LLM の余計なお喋りで、正規表現のパースが崩れる。出力の型を先に決めて受け取る【Structured Outputs】
- 必要のない場面でまでツールを呼んでしまう。スキーマで道具を渡して、呼ぶ判断を制御する【Function Calling】
- 1つのエージェントに予約・観光案内・クレームを任せたら、役割が混ざって黙り込む。最初の一手で振り分ける【Router】
- 終了条件を LLM 任せにしたら、同じ所を回り続けて止まらない。回数の上限と状態で止める【ReAct Loop】
- ツールが百近くになり、説明を全部渡して動きが鈍る。問い合わせごとに必要な道具だけを選ぶ【Dynamic Tool Selection】
- 過去ログを全部詰め込むと、肝心の今が埋もれる。関連する記憶だけを検索して渡す【RAG】
- 会話履歴を足し続けたら、最初の命令を忘れて止まった。直近・要約・ピン留めの3層で覚える【Sliding Window Memory】
- 失敗のたびに同じ指示で再試行して、レート制限を食い潰す。エラーの種類で仕分けて1回だけ言い直す【Self-Correction Loop】
- 2つのエージェントが内部状態を直接読み書きして、譲り合ったまま止まる。共有の進行表で協調させる【Blackboard Pattern】
- 人の確認待ちで input() がイベントループごと止める。一時停止と再開を分けて持つ【Human-in-the-Loop】
- 自己評価の終了判定をキーワード一致にしたら、描き直しが終わらない。型で判定し、回数でも止める【Reflection Loop】
- 覚えた備えを全部足したら、かえって動かなくなった。必要な3つだけを選んで短く収める【KISS Principle】
