Loop dell'agente

Il ciclo dell'agente richiama nuovamente un agente fino a quando non viene soddisfatta una condizione di completamento. Usalo per il miglioramento iterativo, per completare attività da svolgere, per attendere attività in background o per valutare se una risposta soddisfa criteri espliciti.

Cicli autonomi sempre associati. Una condizione di completamento può avere esito negativo, un modello può bloccarsi e un analizzatore può essere probabilistico.

Importante

Il looping dell'agente è sperimentale.

Configura manualmente il loop

Usare l'API di composizione diretta quando si vuole eseguire un ciclo senza le altre impostazioni predefinite dell'agente Harness.

Importare i tipi di ciclo e avvolgere qualsiasi AIAgent con LoopAgent. Il valore massimo predefinito è 10 chiamate dell'agente:

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

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

Importare AgentLoopMiddleware e aggiungerlo a un normale oggetto Agent. Il valore massimo predefinito è 10 esecuzioni dell'agente:

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

Il predicato può essere sincrono o asincrono. Invio True per continuare, False per interrompere o (continue, feedback) per trasmettere il feedback all'iterazione successiva.

Annotazioni

La funzionalità di ciclo in pacchetto descritta in questa pagina non è attualmente disponibile in Go.

Scegliere una condizione di completamento

LoopAgent accetta un valutatore o una raccolta ordinata:

Valutatore Continua mentre
CompletionMarkerLoopEvaluator La risposta più recente non contiene il marcatore configurato.
TodoCompletionLoopEvaluator Un TodoProvider risolto presenta ancora elementi non completati, facoltativamente nelle modalità agente selezionate.
BackgroundTaskCompletionLoopEvaluator Un oggetto risolto BackgroundAgentsProvider ha ancora attività in esecuzione.
AIJudgeLoopEvaluator Un cliente giudice separato dice che la richiesta originale non è completamente risposta.
DelegateLoopEvaluator Il tuo callback restituisce LoopEvaluation.Continue(...).

Quando sono configurati più valutatori, vengono eseguiti in ordine. Il primo analizzatore che richiede un'altra iterazione fornisce il proprio feedback; il ciclo si arresta solo quando tutti gli analizzatori rifiutano di continuare.

Usare un giudice di intelligenza artificiale

Il giudice riceve la richiesta originale e l'ultima risposta dell'agente. Se rileva un gap, l'analisi diventa feedback per l'iterazione successiva:

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

Affidare la richiesta originale e la risposta generata solo a un endpoint di valutazione affidabile.

Contesto di controllo e output

Per impostazione predefinita, LoopAgent riutilizza una sessione e invia il feedback più recente dell'analizzatore vincente come input successivo. FreshContextPerIteration = true ricompila invece ogni passaggio dalla richiesta originale e un log di feedback aggregato e reimposta o ripristina la sessione.

Le esecuzioni non di streaming restituiscono una trascrizione aggregata per impostazione predefinita. Impostare NonStreamingReturnsLastResponseOnly = true per restituire solo la risposta finale. La modalità di streaming restituisce sempre ogni iterazione e qualsiasi messaggio di feedback visibile inviato per conto dell'utente.

Il predicato riceve argomenti di parole chiave, tra cui iteration, last_resultmessages, original_messages, sessionagent, progress, e feedback. Gli helper todos_remaining() e background_tasks_running() forniscono condizioni predefinite per attività in background e todo. Abbinali a todos_remaining_message o background_tasks_running_message per generare un input successivo mirato.

Usare un giudice di intelligenza artificiale

AgentLoopMiddleware.with_judge costruisce un ciclo guidato da un giudice. I cicli di giudici hanno per impostazione predefinita cinque iterazioni:

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

Il ragionamento del giudice viene restituito all'agente quando è necessario ulteriore lavoro. Utilizza solo un endpoint di valutazione di cui ti fidi con la richiesta originale e la risposta generata.

Controlla il contesto, l'avanzamento e l'output

Per i loop avanzati, costruisci AgentLoopMiddleware direttamente:

  • record_feedback crea una voce di avanzamento concisa dopo ogni iterazione di lavoro.
  • progress espone le voci accumulate alle funzioni di callback.
  • inject_progress=True aggiunge lo stato di avanzamento all'input dell'iterazione successiva.
  • fresh_context=True riavvia dall'attività originale e dal registro di avanzamento e ripristina una sessione allegata allo snapshot precedente al ciclo.
  • return_final_only=True restituisce solo l'ultima risposta per le esecuzioni non in streaming.

Passare max_iterations=None solo quando il predicato di completamento ha la garanzia di terminare.

Le condizioni di completamento predefinite e l'integrazione del judge descritte in questa pagina non sono attualmente disponibili in Go.

Usa un ciclo con Harness Agent

Usa la configurazione di Harness Agent se vuoi anche le sue funzionalità preconfigurate di cronologia, pianificazione, memoria, approvazione e la pipeline di osservabilità.

Imposta HarnessAgentOptions.LoopEvaluators. L'harness usa LoopAgent come decoratore più esterno dell'agente:

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

Una raccolta o nullLoopEvaluators vuota lascia l'imbracatura singola.

Autorizzazione e comportamento della sessione

LoopAgent si interrompe prima di valutare la condizione di completamento quando un'iterazione restituisce una richiesta di approvazione del tool ancora in sospeso. Restituisce la richiesta al chiamante anziché nasconderla dietro un'altra iterazione autonoma. Dopo che il chiamante ha fornito la risposta di approvazione tramite il normale flusso di approvazione dello strumento , l'agente può continuare.

LoopAgent non aggiunge di per sé la gestione dell'approvazione. L'agente Harness applica il loop all'esterno di ToolApprovalAgent, consentendo alle richieste di approvazione in sospeso di uscire dal loop.

Riutilizzare lo stesso AgentSession tra le chiamate per continuare la conversazione. Per impostazione predefinita, le iterazioni del ciclo condividono la sessione. Con FreshContextPerIteration = true, LoopAgent reimposta o ripristina lo stato della sessione fornito dal chiamante, se supportato. L'archiviazione di conversazione di proprietà del servizio può mantenere la cronologia quando la sessione serializzata contiene solo un identificatore di conversazione remota.

Fornire loop_should_continue a create_harness_agent; loop_max_iterations il valore predefinito è 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 personalizza l'input successivo. Senza loop_should_continue, la factory non aggiunge un loop e ignora gli altri argomenti del loop.

Autorizzazione e comportamento della sessione

AgentLoopMiddleware si arresta prima di valutare il predicato di continuazione quando un'iterazione restituisce una richiesta di approvazione di uno strumento in sospeso. Restituisce la richiesta al chiamante anziché nasconderla dietro un'altra iterazione autonoma. Dopo che il chiamante ha fornito la risposta di approvazione tramite il normale flusso di approvazione dello strumento , l'agente può continuare.

AgentLoopMiddleware non aggiunge ToolApprovalMiddleware da solo. L'agente Harness posiziona il loop all'esterno del proprio middleware di approvazione, consentendo alle richieste di approvazione in sospeso di uscire dal loop. Creare e passare un AgentSession a ogni esecuzione di Harness Agent quando l'approvazione automatica degli strumenti è abilitata.

Riutilizzare lo stesso AgentSession tra le chiamate per continuare la conversazione. Per impostazione predefinita, le iterazioni del ciclo condividono la sessione. Con fresh_context=True, il middleware ripristina la sessione collegata allo snapshot precedente al ciclo tra un’iterazione e l’altra. L'archiviazione di conversazione di proprietà del servizio può mantenere la cronologia quando la sessione serializzata contiene solo un identificatore di conversazione remota.

Annotazioni

La funzionalità di looping di Harness Agent non è attualmente disponibile in Go, quindi il suo meccanismo di approvazione e il comportamento della sessione non si applicano.

Passaggi successivi

Approfondimento