Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym samouczku pokazano, jak zintegrować agentów sztucznej inteligencji z przepływami pracy przy użyciu platformy Agent Framework. Dowiesz się, jak tworzyć przepływy pracy, które wykorzystują możliwości wyspecjalizowanych agentów sztucznej inteligencji do tworzenia zawartości, przeglądania i innych zadań współpracy.
Co będziesz budować
Utworzysz przepływ pracy, który:
- Używa usługi Azure Foundry Agent Service do tworzenia inteligentnych agentów
- Implementuje francuskiego agenta tłumaczenia, który tłumaczy dane wejściowe na język francuski
- Implementuje hiszpańskiego agenta tłumaczenia, który tłumaczy język francuski na hiszpański
- Implementuje angielskiego agenta tłumaczenia, który tłumaczy język hiszpański z powrotem na angielski
- Łączy agentów w sekwencyjnej ścieżce pracy.
- Przesyła strumieniowo aktualizacje w czasie rzeczywistym, gdy agenci przetwarzają żądania
- Demonstruje prawidłowe czyszczenie zasobów dla agentów usługi Azure Foundry
Omówione pojęcia
Wymagania wstępne
- Pakiet .NET 8.0 SDK lub nowszy
- Skonfigurowany punkt końcowy i model projektu usługi Azure Foundry
- Zainstalowany i uwierzytelniony interfejs wiersza polecenia platformy Azure(na potrzeby uwierzytelniania poświadczeń platformy Azure)
- Nowa aplikacja konsolowa
Krok 1. Instalowanie pakietów NuGet
Najpierw zainstaluj wymagane pakiety dla projektu .NET:
dotnet add package Azure.AI.Projects --prerelease
dotnet add package Azure.Identity
dotnet add package Microsoft.Agents.AI.Foundry --prerelease
dotnet add package Microsoft.Agents.AI.Workflows --prerelease
Krok 2. Konfigurowanie klienta usługi Azure Foundry
Skonfiguruj klienta usługi Azure Foundry przy użyciu zmiennych środowiskowych i uwierzytelniania:
using Azure.AI.Projects;
using Azure.AI.Projects.Agents;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry;
using Microsoft.Agents.AI.Workflows;
using Microsoft.Extensions.AI;
public static class Program
{
private static async Task Main()
{
// Set up the Azure AI Project client
var endpoint = Environment.GetEnvironmentVariable("AZURE_AI_PROJECT_ENDPOINT")
?? throw new InvalidOperationException("AZURE_AI_PROJECT_ENDPOINT is not set.");
var deploymentName = Environment.GetEnvironmentVariable("AZURE_AI_MODEL_DEPLOYMENT_NAME") ?? "gpt-4o-mini";
var aiProjectClient = new AIProjectClient(new Uri(endpoint), new AzureCliCredential());
Krok 3. Tworzenie metody fabryki agentów
Zaimplementuj metodę pomocnika, aby utworzyć agentów usługi Azure Foundry z określonymi instrukcjami:
/// <summary>
/// Creates a translation agent for the specified target language.
/// </summary>
/// <param name="targetLanguage">The target language for translation</param>
/// <param name="aiProjectClient">The AIProjectClient to create the agent</param>
/// <param name="model">The model to use for the agent</param>
/// <returns>A ChatClientAgent configured for the specified language</returns>
private static async Task<ChatClientAgent> GetTranslationAgentAsync(
string targetLanguage,
AIProjectClient aiProjectClient,
string model)
{
string agentName = $"{targetLanguage} Translator";
var version = await aiProjectClient.AgentAdministrationClient.CreateAgentVersionAsync(
agentName,
new ProjectsAgentVersionCreationOptions(
new DeclarativeAgentDefinition(model)
{
Instructions = $"You are a translation assistant that translates the provided text to {targetLanguage}."
}));
return aiProjectClient.AsAIAgent(version);
}
}
Krok 4. Tworzenie wyspecjalizowanych agentów usługi Azure Foundry
Utwórz trzech agentów tłumaczenia przy użyciu metody pomocniczej:
// Create agents
AIAgent frenchAgent = await GetTranslationAgentAsync("French", aiProjectClient, deploymentName);
AIAgent spanishAgent = await GetTranslationAgentAsync("Spanish", aiProjectClient, deploymentName);
AIAgent englishAgent = await GetTranslationAgentAsync("English", aiProjectClient, deploymentName);
Krok 5. Tworzenie przepływu pracy
Połącz agentów w przepływie pracy sekwencyjnej przy użyciu programu WorkflowBuilder:
// Build the workflow by adding executors and connecting them
var workflow = new WorkflowBuilder(frenchAgent)
.AddEdge(frenchAgent, spanishAgent)
.AddEdge(spanishAgent, englishAgent)
.Build();
Krok 6: Wykonywanie z użyciem przesyłania strumieniowego
Uruchom przepływ pracy z funkcją strumieniowania, aby śledzić aktualizacje w czasie rzeczywistym od wszystkich agentów.
// Execute the workflow
await using StreamingRun run = await InProcessExecution.RunStreamingAsync(workflow, new ChatMessage(ChatRole.User, "Hello World!"));
// Must send the turn token to trigger the agents.
// The agents are wrapped as executors. When they receive messages,
// they will cache the messages and only start processing when they receive a TurnToken.
await run.TrySendMessageAsync(new TurnToken(emitEvents: true));
await foreach (WorkflowEvent evt in run.WatchStreamAsync())
{
if (evt is AgentResponseUpdateEvent executorComplete)
{
Console.WriteLine($"{executorComplete.ExecutorId}: {executorComplete.Data}");
}
}
Krok 7. Oczyszczanie zasobów
Prawidłowo wyczyść agentów usługi Azure Foundry po użyciu:
// Cleanup the agents created for the sample.
await aiProjectClient.AgentAdministrationClient.DeleteAgentAsync(frenchAgent.Id);
await aiProjectClient.AgentAdministrationClient.DeleteAgentAsync(spanishAgent.Id);
await aiProjectClient.AgentAdministrationClient.DeleteAgentAsync(englishAgent.Id);
}
Jak to działa
-
Azure Foundry Client Setup: używa
AIProjectClientz poświadczeniami Azure CLI do uwierzytelniania - Tworzenie agentów: Wersjonowanie agentów w usłudze Azure Foundry z określonymi instrukcjami dotyczącymi tłumaczenia
- Przetwarzanie sekwencyjne: francuski agent tłumaczy najpierw dane wejściowe, a następnie hiszpański agent, a następnie angielski agent
-
Wzorzec tokenu 'Turn': agenci buforują komunikaty i przetwarzają dopiero po otrzymaniu
TurnToken -
Aktualizacje strumieniowe:
AgentResponseUpdateEventzapewniają aktualizacje tokenów w czasie rzeczywistym, gdy agenci generują odpowiedzi - Zarządzanie zasobami: prawidłowe czyszczenie agentów usługi Azure Foundry przy użyciu interfejsu API administracyjnego
Kluczowe pojęcia
- Usługa agenta usługi Azure Foundry: agenci sztucznej inteligencji opartej na chmurze z zaawansowanymi możliwościami rozumowania
- AIProjectClient: klient do tworzenia agentów i zarządzania nimi w usłudze Azure Foundry
-
WorkflowEvent: Zdarzenia wyjściowe (
type="output") zawierają dane wyjściowe agenta (AgentResponseUpdatedla przesyłania strumieniowego,AgentResponsedla nieprzesyłania strumieniowego) - TurnToken: sygnał wyzwalający przetwarzanie agenta po buforowaniu komunikatów
- Sekwencyjny przepływ pracy: agenty połączeni w potoku, w którym dane wyjściowe przepływają od jednego do kolejnego
Kompletna implementacja
Aby uzyskać pełną działającą implementację tego przepływu pracy agentów usługi Azure Foundry, zobacz przykład foundryAgent Program.cs w repozytorium Platformy agentów.
Co będziesz budować
Utworzysz przepływ pracy, który:
- Użycie
FoundryChatClientdo tworzenia inteligentnych agentów - Implementuje agenta piszącego, który tworzy zawartość na podstawie poleceń
- Implementuje agenta recenzenta, który przekazuje opinię na temat zawartości
- Łączy agentów w sekwencyjnej ścieżce pracy.
- Przesyła strumieniowo aktualizacje w czasie rzeczywistym, gdy agenci przetwarzają żądania
Omówione pojęcia
Wymagania wstępne
- Środowisko Python w wersji 3.10 lub nowszej
- Zainstalowano program Agent Framework:
pip install agent-framework - Odpowiedzi usługi Azure OpenAI skonfigurowane z odpowiednimi zmiennymi środowiskowymi
- Uwierzytelnianie Azure CLI:
az login
Krok 1. Importowanie wymaganych zależności
Zacznij od zaimportowania niezbędnych składników dla przepływów pracy i agentów odpowiedzi usługi Azure OpenAI:
import asyncio
import os
from agent_framework import AgentResponseUpdate, WorkflowBuilder
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential
Krok 2. Tworzenie klienta odpowiedzi usługi Azure OpenAI
Utwórz jednego udostępnionego klienta, którego można użyć do konstruowania wielu agentów:
async def main() -> None:
client = FoundryChatClient(
project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
model=os.environ["FOUNDRY_MODEL"],
credential=AzureCliCredential(),
)
Krok 3. Tworzenie wyspecjalizowanych agentów
Utwórz dwóch wyspecjalizowanych agentów do tworzenia i przeglądu zawartości.
# Create a Writer agent that generates content
writer_agent = client.as_agent(
name="Writer",
instructions=(
"You are an excellent content writer. You create new content and edit contents based on the feedback."
),
)
# Create a Reviewer agent that provides feedback
reviewer_agent = client.as_agent(
name="Reviewer",
instructions=(
"You are an excellent content reviewer. "
"Provide actionable feedback to the writer about the provided content. "
"Provide the feedback in the most concise manner possible."
),
)
Krok 4. Kompilowanie przepływu pracy
Połącz agentów w przepływie pracy sekwencyjnej przy użyciu konstruktora:
# Build the workflow with agents as executors
workflow = WorkflowBuilder(start_executor=writer_agent).add_edge(writer_agent, reviewer_agent).build()
Krok 5: Wykonanie z użyciem transmisji strumieniowej
Uruchom przepływ pracy z przesyłaniem strumieniowym, aby obserwować aktualizacje w czasie rzeczywistym od obu agentów:
last_author: str | None = None
events = workflow.run("Create a slogan for a new electric SUV that is affordable and fun to drive.", stream=True)
async for event in events:
if event.type == "output" and isinstance(event.data, AgentResponseUpdate):
update = event.data
author = update.author_name
if author != last_author:
if last_author is not None:
print()
print(f"{author}: {update.text}", end="", flush=True)
last_author = author
else:
print(update.text, end="", flush=True)
Krok 6: Ukończ funkcję Main
Zawijaj wszystko w funkcji main przy użyciu prawidłowego wykonywania asynchronicznego:
if __name__ == "__main__":
asyncio.run(main())
Jak to działa
-
Konfiguracja klienta: korzysta z jednego
FoundryChatClientz poświadczeniami Azure CLI do uwierzytelniania. - Tworzenie agenta: Tworzy agentów Piszącego i Przeglądającego na podstawie tej samej konfiguracji klienta.
- Przetwarzanie sekwencyjne: agent modułu zapisywania najpierw generuje zawartość, a następnie przekazuje ją do agenta recenzenta.
-
Aktualizacje przesyłania strumieniowego: zdarzenia wyjściowe (
type="output") zAgentResponseUpdatedanymi zapewniają aktualizacje tokenów w czasie rzeczywistym, gdy agenci generują odpowiedzi.
Kluczowe pojęcia
- FoundryChatClient: udostępniony klient używany do tworzenia agentów przepływu pracy z spójną konfiguracją.
-
WorkflowEvent: zdarzenia wyjściowe (
type="output") zawierają dane wyjściowe agenta (AgentResponseUpdatedla przesyłania strumieniowego,AgentResponsedla trybu nieprzesyłania strumieniowego). - Sekwencyjny przepływ zadań: agenty połączeni w potoku, w którym dane wyjściowe przepływają od jednego do drugiego.
Kompletna implementacja
Aby uzyskać pełną działającą implementację, zobacz azure_ai_agents_streaming.py w repozytorium Platformy agentów.
Co będziesz budować
Utworzysz przepływ pracy, który:
- Używa agentów Azure OpenAI jako funkcji wykonawczych przepływu pracy
- Implementuje francuskiego agenta tłumaczenia
- Implementuje hiszpańskiego agenta tłumaczenia
- Implementuje agenta tłumaczenia w języku angielskim
- Łączy agentów w sekwencyjnej ścieżce pracy.
- Przesyła strumieniowo aktualizacje w czasie rzeczywistym, gdy agenci przetwarzają żądania
Omówione pojęcia
Wymagania wstępne
- Przejdź do wersji 1.25 lub nowszej
- Skonfigurowano punkt końcowy projektu Microsoft Foundry oraz wdrożenie modelu
- uwierzytelnianie za pomocą interfejsu wiersza polecenia platformy Azure lub inne źródło poświadczeń Azure
Krok 1. Konfigurowanie konfiguracji rozwiązania Foundry
endpoint := os.Getenv("FOUNDRY_PROJECT_ENDPOINT")
model := cmp.Or(os.Getenv("FOUNDRY_MODEL"), "gpt-4o-mini")
token, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
return err
}
Warning
azidentity.NewDefaultAzureCredential jest wygodne do programowania, ale wymaga starannego rozważenia w środowisku produkcyjnym. W środowisku produkcyjnym rozważ użycie konkretnego poświadczenia, takiego jak azidentity.NewManagedIdentityCredential, aby uniknąć opóźnień, niezamierzonego sprawdzania poświadczeń i potencjalnego ryzyka dla bezpieczeństwa wynikającego z mechanizmów awaryjnych.
Krok 2. Tworzenie funkcji fabryki agentów
Tworzenie agentów z określonymi instrukcjami tłumaczenia:
newTranslationAgent := func(language string) *agent.Agent {
return foundryprovider.NewAgent(endpoint, token, foundryprovider.ModelDeployment(model), foundryprovider.AgentConfig{
Instructions: fmt.Sprintf(
"Translate the user's text to %s. Return only the translation.",
language,
),
Config: agent.Config{Name: language + "Agent"},
})
}
Krok 3: Utwórz wyspecjalizowane agenty Foundry
frenchAgent := newTranslationAgent("French")
spanishAgent := newTranslationAgent("Spanish")
englishAgent := newTranslationAgent("English")
Krok 4. Kompilowanie przepływu pracy
Agenci mogą służyć jako funkcje wykonawcze przepływu pracy, włączając kroki przepływu pracy oparte na sztucznej inteligencji.
Przypisz każdego agenta jako wykonawcę przepływu pracy, a następnie połącz wykonawców krawędziami:
import (
"github.com/microsoft/agent-framework-go/agent"
"github.com/microsoft/agent-framework-go/workflow/agentworkflow"
"github.com/microsoft/agent-framework-go/message"
"github.com/microsoft/agent-framework-go/workflow"
"github.com/microsoft/agent-framework-go/workflow/inproc"
)
cfg := agentworkflow.Config{DisableForwardIncomingMessages: true}
french := agentworkflow.New(frenchAgent, cfg)
spanish := agentworkflow.New(spanishAgent, cfg)
english := agentworkflow.New(englishAgent, cfg)
wf, err := workflow.NewBuilder(french).
AddEdge(french, spanish).
AddEdge(spanish, english).
WithOutputFrom(english).
Build()
if err != nil {
return err
}
Krok 5: Wykonanie z użyciem transmisji strumieniowej
Uruchom przepływ pracy i włącz zdarzenia aktualizacji za pomocą polecenia workflow.TurnToken:
run, err := inproc.Default.RunStreaming(ctx, wf, message.NewText("Hello World"))
if err != nil {
return err
}
defer run.Close(ctx)
emitEvents := true
if err := run.SendMessage(ctx, workflow.TurnToken{EmitEvents: &emitEvents}); err != nil {
return err
}
for evt, err := range run.WatchStream(ctx) {
if err != nil {
return err
}
if out, ok := evt.(workflow.OutputEvent); ok {
if update, ok := out.Output.(*agent.ResponseUpdate); ok {
fmt.Printf("%s: %s\n", out.ExecutorID, update.String())
}
}
}
Jak to działa
- Konfiguracja klienta: używa poświadczeń Azure z klientem OpenAI.
- Tworzenie agenta: tworzy wyspecjalizowanych agentów z instrukcjami specyficznymi dla języka.
-
Hostowanie agenta: Używa
agentworkflow.New, aby powiązać każdego agenta jako wykonawcę przepływu pracy. - Przetwarzanie sekwencyjne: najpierw uruchamiany jest moduł wykonawczy dla języka francuskiego, następnie hiszpańskiego, a na końcu angielskiego.
-
Włącz wzorzec tokenu: hostowani agenci buforują komunikaty i uruchamiają je po otrzymaniu elementu
workflow.TurnToken. -
Aktualizacje strumieniowe: wartości
workflow.OutputEventmogą zawierać wyniki*agent.ResponseUpdatedo śledzenia postępu w czasie rzeczywistym.
Kluczowe pojęcia
-
Azure Agent OpenAI:
agent.Agentelement wspierany przez Azure OpenAI. - agentworkflow.New: Dostosowuje agenta do używania jako modułu wykonawczego przepływu pracy.
- workflow.TurnToken: sygnał, który wyzwala hostowanych agentów do przetwarzania komunikatów z bufora.
- OutputEvent przepływu pracy: zawiera aktualizacje odpowiedzi agenta i końcowe wyniki przepływu pracy.
- Sekwencyjny przepływ zadań: agenty połączeni w potoku, w którym dane wyjściowe przepływają od jednego do drugiego.
Kompletna implementacja
package main
import (
"cmp"
"context"
"fmt"
"log"
"os"
"github.com/microsoft/agent-framework-go/agent"
"github.com/microsoft/agent-framework-go/workflow/agentworkflow"
"github.com/microsoft/agent-framework-go/message"
"github.com/microsoft/agent-framework-go/workflow"
"github.com/microsoft/agent-framework-go/workflow/inproc"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/microsoft/agent-framework-go/provider/foundryprovider"
)
func main() {
ctx := context.Background()
endpoint := os.Getenv("FOUNDRY_PROJECT_ENDPOINT")
model := cmp.Or(os.Getenv("FOUNDRY_MODEL"), "gpt-4o-mini")
credential, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
log.Fatal(err)
}
newTranslationAgent := func(language string) *agent.Agent {
return foundryprovider.NewAgent(endpoint, credential, foundryprovider.ModelDeployment(model), foundryprovider.AgentConfig{
Instructions: fmt.Sprintf(
"Translate the user's text to %s. Return only the translation.",
language,
),
Config: agent.Config{Name: language + "Agent"},
})
}
cfg := agentworkflow.Config{DisableForwardIncomingMessages: true}
french := agentworkflow.New(newTranslationAgent("French"), cfg)
spanish := agentworkflow.New(newTranslationAgent("Spanish"), cfg)
english := agentworkflow.New(newTranslationAgent("English"), cfg)
wf, err := workflow.NewBuilder(french).
AddEdge(french, spanish).
AddEdge(spanish, english).
WithOutputFrom(english).
Build()
if err != nil {
log.Fatal(err)
}
run, err := inproc.Default.RunStreaming(ctx, wf, message.NewText("Hello World"))
if err != nil {
log.Fatal(err)
}
defer run.Close(ctx)
emitEvents := true
if err := run.SendMessage(ctx, workflow.TurnToken{EmitEvents: &emitEvents}); err != nil {
log.Fatal(err)
}
for evt, err := range run.WatchStream(ctx) {
if err != nil {
log.Fatal(err)
}
if out, ok := evt.(workflow.OutputEvent); ok {
if update, ok := out.Output.(*agent.ResponseUpdate); ok {
fmt.Printf("%s: %s\n", out.ExecutorID, update.String())
}
}
}
}
Warning
azidentity.NewDefaultAzureCredential jest wygodne do programowania, ale wymaga starannego rozważenia w środowisku produkcyjnym. W środowisku produkcyjnym rozważ użycie konkretnego poświadczenia, takiego jak azidentity.NewManagedIdentityCredential, aby uniknąć opóźnień, niezamierzonego sprawdzania poświadczeń oraz potencjalnych zagrożeń bezpieczeństwa wynikających z mechanizmów awaryjnych.
Wskazówka
Zobacz przykład agentów w przepływach pracy , aby zapoznać się z kompletnym przykładem.