Agentschleifen

Die Agentschleife ruft einen Agent erneut auf, bis eine Abschlussbedingung erfüllt ist. Verwenden Sie sie für iterative Einschränkung, Todo-Abschluss, Warten auf Hintergrundaufgaben oder Auswerten, ob eine Antwort explizite Kriterien erfüllt.

Immer gebundene autonome Schleifen. Eine Abschlussbedingung kann fehlschlagen, ein Modell kann hängen und ein Evaluator kann probabilistisch sein.

Important

Agentschleifen sind experimentell.

Manuelles Einrichten von Schleifen

Verwenden Sie die direkte Kompositions-API, wenn Sie eine Schleife ohne die anderen Benutzerfreundlichkeits-Agent-Standardwerte ausführen möchten.

Importieren Sie die Schleifentypen, und schließen Sie sie mit AIAgentLoopAgent. Der Standardwert beträgt 10 Agentaufrufe:

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

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

Importieren AgentLoopMiddleware und hinzufügen sie zu einer regulären Agent. Der Standardwert ist 10 Agentausführungen:

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,
        )
    ],
)

Das Prädikat kann synchron oder asynchron sein. Kehren Sie True zurück, um fortzufahren, False zu beenden oder (continue, feedback) Feedback an die nächste Iteration zu übergeben.

Note

Die auf dieser Seite beschriebene Paketschleifenfunktion ist derzeit in Go nicht verfügbar.

Auswählen einer Abschlussbedingung

LoopAgent akzeptiert einen Evaluator oder eine sortierte Sammlung:

Auswerter Wird fortgesetzt, während
CompletionMarkerLoopEvaluator Die neueste Antwort enthält nicht die konfigurierte Markierung.
TodoCompletionLoopEvaluator Ein aufgelöstes TodoProvider Element verfügt weiterhin über unvollständige Elemente, optional in ausgewählten Agentmodi.
BackgroundTaskCompletionLoopEvaluator Ein aufgelöstes Problem BackgroundAgentsProvider hat noch ausgeführte Aufgaben.
AIJudgeLoopEvaluator Ein separater Richter-Kunde sagt, dass die ursprüngliche Anfrage nicht vollständig beantwortet wird.
DelegateLoopEvaluator Ihr Rückruf gibt zurück LoopEvaluation.Continue(...).

Wenn mehrere Bewerter konfiguriert sind, werden sie in der Reihenfolge ausgeführt. Der erste Wert, der eine weitere Iteration anfordert, liefert sein Feedback; die Schleife wird nur beendet, wenn alle Auswertungen den Vorgang fortsetzen.

Verwenden eines KI-Richters

Der Richter erhält die ursprüngliche Anfrage und die neueste Agentantwort. Wenn eine Lücke gefunden wird, wird die Analyse feedback für die nächste Iteration:

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 });

Verwenden Sie nur einen Richterendpunkt, dem Sie vertrauen, mit der ursprünglichen Anforderung und der generierten Antwort.

Steuern des Kontexts und der Ausgabe

Verwendet standardmäßig LoopAgent eine Sitzung und sendet das neueste Feedback des Gewinners als nächste Eingabe. FreshContextPerIteration = true Erstellt stattdessen jeden Durchgang aus der ursprünglichen Anforderung sowie ein aggregiertes Feedbackprotokoll neu und setzt die Sitzung zurück oder stellt sie wieder her.

Wenn kein Streaming ausgeführt wird, wird standardmäßig ein aggregiertes Transkript zurückgegeben. Legen Sie fest NonStreamingReturnsLastResponseOnly = true , dass nur die endgültige Antwort zurückgegeben wird. Streaming sendet immer jede Iteration und alle sichtbaren Im-Auftrag-von-Feedback-Nachrichten.

Das Prädikat empfängt Schlüsselwortargumente, einschließlich iteration, , , messagesoriginal_messages, session, agent, und progressfeedback. last_result Die Helfer todos_remaining() und background_tasks_running() stellen integrierte Aufgaben- und Hintergrundaufgabenbedingungen bereit. Koppeln Sie sie mit todos_remaining_message oder background_tasks_running_message generieren Sie eine gezielte nächste Eingabe.

Verwenden eines KI-Richters

AgentLoopMiddleware.with_judge erstellt eine richtergesteuerte Schleife. Richterschleifen werden standardmäßig auf fünf Iterationen festgelegt:

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],
)

Die Begründung des Richters wird an den Agenten zurückgespeist, wenn mehr Arbeit erforderlich ist. Verwenden Sie nur einen Richterendpunkt, dem Sie vertrauen, mit der ursprünglichen Anforderung und der generierten Antwort.

Steuern des Kontexts, des Fortschritts und der Ausgabe

Erstellen Sie AgentLoopMiddleware für erweiterte Schleifen direkt:

  • record_feedback erstellt nach jeder Arbeits iteration einen präzisen Statuseintrag.
  • progress macht gesammelte Einträge für Rückrufe verfügbar.
  • inject_progress=True fügt den Fortschritt zur Eingabe der nächsten Iteration hinzu.
  • fresh_context=True startet aus dem ursprünglichen Vorgangs- und Statusprotokoll neu und stellt eine angefügte Sitzung in seiner Vorabschleifenmomentaufnahme wieder her.
  • return_final_only=True gibt nur die letzte Antwort für nicht streamingfreie Ausführung zurück.

Übergeben Sie max_iterations=None nur, wenn das Vervollständigungs-Prädikat garantiert beendet wird.

Die auf dieser Seite beschriebenen gepackten Abschlussbedingungen und die Beurteilungsintegration sind derzeit in Go nicht verfügbar.

Verwenden von Schleifen mit Dem Harness Agent

Verwenden Sie das Setup von Harness Agent, wenn Sie auch den vorkonfigurierten Verlauf, die Planung, den Speicher, die Genehmigung und die Observability-Pipeline wünschen.

Legen Sie HarnessAgentOptions.LoopEvaluators fest. Der Gurt gilt LoopAgent als äußerster Agent-Dekorateur:

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();

Eine leere Oder Sammlung lässt den Gurt ein- und nullLoopEvaluators aus.

Genehmigungs- und Sitzungsverhalten

LoopAgent beendet, bevor die Abschlussbedingung ausgewertet wird, wenn eine Iteration eine ausstehende Toolgenehmigungsanforderung zurückgibt. Sie gibt die Anforderung an den Aufrufer zurück, anstatt sie hinter einer anderen autonomen Iteration auszublenden. Nachdem der Anrufer die Genehmigungsantwort über den normalen Genehmigungsfluss des Tools bereitstellt, kann der Agent fortfahren.

LoopAgent fügt keine Genehmigungsbehandlung selbst hinzu. Der Nutzungs-Agent wendet die Schleife außerhalb ToolApprovalAgentan, sodass ausstehende Genehmigungsanforderungen die Schleife escapen können.

Verwenden Sie dieselbe AgentSession Wiederverwendung für Anrufe, um die Unterhaltung fortzusetzen. Schleifeniterationen teilen diese Sitzung standardmäßig. Mit FreshContextPerIteration = true, LoopAgent wird der vom Aufrufer bereitgestellte Sitzungszustand zurückgesetzt oder wiederhergestellt, sofern unterstützt. Diensteigener Unterhaltungsspeicher kann den Verlauf beibehalten, wenn die serialisierte Sitzung nur einen Remoteunterhaltungsbezeichner enthält.

Lieferung loop_should_continue an create_harness_agent; loop_max_iterations Standardwert 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 passt die nächste Eingabe an. loop_should_continueOhne , fügt die Factory keine Schleife hinzu und ignoriert die anderen Schleifenargumente.

Genehmigungs- und Sitzungsverhalten

AgentLoopMiddleware beendet, bevor das Fortsetzungsdrädikat ausgewertet wird, wenn eine Iteration eine ausstehende Toolgenehmigungsanforderung zurückgibt. Sie gibt die Anforderung an den Aufrufer zurück, anstatt sie hinter einer anderen autonomen Iteration auszublenden. Nachdem der Anrufer die Genehmigungsantwort über den normalen Genehmigungsfluss des Tools bereitstellt, kann der Agent fortfahren.

AgentLoopMiddleware fügt sich nicht selbst hinzu ToolApprovalMiddleware . Der Nutzungs-Agent platziert die Schleife außerhalb ihrer Genehmigungs-Middleware, sodass ausstehende Genehmigungsanforderungen die Schleife escapen können. Erstellen und übergeben Sie jeden AgentSession Harness Agent, der ausgeführt wird, während die automatische Genehmigung des Tools aktiviert ist.

Verwenden Sie dieselbe AgentSession Wiederverwendung für Anrufe, um die Unterhaltung fortzusetzen. Schleifeniterationen teilen diese Sitzung standardmäßig. Mit fresh_context=True, stellt die Middleware die angefügte Sitzung zwischen Iterationen in der Vorschleifenmomentaufnahme wieder her. Diensteigener Unterhaltungsspeicher kann den Verlauf beibehalten, wenn die serialisierte Sitzung nur einen Remoteunterhaltungsbezeichner enthält.

Note

Die Nutzungs-Agent-Schleifen sind derzeit in Go nicht verfügbar, daher gilt das Genehmigungs- und Sitzungsverhalten nicht.

Nächste Schritte

Mehr erfahren