Compartir a través de


Orquestación secuencial

Importante

Las características de orquestación del agente en Agent Framework se encuentran en la fase experimental. Están en desarrollo activo y pueden cambiar significativamente antes de avanzar a la fase de versión preliminar o candidata para lanzamiento.

En la orquestación secuencial, los agentes se organizan en una tubería. Cada agente procesa la tarea a su vez, pasando su salida al siguiente agente de la secuencia. Esto es ideal para los flujos de trabajo en los que cada paso se basa en el anterior, como la revisión de documentos, las canalizaciones de procesamiento de datos o el razonamiento de varias fases.

Para obtener más información sobre el patrón, como cuándo usar el patrón o cuándo evitar el patrón en la carga de trabajo, consulte Orquestación secuencial.

Casos de uso comunes

Un documento pasa a través de un agente de resumen, un agente de traducción y, por último, un agente de control de calidad, cada uno basándose en la salida anterior.

diagrama

Temas que se abordarán

  • Cómo definir una secuencia de agentes, cada una con un rol especializado
  • Cómo organizar estos agentes para que cada uno procese la salida del anterior
  • Cómo observar salidas intermedias y recopilar el resultado final

Definir los agentes

Los agentes son entidades especializadas que procesan tareas en secuencia. En este caso, definimos tres agentes: un analista, un copywriter y un editor.

Sugerencia

ChatCompletionAgent se usa aquí, pero puede usar cualquier 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 respuestas del agente

Puede crear un 'callback' para recoger las respuestas del agente a medida que la secuencia avanza mediante la propiedad ResponseCallback.

ChatHistory history = [];

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

Configurar la orquestación secuencial

Cree un objeto SequentialOrchestration pasando los agentes y el callback de respuesta opcional.

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

Iniciar el entorno de ejecución

Se requiere un tiempo de ejecución para administrar la ejecución de agentes. Aquí, usamos InProcessRuntime e iniciamos antes de invocar la orquestación.

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

Invocar la orquestación

Invoque la orquestación con la tarea inicial (por ejemplo, una descripción del producto). La salida fluirá a través de cada agente de forma secuencial.

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

Recopilar resultados

Espere a que la orquestación se complete y recupere la salida 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: Detener el tiempo de ejecución

Una vez completado el procesamiento, detenga el tiempo de ejecución para limpiar los recursos.

await runtime.RunUntilIdleAsync();

Salida de ejemplo

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

Sugerencia

El código de ejemplo completo está disponible aquí.

Definir los agentes

Cada agente de la secuencia tiene una responsabilidad específica. En este ejemplo, tenemos:

  • ConceptExtractorAgent: extrae características clave, audiencia objetivo y puntos de venta únicos de una descripción del producto.
  • WriterAgent: redacta un texto publicitario basado en la información extraída.
  • FormatProofAgent: edita y pule la copia de borrador para mayor claridad y coherencia.

Sugerencia

ChatCompletionAgent Se usa aquí con Azure OpenAI, pero puede usar cualquier tipo de agente o servicio 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 respuestas del agente

Puede definir un callback para observar e imprimir el output de cada agente a medida que la secuencia progresa.

from semantic_kernel.contents import ChatMessageContent

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

Configurar la orquestación secuencial

En el objeto SequentialOrchestration, se pasan los agentes y la respuesta opcional de devolución de llamada.

from semantic_kernel.agents import SequentialOrchestration

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

Iniciar el entorno de ejecución

Inicie el entorno de ejecución para gestionar la ejecución del agente.

from semantic_kernel.agents.runtime import InProcessRuntime

runtime = InProcessRuntime()
runtime.start()

Invocar la orquestación

Invoque la orquestación con la tarea inicial (por ejemplo, una descripción del producto). La salida fluirá a través de cada agente de forma secuencial.

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

Recopilar resultados

Espere a que se complete la orquestación.

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

Opcional: Detener el tiempo de ejecución

Una vez completado el procesamiento, detenga el tiempo de ejecución para limpiar los recursos.

await runtime.stop_when_idle()

Salida de ejemplo

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

Sugerencia

El código de ejemplo completo está disponible aquí.

Nota:

La orquestación del agente aún no está disponible en el SDK de Java.

Pasos siguientes