Pętla agenta

Zapętlenie agenta powoduje ponowne wywoływanie agenta do momentu spełnienia warunku zakończenia. Używaj tego do iteracyjnego dopracowywania, realizacji zadań z listy rzeczy do zrobienia, oczekiwania na zakończenie zadań w tle lub oceny, czy odpowiedź spełnia określone kryteria.

Zawsze ograniczaj autonomiczne pętle. Warunek zakończenia może zawieść, model może utknąć, a oceniający może być probabilistyczny.

Important

Zapętlanie agenta jest eksperymentalne.

Ręczne konfigurowanie pętli

Użyj interfejsu Direct Composition API, jeśli chcesz używać pętli bez pozostałych domyślnych ustawień Harness Agent.

Zaimportuj typy pętli i opakuj dowolny element AIAgent elementem LoopAgent. Jego domyślna maksymalna wartość to 10 wywołań agenta:

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

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

Zaimportuj AgentLoopMiddleware i dodaj go do zwykłego Agentelementu . Domyślny maksymalny limit to 10 uruchomień agenta:

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

Predykat może być synchroniczny lub asynchroniczny. Wróć do True, aby kontynuować, do False, aby zatrzymać, lub do (continue, feedback), aby przekazać opinię do następnej iteracji.

Uwaga / Notatka

Opisana na tej stronie obsługa pętli w pakietach nie jest obecnie dostępna w języku Go.

Wybieranie warunku ukończenia

LoopAgent przyjmuje jeden moduł oceniający lub uporządkowaną kolekcję:

Oceniacz Kontynuuje, gdy
CompletionMarkerLoopEvaluator Najnowsza odpowiedź nie zawiera skonfigurowanego znacznika.
TodoCompletionLoopEvaluator Rozwiązany element TodoProvider nadal ma niekompletne elementy, opcjonalnie w wybranych trybach agenta.
BackgroundTaskCompletionLoopEvaluator Rozwiązane BackgroundAgentsProvider nadal ma uruchomione zadania.
AIJudgeLoopEvaluator Oddzielny klient sędziego mówi, że oryginalne żądanie nie jest w pełni odpowiedzi.
DelegateLoopEvaluator Funkcja wywołania zwrotnego zwraca LoopEvaluation.Continue(...).

Po skonfigurowaniu wielu ewaluatorów są one uruchamiane w kolejności. Pierwszy ewaluator, który żąda innej iteracji dostarcza swoją opinię; pętla zatrzymuje się tylko wtedy, gdy wszyscy ewaluatorzy odmawiają kontynuowania.

Korzystanie z sędziego sztucznej inteligencji

Sędzia otrzymuje oryginalne żądanie i najnowszą odpowiedź agenta. Jeśli znajdzie lukę, jej analiza stanie się opinią na potrzeby następnej iteracji:

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

Korzystaj wyłącznie z endpointu oceniającego, któremu ufasz, przekazując do niego oryginalne żądanie i wygenerowaną odpowiedź.

Sterowanie kontekstem i danymi wyjściowymi

Domyślnie LoopAgent ponownie wykorzystuje tę samą sesję i wysyła najnowsze informacje zwrotne zwycięskiego ewaluatora jako kolejne dane wejściowe. FreshContextPerIteration = true zamiast tego odtwarza każdy przebieg na podstawie oryginalnego żądania i zagregowanego dziennika informacji zwrotnych oraz resetuje lub przywraca sesję.

Uruchomienia bez przesyłania strumieniowego domyślnie zwracają zbiorczą transkrypcję. Ustaw NonStreamingReturnsLastResponseOnly = true, aby zwracał tylko odpowiedź końcową. Transmisja strumieniowa zawsze zwraca wynik każdej iteracji oraz wszelkie widoczne komunikaty zwrotne typu „on-behalf-of”.

Predykat odbiera argumenty słów kluczowych, w tym iteration, , last_resultmessagesoriginal_messagessessionagentprogress, i .feedback Pomocnicy todos_remaining() i background_tasks_running() zapewniają wbudowane warunki zadań do wykonania i zadań w tle. Połącz je z todos_remaining_message lub background_tasks_running_message, aby wygenerować ukierunkowane kolejne dane wejściowe.

Korzystanie z sędziego sztucznej inteligencji

AgentLoopMiddleware.with_judge tworzy pętlę sterowaną przez sędziego. Pętle oceniające domyślnie mają pięć iteracji:

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

Uzasadnienie sędziego jest przekazywane z powrotem agentowi, gdy konieczna jest dalsza praca. Korzystaj tylko z endpointu oceniającego, któremu ufasz, przesyłając do niego oryginalne żądanie i wygenerowaną odpowiedź.

Kontrolowanie kontekstu, postępu i danych wyjściowych

W przypadku pętli zaawansowanych skonstruuj AgentLoopMiddleware bezpośrednio:

  • record_feedback tworzy zwięzły wpis o postępach po każdej iteracji pracy.
  • progress uwidacznia skumulowane wpisy w wywołaniach zwrotnych.
  • inject_progress=True dodaje informacje o postępie do danych wejściowych następnej iteracji.
  • fresh_context=True jest ponownie uruchamiane na podstawie oryginalnego zadania i dziennika postępu oraz przywraca dołączoną sesję do stanu z migawki sprzed pętli.
  • return_final_only=True zwraca tylko ostatnią odpowiedź dla uruchomień bez strumieniowania.

Przekaż max_iterations=None tylko wtedy, gdy predykat ukończenia ma gwarancję zakończenia.

Spakowane warunki ukończenia i integracja sędziego opisane na tej stronie nie są obecnie dostępne w języku Go.

Używanie pętli z Harness Agent

Użyj konfiguracji agenta Harness, jeśli chcesz także skorzystać z jego wstępnie skonfigurowanych funkcji historii, planowania, pamięci, zatwierdzeń i pipeline’u observability.

Ustaw wartość HarnessAgentOptions.LoopEvaluators. Mechanizm testowy stosuje LoopAgent jako najbardziej zewnętrzny dekorator agenta:

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

Pusta lub nullLoopEvaluators kolekcja pozostawia uprzężę jednostrzeliwą.

Zatwierdzanie i działanie sesji

LoopAgent zatrzymuje się przed oceną warunku ukończenia, gdy iteracja zwraca oczekujące żądanie zatwierdzenia narzędzia. Zwraca żądanie do wywołującego, zamiast ukrywać je za inną samodzielną iteracją. Gdy wywołujący przekaże odpowiedź zatwierdzającą za pośrednictwem normalnego przepływu zatwierdzania narzędzia, agent może kontynuować.

LoopAgent samo w sobie nie dodaje funkcji zatwierdzania. Agent Harness stosuje pętlę poza ToolApprovalAgent, umożliwiając oczekującym żądaniom zatwierdzenia wyjście poza pętlę.

Użyj ponownie tego samego elementu AgentSession w kolejnych wywołaniach, aby kontynuować rozmowę. Iteracje pętli domyślnie współdzielą tę sesję. Za pomocą FreshContextPerIteration = trueLoopAgent resetuje lub przywraca stan sesji dostarczony przez wywołującego, jeśli jest to obsługiwane. Magazyn konwersacji należących do usługi może zachować historię, gdy serializowana sesja zawiera tylko identyfikator konwersacji zdalnej.

Przekaż loop_should_continue do create_harness_agent; loop_max_iterations ma domyślną wartość 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 dostosowuje kolejne dane wejściowe. Bez elementu loop_should_continue fabryka nie dodaje pętli i ignoruje pozostałe argumenty pętli.

Zachowanie zatwierdzania i zachowanie sesji

AgentLoopMiddleware zatrzymuje się przed sprawdzeniem warunku kontynuacji, gdy iteracja zwraca żądanie zatwierdzenia narzędzia oczekujące na rozpatrzenie. Zwraca żądanie wywołującemu, zamiast ukrywać je za inną samodzielną iteracją. Gdy osoba wywołująca przekaże odpowiedź zatwierdzającą za pośrednictwem standardowego przepływu zatwierdzania narzędzia, agent może kontynuować.

AgentLoopMiddleware samo nie dodaje ToolApprovalMiddleware. Agent Harness umieszcza pętlę poza warstwą pośrednią obsługującą zatwierdzanie, co pozwala oczekującym żądaniom zatwierdzenia wydostać się z pętli. Utwórz i przekaż element AgentSession przy każdym uruchomieniu Harness Agent, gdy włączone jest automatyczne zatwierdzanie narzędzi.

Użyj ponownie tego samego AgentSession w kolejnych wywołaniach, aby kontynuować rozmowę. Iteracje pętli domyślnie współdzielą tę sesję. Przy użyciu fresh_context=True warstwa pośrednia przywraca dołączoną sesję do stanu z migawki sprzed pętli między iteracjami. Magazyn konwersacji należących do usługi może zachować historię, gdy serializowana sesja zawiera tylko identyfikator konwersacji zdalnej.

Uwaga / Notatka

Funkcja działania w pętli w Harness Agent nie jest obecnie dostępna dla języka Go, więc nie dotyczą jej zasady zatwierdzania ani zachowanie sesji.

Następne kroki

Głębiej