Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
Środowisko uruchomieniowe
Środowisko uruchomieniowe to podstawowy składnik, który zarządza cyklem życia, komunikacją i wykonywaniem agentów i orkiestracji. Działa jako magistrala komunikatów i środowisko wykonawcze dla wszystkich aktorów (agentów i aktorów specyficznych dla orkiestracji) w systemie.
Rola środowiska uruchomieniowego
- Routing komunikatów: Środowisko uruchomieniowe jest odpowiedzialne za dostarczanie komunikatów między agentami a aktorami orkiestracji, przy użyciu modelu pub-sub lub bezpośredniego modelu komunikacji, w zależności od wzorca orkiestracji.
- Zarządzanie cyklem życia aktora: Tworzy, rejestruje i zarządza cyklem życia wszystkich podmiotów zaangażowanych w orkiestrację, zapewniając izolację i właściwe zarządzanie zasobami.
- Kontekst wykonywania: Środowisko uruchomieniowe udostępnia kontekst wykonywania orkiestracji, dzięki czemu wiele aranżacji (i ich wywołań) jest uruchamianych niezależnie i współbieżnie.
Relacja między środowiskiem uruchomieniowym i orkiestracją
Orkiestracja jest grafem definiującym sposób interakcji agentów ze sobą. Środowisko uruchomieniowe to silnik, który wykonuje ten graf, zarządza przepływem komunikatów i cyklem życia agentów. Deweloperzy mogą wykonać ten graf wiele razy z różnymi danymi wejściowymi w tym samym wystąpieniu środowiska uruchomieniowego, a środowisko uruchomieniowe zapewni, że każde wykonanie jest izolowane i niezależne.
Przerwy czasowe
Po wywołaniu orkiestracji orkiestracja zwraca natychmiast program obsługi, który może służyć do późniejszego uzyskania wyniku. Ten wzorzec asynchroniczny umożliwia bardziej elastyczny i dynamiczny projekt, szczególnie w scenariuszach, w których aranżacja może zająć dużo czasu.
Ważne
Jeśli wystąpi przekroczenie limitu czasu, wywołanie orkiestracji nie zostanie anulowane. Orchestracja będzie nadal działać w tle, dopóki nie zostanie ukończona. Deweloperzy nadal mogą pobrać wynik później.
Deweloperzy mogą uzyskać wynik wywołania orkiestracji później, wywołując metodę GetValueAsync w obiekcie result. Gdy aplikacja jest gotowa do przetworzenia wyniku, wywołanie może lub nie zostało ukończone. W związku z tym deweloperzy mogą opcjonalnie określić limit czasu dla GetValueAsync metody . Jeśli aranżacja nie zostanie ukończona w określonym przedziale czasu, zostanie zgłoszony wyjątek limitu czasu.
string output = await result.GetValueAsync(TimeSpan.FromSeconds(60));
Jeśli aranżacja nie zostanie ukończona w określonym przedziale czasu, zostanie zgłoszony wyjątek limitu czasu.
Deweloperzy mogą uzyskać wynik wywołania orkiestracji później, wywołując metodę get w obiekcie result. Gdy aplikacja jest gotowa do przetworzenia wyniku, wywołanie może lub nie zostało ukończone. W związku z tym deweloperzy mogą opcjonalnie określić limit czasu dla get metody . Jeśli aranżacja nie zostanie ukończona w określonym przedziale czasu, zostanie zgłoszony wyjątek limitu czasu.
value = await orchestration_result.get(timeout=60)
Jeśli aranżacja nie zostanie ukończona w określonym przedziale czasu, zostanie zgłoszony wyjątek limitu czasu.
Uwaga / Notatka
Orkiestracja agentów nie jest jeszcze dostępna w Java SDK.
Czynnik ludzki w procesie
Funkcja zwrotna odpowiedzi agenta
Aby wyświetlić odpowiedzi agenta wewnątrz wywołania, deweloperzy mogą przekazać ResponseCallback do orkiestracji. Dzięki temu deweloperzy mogą obserwować odpowiedzi poszczególnych agentów podczas procesu aranżacji. Deweloperzy mogą używać tego wywołania zwrotnego do aktualizacji interfejsu użytkownika, rejestrowania lub innych celów.
public ValueTask ResponseCallback(ChatMessageContent response)
{
Console.WriteLine($"# {response.AuthorName}\n{response.Content}");
return ValueTask.CompletedTask;
}
SequentialOrchestration orchestration = new SequentialOrchestration(
analystAgent, writerAgent, editorAgent)
{
ResponseCallback = ResponseCallback,
};
Aby zobaczyć odpowiedzi agenta wewnątrz wywołania, deweloperzy mogą dostarczyć agent_response_callback do orkiestracji. Dzięki temu deweloperzy mogą obserwować odpowiedzi poszczególnych agentów podczas procesu aranżacji. Deweloperzy mogą używać tego wywołania zwrotnego do aktualizacji interfejsu użytkownika, rejestrowania lub innych celów.
def agent_response_callback(message: ChatMessageContent) -> None:
print(f"# {message.name}\n{message.content}")
sequential_orchestration = SequentialOrchestration(
members=agents,
agent_response_callback=agent_response_callback,
)
Uwaga / Notatka
Orkiestracja agentów nie jest jeszcze dostępna w Java SDK.
Funkcja odpowiedzi człowieka
W przypadku orkiestracji, które obsługują dane wejściowe użytkownika (np. przekazywanie i czat grupowy), należy podać element InteractiveCallback, który zwraca element ChatMessageContent od użytkownika. Korzystając z tego wywołania zwrotnego, deweloperzy mogą implementować logikę niestandardową w celu zbierania danych wejściowych użytkownika, takich jak wyświetlanie komunikatu interfejsu użytkownika lub integrowanie z innymi systemami.
HandoffOrchestration orchestration = new(...)
{
InteractiveCallback = () =>
{
Console.Write("User: ");
string input = Console.ReadLine();
return new ChatMessageContent(AuthorRole.User, input);
}
};
W przypadku orkiestracji, które obsługują dane wejściowe użytkownika (np. przekazywanie i czat grupowy), należy podać element human_response_function, który zwraca element ChatMessageContent od użytkownika. Korzystając z tego wywołania zwrotnego, deweloperzy mogą implementować logikę niestandardową w celu zbierania danych wejściowych użytkownika, takich jak wyświetlanie komunikatu interfejsu użytkownika lub integrowanie z innymi systemami.
def human_response_function() -> ChatMessageContent:
user_input = input("User: ")
return ChatMessageContent(role=AuthorRole.USER, content=user_input)
handoff_orchestration = HandoffOrchestration(
...,
agent_response_callback=agent_response_callback,
)
Uwaga / Notatka
Orkiestracja agentów nie jest jeszcze dostępna w Java SDK.
Dane ustrukturyzowane
Uważamy, że dane ustrukturyzowane są kluczowym elementem tworzenia przepływów pracy agentów. Dzięki użyciu danych ustrukturyzowanych deweloperzy mogą tworzyć bardziej wielokrotne aranżacje, a środowisko programistyczne jest ulepszone. Zestaw SDK jądra semantycznego umożliwia przekazywanie danych ustrukturyzowanych jako danych wejściowych do aranżacji i zwracanie danych ustrukturyzowanych jako danych wyjściowych.
Ważne
Wewnętrznie orkiestracje nadal przetwarzają dane jako ChatMessageContent.
Dane wejściowe ze strukturą
Deweloperzy mogą przekazywać dane ustrukturyzowane jako dane wejściowe do aranżacji przy użyciu silnie typizowanej klasy wejściowej i określać je jako ogólny parametr aranżacji. Umożliwia to bezpieczeństwo typów i większą elastyczność orkiestracji przy obsłudze złożonych struktur danych. Aby na przykład sklasyfikować problemy z usługą GitHub, zdefiniuj klasę dla danych wejściowych ze strukturą:
public sealed class GithubIssue
{
public string Id { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string Body { get; set; } = string.Empty;
public string[] Labels { get; set; } = [];
}
Deweloperzy mogą następnie używać tego typu jako danych wejściowych do aranżacji, podając go jako parametr ogólny:
HandoffOrchestration<GithubIssue, string> orchestration =
new(...);
GithubIssue input = new GithubIssue { ... };
var result = await orchestration.InvokeAsync(input, runtime);
Niestandardowe przekształcenia danych wejściowych
Domyślnie orkiestracja będzie używać wbudowanej transformacji wejściowej, która serializuje obiekt w formacie JSON i opakowuje go w formacie ChatMessageContent. Jeśli chcesz dostosować sposób konwersji danych wejściowych ze strukturą na odpowiedni typ komunikatu, możesz podać swoją własną funkcję transformacji danych wejściowych za pośrednictwem właściwości InputTransform.
HandoffOrchestration<GithubIssue, string> orchestration =
new(...)
{
InputTransform = (issue, cancellationToken) =>
{
// For example, create a chat message with a custom format
var message = new ChatMessageContent(AuthorRole.User, $"[{issue.Id}] {issue.Title}\n{issue.Body}");
return ValueTask.FromResult<IEnumerable<ChatMessageContent>>([message]);
},
};
Dzięki temu można kontrolować dokładnie sposób prezentowania wpisanych danych wejściowych agentom, umożliwiając zaawansowane scenariusze, takie jak formatowanie niestandardowe, wybór pola lub wprowadzanie wielu komunikatów.
Wskazówka
Zobacz pełny przykład w Step04a_HandoffWithStructuredInput.cs
Deweloperzy mogą przekazywać dane ustrukturyzowane jako dane wejściowe do aranżacji, określając model Pydantic (lub dowolną klasę niestandardową) jako ogólny parametr aranżacji. Umożliwia to bezpieczeństwo typów i umożliwia orkiestracji obsługę złożonych struktur danych.
Aby na przykład przeprowadzić triage problemów z usługą GitHub, zdefiniuj model Pydantic dla strukturyzowanych danych wejściowych:
from pydantic import BaseModel
class GithubIssue(BaseModel):
id: str
title: str
body: str
labels: list[str] = []
Następnie możesz użyć tego typu jako danych wejściowych do aranżacji, podając go jako parametr ogólny:
from semantic_kernel.agents import HandoffOrchestration
def custom_input_transform(input_message: GithubIssue) -> ChatMessageContent:
return ChatMessageContent(role=AuthorRole.USER, content=f"[{input_message.id}] {input_message.title}\n{input_message.body}")
handoff_orchestration = HandoffOrchestration[GithubIssue, ChatMessageContent](
...,
input_transform=custom_input_transform,
)
GithubIssueSample = GithubIssue(
id="12345",
title="Bug: ...",
body="Describe the bug...",
labels=[],
)
orchestration_result = await handoff_orchestration.invoke(
task=GithubIssueSample,
runtime=runtime,
)
Wskazówka
Zobacz pełny przykład w step4a_handoff_structured_inputs.py
Uwaga / Notatka
Orkiestracja agentów nie jest jeszcze dostępna w Java SDK.
Dane wyjściowe ze strukturą
Agenci i orkiestracje mogą zwracać ustrukturyzowane dane wyjściowe, określając silnie typizowaną klasę danych wyjściowych jako ogólny parametr aranżacji. Umożliwia to pracę z zaawansowanymi, ustrukturyzowanymi wynikami w aplikacji, a nie tylko zwykłym tekstem.
Załóżmy na przykład, że chcesz przeanalizować artykuł i wyodrębnić motywy, tonacje i jednostki. Zdefiniuj klasę dla danych wyjściowych ze strukturą:
public sealed class Analysis
{
public IList<string> Themes { get; set; } = [];
public IList<string> Sentiments { get; set; } = [];
public IList<string> Entities { get; set; } = [];
}
Następnie możesz użyć tego typu jako dane wyjściowe orkiestracji, podając go jako parametr ogólny.
ConcurrentOrchestration<string, Analysis> orchestration =
new(agent1, agent2, agent3)
{
ResultTransform = outputTransform.TransformAsync, // see below
};
// ...
OrchestrationResult<Analysis> result = await orchestration.InvokeAsync(input, runtime);
Analysis output = await result.GetValueAsync(TimeSpan.FromSeconds(60));
Niestandardowe przekształcenia danych wyjściowych
Domyślnie orkiestracja będzie używać wbudowanej transformacji wyjściowej, która próbuje deserializować zawartość odpowiedzi agenta na typ danych wyjściowych. W przypadku bardziej zaawansowanych scenariuszy można udostępnić niestandardową transformację danych wyjściowych (na przykład ze ustrukturyzowanymi danymi wyjściowymi według niektórych modeli).
StructuredOutputTransform<Analysis> outputTransform =
new(chatCompletionService, new OpenAIPromptExecutionSettings { ResponseFormat = typeof(Analysis) });
ConcurrentOrchestration<string, Analysis> orchestration =
new(agent1, agent2, agent3)
{
ResultTransform = outputTransform.TransformAsync,
};
Takie podejście umożliwia odbieranie i przetwarzanie danych ustrukturyzowanych bezpośrednio z aranżacji, co ułatwia tworzenie zaawansowanych przepływów pracy i integracji.
Wskazówka
Zobacz cały przykład w Step01a_ConcurrentWithStructuredOutput.cs
Agenci i aranżacje mogą zwracać ustrukturyzowane dane wyjściowe, określając model Pydantic (lub dowolną klasę niestandardową) jako ogólny typ danych wyjściowych aranżacji. Umożliwia to pracę z zaawansowanymi, ustrukturyzowanymi wynikami w aplikacji, a nie tylko zwykłym tekstem.
Załóżmy na przykład, że chcesz przeanalizować artykuł i wyodrębnić motywy, tonacje i jednostki. Zdefiniuj model Pydantic dla danych wyjściowych ze strukturą:
from pydantic import BaseModel
class ArticleAnalysis(BaseModel):
themes: list[str]
sentiments: list[str]
entities: list[str]
Następnie możesz użyć tego typu jako danych wyjściowych aranżacji, podając go jako parametr ogólny i określając przekształcenie danych wyjściowych:
from semantic_kernel.agents import ConcurrentOrchestration
from semantic_kernel.agents.orchestration.tools import structured_outputs_transform
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
# `structured_outputs_transform` is a built-in transform that uses the structured output
concurrent_orchestration = ConcurrentOrchestration[str, ArticleAnalysis](
members=agents,
output_transform=structured_outputs_transform(ArticleAnalysis, AzureChatCompletion()),
)
...
orchestration_result = await concurrent_orchestration.invoke(
task="article text",
runtime=runtime,
)
value = await orchestration_result.get(timeout=20)
# `value` is now an instance of ArticleAnalysis
Takie podejście umożliwia odbieranie i przetwarzanie danych ustrukturyzowanych bezpośrednio z aranżacji, co ułatwia tworzenie zaawansowanych przepływów pracy i integracji.
Wskazówka
Zobacz pełny przykład w step1a_concurrent_structured_outputs.py
Uwaga / Notatka
Orkiestracja agentów nie jest jeszcze dostępna w Java SDK.
Anulowanie
Ważne
Anulowanie spowoduje zatrzymanie agentów w przetwarzaniu dalszych komunikatów, ale nie zatrzyma agentów, którzy już przetwarzają komunikaty.
Ważne
Anulowanie nie spowoduje zatrzymania środowiska uruchomieniowego.
Orkiestrację można anulować, wywołując metodę Cancel w procedurze obsługi wyników. Spowoduje to zatrzymanie koordynacji przez propagowanie sygnału do wszystkich agentów, co zatrzyma przetwarzanie kolejnych komunikatów.
var resultTask = orchestration.InvokeAsync(input, runtime);
resultTask.Cancel();
Deweloperzy mogą anulować aranżację, wywołując metodę cancel w procedurze obsługi wyników. Spowoduje to zatrzymanie koordynacji przez propagowanie sygnału do wszystkich agentów, co zatrzyma przetwarzanie kolejnych komunikatów.
orchestration_result = await orchestration.invoke(task=task, runtime=runtime)
orchestration_result.cancel()
Uwaga / Notatka
Orkiestracja agentów nie jest jeszcze dostępna w Java SDK.
Dalsze kroki
Uwaga / Notatka
Orkiestracja agentów nie jest jeszcze dostępna w Java SDK.