Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här självstudien visar hur du integrerar AI-agenter i arbetsflöden med hjälp av Agent Framework. Du lär dig att skapa arbetsflöden som utnyttjar kraften hos specialiserade AI-agenter för att skapa, granska och andra samarbetsuppgifter.
Vad du kommer att bygga
Du skapar ett arbetsflöde som:
- Använder Azure Foundry Agent Service för att skapa intelligenta agenter
- Implementerar en fransk översättningsagent som översätter indata till franska
- Implementerar en spansk översättningsagent som översätter franska till spanska
- Implementerar en engelsk översättningsagent som översätter spanska tillbaka till engelska
- Ansluter agenter i en pipeline för sekventiellt arbetsflöde
- Strömmar realtidsuppdateringar när agenter bearbetar begäranden
- Visar korrekt resursrensning för Azure Foundry-agenter
Begrepp som omfattas
Förutsättningar
- .NET 8.0 SDK eller senare
- En Azure Foundry-projektslutpunkt och modell konfigurerad
- Azure CLI installerat och autentiserat (för autentisering med Azure-autentiseringsuppgifter)
- Ett nytt konsolprogram
Steg 1: Installera NuGet-paket
Installera först de nödvändiga paketen för .NET-projektet:
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
Steg 2: Konfigurera Azure Foundry-klienten
Konfigurera Azure Foundry-klienten med miljövariabler och autentisering:
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());
Steg 3: Skapa agentfabriksmetod
Implementera en hjälpmetod för att skapa Azure Foundry-agenter med specifika instruktioner:
/// <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);
}
}
Steg 4: Skapa specialiserade Azure Foundry-agenter
Skapa tre översättningsagenter med hjälpmetoden:
// Create agents
AIAgent frenchAgent = await GetTranslationAgentAsync("French", aiProjectClient, deploymentName);
AIAgent spanishAgent = await GetTranslationAgentAsync("Spanish", aiProjectClient, deploymentName);
AIAgent englishAgent = await GetTranslationAgentAsync("English", aiProjectClient, deploymentName);
Steg 5: Skapa arbetsflödet
Anslut agenterna i ett sekventiellt arbetsflöde med hjälp av WorkflowBuilder:
// Build the workflow by adding executors and connecting them
var workflow = new WorkflowBuilder(frenchAgent)
.AddEdge(frenchAgent, spanishAgent)
.AddEdge(spanishAgent, englishAgent)
.Build();
Steg 6: Kör med direktuppspelning
Kör arbetsflödet med direktuppspelning för att observera realtidsuppdateringar från alla agenter:
// 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}");
}
}
Steg 7: Resursrensning
Rensa Azure Foundry-agenterna korrekt efter användning:
// 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);
}
Så här fungerar det
-
Konfiguration av Azure Foundry-klient: Använder
AIProjectClientmed Azure CLI-autentiseringsuppgifter för autentisering - Skapande av agent: Skapar versionshanterade agenter på Azure Foundry med specifika instruktioner för översättning
- Sekventiell bearbetning: Fransk agent översätter indata först, sedan spansk agent och sedan engelsk agent
-
Vänd tokenmönster: Agenter cachelagrar meddelanden och bearbetar endast när de tar emot en
TurnToken -
Direktuppspelningsuppdateringar:
AgentResponseUpdateEventtillhandahåller tokenuppdateringar i realtid när agenter genererar svar - Resurshantering: Korrekt rensning av Azure Foundry-agenter med hjälp av administrations-API:et
Viktiga begrepp
- Azure Foundry Agent Service: Molnbaserade AI-agenter med avancerade resonemangsfunktioner
- AIProjectClient: Klient för att skapa och hantera agenter på Azure Foundry
-
WorkflowEvent: Utdatahändelser (
type="output") innehåller agentutdata (AgentResponseUpdateför direktuppspelning,AgentResponseför icke-direktuppspelning) - TurnToken: Signal som utlöser agentbearbetning efter cachelagring av meddelanden
- Sekventiellt arbetsflöde: Agenter som är anslutna i en pipeline där utdata flödar från en till en annan
Fullständig implementering
Den fullständiga implementeringen av det här Arbetsflödet för Azure Foundry-agenter finns i FoundryAgent-Program.cs exempel på Agent Framework-lagringsplatsen.
Vad du kommer att bygga
Du skapar ett arbetsflöde som:
- Använder
FoundryChatClientför att skapa intelligenta agenter - Implementerar en Writer-agent som skapar innehåll baserat på frågor
- Implementerar en granskaragent som ger feedback om innehållet
- Ansluter agenter i en pipeline för sekventiellt arbetsflöde
- Strömmar realtidsuppdateringar när agenter bearbetar begäranden
Begrepp som omfattas
Förutsättningar
- Python 3.10 eller senare
- Agent Framework har installerats:
pip install agent-framework - Azure OpenAI-svar konfigurerade med rätt miljövariabler
- Azure CLI-autentisering:
az login
Steg 1: Importera nödvändiga beroenden
Börja med att importera nödvändiga komponenter för arbetsflöden och Azure OpenAI-svarsagenter:
import asyncio
import os
from agent_framework import AgentResponseUpdate, WorkflowBuilder
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential
Steg 2: Skapa Azure OpenAI-svarsklient
Skapa en delad klient som du kan använda för att skapa flera agenter:
async def main() -> None:
client = FoundryChatClient(
project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
model=os.environ["FOUNDRY_MODEL"],
credential=AzureCliCredential(),
)
Steg 3: Skapa specialiserade agenter
Skapa två specialiserade agenter för att skapa och granska innehåll:
# 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."
),
)
Steg 4: Skapa arbetsflödet
Anslut agenterna i ett sekventiellt arbetsflöde med hjälp av byggverktyget:
# Build the workflow with agents as executors
workflow = WorkflowBuilder(start_executor=writer_agent).add_edge(writer_agent, reviewer_agent).build()
Steg 5: Kör med direktuppspelning
Kör arbetsflödet med direktuppspelning för att observera realtidsuppdateringar från båda agenterna:
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)
Steg 6: Slutför huvudfunktionen
Inneslut allt i huvudfunktionen med korrekt asynkron körning.
if __name__ == "__main__":
asyncio.run(main())
Så här fungerar det
-
Klientinstallation: Använder en
FoundryChatClientmed Azure CLI-autentiseringsuppgifter för autentisering. - Skapande av agent: Skapar skrivare och granskare från samma klientkonfiguration.
- Sekventiell bearbetning: Skrivagenten genererar först innehåll och skickar det sedan till granskaragenten.
-
Direktuppspelningsuppdateringar: Utdatahändelser (
type="output") medAgentResponseUpdatedata ger uppdateringar av token i realtid när agenter genererar svar.
Viktiga begrepp
- FoundryChatClient: Delad klient som används för att skapa arbetsflödesagenter med konsekvent konfiguration.
-
WorkflowEvent: Utdatahändelser (
type="output") innehåller agentutdata (AgentResponseUpdateför direktuppspelning,AgentResponseför icke-direktuppspelning). - Sekventiellt arbetsflöde: Agenter som är anslutna i en pipeline där utdata flödar från en till en annan.
Fullständig implementering
Den fullständiga arbetsimplementeringen finns i azure_ai_agents_streaming.py på Agent Framework-lagringsplatsen.
Vad du kommer att bygga
Du skapar ett arbetsflöde som:
- Använder Azure OpenAI-agenter som arbetsflödesexekutorer
- Implementerar en fransk översättningsagent
- Implementerar en spansk översättningsagent
- Implementerar en engelsk översättningsagent
- Ansluter agenter i en pipeline för sekventiellt arbetsflöde
- Strömmar realtidsuppdateringar när agenter bearbetar begäranden
Begrepp som omfattas
Förutsättningar
- Gå 1.25 eller senare
- Microsoft Foundry-projektslutpunkt och modelldistribution konfigurerad
- Azure CLI autentisering eller någon annan källa för Azure autentiseringsuppgifter
Steg 1: Konfigurera 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
}
Varning
azidentity.NewDefaultAzureCredential är praktiskt för utveckling men kräver noggrant övervägande i produktion. I produktion bör du överväga att använda en specifik autentiseringsuppgift, till exempel azidentity.NewManagedIdentityCredential, för att undvika problem med svarstid, oavsiktlig avsökning av autentiseringsuppgifter och potentiella säkerhetsrisker från reservmekanismer.
Steg 2: Skapa agentfabriksfunktion
Skapa agenter med specifika översättningsinstruktioner:
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"},
})
}
Steg 3: Skapa specialiserade Foundry-agenter
frenchAgent := newTranslationAgent("French")
spanishAgent := newTranslationAgent("Spanish")
englishAgent := newTranslationAgent("English")
Steg 4: Skapa arbetsflödet
Agenter kan användas som arbetsflödesexekutorer, vilket möjliggör AI-baserade arbetsflödessteg.
Bind varje agent som en exekverare i arbetsflödet och anslut sedan exekverarna med kanter:
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
}
Steg 5: Kör med direktuppspelning
Kör arbetsflödet och aktivera uppdateringshändelser med en 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())
}
}
}
Så här fungerar det
- Klientkonfiguration: Använder en Azure autentiseringsuppgifter med OpenAI-klienten.
- Skapande av agent: Skapar specialiserade agenter med språkspecifika instruktioner.
-
Agentvärdtjänst: Använder
agentworkflow.Newför att koppla varje agent som en arbetsflödesexekverare. - Sekventiell bearbetning: Den franska exekveraren körs först, därefter den spanska och sedan den engelska.
-
Turordningsmönster för token: Värdbaserade agenter buffrar meddelanden och körs när de tar emot en
workflow.TurnToken. -
Direktuppspelningsuppdateringar:
workflow.OutputEventvärden kan innehålla*agent.ResponseUpdateutdata för realtidsförlopp.
Viktiga begrepp
-
Azure OpenAI-agent: En
agent.Agentsom backas upp av Azure OpenAI. - agentworkflow. Ny: Anpassar en agent för användning som arbetsflödesexekutor.
- Arbetsflöde. TurnToken: Signal som utlöser värdbaserade agenter för att bearbeta buffrade meddelanden.
- Arbetsflödets utdatabegivenhet: Innehåller uppdateringar av agentens svar och arbetsflödets slutliga utdata.
- Sekventiellt arbetsflöde: Agenter som är anslutna i en pipeline där utdata flödar från en till en annan.
Fullständig implementering
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())
}
}
}
}
Varning
azidentity.NewDefaultAzureCredential är praktiskt för utveckling men kräver noggrant övervägande i produktion. I produktion bör du överväga att använda en specifik autentiseringsuppgift, till exempel azidentity.NewManagedIdentityCredential, för att undvika problem med svarstid, oavsiktlig avsökning av autentiseringsuppgifter och potentiella säkerhetsrisker från reservmekanismer.
Tip
Se agenterna i arbetsflödesexemplet för ett fullständigt exempel.