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

Semantic Kernel: AI Agent & Kỹ Thuật Prompting Nâng Cao – Part 3

Mình vừa học, vừa ghi chú lại những phần đã học trước đó:

Giới Thiệu: Nâng cấp Agent từ "Tính cách" đến "Logic"

Trong Phần 2, chúng ta đã định hình Persona cho Agent bằng Instruction cơ bản , biến nó thành một nhân vật có vai trò và khí chất. Trong phần này, chúng ta nâng cấp Agent bằng cách thêm logic suy luận và khả năng tự nhận thức vào Instruction để Agent biết cách làm việc và giới hạn hiểu biết của mình. 

Các kỹ thuật quan trọng sẽ được triển khai là: 

Structured Reasoning thay thế cho Chain-of-Thought (CoT) nội bộ, tạo ra mạch suy luận an toàn và minh bạch. 

Self-Scoring: Thêm lớp tự nhận thức để Agent báo cáo độ tin cậy. 

Agent Routing qua GetScoreAsync(): Sử dụng Scoring để kích hoạt Agent phù hợp trong hệ thống Multi-Agent.

Structured Reasoning

Kỹ thuật Chain-of-Thought (CoT) rất mạnh mẽ vì nó buộc mô hình phải phân tích từng bước trước khi trả lời. Tuy nhiên, việc yêu cầu mô hình tiết lộ quy trình tư duy nội bộ bằng các thẻ THOUGHT: có thể dẫn đến hallucination trong luồng tư duy hoặc tạo ra định dạng không nhất quán.

Structured Reasoning khắc phục điều này. Chúng ta hướng dẫn Agent sử dụng tư duy logic đó và trình bày nó dưới định dạng cấu trúc, an toàn (ví dụ: Key Points, gạch đầu dòng) thay vì mô tả quá trình tư duy nội bộ của LLM.

Ví dụ

Chúng ta giữ Persona là "chuyên gia phân tích văn học cổ" và bổ sung quy tắc về quy trình làm việc:

var instructions = """
// ROLE: You are an expert in classical literature analysis.
// GOAL:

// - Analyze content, imagery, rhetorical devices, and historical context.
// - Present clear logic without disclosing the model's internal thought process.

// REASONING RULE:

// - Use "Structured Reasoning".
// - Present analysis in 3 structural parts:
//   1) Key Points (bullet points)
//   2) Detailed explanation
//   3) Concise conclusion


// OUTPUT FORMAT:

// ANALYSIS:
// [analysis...]
// CONCLUSION:
// [summary]
""";
Structured Reasoning giúp tăng tính minh bạch, dễ đọc, và kiểm soát được cấu trúc đầu ra mà vẫn giữ được logic suy luận chuyên môn.

Self-Scoring: Lớp Tự Nhận Thức quan trọng

Self-Scoring là kỹ thuật mà Agent tự báo cáo mức độ tự tin về câu trả lời của mình dựa trên dữ liệu đầu vào. Kỹ thuật này không làm mô hình thông minh hơn, nhưng nó là một lớp tự kiểm soát quan trọng:
  • Giảm Hallucination: Buộc mô hình phải khai báo độ chắc chắn, giảm khuynh hướng "đoán mò".
  • Hỗ trợ Router: Trong các hệ thống phức tạp, điểm này có thể được Router sử dụng để đánh giá chất lượng phản hồi.
Ví dụ Self-Scoring Chuẩn
Chúng ta yêu cầu Agent là "Fact Checker lịch sử" tự đánh giá độ tin cậy:
var instructions = """
// ROLE: Bạn là Fact Checker lịch sử. (You are a historical Fact Checker.)

// REQUIREMENTS:
// - Luôn giải thích bằng structured reasoning. (Always explain using structured reasoning.)
// - Sau câu trả lời, tự đánh giá độ tin cậy theo thang 0.0 → 1.0. (After the answer, self-evaluate confidence on a 0.0 to 1.0 scale.)
// - 0.0 means the answer is based on speculation or non-verifiable sources.
// - 1.0 means the answer is verifiable with multiple reliable sources.
// - Nếu thiếu dữ liệu, phải nêu rõ sự không chắc chắn. (If data is missing, state the uncertainty clearly.)

// OUTPUT:
// ANSWER: ...
// CONFIDENCE: [0.0 - 1.0]
""";

Routing Thông minh với GetScoreAsync()

Trong Semantic Kernel, GetScoreAsync() là một hàm Agent tự triển khai  nhằm tính toán mức độ phù hợp của nó đối với một câu hỏi cụ thể.

Lưu ý: GetScoreAsync() không phải Self-Scoring của mô hình (như ở mục 3), mà là Scoring của chính Agent, được sử dụng bởi Router/Planner để xem Agent hoặc Tool nào phù hợp nhất khi có nhiều tùy chọn. 

Ví dụ này minh họa cách kết hợp nhiều tiêu chí để tính điểm (Score) cho Agent Lịch sử.

public override Task<double> GetScoreAsync(ChatHistory history, string userMessage)
{
    // Initialize score
    double score = 0.0;
    
    // 1. Check for core topic relevance (History is primary)
    // If the message contains "lịch sử", give a base high score.
    if (userMessage.Contains("lịch sử", StringComparison.OrdinalIgnoreCase))
        score += 0.60;

    // 2. Check for specialization (Việt Nam history is a bonus)
    // If the message is specifically about "Việt Nam", add bonus relevance.
    if (userMessage.Contains("Việt Nam", StringComparison.OrdinalIgnoreCase))
        score += 0.30; 
    
    // 3. Apply a minimum threshold logic. 
    // If the combined score is too low, we set it to 0.0 to signal retreat.
    // Ensure the final score does not exceed 1.0.
    if (score < 0.5)
        return Task.FromResult(0.0);
    else
        return Task.FromResult(Math.Min(1.0, score));
}

Tham khảo

From Prompting to Purpose: Creating a Chain of Thought 

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.