Freigeben über


Sequenzielle Orchestrierung

Von Bedeutung

Agent Orchestration-Features im Agent Framework befinden sich in der experimentellen Phase. Sie befinden sich in der aktiven Entwicklung und können sich erheblich ändern, bevor sie zur Vorschau- oder Veröffentlichungskandidatenphase wechseln.

Im sequenziellen Muster werden Agents in einer Pipeline organisiert. Jeder Agent verarbeitet die Aufgabe wiederum und übergibt die Ausgabe an den nächsten Agent in der Sequenz. Dies ist ideal für Workflows, bei denen jeder Schritt auf dem vorherigen aufbaut, z. B. Dokumentüberprüfung, Datenverarbeitungspipeline oder mehrstufiges Denken.

Gängige Anwendungsfälle

Ein Dokument durchläuft einen Zusammenfassungs-Agent, dann einen Übersetzungsagenten und schließlich einen Qualitätssicherungs-Agenten, der auf der vorherigen Ausgabe aufbaut:

Diagramm

Sie lernen Folgendes

  • Wie man eine Abfolge von Agenten definiert, wobei jeder eine spezialisierte Rolle hat
  • So orchestrieren Sie diese Agenten, damit jeder die Ausgabe des vorherigen verarbeitet.
  • Wie man Zwischenergebnisse beobachtet und das Endergebnis erhält

Definieren Sie Ihre Agenten

Agents sind spezialisierte Entitäten, die Aufgaben sequenziert verarbeiten. Hier definieren wir drei Agenten: einen Analysten, einen Kopierer und einen Redakteur.

Tipp

Dies ChatCompletionAgent wird hier verwendet, aber Sie können jeden Agenttyp verwenden.

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.Agents.Orchestration;
using Microsoft.SemanticKernel.Agents.Orchestration.Sequential;
using Microsoft.SemanticKernel.Agents.Runtime.InProcess;

// Create a kernel with an AI service
Kernel kernel = ...;

ChatCompletionAgent analystAgent = new ChatCompletionAgent {
    Name = "Analyst",
    Instructions = "You are a marketing analyst. Given a product description, identify:\n- Key features\n- Target audience\n- Unique selling points",
    Kernel = kernel,
};

ChatCompletionAgent writerAgent = new ChatCompletionAgent {
    Name = "Copywriter",
    Instructions = "You are a marketing copywriter. Given a block of text describing features, audience, and USPs, compose a compelling marketing copy (like a newsletter section) that highlights these points. Output should be short (around 150 words), output just the copy as a single text block.",
    Kernel = kernel,
};

ChatCompletionAgent editorAgent = new ChatCompletionAgent {
    Name = "Editor",
    Instructions = "You are an editor. Given the draft copy, correct grammar, improve clarity, ensure consistent tone, give format and make it polished. Output the final improved copy as a single text block.",
    Kernel = kernel,
};

Optional: Beobachten von Agentantworten

Sie können einen Rückruf erstellen, um Agentantworten zu erfassen, während die Sequenz über die ResponseCallback Eigenschaft voranschreitet.

ChatHistory history = [];

ValueTask responseCallback(ChatMessageContent response)
{
    history.Add(response);
    return ValueTask.CompletedTask;
}

Einrichten der sequenziellen Orchestrierung

Erstellen Sie ein SequentialOrchestration Objekt, übergeben Sie die Agents und den optionalen Antwortrückruf.

SequentialOrchestration orchestration = new(analystAgent, writerAgent, editorAgent)
{
    ResponseCallback = responseCallback,
};

Laufzeit starten

Zum Verwalten der Ausführung von Agents ist eine Laufzeit erforderlich. Hier verwenden wir InProcessRuntime und beginnen damit, bevor wir die Orchestrierung aufrufen.

InProcessRuntime runtime = new InProcessRuntime();
await runtime.StartAsync();

Orchestrierung aufrufen

Rufen Sie die Orchestrierung mit Ihrer Ausgangsaufgabe (z. B. eine Produktbeschreibung) auf. Die Ausgabe durchläuft jeden Agenten in der Reihenfolge.

var result = await orchestration.InvokeAsync(
    "An eco-friendly stainless steel water bottle that keeps drinks cold for 24 hours",
    runtime);

Sammeln von Ergebnissen

Warten Sie, bis der Orchestrierungsvorgang abgeschlossen ist, und rufen Sie die endgültige Ausgabe ab.

string output = await result.GetValueAsync(TimeSpan.FromSeconds(20));
Console.WriteLine($"\n# RESULT: {text}");
Console.WriteLine("\n\nORCHESTRATION HISTORY");
foreach (ChatMessageContent message in history)
{
    this.WriteAgentChatMessage(message);
}

Optional: Beenden der Laufzeit

Beenden Sie nach Abschluss der Verarbeitung die Laufzeit, um Ressourcen zu bereinigen.

await runtime.RunUntilIdleAsync();

Beispielausgabe

# RESULT: Introducing our Eco-Friendly Stainless Steel Water Bottles – the perfect companion for those who care about the planet while staying hydrated! Our bottles ...


ORCHESTRATION HISTORY

# Assistant - Analyst: **Key Features:**
- Made from eco-friendly stainless steel
- Insulation technology that maintains cold temperatures for up to 24 hours
- Reusable and sustainable design
- Various sizes and colors available (assumed based on typical offerings)
- Leak-proof cap
- BPA-free ...

# Assistant - copywriter: Introducing our Eco-Friendly Stainless ...

# Assistant - editor: Introducing our Eco-Friendly Stainless Steel Water Bottles – the perfect companion for those who care about the planet while staying hydrated! Our bottles ...

Tipp

Der vollständige Beispielcode ist hier verfügbar.

Definieren Sie Ihre Agenten

Jeder Agent in der Sequenz hat eine bestimmte Verantwortung. In diesem Beispiel haben wir Folgendes:

  • ConceptExtractorAgent: Extrahiert wichtige Features, Zielgruppe und eindeutige Verkaufspunkte aus einer Produktbeschreibung.
  • WriterAgent: Verfasst eine Marketingkopie basierend auf den extrahierten Informationen.
  • FormatProofAgent: Bearbeitet und poliert den Entwurf für Klarheit und Konsistenz.

Tipp

Dies ChatCompletionAgent wird hier mit Azure OpenAI verwendet, Sie können jedoch jeden Agenttyp oder Modelldienst verwenden.

from semantic_kernel.agents import Agent, ChatCompletionAgent
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion

def get_agents() -> list[Agent]:
    concept_extractor_agent = ChatCompletionAgent(
        name="ConceptExtractorAgent",
        instructions=(
            "You are a marketing analyst. Given a product description, identify:\n"
            "- Key features\n"
            "- Target audience\n"
            "- Unique selling points\n\n"
        ),
        service=AzureChatCompletion(),
    )
    writer_agent = ChatCompletionAgent(
        name="WriterAgent",
        instructions=(
            "You are a marketing copywriter. Given a block of text describing features, audience, and USPs, "
            "compose a compelling marketing copy (like a newsletter section) that highlights these points. "
            "Output should be short (around 150 words), output just the copy as a single text block."
        ),
        service=AzureChatCompletion(),
    )
    format_proof_agent = ChatCompletionAgent(
        name="FormatProofAgent",
        instructions=(
            "You are an editor. Given the draft copy, correct grammar, improve clarity, ensure consistent tone, "
            "give format and make it polished. Output the final improved copy as a single text block."
        ),
        service=AzureChatCompletion(),
    )
    return [concept_extractor_agent, writer_agent, format_proof_agent]

Optional: Beobachten von Agentantworten

Sie können einen Callback definieren, um die Ausgabe jedes Agents zu überwachen und auszugeben, während die Sequenz voranschreitet.

from semantic_kernel.contents import ChatMessageContent

def agent_response_callback(message: ChatMessageContent) -> None:
    print(f"# {message.name}\n{message.content}")

Einrichten der sequenziellen Orchestrierung

Das SequentialOrchestration-Objekt wird übergeben, zusammen mit den Agenten und dem optionalen Antwortrückruf.

from semantic_kernel.agents import SequentialOrchestration

agents = get_agents()
sequential_orchestration = SequentialOrchestration(
    members=agents,
    agent_response_callback=agent_response_callback,
)

Laufzeit starten

Starten Sie die Laufzeit, um die Agentausführung zu verwalten.

from semantic_kernel.agents.runtime import InProcessRuntime

runtime = InProcessRuntime()
runtime.start()

Orchestrierung aufrufen

Rufen Sie die Orchestrierung mit Ihrer Ausgangsaufgabe (z. B. eine Produktbeschreibung) auf. Die Ausgabe durchläuft jeden Agenten in der Reihenfolge.

orchestration_result = await sequential_orchestration.invoke(
    task="An eco-friendly stainless steel water bottle that keeps drinks cold for 24 hours",
    runtime=runtime,
)

Sammeln von Ergebnissen

Warten Sie, bis die Orchestrierung abgeschlossen ist.

value = await orchestration_result.get(timeout=20)
print(f"***** Final Result *****\n{value}")

Optional: Beenden der Laufzeit

Beenden Sie nach Abschluss der Verarbeitung die Laufzeit, um Ressourcen zu bereinigen.

await runtime.stop_when_idle()

Beispielausgabe

# ConceptExtractorAgent
- Key Features:
- Made of eco-friendly stainless steel
- Keeps drinks cold for 24 hours
...
# WriterAgent
Keep your beverages refreshingly chilled all day long with our eco-friendly stainless steel bottles...
# FormatProofAgent
Keep your beverages refreshingly chilled all day long with our eco-friendly stainless steel bottles...
***** Final Result *****
Keep your beverages refreshingly chilled all day long with our eco-friendly stainless steel bottles...

Tipp

Der vollständige Beispielcode ist hier verfügbar.

Hinweis

Die Agent-Orchestrierung ist noch nicht im Java SDK verfügbar.

Nächste Schritte