音声原稿 01-a:ループと判断の主体
このパートでは、エージェントのループを、誰が何を実行し、何を見たら止めるか、で扱います。ノートの、ループはキャッチボール、止める合図を文章に読まない、次のツールを選ぶのはモデルか決定木か、止まった理由を症状から先に決める、の節と同じ中身です。
モデルは、ファイルを開いたり、返金のAPIを叩いたりしません。一回の呼び出しは、それまでの会話を読んで、次のメッセージを一つ返すだけです。返す中身が、このツールを、この引数で呼んでほしい、という宣言なら、実行するのはこちらのプログラムです。このプログラムをハーネスと呼びます。
返答には、止まった理由が付きます。ツールユースなら、宣言されたツールを実行し、結果を会話に足し、同じモデルへ次の依頼を送ります。エンドターンなら、モデルは利用者への返答を終えたと判断しています。ループを閉じます。
返品の例で、往復を追います。利用者は、注文エー十九の壊れたヘッドホンを返金して、と言いました。一回目の返答はツールユースで、顧客の確認を要求します。ハーネスが実行し、顧客は確認済み、識別子はシー四十二、を履歴に足します。二回目もツールユースで、注文の参照を要求します。結果は、ヘッドホン、配送済み、金額は八千です。これも履歴に足します。三回目に、方針の範囲内だとモデルが判断し、返金を要求します。結果が成功なら、四回目はエンドターンで、返金しました、と利用者に話して終わります。
結果を履歴に戻さないと、二回目のモデルは、利用者の最初の文しか見ません。顧客の識別子を知らないので、注文を当てにいくか、もう一度同じ確認を要求します。モデルに隠しメモリはありません。次の判断材料は、トランスクリプトに入っているものだけです。
止める合図を、文章から読まないでください。モデルはツールの前に、確認します、と書くことがあります。文章があることは、仕事が終わったことではありません。逆に、最終の返答が短くても、理由がエンドターンなら終わっています。空の文章を完了の印にすると、ツール直前の短いつなぎを完了と誤認するか、最終の一文が空に近いときに、終わったのにループを続けます。
自然文の、完了しました、も、主たる停止条件にしません。モデルはその語を、まだツールが必要な途中でも書きます。その語を拾ってループを切ると、返金の直前で止まります。
回数の上限は、暴走したときのヒューズです。完了の定義ではありません。上限が先に発火すると、返金の途中で、利用者に中途半端な状態を返します。ヒューズは残してよいです。ただし分岐の本体は、止まった理由です。上限で止めたとき、モデルがまだツールユースを返していたなら、利用者への文は、実行済みと未実行を分けます。返金だけが未実行なのに、対応しました、と書くのが、このヒューズの事故です。
トークンの上限で返答が途中で切れた場合も、エンドターンではありません。ツール呼び出しの形が、閉じる前に切れていたら、その引数は実行しません。切れた金額を補完して実行すると、桁の欠けた返金が通ります。切断は、出力の予算を足して同じ履歴から続け直すか、失敗として返すか、です。完了ではありません。
次のツールを選ぶのは、普段はモデルです。モデルは、説明と会話を見て選びます。返品の方針だけ教えて、には、顧客確認も返金も要りません。この注文を返金して、には、確認と参照が要ります。決定木は、この差を事前に全部書き切る必要があります。書き漏れた枝は、木が間違ったツールを呼びます。
決定木が勝つのは、順序が安全の不変条件であるときだけです。普段の分岐まで木にすると、方針の質問でも、返金の手前まで進みます。失敗の型は、ツールの列をプロンプトに固定することです。必ず顧客、注文、返金の順、と書くと、モデルはだいたい従います。従わない回が残ります。従わせたいのが事故防止なら、プロンプトではなく、あとで扱うゲートです。従わせたいのが効率なら、モデルに選ばせたほうが、不要な呼び出しを減らせます。
止まった、には五つの違う原因があります。ログに残るのは、最後の止まった理由、最後のツール名と引数、その結果が履歴に一行でも入ったか、です。プロンプトを直す前に、どれかを決めます。
一つ目。理由がエンドターンで、直前のツール結果が方針と矛盾せず、利用者への文がその結果を言っている。これは完了です。
二つ目。文章に完了しましたとあり、理由はツールユース。文章は無視して、ツールを実行します。
三つ目。同じツール、同じ引数が三回続く。結果が履歴に無ければ、ハーネスが戻していません。これは結合の漏れで、プロンプトでは直りません。結果が、失敗、の一文だけなら、モデルは再試行をやめる根拠を持っていません。直す場所は、ツールの戻り値の形です。
四つ目。トークン上限で、ツールの形が閉じる前に切れている。実行せず、予算を足すか、切断として返します。
五つ目。回数の上限でハーネスが止めた。完了と返さず、どこまで実行し、何が未実行かを返します。
このパートの判断は、こうです。ループを閉じるのはエンドターンです。ツールユースのあいだは、実行して履歴に戻します。文章、回数、空の文は、完了の定義にしません。切断は完了ではありません。普段の次のツールはモデルに選ばせ、事故になる順序だけ、あとでプログラムにします。
もう一つ、方針だけの質問で、ループがどう進むかを見ます。利用者は、返金できる条件を教えて、と言いました。モデルが文章で条件を説明し、理由がエンドターンなら、そこで終わりです。顧客確認も返金も要りません。決定木が、返金という言葉を見たら確認へ進む、と固定していると、この質問でもAPIの手前まで進みます。モデルに選ばせると、説明だけで終われます。選ばせた結果がツールユースなら、そのツールは実行します。文章で条件を話したあとに、念のため返金も呼ぶ、は過剰です。ハーネスは、モデルが要求していない返金を先に実行しません。
ハーネスが残すログは、三つで足ります。止まった理由。要求されたツールの名前と引数。その結果を、どの履歴の位置に足したか。この三つが揃っていれば、三回続いたのが結合漏れなのか、失敗の一文なのか、切断なのかを、プロンプトを開く前に分けられます。ログが最終の文章しか残していないと、完了しました、を見て完了だと思い、未実行の返金を見逃します。
切断の具体です。返金の引数が、金額の桁の途中で切れました。閉じる括弧がありません。これを実行側が、見えている数字だけで補完すると、八千が八として通ります。切れた呼び出しは実行せず、出力の予算を足して、同じ履歴から続け直します。続け直しても同じ場所で切れるなら、それは完了ではなく、失敗として利用者に返します。空の最終文を、切断の代わりに完了と読むのも同じ事故です。ツールの直前に、少々お待ちください、のような短い文だけが返り、理由がツールユースなら、その文は無視して実行します。
回数のヒューズが八回で発火し、そのとき返金がまだ要求されていないなら、利用者には、確認と注文参照までは終わった、返金は未実行、と返します。対応しました、は書きません。ヒューズの回数を上げて、完了の定義を先送りするのも違います。分岐の本体は、エンドターンです。ヒューズは、エンドターンが来ない暴走を止めるためだけに残します。
ハーネスがモデルの次の一手を先回りして実行しない、を返金以外でも守ります。利用者は、届いたかを教えて、と言いました。モデルが注文参照だけを要求したなら、実行するのは参照だけです。在庫の確認を気を利かせて先に履歴へ入れると、モデルは自分が頼んでいない数字を前提に話し、ログからもどの判断でその数字が入ったか追えません。先に止めたい不変条件があるなら、先に実行するのではなく、そのツールはまだ実行できない、と結果で返します。