Поделиться через


Последовательная оркестрация

Это важно

Функции оркестрации агентов во фреймворке агентов находятся на стадии эксперимента. Они находятся в активной разработке и могут значительно измениться до перехода к стадии предварительной версии или кандидата на выпуск.

В последовательной оркестрации агенты организованы в конвейере. Каждый агент обрабатывает задачу в свою очередь, передавая выходные данные следующему агенту в последовательности. Это идеально подходит для рабочих процессов, в которых каждый шаг строится на основе предыдущего, например проверки документов, конвейеров обработки данных или многоэтапного рассуждения.

Дополнительные сведения о шаблоне, например о том, когда следует использовать шаблон или когда избежать шаблона в рабочей нагрузке, см. в разделе "Последовательная оркестрация".

Распространенные варианты использования

Документ проходит через агент краткого изложения, затем агент перевода и, наконец, агент проверки качества, каждый из которых работает, основываясь на предыдущих результатах.

диаграмма

Цели обучения

  • Определение последовательности агентов с специализированной ролью
  • Как управлять работой этих агентов так, чтобы каждый из них обрабатывал результаты работы предыдущего.
  • Как наблюдать промежуточные выходные данные и собирать окончательный результат

Определение агентов

Агенты — специализированные сущности, обрабатывающие задачи последовательно. Здесь мы определим три агента: аналитик, копирайтер и редактор.

Подсказка

Используется ChatCompletionAgent здесь, но можно использовать любой тип агента.

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

Необязательно: Наблюдайте за ответами агента

Вы можете создать обратный вызов для получения ответов агента по мере продвижения последовательности через свойство ResponseCallback.

ChatHistory history = [];

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

Настройка последовательной оркестрации

Создайте объект SequentialOrchestration, передав указанных агентов и необязательный обратный вызов ответа.

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

Запуск среды выполнения

Среда выполнения необходима для управления выполнением агентов. Здесь мы используем InProcessRuntime и запускаем его перед вызовом оркестрации.

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

Вызов оркестрации

Запустите процесс оркестрации с вашей начальной задачей (например, описание продукта). Выходные данные будут передаваться через каждого агента в последовательности.

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

Сбор результатов

Дождитесь, пока завершится оркестрация, и получите окончательные выходные данные.

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

Необязательно: Остановите среду выполнения

После завершения обработки остановите среду выполнения, чтобы очистить ресурсы.

await runtime.RunUntilIdleAsync();

Образец вывода

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

Подсказка

Полный пример кода доступен здесь

Определение агентов

Каждый агент в последовательности несет определенную ответственность. В этом примере у нас есть:

  • ConceptExtractorAgent: извлекает ключевые функции, целевую аудиторию и уникальные точки продажи из описания продукта.
  • WriterAgent: создает маркетинговую копию на основе извлеченных сведений.
  • FormatProofAgent: редактирует и полирует черновик для ясности и согласованности.

Подсказка

Здесь ChatCompletionAgent используется Azure OpenAI, однако вы можете использовать любой тип агента или службу модели.

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]

Необязательно: Наблюдайте за ответами агента

Вы можете определить обратный вызов для наблюдения и печати выходных данных каждого агента по мере выполнения последовательности.

from semantic_kernel.contents import ChatMessageContent

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

Настройка последовательной оркестрации

Передавайте объект SequentialOrchestration, передавая данных агентов и при необходимости функцию обратного вызова.

from semantic_kernel.agents import SequentialOrchestration

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

Запуск среды выполнения

Запустите выполнение для управления работой агента.

from semantic_kernel.agents.runtime import InProcessRuntime

runtime = InProcessRuntime()
runtime.start()

Вызов оркестрации

Запустите процесс оркестрации с вашей начальной задачей (например, описание продукта). Выходные данные будут передаваться через каждого агента в последовательности.

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

Сбор результатов

Дождитесь завершения оркестрации.

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

Необязательно: Остановите среду выполнения

После завершения обработки остановите среду выполнения, чтобы очистить ресурсы.

await runtime.stop_when_idle()

Образец вывода

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

Подсказка

Полный пример кода доступен здесь.

Замечание

Оркестрация агентов пока недоступна в пакете SDK для Java.

Дальнейшие шаги