在昨天的大菜「AI 經理人」上桌後,各位饕客是不是意猶未盡呢?今天,我們將正式走進廚房,親手聘請你的第一位 AI 員工,也就是最基礎也最靈活的經理人:ChatCompletionAgent
。
為什麼說它是最基礎?因為它是基於我們最熟悉的 ChatCompletionService
所打造的。為什麼說它最靈活?因為你可以透過豐富的 Instructions
和任意的 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
已經明確界定了它的角色與職責。
前面我們聘請的英文老師只會說話,還不夠完美。如果我們想讓它能查詢天氣,或是執行更複雜的任務,該怎麼辦呢?這時,我們需要給它掛載 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 應用更上一層樓!