Semantic Kernel: Từ "Bạch" Cổ Phong Đến AI: Thổi Hồn Cho Agent Với Semantic Kernel Instructions - Part 2
Giới thiệu
Một lần vô tình nghe lại bài nhạc trong 1 bộ phim cũ, học về AI, thấy có sự liên quan nhẹ nên mình lồng ghép bài hát vào phần mở đầu.
Các bài viết trong series:
Phần 1: Semantic Kernel là gì?
Instruction – Phần “Bạch” trong Microsoft.SemanticKernel.Agents
Trong phim Đát Kỷ Trụ Vương (TVB), ngay từ giây phút mở màn, khán giả đã nghe một đoạn “Bạch” hùng tráng:Chữ Hán:
仙神人鬼從今定,不使朝朝墮草萊。
太上原始天尊敕令:「五方之神,來受命耳!」
此乃《封神榜》。
Hán–Việt:
Tiên thần nhân quỷ tòng kim định, bất sử triêu triêu đọa thảo lai.
Thái Thượng Nguyên Thủy Thiên Tôn sắc lệnh: “Ngũ phương chi thần lai thụ mệnh nhĩ!”
Thử nãi Phong Thần Bảng.
Dịch nghĩa:
Từ nay định rõ tiên, thần, người, quỷ – chẳng để chúng sinh chìm trong lầm than.
Thái Thượng Nguyên Thủy Thiên Tôn ban lệnh:
“Các thần năm phương, hãy đến nhận mệnh!”
Đây chính là Phong Thần Bảng.
Một đoạn Bạch ngắn thôi, nhưng nó mở ra khí thế bi tráng, định hình bối cảnh, khẳng định trọng trách. Sau đó, người xem mới bước vào câu chuyện dài phía sau.
Trong thế giới AI cũng vậy — khi tạo Agent bằng Microsoft.SemanticKernel.Agents, phần Instruction chính là “lời Bạch” khai màn cho mọi hành động và đối thoại sau đó.
Instruction là gì?
Trong Semantic Kernel, một Agent không chỉ là “cái máy trả lời” mà là một nhân vật có vai trò, khí chất, và cách hành xử.
- Name/Role: Tên gọi và vai trò.
- Instruction: Lời dẫn dắt, nguyên tắc hành xử.
- Tools/Plugins: Công cụ hỗ trợ tác vụ.
Instruction là lời tuyên thệ ban đầu, định hình tinh thần và giọng điệu của Agent. Nếu prompt của người dùng là câu chuyện chính, thì Instruction chính là bối cảnh mở màn.
Vậy Instruction có liên quan gì đến Persona?
Nếu bạn đã từng tìm hiểu về thiết kế AI, có lẽ bạn đã nghe đến thuật ngữ Persona – tức là "nhân cách" hay "bản thể" của AI. Vậy Instruction và Persona có phải là một?
Câu trả lời là Có, về bản chất chúng là một, nhưng được nhìn từ hai góc độ khác nhau: Thiết kế và Triển khai.
Persona là Bản thiết kế (The "What"): Đây là khái niệm trừu tượng, là bản thiết kế nhân vật trên giấy. Khi một đội phát triển sản phẩm thảo luận, họ sẽ nói: "Chúng ta cần xây dựng một AI có persona là một chuyên gia tài chính cẩn trọng và đáng tin cậy". Persona trả lời câu hỏi: "AI của chúng ta NÊN là người như thế nào?"
Hiện thực hóa
Cài đặt packages:dotnet add package Microsoft.SemanticKernel.Agents
Implement lại hàm Invoke(). Ở bước này bạn chưa cần quan tâm đến ChatHistory mà chỉ cần chú ý đến Instruction. Instruction như lời chỉ dẫn
public async Task<ChatMessageContent> InvokeAgentAsync(ChatHistory chatHistory, string instructions, string? serviceId = null)
{
var kernel = _kernelFactory.Create(serviceId);
var agent = new ChatCompletionAgent()
{
Kernel = kernel,
Instructions = instructions,
};
var agentResponse = agent.InvokeAsync(chatHistory);
await foreach (var item in agentResponse)
{
return item.Message;
}
throw new InvalidOperationException("No response from agent.");
}
Khai báo Instruction và gọi hàm:
var instructions = "Bạn là một nhà nghiên cứu lịch sử uyên bác và khách quan...";
var chatHistory = new ChatHistory();
chatHistory.AddUserMessage(userInput);
var agentResponse = await _semanticService.InvokeAgentAsync(chatHistory, instructions, "gemini");
Viết Instruction trong Semantic Kernel: 3 bước cơ bản
Khi xây dựng agent với Semantic Kernel, ta có thể “lập trình” hành vi AI bằng ngôn ngữ tự nhiên thông qua instruction. Cách đơn giản nhất là theo 3 bước:
- Xác định Vai trò và Mục đích – định nghĩa rõ AI là ai và làm gì (ví dụ: “Bạn là một trợ lý sách am hiểu, giúp độc giả khám phá văn học”).
- Thiết lập Phong cách và Hành vi – mô tả cách AI nên trả lời (ngắn gọn, sâu sắc, tôn trọng trải nghiệm người dùng...).
- Đặt ra Quy tắc Tương tác – chỉ rõ khi nào cần hỏi lại, cách thừa nhận giới hạn và cách đưa ra gợi ý.
Chat History
Ở ví dụ trước, mình dùng Instructions (Kịch bản) định hình nhân vật. "Ngươi là một nhà sử học, ngươi phải khách quan, ngươi phải uyên bác." Nhân vật này sẽ không bao giờ thay đổi vai diễn của mình. Nhưng nhân vật cần học hỏi và phát triển vai diễn của mình thông qua ChatHistory (Trí nhớ và kinh nghiệm). Nhân vật không thay đổi bản chất, nhưng cách họ thể hiện bản chất đó sẽ trở nên tinh tế hơn, sâu sắc hơn dựa trên những gì họ đã trải qua (lịch sử trò chuyện).Có nhiều cách để lưu History, mình chọn lưu vào session trong ví dụ này
Khai báo Session trong file Program.cs//...
builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(30);
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
//...
app.UseSession();
Save và get History từ Session:
private void SaveChatHistoryToSession(ChatHistory chatHistory)
{
var historyJson = JsonSerializer.Serialize(chatHistory);
HttpContext.Session.SetString("AgentChatHistory", historyJson);
}
private ChatHistory GetChatHistoryFromSession()
{
if (HttpContext.Session.GetString("AgentChatHistory") is { } historyJson)
{
return JsonSerializer.Deserialize<ChatHistory>(historyJson) ?? new ChatHistory();
}
return new ChatHistory();
}
Gọi Session trước khi gởi Prompt:
var instructions = "Bạn là một nhà nghiên cứu lịch sử uyên bác và khách quan. Nhiệm vụ của bạn là cung cấp các câu trả lời chi tiết, chính xác về các sự kiện lịch sử mà người dùng hỏi. Hãy luôn trình bày thông tin một cách có cấu trúc, rõ ràng và giữ thái độ trung lập, học thuật.";
var chatHistory = GetChatHistoryFromSession();
chatHistory.AddUserMessage(userInput);
var agentResponse = await _semanticService.InvokeAgentAsync(chatHistory, instructions, "gemini");
chatHistory.Add(agentResponse);
SaveChatHistoryToSession(chatHistory);
ViewBag.ChatHistory = chatHistory;Giải thích
ChatHistory: là tập hợp các ChatMessageContent. Mỗi ChatMessageContent có mấy thành phần chính:
- AuthorRole (AuthorRole) → ai là người phát ngôn.
- AuthorRole.User → tin nhắn từ người dùng
- AuthorRole.Assistant → phản hồi của Agent/LLM
- AuthorRole.System → instruction / chỉ dẫn hệ thống (thường chính là chỗ bạn truyền “Bạch”)
- AuthorRole.Tool (hoặc plugin/agent khác) → khi gọi công cụ trả kết quả về
- Content (string) → nội dung hội thoại (text hoặc multimodal).
- AdditionalProperties (IReadOnlyDictionary<string, object>) → metadata bổ sung (ví dụ token usage, id message, vv).
Nhận xét
Đăng nhận xét