iT邦幫忙

2025 iThome 鐵人賽

DAY 17
0

在昨天的大菜「AI 經理人」上桌後,各位饕客是不是意猶未盡呢?今天,我們將正式走進廚房,親手聘請你的第一位 AI 員工,也就是最基礎也最靈活的經理人:ChatCompletionAgent

為什麼說它是最基礎?因為它是基於我們最熟悉的 ChatCompletionService 所打造的。為什麼說它最靈活?因為你可以透過豐富的 Instructions 和任意的 Plugins,把它訓練成任何你需要的樣子,從文案寫手到技術客服,無所不能。

建立你的第一位 AI 員工:ChatCompletionAgent

要聘請這位新員工,我們只需要為它準備好三樣東西:

  1. 一個廚房 (Kernel):這是它工作的環境。
  2. 一套專業食譜 (Instructions):告訴它工作的職責和風格。
  3. 一套基本工具 (Plugins):讓它擁有執行特定任務的能力。

讓我們直接看程式碼,來建立這位員工並與它互動:

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.Extensions.Configuration;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;

// 步驟一:建立你的頂級廚房 (Kernel)
var config = new ConfigurationBuilder()
    .AddUserSecrets<Program>()
    .Build();

var builder = Kernel.CreateBuilder()
    .AddOpenAIChatCompletion(
        modelId: "gpt-4o-mini",
        apiKey: config["OpenAI:ApiKey"]!);

var kernel = builder.Build();

// 步驟二:為你的 AI 員工設定專業食譜 (Instructions)
var instructions = """
你是一個專業的英文老師,你的目標是幫助學生練習英文。
你應該有耐心,並且專注於提供準確的文法與單字建議。
當學生問到與英文學習無關的問題時,請禮貌地拒絕。
""";

// 步驟三:聘請並設定你的 ChatCompletionAgent 員工
var agent = new ChatCompletionAgent()
{
    Instructions = instructions,
    Kernel = kernel,
    Name = "EnglishTeacher",
    Arguments = new KernelArguments()
};

// 步驟四:開闢一個專屬對話會議室 (AgentThread)
var chatThread = new ChatHistoryAgentThread();

// 步驟五:開始與你的 AI 員工對話!
Console.WriteLine("你好,我是你的英文老師。我們開始練習吧!");
await foreach (ChatMessageContent response in agent.InvokeAsync(new ChatMessageContent(AuthorRole.User, "Hello teacher! What is the weather like today?"), chatThread))
{
    Console.WriteLine($"{response.Role}: {response.Content}");
}
await foreach (ChatMessageContent response in agent.InvokeAsync(new ChatMessageContent(AuthorRole.User, "I goed to the park yesterday."), chatThread))
{
    Console.WriteLine($"{response.Role}: {response.Content}");
}

這段程式碼展示了如何定義一個專注於英文教學的 ChatCompletionAgent,並透過 ChatHistoryAgentThread 來維護多輪對話。當你執行後,你會看到它會先禮貌地拒絕第一個與主題無關的問題,接著精準地回答第二個問題,因為我們給它的 Instructions 已經明確界定了它的角色與職責。


為 Agent 裝上超能力:掛載 Plugins

前面我們聘請的英文老師只會說話,還不夠完美。如果我們想讓它能查詢天氣,或是執行更複雜的任務,該怎麼辦呢?這時,我們需要給它掛載 Plugins,讓它擁有超能力。

讓我們為這位英文老師新增一個 TimePlugin,讓它能夠回答時間相關的問題。

using System.ComponentModel;
using Microsoft.Extensions.Configuration;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Agents;
using Microsoft.SemanticKernel.ChatCompletion;
using Microsoft.SemanticKernel.Connectors.OpenAI;
// 步驟一:建立頂級廚房 (Kernel)
var config = new ConfigurationBuilder()
    .AddUserSecrets<Program>()
    .Build();

var builder = Kernel.CreateBuilder()
    .AddOpenAIChatCompletion(
        modelId: "gpt-4o-mini",
        apiKey: config["OpenAI:ApiKey"]!);

var kernel = builder.Build();

// 將 Plugin 註冊到 Kernel 中
kernel.ImportPluginFromType<TimePlugin>();

// 步驟二:為你的 AI 員工設定專業食譜 (Instructions)
var instructions = """
你是一個專業的英文老師,你的目標是幫助學生練習英文。
你應該有耐心,並且專注於提供準確的文法與單字建議。
你也可以使用你的工具來回答學生的問題。
""";

// 步驟三:聘請並設定你的 ChatCompletionAgent 員工
var agent = new ChatCompletionAgent()
{
    Instructions = instructions,
    Kernel = kernel,
    Name = "EnglishTeacher",
    Arguments = new KernelArguments(
                new OpenAIPromptExecutionSettings()
                {
                    FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
                })
};

// 步驟四:開闢一個專屬對話會議室 (AgentThread)
var chatThread = new ChatHistoryAgentThread();

// 步驟五:開始與你的 AI 員工對話!
Console.WriteLine("你好,我是你的英文老師。");
await foreach (ChatMessageContent response in agent.InvokeAsync(new ChatMessageContent(AuthorRole.User, "What time is it now?"), chatThread))
{
    Console.WriteLine($"{response.Role}: {response.Content}");
}

await foreach (ChatMessageContent response in agent.InvokeAsync(new ChatMessageContent(AuthorRole.User, "Can you help me with this sentence: I am learning English today."), chatThread))
{
    Console.WriteLine($"{response.Role}: {response.Content}");
}

public class TimePlugin
{
    [KernelFunction("GetCurrentTime")]
    [Description("Returns the current time of the day.")]
    public static string GetCurrentTime()
    {
        return DateTime.Now.ToString("HH:mm:ss");
    }
}

你會發現,當我們為它提供一個與時間相關的問題時,它會自動調用我們掛載的 GetCurrentTime 函式,並將結果返回給你。

這就是 ChatCompletionAgent 的魅力所在,你只需要定義好它的職責 (Instructions)和能力 (Plugins),它就能夠自主地判斷並完成任務。它不像傳統的 AI 聊天機器人那樣被動,而是像一位主動且專業的員工,隨時待命。


明天,我們將介紹另一位重量級員工,來自 OpenAI 的官方派遣工:OpenAIAssistantAgent,看看它如何利用 OpenAI Assistants API 的強大能力,讓我們的 AI 應用更上一層樓!

完整程式碼範例


上一篇
Day 16: 歡迎來到 AI 經理人時代:Agent Framework 介紹
下一篇
Day 18: 來自 OpenAI 的官方派遣工:OpenAIAssistantAgent
系列文
AI 全餐,好吃嗎?用 Semantic Kernel 打造你的客製化滿漢全席!20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言