エージェントのループ

エージェント ループは、完了条件が満たされるまでエージェントを再呼び出します。 反復的な絞り込み、todo 完了、バックグラウンド タスクの待機、または回答が明示的な条件を満たしているかどうかを評価するために使用します。

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

Important

エージェントのループは試験段階です。

ループを手動で設定する

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

ループの種類をインポートし、LoopAgentを使用して任意のAIAgentをラップします。 その既定の最大値は、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 のセットアップを使用します。

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は、サポートされている場合に呼び出し元が指定したセッション状態をリセットまたは復元します。 サービス所有の会話ストレージは、シリアル化されたセッションにリモート会話識別子のみが含まれている場合に履歴を保持できます。

create_harness_agentloop_should_continueを指定します。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 では使用できないため、承認とセッションの動作は適用されません。

次のステップ

さらに詳しく