Udostępnij przez


Orkiestracja sekwencyjna

Ważne

Funkcje orkiestracji agenta w ramach struktury agenta znajdują się w fazie eksperymentalnej. Są one aktywnie opracowywane i mogą ulec znacznej zmianie przed przejściem do etapu wersji zapoznawczej lub wersji kandydującej do wydania.

W sekwencyjnej orkiestracji agenci są zorganizowani w szeregu. Każdy agent przetwarza zadanie z kolei, przekazując dane wyjściowe do następnego agenta w sekwencji. Jest to idealne rozwiązanie w przypadku przepływów pracy, w których każdy krok opiera się na poprzednim, takim jak przegląd dokumentów, potoki przetwarzania danych lub rozumowanie wieloetapowe.

Aby dowiedzieć się więcej na temat wzorca, jak kiedy używać wzorca lub kiedy go unikać w swoim obciążeniu, zobacz Sekwencyjna orkiestracja.

Typowe przypadki użycia

Dokument przechodzi przez agenta podsumowania, a następnie agenta tłumaczenia, a na koniec agenta kontroli jakości, z których każdy jest oparty na poprzednich danych wyjściowych:

diagram

Czego nauczysz się

  • Jak zdefiniować sekwencję agentów z każdą z wyspecjalizowaną rolą
  • Jak zorganizować tych agentów tak, aby każdy przetwarzał dane wyjściowe poprzedniego
  • Jak obserwować pośrednie dane wyjściowe i zbierać końcowy wynik

Definiowanie agentów

Agenci to wyspecjalizowane jednostki, które przetwarzają zadania w sekwencji. W tym miejscu definiujemy trzech agentów: analityka, autora kopii i edytora.

Wskazówka

Parametr ChatCompletionAgent jest używany w tym miejscu, ale można użyć dowolnego typu agenta.

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

Opcjonalnie: Obserwowanie odpowiedzi agenta

Za pośrednictwem właściwości ResponseCallback można utworzyć wywołanie zwrotne w celu przechwycenia odpowiedzi agenta w miarę postępu sekwencji.

ChatHistory history = [];

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

Konfigurowanie sekwencyjnej orkiestracji

Utwórz obiekt SequentialOrchestration, przekazując agentów i opcjonalne wywołanie zwrotne odpowiedzi.

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

Uruchamianie środowiska uruchomieniowego

Środowisko uruchomieniowe jest wymagane do zarządzania wykonywaniem agentów programowych. W tym miejscu użyjemy InProcessRuntime i uruchomimy go przed wywołaniem orkiestracji.

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

Wywołaj orkiestrację

Wywołaj aranżację za pomocą zadania początkowego (np. opisu produktu). Dane wyjściowe będą przepływać przez każdego agenta w sekwencji.

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

Zbieranie wyników

Poczekaj na ukończenie aranżacji i pobierz końcowe dane wyjściowe.

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

Opcjonalnie: Zatrzymaj środowisko uruchomieniowe

Po zakończeniu przetwarzania zatrzymaj środowisko uruchomieniowe, aby wyczyścić zasoby.

await runtime.RunUntilIdleAsync();

Przykładowe dane wyjściowe

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

Wskazówka

Pełny przykładowy kod jest dostępny tutaj

Definiowanie agentów

Każdy agent w sekwencji ma określoną odpowiedzialność. W tym przykładzie mamy następujące elementy:

  • ConceptExtractorAgent: wyodrębnia kluczowe funkcje, docelową grupę odbiorców i unikatowe punkty sprzedaży z opisu produktu.
  • WriterAgent: komponuje kopię marketingową na podstawie wyodrębnionych informacji.
  • FormatProofAgent: edytuje i przeczyszcza kopię roboczą w celu zapewnienia przejrzystości i spójności.

Wskazówka

Element ChatCompletionAgent jest używany w tym miejscu w usłudze Azure OpenAI, ale można użyć dowolnego typu agenta lub usługi modelu.

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]

Opcjonalnie: Obserwowanie odpowiedzi agenta

Możesz zdefiniować funkcję zwrotną, aby obserwować i wyświetlać dane wyjściowe każdego agenta w miarę postępu sekwencji.

from semantic_kernel.contents import ChatMessageContent

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

Konfigurowanie sekwencyjnej orkiestracji

Obiekt SequentialOrchestration, przekazując agentów oraz opcjonalne wywołanie zwrotne dla odpowiedzi.

from semantic_kernel.agents import SequentialOrchestration

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

Uruchamianie środowiska uruchomieniowego

Uruchom środowisko uruchomieniowe, aby zarządzać wykonywaniem agenta.

from semantic_kernel.agents.runtime import InProcessRuntime

runtime = InProcessRuntime()
runtime.start()

Wywołaj orkiestrację

Wywołaj aranżację za pomocą zadania początkowego (np. opisu produktu). Dane wyjściowe będą przepływać przez każdego agenta w sekwencji.

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

Zbieranie wyników

Poczekaj na ukończenie aranżacji.

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

Opcjonalnie: Zatrzymaj środowisko uruchomieniowe

Po zakończeniu przetwarzania zatrzymaj środowisko uruchomieniowe, aby wyczyścić zasoby.

await runtime.stop_when_idle()

Przykładowe dane wyjściowe

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

Wskazówka

Pełny przykładowy kod jest dostępny tutaj.

Uwaga / Notatka

Orkiestracja agentów nie jest jeszcze dostępna w Java SDK.

Dalsze kroki