Compartilhar via


Orquestração sequencial

Importante

Os recursos de Orquestração de Agente no Agent Framework estão em estágio experimental. Eles estão em desenvolvimento ativo e podem mudar significativamente antes de avançar para o estágio de prévia ou release candidate.

Na orquestração sequencial, os agentes são organizados em um pipeline. Cada agente processa a tarefa por sua vez, passando sua saída para o próximo agente na sequência. Isso é ideal para fluxos de trabalho em que cada etapa se baseia na anterior, como revisão de documentos, pipelines de processamento de dados ou raciocínio de vários estágios.

Para saber mais sobre o padrão, como quando usar o padrão ou quando evitar o padrão em sua carga de trabalho, consulte orquestração sequencial.

Casos de uso comuns

Um documento passa por um agente de resumo, depois um agente de tradução e, por fim, um agente de garantia de qualidade, cada um com base na saída anterior:

diagrama

O que você vai aprender

  • Como definir uma sequência de agentes, cada um com uma função especializada
  • Como orquestrar esses agentes para que cada um processe a saída da anterior
  • Como observar saídas intermediárias e coletar o resultado final

Definir seus agentes

Os agentes são entidades especializadas que processam tarefas em sequência. Aqui, definimos três agentes: um analista, um redator e um editor.

Dica

O ChatCompletionAgent é usado aqui, mas você pode usar qualquer tipo de agente.

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

Opcional: Observar respostas do agente

Você pode criar um retorno de chamada para capturar respostas do agente conforme a sequência progride por meio da propriedade ResponseCallback.

ChatHistory history = [];

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

Configurar a orquestração sequencial

Crie um objeto SequentialOrchestration, passando os agentes e o callback de resposta opcional.

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

Iniciar o Runtime

Um runtime é necessário para gerenciar a execução de agentes. Aqui, usamos InProcessRuntime e o iniciamos previamente à invocação da orquestração.

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

Invocar a Orquestração

Inicie o processo de orquestração com sua tarefa inicial (por exemplo, uma descrição de produto). A saída passará por cada agente em sequência.

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

Coletar Resultados

Aguarde até que a orquestração seja concluída e recupere o resultado final.

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

Opcional: Parar o Ambiente de Execução

Após a conclusão do processamento, interrompa o runtime para limpar os recursos.

await runtime.RunUntilIdleAsync();

Saída de exemplo

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

Dica

O código de exemplo completo está disponível aqui

Definir seus agentes

Cada agente na sequência tem uma responsabilidade específica. Neste exemplo, temos:

  • ConceptExtractorAgent: extrai os principais recursos, público-alvo e pontos de venda exclusivos de uma descrição do produto.
  • WriterAgent: Compõe um texto de marketing com base nas informações extraídas.
  • FormatProofAgent: edita e poli a cópia de rascunho para maior clareza e consistência.

Dica

O ChatCompletionAgent recurso é usado aqui com o Azure OpenAI, no entanto, você pode usar qualquer tipo de agente ou serviço de modelo.

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]

Opcional: Observar respostas do agente

Você pode definir um retorno de chamada para observar e imprimir a saída de cada agente à medida que a sequência progride.

from semantic_kernel.contents import ChatMessageContent

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

Configurar a orquestração sequencial

Objeto SequentialOrchestration, passando os agentes e o callback de resposta opcional.

from semantic_kernel.agents import SequentialOrchestration

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

Iniciar o Runtime

Inicie o runtime para gerenciar a execução do agente.

from semantic_kernel.agents.runtime import InProcessRuntime

runtime = InProcessRuntime()
runtime.start()

Invocar a Orquestração

Inicie o processo de orquestração com sua tarefa inicial (por exemplo, uma descrição de produto). A saída passará por cada agente em sequência.

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

Coletar Resultados

Aguarde a conclusão da orquestração.

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

Opcional: Parar o Ambiente de Execução

Após a conclusão do processamento, interrompa o runtime para limpar os recursos.

await runtime.stop_when_idle()

Saída de exemplo

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

Dica

O código de exemplo completo está disponível aqui.

Observação

A orquestração do agente ainda não está disponível no SDK do Java.

Próximas etapas