Chuyển đến nội dung chính

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 ý.
👉 Với 3 bước này, bạn đã có một instruction ngắn gọn nhưng đủ mạnh để biến AI từ công cụ chung thành trợ lý chuyên biệt, đúng phong cách và an toàn.

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

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.