本教學課程示範如何使用代理程式架構將 AI 代理程式整合到工作流程中。 您將學習創建工作流程,利用專門的 AI 代理的強大功能來進行內容創建、審查和其他協作任務。
您將構建什麼
您將建立工作流程,以:
- 使用 Azure Foundry 代理程式服務來建立智慧型代理程式
- 實作法語翻譯代理,將輸入翻譯成法語
- 實施將法語翻譯成西班牙語的西班牙語翻譯代理
- 實施一個英語翻譯程式,將西班牙語翻譯回英語。
- 在循序工作流程管線中連接代理人
- 在客服人員處理請求時串流即時更新
- 示範如何為 Azure Foundry 代理程式正確地釋放資源
涵蓋概念
先決條件
- .NET 8.0 SDK 或更新版本
- 一個 Azure Foundry 專案端點與模型已配置
- 已安裝並驗證 Azure CLI(適用於 Azure 認證驗證)
- 新的主控台應用程式
步驟 1:安裝 NuGet 套件
首先,安裝 .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
步驟 2:設定 Azure Foundry 用戶端
使用環境變數和驗證來設定 Azure Foundry 用戶端:
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());
步驟三:建立代理工廠方法
實作協助程式方法,以使用特定指示建立 Azure Foundry 代理程式:
/// <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);
}
}
步驟 4:建立專用的 Azure Foundry 代理
使用協助程式方法建立三個翻譯代理程式:
// Create agents
AIAgent frenchAgent = await GetTranslationAgentAsync("French", aiProjectClient, deploymentName);
AIAgent spanishAgent = await GetTranslationAgentAsync("Spanish", aiProjectClient, deploymentName);
AIAgent englishAgent = await GetTranslationAgentAsync("English", aiProjectClient, deploymentName);
步驟 5:建立工作流程
使用 WorkflowBuilder 在循序工作流程中連接代理程式:
// Build the workflow by adding executors and connecting them
var workflow = new WorkflowBuilder(frenchAgent)
.AddEdge(frenchAgent, spanishAgent)
.AddEdge(spanishAgent, englishAgent)
.Build();
第 6 步:使用串流執行
使用串流執行工作流程,以觀察所有代理程式的即時更新:
// 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}");
}
}
第 7 步:資源清理
使用後正確清除 Azure Foundry 代理程式:
// 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);
}
運作方式
-
Azure Foundry 用戶端設定:
AIProjectClient搭配 Azure CLI 認證進行驗證 - 代理建立:在 Azure Foundry 上建立版本化代理,並附有特定轉譯指示
- 順序處理:法語代理先翻譯輸入,然後翻譯西班牙語代理,然後翻譯英語代理
- 轉權杖模式:代理程式會快取訊息,並且僅在收到權杖後才處理訊息。
-
流式更新:
AgentResponseUpdateEvent在代理生成響應時提供實時標記更新 - 資源管理:使用系統管理 API 正確清除 Azure Foundry 代理程式
關鍵概念
- Azure Foundry 代理服務:具有進階推理功能的雲端式 AI 代理程式
- AIProjectClient:用於在 Azure Foundry 建立及管理代理的客戶端
-
WorkflowEvent:輸出事件(
type="output")包含代理輸出資料(AgentResponseUpdate串流、AgentResponse非串流) - TurnToken:訊息快取後觸發代理程式處理的訊號
- 循序工作流程:在管道中連接的代理程式,其中輸出從一個流向下一個
完成實施
如需此 Azure Foundry 代理程式工作流程的完整工作實作,請參閱代理程式架構存放庫中的 FoundryAgent Program.cs 範例。
您將構建什麼
您將建立工作流程,以:
-
FoundryChatClient用於創造智慧代理 - 實作根據提示建立內容的 Writer 代理程式
- 實作檢閱者代理程式,提供內容的意見反應
- 在循序工作流程管線中連接代理人
- 在客服人員處理請求時串流即時更新
涵蓋概念
先決條件
- Python 3.10 或更新版本
- 已安裝代理程式架構:
pip install agent-framework - Azure OpenAI 回應已設定為具備合適的環境變數
- Azure CLI 驗證:
az login
步驟 1:匯入所需的依賴項
首先從匯入工作流程與 Azure OpenAI 回應代理所需的元件開始:
import asyncio
import os
from agent_framework import AgentResponseUpdate, WorkflowBuilder
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential
步驟 2:建立 Azure OpenAI 回應客戶端
建立一個共用客戶端,用來構建多個代理:
async def main() -> None:
client = FoundryChatClient(
project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
model=os.environ["FOUNDRY_MODEL"],
credential=AzureCliCredential(),
)
步驟三:建立專業代理人
建立兩個專門的代理程式以進行內容建立和檢閱:
# 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."
),
)
步驟 4:建立工作流程
使用建構工具以順序工作流程連接代理:
# Build the workflow with agents as executors
workflow = WorkflowBuilder(start_executor=writer_agent).add_edge(writer_agent, reviewer_agent).build()
步驟 5:使用串流執行
使用串流執行工作流程,以觀察兩個代理程式的即時更新:
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)
第 6 步:完成主要功能
使用適當的非同步執行將所有內容包裝在 main 函數中:
if __name__ == "__main__":
asyncio.run(main())
運作方式
-
用戶端設定:使用帶有 Azure CLI 憑證的裝置
FoundryChatClient來進行驗證。 - 代理建立:從同一客戶端設定中建立寫入者與審核者代理。
- 序列處理:作者代理先產生內容,然後再交給審稿代理。
-
串流更新:包含
type="output"資料的輸出事件AgentResponseUpdate提供代理生成回應時的即時令牌更新。
關鍵概念
- FoundryChatClient:用於建立具有一致設定的工作流程代理的共享客戶端。
-
工作流程事件:輸出事件(
type="output")包含代理的輸出資料(AgentResponseUpdate串流、AgentResponse非串流)。 - 序列式工作流程:代理在管線中連接,輸出從一個流向下一個。
完成實施
完整實作請參見代理框架倉庫中的 azure_ai_agents_streaming.py 。
您將構建什麼
您將建立工作流程,以:
- 使用 Azure OpenAI 代理作為工作流程執行者
- 實作法文翻譯代理
- 實作西班牙語翻譯代理
- 實現英文翻譯代理程式
- 在循序工作流程管線中連接代理人
- 在客服人員處理請求時串流即時更新
涵蓋概念
先決條件
- 升級到 1.25 或更高版本
- Microsoft Foundry 專案端點與模型部署已設定
- Azure CLI 驗證或其他 Azure 認證來源
步驟 1:設定 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 開發方便,但在生產過程中需謹慎考量。 在生產環境中,建議使用特定的憑證,例如 azidentity.NewManagedIdentityCredential,以避免延遲問題、意外的憑證探測,以及備用機制帶來的安全風險。
步驟 2:建立代理程式工廠函式
建立具有特定翻譯指示的代理人:
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"},
})
}
步驟三:建立專業的鑄造代理
frenchAgent := newTranslationAgent("French")
spanishAgent := newTranslationAgent("Spanish")
englishAgent := newTranslationAgent("English")
步驟 4:建立工作流程
代理可作為工作流程執行者使用,實現 AI 驅動的工作流程步驟。
將每個代理程式指定為工作流程執行器,然後以邊將這些執行器連接起來:
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
}
步驟 5:使用串流執行
執行工作流程,並使用 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())
}
}
}
運作方式
- 用戶端設定:使用 Azure 憑證搭配 OpenAI 用戶端。
- 代理創建:建立具有特定語言指令的專業代理。
-
代理主機:用於
agentworkflow.New綁定每個代理作為工作流程執行者。 - 循序處理:法語執行器會先執行,接著是西班牙語執行器,最後是英語執行器。
-
回合權杖模式:託管代理程式會緩衝訊息,並在收到
workflow.TurnToken時執行。 -
串流更新:
workflow.OutputEvent數值可包含*agent.ResponseUpdate即時進度的輸出。
關鍵概念
-
Azure OpenAI 代理:由
agent.AgentAzure OpenAI 支持。 - agentworkflow.New:使代理適用於作為工作流程執行器。
- 工作流程。TurnToken:觸發託管代理處理緩衝訊息的訊號。
- Workflow OutputEvent:傳送代理回應更新及最終工作流程輸出。
- 序列式工作流程:代理在管線中連接,輸出從一個流向下一個。
完成實施
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 開發方便,但在生產過程中需謹慎考量。 在生產環境中,建議使用特定的憑證,例如 azidentity.NewManagedIdentityCredential,以避免延遲問題、意外的憑證探測,以及備用機制帶來的安全風險。
Tip
完整範例請參見 工作流程中的代理人範例 。