エージェントのループ動作

エージェント ループは、完了条件が満たされるまでエージェントを再呼び出します。 反復的な改善、ToDo の完了、バックグラウンドタスクの完了待ち、または回答が明確な基準を満たしているかどうかの評価に利用できます。

自律ループは常に制限する。 完了条件が失敗し、モデルがストールし、エバリュエーターが確率論的になる可能性があります。

Important

エージェントのループ処理は実験的機能です。

ループを手動で設定する

他の Harness エージェントの既定値なしでループする場合は、ダイレクトコンポジション API を使用します。

ループの種類をインポートし、AIAgentを使用して任意のLoopAgentをラップします。 その既定の最大値は、10 個のエージェント呼び出しです。

using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;

AIAgent baseAgent = chatClient.AsAIAgent();
AIAgent agent = new LoopAgent(
    baseAgent,
    new CompletionMarkerLoopEvaluator("DONE"),
    new LoopAgentOptions { MaxIterations = 5 });

AgentLoopMiddlewareインポートし、通常のAgentに追加します。 既定の最大値は、10 個のエージェント実行です。

from agent_framework import Agent, AgentLoopMiddleware


def needs_more_work(*, last_result, **kwargs):
    return "DONE" not in last_result.text


agent = Agent(
    client=client,
    middleware=[
        AgentLoopMiddleware(
            needs_more_work,
            max_iterations=5,
        )
    ],
)

述語は、同期または非同期にすることができます。 続行する True 、停止する False 、または次のイテレーションにフィードバックを渡す (continue, feedback) を返します。

Note

このページで説明されているパッケージ化されたループ機能は、現在 Go では使用できません。

完了条件を選択する

LoopAgent は、1 つのエバリュエーターまたは順序付けられたコレクションを受け取ります。

エバリュエーター ~の間、継続します
CompletionMarkerLoopEvaluator 最新の応答には、構成されたマーカーが含まれません。
TodoCompletionLoopEvaluator 解決された TodoProvider には、オプションで選択したエージェント モードで不完全な項目が残っています。
BackgroundTaskCompletionLoopEvaluator 解決された BackgroundAgentsProvider には、まだ実行中のタスクがあります。
AIJudgeLoopEvaluator 別の判定クライアントは、元のリクエストに十分な回答がなされていないと述べています。
DelegateLoopEvaluator コールバックは LoopEvaluation.Continue(...)を返します。

複数のエバリュエーターを構成すると、順番に実行されます。 別のイテレーションを要求する最初のエバリュエーターは、フィードバックを提供します。ループは、すべてのエバリュエーターが続行を拒否した場合にのみ停止します。

AI ジャッジを使用する

ジャッジは、元の要求と最新のエージェントの応答を受け取ります。 ギャップが見つかると、その分析は次のイテレーションのフィードバックになります。

var evaluator = new AIJudgeLoopEvaluator(
    judgeClient,
    new AIJudgeLoopEvaluatorOptions
    {
        Criteria =
        [
            "Answer every part of the request.",
            "Support conclusions with evidence.",
        ],
    });

AIAgent loopAgent = new LoopAgent(
    agent,
    evaluator,
    new LoopAgentOptions { MaxIterations = 4 });

元の要求と生成された応答で信頼できるジャッジ エンドポイントのみを使用します。

コンテキストと出力を制御する

既定では、 LoopAgent は 1 つのセッションを再利用し、次の入力として、成功したエバリュエーターの最新のフィードバックを送信します。 FreshContextPerIteration = true 代わりに、元の要求から各パスと集計されたフィードバック ログを再構築し、セッションをリセットまたは復元します。

ストリーミング以外の実行では、既定で集計されたトランスクリプトが返されます。 最終的な応答のみを返すように NonStreamingReturnsLastResponseOnly = true を設定します。 ストリーミングでは、常に各イテレーションと、表示されている代理実行時のフィードバック メッセージをすべて送信します。

述語は、 iterationlast_resultmessagesoriginal_messagessessionagentprogressfeedbackなどのキーワード引数を受け取ります。 ヘルパー todos_remaining()background_tasks_running() は、組み込みの todo とバックグラウンド タスクの条件を提供します。 それらを todos_remaining_message または background_tasks_running_message とペアリングして、ターゲットの次の入力を生成します。

AI ジャッジを使用する

AgentLoopMiddleware.with_judge は、ジャッジドリブン ループを構築します。 ジャッジ ループの既定値は 5 回です。

from agent_framework import Agent, AgentLoopMiddleware

loop = AgentLoopMiddleware.with_judge(
    judge_client,
    criteria=[
        "Answer every part of the request.",
        "Support conclusions with evidence.",
    ],
    max_iterations=4,
)

agent = Agent(
    client=client,
    middleware=[loop],
)

より多くの作業が必要な場合、判事の推論はエージェントにフィードバックされます。 元の要求と生成された応答で信頼できるジャッジ エンドポイントのみを使用します。

コンテキスト、進行状況、出力を制御する

高度なループの場合は、 AgentLoopMiddleware を直接構築します。

  • record_feedback は、各作業イテレーションの後に簡潔な進行状況エントリを作成します。
  • progress は、蓄積されたエントリをコールバックに公開します。
  • inject_progress=True は、次のイテレーションの入力に進行状況を追加します。
  • fresh_context=True は、元のタスクと進行状況ログから再起動し、アタッチされたセッションをそのプリループ スナップショットに復元します。
  • return_final_only=True は、ストリーミング以外の実行に対する最後の応答のみを返します。

完了述語が終了することが保証されている場合にのみ、 max_iterations=None を渡します。

このページで説明されているパッケージ化された完了条件とジャッジ統合は、現在 Go では使用できません。

Harness Agentを使用したループ処理

事前構成済みの履歴、計画、メモリ、承認、監視パイプラインも必要な場合は、Harness Agent のセットアップを使用します。

HarnessAgentOptions.LoopEvaluatorsを設定します。 ハーネスは、LoopAgent を最も外側のエージェントデコレーターとして適用します。

using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;

var options = new HarnessAgentOptions
{
    LoopEvaluators =
    [
        new CompletionMarkerLoopEvaluator("DONE"),
    ],
    LoopAgentOptions = new LoopAgentOptions
    {
        MaxIterations = 5,
    },
};

HarnessAgent agent = chatClient.AsHarnessAgent(options);
// Equivalent construction: new HarnessAgent(chatClient, options)
AgentSession session = await agent.CreateSessionAsync();

空のコレクションまたは nullLoopEvaluators コレクションは、ハーネスのシングルショットを残します。

承認とセッションの動作

LoopAgent は、イテレーションが保留中のツール承認要求を返したときに完了条件を評価する前に停止します。 別の自律的な反復処理の陰に隠すのではなく、呼び出し元にリクエストを返します。 呼び出し元が通常のツール承認フローを通じて 承認 応答を提供した後、エージェントは続行できます。

LoopAgent 自体には承認処理を追加する機能はありません。 Harness エージェントは、ループを ToolApprovalAgent の外側に適用し、保留中の承認リクエストがループから抜け出せるようにします。

呼び出し間で同じ AgentSession を再利用して会話を続行します。 ループ イテレーションでは、既定でそのセッションが共有されます。 FreshContextPerIteration = trueでは、LoopAgentは、サポートされている場合に呼び出し元が指定したセッション状態をリセットまたは復元します。 サービス所有の会話ストレージは、シリアル化されたセッションにリモート会話識別子のみが含まれている場合に履歴を保持できます。

loop_should_continuecreate_harness_agentを指定します。loop_max_iterationsの既定値は 10 です。

from agent_framework import create_harness_agent


def needs_more_work(*, last_result, **kwargs):
    return "DONE" not in last_result.text


agent = create_harness_agent(
    client=client,
    loop_should_continue=needs_more_work,
    loop_max_iterations=5,
)
session = agent.create_session()

loop_next_message は、次の入力をカスタマイズします。 loop_should_continueがないと、ファクトリはループを追加せず、他のループ引数を無視します。

承認とセッションの動作

AgentLoopMiddleware は、反復処理で承認待ちのツール承認リクエストが返された場合、継続条件を評価する前に停止します。 別の自律的な反復処理の陰に隠すのではなく、呼び出し元にリクエストを返します。 呼び出し元が通常のツール承認フローを通じて 承認 応答を提供した後、エージェントは続行できます。

AgentLoopMiddleware 自体は ToolApprovalMiddleware を追加しません。 Harness エージェントは、承認ミドルウェアの外側にループを配置し、保留中の承認要求がループをエスケープできるようにします。 ツールの自動承認が有効になっている間、Harness エージェントを実行するたびに AgentSession を作成して渡します。

呼び出し間で同じ AgentSession を再利用して会話を続行します。 ループ イテレーションでは、既定でそのセッションが共有されます。 fresh_context=Trueを使用すると、ミドルウェアはアタッチされたセッションをイテレーション間のプリループ スナップショットに復元します。 サービス所有の会話ストレージは、シリアル化されたセッションにリモート会話識別子のみが含まれている場合に履歴を保持できます。

Note

Harness Agent ループは現在 Go では使用できないため、承認とセッションの動作は適用されません。

次のステップ

さらに詳しく