Partager via


Orchestration séquentielle

Important

Les fonctionnalités d’orchestration d’agent dans l’infrastructure d’agent sont à l’étape expérimentale. Ils sont en cours de développement actif et peuvent changer considérablement avant de passer à la phase de version préliminaire ou de candidat à la version finale.

Dans l’orchestration séquentielle, les agents sont organisés dans un pipeline. Chaque agent traite la tâche à son tour, en passant sa sortie à l’agent suivant dans la séquence. Cela est idéal pour les flux de travail où chaque étape s’appuie sur l’étape précédente, comme la révision de document, les pipelines de traitement des données ou le raisonnement à plusieurs étapes.

Pour en savoir plus sur le modèle, par exemple quand utiliser le modèle ou quand éviter le modèle dans votre charge de travail, consultez orchestration séquentielle.

Cas d’usage courants

Un document passe par un agent de synthèse, puis un agent de traduction, et enfin un agent d’assurance qualité, chacun s’appuyant sur la sortie précédente :

diagramme

Ce que vous allez apprendre

  • Comment définir une séquence d’agents, chacune avec un rôle spécialisé
  • Comment orchestrer ces agents afin que chacun traite le résultat du précédent
  • Comment observer les sorties intermédiaires et collecter le résultat final

Définir vos agents

Les agents sont des entités spécialisées qui traitent les tâches en séquence. Ici, nous définissons trois agents : un analyste, un rédacteur et un éditeur.

Conseil / Astuce

Il ChatCompletionAgent est utilisé ici, mais vous pouvez utiliser n’importe quel type d’agent.

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

Facultatif : Observer les réponses de l’agent

Vous pouvez créer un rappel pour capturer les réponses de l’agent à mesure que la séquence progresse via la ResponseCallback propriété.

ChatHistory history = [];

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

Configurer l’orchestration séquentielle

Créez un objet SequentialOrchestration, en transmettant les agents et le rappel de réponse facultatif.

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

Démarrer le runtime

Un runtime est nécessaire pour gérer l’exécution des agents. Ici, nous utilisons InProcessRuntime et démarrons avant d’invoquer l’orchestration.

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

Appeler l’orchestration

Appelez l’orchestration avec votre tâche initiale (par exemple, une description de produit). La sortie transite par chaque agent en séquence.

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

Collecter les résultats

Attendez que l'orchestration se termine et récupérez la sortie finale.

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

Facultatif : arrêter le runtime

Une fois le traitement terminé, arrêtez le runtime pour nettoyer les ressources.

await runtime.RunUntilIdleAsync();

Exemple de sortie

# 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 ...

Conseil / Astuce

L’exemple de code complet est disponible ici

Définir vos agents

Chaque agent de la séquence a une responsabilité spécifique. Dans cet exemple, nous avons :

  • ConceptExtractorAgent : extrait les principales fonctionnalités, le public cible et les points de vente uniques d’une description de produit.
  • WriterAgent : compose un texte marketing sur la base des informations extraites.
  • FormatProofAgent : modifie et polit le brouillon pour plus de clarté et de cohérence.

Conseil / Astuce

Il ChatCompletionAgent est utilisé ici avec Azure OpenAI, mais vous pouvez utiliser n’importe quel type d’agent ou service de modèle.

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]

Facultatif : Observer les réponses de l’agent

Vous pouvez définir un rappel pour observer et imprimer la sortie de chaque agent à mesure que la séquence progresse.

from semantic_kernel.contents import ChatMessageContent

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

Configurer l’orchestration séquentielle

Objet SequentialOrchestration, en transmettant les agents et le rappel de réponse optionnel.

from semantic_kernel.agents import SequentialOrchestration

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

Démarrer le runtime

Démarrez le runtime pour gérer l’exécution de l’agent.

from semantic_kernel.agents.runtime import InProcessRuntime

runtime = InProcessRuntime()
runtime.start()

Appeler l’orchestration

Appelez l’orchestration avec votre tâche initiale (par exemple, une description de produit). La sortie transite par chaque agent en séquence.

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

Collecter les résultats

Attendez que l’orchestration se termine.

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

Facultatif : arrêter le runtime

Une fois le traitement terminé, arrêtez le runtime pour nettoyer les ressources.

await runtime.stop_when_idle()

Exemple de sortie

# 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...

Conseil / Astuce

L’exemple de code complet est disponible ici.

Remarque

L’orchestration de l’agent n’est pas encore disponible dans le Kit de développement logiciel (SDK) Java.

Étapes suivantes