iT邦幫忙

2025 iThome 鐵人賽

DAY 29
0

回顧過去幾天,我們已經學會了如何讓 AI 獨立完成任務(Function Calling)或與其他 AI 進行協作(Agents)。這就像是我們的廚師能夠獨立完成一道菜,或者和其他廚師一起工作。

但對於真正的企業級商業流程,我們需要的是一套標準化、可重複、且能夠處理複雜分支邏輯的「中央廚房生產線」。單純的聊天或單次工具呼叫已經不夠了!

今天,我們要來探索 Semantic Kernel (SK) 裡一個極具野心且仍處於實驗階段 (Experimental) 的框架:Process Framework。它正是為了解決那些跨越多個步驟、需要精確順序控制的複雜商業流程而設計。

⚙️ 當 AI 遇到「作業流程圖」:Process Framework

你可以將 Process Framework 想像成一套流程圖繪製工具,它允許你將多個 SK 的功能、Plugins、甚至是其他 Agents,像積木一樣精確地串連起來,形成一個嚴謹的、可追蹤的自動化流程。

在 Process Framework 中,核心概念如下:

  1. Process (流程): 這是整個自動化任務的藍圖(例如:完成一份月度報告)。它定義了從開始到結束的完整路徑。
  2. Step (步驟): 流程中的最小工作單元。它可以是一個 LLM 呼叫、一個 Plugin 函式,甚至是一個 Agents 的互動回合。
  3. Pattern (模式): 這是流程的「控制閘門」,用於處理複雜的邏輯。
    • Fan Out (扇出): 同時啟動多個步驟(並行處理)。
    • Fan In (扇入): 等待所有並行步驟完成後,再進入下一步(結果彙整)。
    • Cycle (循環): 建立一個循環,直到滿足特定條件才跳出(例如:持續校對直到錯誤率為零)。

透過這三個概念,我們就能把原本需要數十行 if/else 或手動的 await 程式碼,轉換為清晰、高可讀性的流程定義。

📄 實戰:文件生成與校對的自動化流程

我們以一個常見的企業流程——自動化文件生成流程——作為範例:

  1. Step 1: 資訊蒐集 (CollectData):使用 RAG Plugin 從內部文檔或網路搜尋相關資訊。
  2. Step 2: 初稿生成 (GenerateDraft):使用 LLM 根據蒐集到的資料生成文章初稿。
  3. Step 3: 語法校對 (ReviewDraft):使用另一個 LLM 或專門的 Plugin 檢查語法與錯字。
  4. Step 4: 人工審核 (HumanApproval):流程暫停,等待使用者確認是否發布(Human-in-the-loop)。
  5. Step 5: 文件發布 (PublishDocument):使用 Logic App Plugin 將最終文件發布到 SharePoint。

C# 範例程式碼:定義一個自動化文件流程

由於 Process Framework 處於實驗階段且 API 變動較大,這裡我們將以概念性的 C# 程式碼來展示如何定義這個流程結構,強調其邏輯而非具體實現細節。

我們將使用 Microsoft.SemanticKernel.Experimental.Process 命名空間下的概念。

using Microsoft.SemanticKernel;
using Microsoft.Extensions.Configuration;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using Microsoft.SemanticKernel.Process;
using Day29.Plugins;
using Day29.Workflows;
using Day29.ProcessFramework;
using Day29.ProcessSteps;

// Day 29: Semantic Kernel Process Framework 實作
// 本範例展示如何使用 Semantic Kernel Process Framework 建立複雜的工作流程
// 包含:資料收集 → 草稿生成 → 審核循環 → 文件發布

var configuration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json", optional: true)
    .AddUserSecrets<Program>()
    .Build();

// 建立 Kernel
var kernel = CreateKernel(configuration);

Console.WriteLine("🚀 Semantic Kernel Process Framework 示範");
Console.WriteLine(new string('=', 60));

// 示範 1: 基本 Process Framework 使用
await RunProcessFrameworkDemoAsync(kernel);

// 示範 2: 傳統工作流程比較
await RunTraditionalWorkflowDemoAsync(kernel);

// 示範 3: 並行處理多個流程
await RunMultipleProcessesAsync(kernel);

Console.WriteLine("\n🎉 所有示範完成!");
Console.WriteLine("按任意鍵結束程式...");
Console.ReadKey();

/// <summary>
/// 建立並設定 Semantic Kernel
/// </summary>
static Kernel CreateKernel(IConfiguration configuration)
{
    var builder = Kernel.CreateBuilder();

    // 設定 OpenAI
    var openAiApiKey = configuration["OpenAI:ApiKey"];
    if (!string.IsNullOrEmpty(openAiApiKey))
    {
        builder.AddOpenAIChatCompletion("gpt-4o", openAiApiKey);
        Console.WriteLine("✅ 使用 OpenAI 服務");
    }
    else
    {
        Console.WriteLine("⚠️ 未設定 API 金鑰,將使用模擬模式");
    }

    return builder.Build();
}

/// <summary>
/// 示範 Process Framework 的使用
/// </summary>
static async Task RunProcessFrameworkDemoAsync(Kernel kernel)
{
    Console.WriteLine("📋 示範 1: Process Framework 完整工作流程");
    Console.WriteLine(new string('-', 50));

    try
    {
        // 執行 Process Framework 流程
        var topic = "Semantic Kernel Process Framework";
        Console.WriteLine($"🚀 開始執行 Process Framework 流程: {topic}");

        var result = await DocumentProcessBuilder.ExecuteDocumentGenerationProcessAsync(kernel, topic);
        
        Console.WriteLine($"✅ Process Framework 流程完成!");
        Console.WriteLine($"📊 結果: {result}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"❌ Process Framework 執行失敗: {ex.Message}");
    }

    Console.WriteLine();
}

/// <summary>
/// 示範傳統工作流程方法
/// </summary>
static async Task RunTraditionalWorkflowDemoAsync(Kernel kernel)
{
    Console.WriteLine("📋 示範 2: 傳統工作流程方法");
    Console.WriteLine(new string('-', 50));

    try
    {
        // 註冊傳統 Plugins
        RegisterWorkflowPlugins(kernel);

        // 執行傳統工作流程
        var workflow = new DocumentGenerationWorkflow(kernel);
        var result = await workflow.ExecuteAsync("傳統工作流程範例");

        Console.WriteLine($"✅ 傳統工作流程完成!");
        Console.WriteLine($"📊 結果: {result}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"❌ 傳統工作流程執行失敗: {ex.Message}");
    }

    Console.WriteLine();
}

/// <summary>
/// 示範並行處理多個流程
/// </summary>
static async Task RunMultipleProcessesAsync(Kernel kernel)
{
    Console.WriteLine("📋 示範 3: 並行處理多個 Process Framework 流程");
    Console.WriteLine(new string('-', 50));

    var topics = new[]
    {
        "AI Agent 設計模式",
        "Prompt Engineering 最佳實務", 
        "記憶體管理策略"
    };

    var tasks = topics.Select(async topic =>
    {
        try
        {
            var startTime = DateTime.Now;
            
            // 為每個任務建立獨立的 Kernel 實例以避免衝突
            var taskKernel = kernel.Clone();
            
            var result = await DocumentProcessBuilder.ExecuteSimpleSequentialProcessAsync(taskKernel, topic);
            var duration = DateTime.Now - startTime;

            return $"✅ {topic}: 成功 (耗時: {duration.TotalSeconds:F1}秒)";
        }
        catch (Exception ex)
        {
            return $"❌ {topic}: 失敗 - {ex.Message}";
        }
    }).ToArray();

    var results = await Task.WhenAll(tasks);

    Console.WriteLine("🎯 並行處理結果:");
    foreach (var result in results)
    {
        Console.WriteLine($"  📄 {result}");
    }

    Console.WriteLine();
}

/// <summary>
/// 註冊工作流程相關的 Plugins (用於傳統工作流程比較)
/// </summary>
static void RegisterWorkflowPlugins(Kernel kernel)
{
    // 註冊各個功能 Plugin
    kernel.ImportPluginFromType<RAGPlugin>("RAGPlugin");
    kernel.ImportPluginFromType<LLMPlugin>("LLMPlugin");
    kernel.ImportPluginFromType<ReviewPlugin>("ReviewPlugin");
    kernel.ImportPluginFromType<LogicAppPlugin>("LogicAppPlugin");

    Console.WriteLine("✅ 已註冊所有傳統工作流程 Plugins");
}

依照範例程式碼的重點對照

  • 示範 1(RunProcessFrameworkDemoAsync):以 DocumentProcessBuilder 執行完整的文件自動化流程,涵蓋 CollectData → GenerateDraft → ReviewDraft(可循環)→ HumanApproval → Publish。強調以「流程定義」驅動執行。
  • 示範 2(RunTraditionalWorkflowDemoAsync):以傳統方式組裝工作流程,先註冊 Plugins(RAGPlugin、LLMPlugin、ReviewPlugin、LogicAppPlugin),再以 DocumentGenerationWorkflow 線性呼叫,比對可讀性與維護性差異。
  • 示範 3(RunMultipleProcessesAsync):以 topics 陣列並行啟動多個流程,每個任務 clone 一個 Kernel 避免資源衝突,再彙總結果。適合批次產出多主題內容。
  • Plugins 與步驟對應:
    • RAGPlugin → CollectData
    • LLMPlugin → GenerateDraft
    • ReviewPlugin → ReviewDraft(可搭配循環條件)
    • LogicAppPlugin → Publish(外部系統整合)
  • 設定與相依:
    • 透過 IConfiguration 讀取 OpenAI:ApiKey。未設定時以「模擬模式」運行,文中需提醒讀者實務請配置金鑰。
    • 使用 builder.AddOpenAIChatCompletion("gpt-4o", apiKey) 建立聊天模型連線。
  • 注意事項:
    • Process Framework 屬實驗性質,API 可能變動。文中建議以「流程定義」的觀念理解,避免過度綁定暫時性 API 細節。

在這個範例中,Process Framework 的價值在於:它讓我們的商業邏輯(步驟的順序、循環、分支)從應用程式的執行程式碼中被分離出來,變成一個清晰的流程定義

這不僅提高了程式碼的可維護性,更重要的是,它讓我們的 AI Agent 不只是單純的「工具使用者」,而是能夠理解並執行複雜商業流程的「超級經理人」。這才是真正將 AI 導入企業核心業務的關鍵。


上一篇
Day 28: 防止食譜被篡改:防範提示詞注入攻擊
下一篇
Day 30: 滿漢全席之後:系列總結與未來展望
系列文
AI 全餐,好吃嗎?用 Semantic Kernel 打造你的客製化滿漢全席!30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言