企業級 AI Agent 開發框架 - Microsoft Agent Framework
| | | 0 | |
2025 年,AI 輔助開發(AI-Assisted Coding,其實已經是 AI 代理開發了)領域最大的變革,當屬 Agent 降臨並迅速成為主流。2025 年 2 月,Github Copilot 加入 Agent 模式,AI 從聊天問答及修改補全程式碼的角色,轉為採目標導向,可多步驟自動執行,並能自我檢查的助理,能在本機或雲端環境主動跑指令、一次修改多個檔案、跑測試,甚至自己開 PR,從頭做到尾包辦整個開發任務。
在 Agent 模式中,Prompt 會自動包含 Workspace 檔案結構、機器 OS、可用工具描述等,模型對整個 Repository 完整了解,透過 read_file、edit_file 等工具,Agent 能搜尋 Workspace、讀取多個檔案內容並進行跨檔重構、框架遷移、產生/更新文件等,整個過程在同一個 Agent Session 內完成。舉個例子,訂便當系統想為後台加入人員權限管控,以前的 Edit 模式需要一個一個開啟程式檔,敲 Prompt 請 AI 改 Code;現在,下一次指令「為 /Admin 路徑所有程式加入後台人員權限管控,並新增相關單元測試」就做完了。甚至可從無到有,直接丟需求給 AI 分析,善用 AI 的多模態能力,解讀圖片、產生程式、執行測試、比對結果、修正程式,把整個開發工作丟給 AI 處理,我們在旁邊負責喝珍奶吃雞排監工指正方向,「開發程式」這檔事已是全然不同的樣貌。(有興趣可參考我前陣子的實測:Vibe Coding 體驗 - 製作描字帖 (含 Github Copilot 節費心得))
Agent 的核心運作概念如下圖 來源,Agent 在接獲使用者訊息後送交 LLM 處理,必要時會呼叫 Tools/MCP (以及 Skills),將 Tools/MCP/Skills 回傳結果及更新後的上下文送交 LLM,必要時會以迴圈方式循環多次(可反覆檢查結果、修正再執行到預合預期目標為止,經此功能加持,Agent 在一次問答間完成複雜度很高的任務),LLM 判定達標再返回最終回覆:

Agent 概念已然是當今 AI 程式開發主流,是目前 GPT、Claude、Gemini 全力發展的重點,而 Agent 的任務導向、多步驟執行、能讀寫檔、呼叫工具、循環檢查修正修正能力,不只能寫程式,還能用來做更多事,打造各式 AI 應用,這陣子火紅的 OpenClaw 小龍蝦便是經典例子。
龍蝦是無程式背景者的福音,原本會寫程式的人則有自己的玩法,除了用別人做好的現成 Agent,開發者更可因應需求發展自訂的 AI Agent、協調統整多個子 Agent 執行複雜作業、針對已知情境預先規劃流程取代即興 Prompt 操作... 面對這些情境,我們多半需借助開發平台或框架簡化工作,n8n、Copilot Studio 是 No Code/Low Code 型解決方案,而微軟在這個領域推出的新玩具叫 Microsoft Agent Framework,它提供建構 AI 應用程式 的基礎建構組件,包括模型客戶端(聊天完成與回應)、用於狀態管理的 Agent Session、用於代理記憶體的上下文提供者、用於攔截 Agent 行動的中介軟體,以及用於工具整合的 MCP 用戶端,這些元件可提供靈活性和能力,方便快速建立互動式、功能強大且安全的 AI 應用程式。
更早之前,微軟有 Semantic Kernel 作為企業級 AI Agent 開發 SDK,有實驗性質的 AutoGen 框架用於處理多 Agent 協調應用,而 Agent Framework 的定位則是要綜合二者優點取而代之。比較表來源
| 項目 | Semantic Kernel | AutoGen | Microsoft Agent Framework |
|---|---|---|---|
| 重點 Focus | 穩定 SDK,提供企業場景連接器 、工作流程與可觀測性 | 實驗性質的多代理協同編排 | 結合創新與企業應用需求的統一 SDK |
| 互通性 Interop | 外掛、連接器,支援 MCP、A2A、OpenAPI | 支援工具整合,但缺乏標準化 跨執行環境通訊協定 | 內建連接器,支援 MCP + A2A + OpenAPI |
| 記憶體 Memory | 多種向量資料庫連接器與記憶體儲存抽象 (如 Azure SQL、Elasticsearch、MongoDB) | 支援記憶體內/緩衝區歷史紀錄、 外部向量資料庫記憶體選項 (ChromaDB、Mem0 等) | 可插拔式記憶,支援內建與第三方儲存; 具備持久化與自適應記憶體,結合混合檢索方法 |
| 編排 Orchestration | 確定性 + 動態編排 (Agent Framework、Process Framework) | 動態 LLM 編排(辯論、反思、 促進者/工作者、群組對話) | 確定性 + 動態編排(代理編排、工作流程編排) |
| 企業就緒 Enterprise readiness | 遙測、可觀測性、合規掛鉤 | 最低限度 | 可觀測性、核准流程、CI/CD、 長時間執行的耐久性、狀態還原(Hydration) |
Microsoft Agent Framework 是一組開源 SDK 與 Runtime,支援 .NET (Microsofty.Agents.AI) 及 Python (pip install agent-framework) 兩種程式語言,可以配合單一 Agent 也可以擴展到 Graph-Based 多 Agent Workflow。既然是 Framework,Agent Framework 可以整合各家 AI 模型,搭配 Github Copilot、OpenAI、Azure OpenAI (AOAI)、Anthropic (Claude)、Ollama... 等 Provider 使用。

這裡順便簡要解釋表格提到的名詞:
- Function Tools - 把自己寫的程式碼包成工具,讓 Agent 在需要時呼叫
- Structured Output - 模型在呼叫工具時,產生結構化的 JSON/物件輸出,框架將其轉成型別安全的結果
- Code Interpreter - 由 Provider 代管的程式碼執行工具,Agent 生成並在 Sandbox 執行一次性的 Python 程式以進行計算、資料分析、產生檔案等
- File Search - 由 Provider 管理向量索引/檔案儲存,讓 Agent 直接呼叫檔案搜尋工具對上傳的文件或知識庫進行檢索
- MCP Tools - 透過 Model Context Protocol 協定為外部系統提供統一介面供 Agent 呼叫應用
- Background Responses - 執行長時間工作時,Agent 先回一個 Continuation Token,真正的處理在背景跑,客戶端用此 Token 定期輪詢或恢復中斷的串流
純當 Agent 使用者相對簡單,會下 Prompt 就夠了。但如果想自己寫出像 Copilot Agent 模式的功能,上面就是我們必須考量的配套工作,要準備 MCP 或 Tools、執行環境運行 MCP Server... 等,而 Agent Framework 提供 SDK 簡化開發,Azure OpenAI 或 Azure AI Foundry 則是微軟提供的運行平台。例如:Agent 想擁有長期記憶(上個月你曾問過的問題)不能全靠記憶體而需要向量資料庫長期保存、要包含文件知識庫則也需要向量索引與搜尋,個人玩家可以買個 OpenAI/Calude/Gemini 訂閱帳號自己土砲拼裝,企業級應用要考量資安、可監測性、合規... 等因素~~(重要的是出事有廠商坦)~~,大多數人會採用 Azure OpenAI 或 Azure AI Foundry 這類可涵蓋 LLM 模型、微調訓練、容器托管、虛擬主機、雲端資料庫的 AI 全家桶。(為什麼要用 Azure 不自己兜?企業自有企業的理由,懂的就懂)
延伸閱讀:想進一步認識 Azure AI Foundry,推薦 Scott Hanselman 跟 AI Foundry PM Yina Arenas 在 Build 大會的這場 Demo,蠻精彩的。
最後,依照慣例,寫點練習程式作為文章結尾。
我打算利用 Micrsoft Agent Framework + GPT-5.2-Chat 模型,寫一個可以依據照片內容分類,歸檔到各分類資料夾的 AI Agent。假設我有以下張照片,圖片共有風景、人像、動物、美食、運動、物品六種分類:

先看結果,我們可以用自然語言請 Agent 分類單一圖檔或資料夾下所有圖檔,依其分類存到指定資料夾對映的目錄:


好,來看看怎麼用約 100 行 C# 程式,定義三個 Tool 函式,用 Agent Framwork 將 GPT-5.2-Chat 模型客戶端轉成 AI Agent:
首先專案要參照以下套件,Agent Framework 還很新,現在玩算是站在風口浪尖,記得要加上 -prerelease 參數抓預覽版本,程式才跑得動。另外,Agent Framework 的教學及參考文件還不多,建議看範例程式比較快上手。
dotnet package add Microsoft.Agents.AI --prerelease
dotnet package add Microsoft.Agents.AI.OpenAI --prerelease
dotnet package add Azure.AI.OpenAI --prerelease
dotnet package add Microsoft.Extensions.AI.OpenAI
程式是範例性質,為求簡單我開 Console 專案,全部程式都寫在 Program.cs。總共設計了三個 Tool,GetImageFileList 取得檔案清單、GetImageCategory 利用 GPT 模型視覺能判斷圖片分類、CopyToClassfiedFolder 將圖檔複製到對映資料夾。AIFunctionFactory.Create() 可將方法快速轉成模型可呼叫的工具函式,方法使用方法描述及參數說明可使用 [Description()] Attribute 標示,方便不少。剩下的就是把 Prompt 寫到清楚明確,靠著當代 LLM 的聰慧過人,程式比想像簡單許多~
using Azure.AI.OpenAI;
using System.ClientModel;
using OpenAI.Chat;
using System.ComponentModel;
using Microsoft.Extensions.AI;
using System.Drawing;
var endPoint = Environment.GetEnvironmentVariable("AOAI_EndPoint") ??
throw new InvalidOperationException("AOAI_EndPoint environment variable is not set.");
var key = Environment.GetEnvironmentVariable("AOAI_Key") ??
throw new InvalidOperationException("AOAI_Key environment variable is not set.");
var chatDepName = "gpt-5.2-chat";
var azureOpenAIClient = new AzureOpenAIClient(new Uri(endPoint), new ApiKeyCredential(key));
var chatClient = azureOpenAIClient.GetChatClient(chatDepName);
[Description("Copy the image file to the classified folder based on the category.")]
static string CopyToClassfiedFolder(
[Description("The image file path.")] string imageFilePath,
[Description("The category of the image.")] string category,
[Description("The base folder for classified images.")] string outputBaseFolder = @"D:\Classfied"
)
{
Console.WriteLine($"DEBUG: CopyToClassfiedFolder({imageFilePath}, {category}, outputBaseFolder={outputBaseFolder})");
var classifiedFolder = Path.Combine(outputBaseFolder, category);
Directory.CreateDirectory(classifiedFolder);
var fileName = Path.GetFileName(imageFilePath);
var destinationPath = Path.Combine(classifiedFolder, fileName);
File.Copy(imageFilePath, destinationPath, overwrite: true);
return destinationPath;
}
[Description("Analyze the path, return file path string array for folder, or return array of single file path string for single file.")]
static List<string> GetImageFileList(
[Description("The path to analyze.")]string path
)
{
Console.WriteLine($"DEBUG: GetImageFileList({path})");
if (File.Exists(path)) return new List<string> { path };
else if (Directory.Exists(path))
{
var supportedExtensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { ".jpg", ".jpeg", ".png" };
var files = Directory.GetFiles(path);
return files.Where(f => supportedExtensions.Contains(Path.GetExtension(f))).ToList();
}
else
{
return [];
}
}
var agent = azureOpenAIClient
.GetChatClient(chatDepName)
.AsAIAgent(
instructions: """
你是圖片分類助理,協助依據使用者提供的圖片路徑(或資料夾路徑),以及輸出資料夾,判斷圖片的分類並將其複製到對映的分類資料夾。
執行提示:
- 解析使用者提供的路徑,呼叫 GetImageFileList 判斷是單一圖片還是資料夾,取得待處理圖片檔案清單。
- 依據使用者提供圖片,呼叫 GetImageCategory 函式來判斷圖片的分類。
- 呼叫 CopyToClassfiedFolder 將圖片複製到對應分類的資料夾中。
""",
tools: [
AIFunctionFactory.Create(
async ([Description("The image file path.")] string imageFilePath) => {
Console.WriteLine($"DEBUG: GetImageCategory({imageFilePath})");
var imageBytes = BinaryData.FromBytes(File.ReadAllBytes(imageFilePath));
var mimeType = $"image/{Path.GetExtension(imageFilePath).TrimStart('.')}";
var messages = new List<OpenAI.Chat.ChatMessage>
{
new SystemChatMessage("You are an image classifier. Classify the image into one of the following categories: 風景, 人像, 動物, 美食, 運動, 物品. Please provide only the category name as the output."),
new UserChatMessage(
ChatMessageContentPart.CreateTextPart("Classify this image:"),
ChatMessageContentPart.CreateImagePart(imageBytes, mimeType)
)
};
try {
var response = await chatClient.CompleteChatAsync(messages);
Console.WriteLine($"DEBUG: 分類結果 = {response.Value.Content[0].Text}");
return response.Value.Content[0].Text;
}
catch (Exception ex)
{
return $"分類失敗:{ex.Message}";
}
},
name: "GetImageCategory",
description: "Classifies an image into predefined categories."
),
AIFunctionFactory.Create(GetImageFileList),
AIFunctionFactory.Create(CopyToClassfiedFolder)
]
);
while (true) {
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("輸入指令:");
var prompt = Console.ReadLine();
Console.ResetColor();
if (string.IsNullOrWhiteSpace(prompt)) continue;
var res = await agent.RunAsync(prompt);
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine(res);
Console.ResetColor();
}
就醬,我也會寫 AI Agent 了! (轉圈灑花)
Explores the rise of AI Agents in 2025, focusing on GitHub Copilot Agent Mode and Microsoft Agent Framework. Explains agent concepts, tooling, and demonstrates building a C# image-classification agent using GPT‑5.2 with minimal code.
Comments
Be the first to post a comment