Công nghệ - 22/12/2025 16:56:06
Ở những năm 2000, khi viết một câu lệnh SQL Stored Procedure dài 500 dòng là niềm tự hào của một backend developer. Chúng ta tối ưu từng cái index, nâng niu từng câu JOIN. Nhưng gần đây, tôi nhận ra một sự thật phũ phàng: Ông sếp lưỡi không lông của tôi không quan tâm đến SQL của bạn đẹp thế nào. Hắn chỉ quan tâm đến Dữ Liệu.
Hắn muốn hỏi: "Doanh thu tháng này so với cùng kỳ năm ngoái thế nào?"và ếch muốn chờ tôi export report, quần quật mất 3 ngày 3 đêm.
Đó là lý do Text-to-SQL Agent ra đời. Và nếu bạn nghĩ đây là sân chơi riêng của Python, thì hãy để tôi, một coder chỉ biết tới .NET lại muốn chứng minh rằng: .NET vẫn là "chân ái" cho hệ thống của chúng tôi.
Nhiều bạn sẽ hỏi: "Chỉ cần ném schema vào ChatGPT là nó viết được SQL mà?"
Đúng, nhưng chưa đủ. Để tối ưu hệ thống dữ liệu lớn, và tránh tình trạng rất dễ gặp ảo giác. Nó có thể bịa ra tên bảng, sai cú pháp SQL, mà bạn có thể mất vài tiếng để review và debug hoặc nguy hiểm hơn là tạo ra các truy vấn "quét sạch" database của bạn.
Và chốt lại một AI Agent viết bằng .NET sẽ hoạt động như một "kỹ sư ảo" với quy trình suy nghĩ (Chain of Thought):
Python có LangChain, và phía .net chúng ta có Semantic Kernel (SK). Đây là SDK mã nguồn mở của Microsoft giúp tích hợp LLM vào code C# một cách mượt mà như cách chúng ta dùng Dependency Injection vậy.
Tại sao tôi chọn stack này, dưới đây là một vài key-point:
Để xây dựng một Agent "thông minh" và an toàn, tôi đề xuất kiến trúc sau dựa trên các nghiên cứu từ Microsoft Learn và kinh nghiệm thực tế:
Bước 1: RAG cho Metadata của thông tin bảng
Chúng ta sẽ không ném cả 100 bảng vào Prompt (tốn token và gây nhiễu), hãy liệt kê danh sách bảng, sau đó dùng Vector Search để tìm ra 5-10 bảng liên quan nhất đến câu hỏi của người dùng.
Bước 2: The "Planner" (Bộ não của Agent)
Sử dụng Function Calling trong Semantic Kernel. Chúng ta định nghĩa các hàm như GetTableSchema, ExecuteQuery (read-only), CorrectSyntax. Agent sẽ tự biết khi nào cần gọi hàm nào.
Một tip nhỏ tôi hay dùng để chuẩn hóa câu prompt bằng cách cung cấp cho Agent một vài ví dụ mẫu (kỹ thuật Few-shot prompting) về cách database của bạn được tổ chức. Ví dụ: "Bảng 'Orders' liên kết với 'Users' qua 'CustomerId', không phải 'UserId'".
Bước 3: Vòng lặp sửa lỗi (The Feedback Loop)
Đây là điểm ăn tiền. Nếu SQL sinh ra bị lỗi runtime, Agent sẽ bắt lỗi đó (exception), đọc thông báo lỗi, và viết lại câu lệnh mới. Đây là tư duy của một Senior Dev được codify vào AI.
Đây là điểm ăn tiền. Nếu SQL sinh ra bị lỗi runtime, Agent sẽ bắt lỗi đó (exception), đọc thông báo lỗi, và viết lại câu lệnh mới. Đây là tư duy của một Senior Dev được codify vào AI.
Nếu bạn là người làm hệ thống lão luyện, bạn sẽ không bao giờ tin tưởng hoàn toàn vào đầu vào từ người dùng hay đầu ra của AI.
Đây là phần 'thịt' của vấn đề. Dưới đây là cách tôi dựng khung sườn cho một SQL Agent sử dụng .NET 8 và Semantic Kernel. Chú ý cách chúng ta dùng Description attribute để 'dạy' AI hiểu về code của mình.
1. Định nghĩa "Tools" cho Agent
Đây là nơi chúng ta biến các hàm C# thành công cụ mà AI có thể gọi.
2. Cấu hình "Brain" cho Agent
Đây là đoạn code kết nối Azure OpenAI và kích hoạt chế độ tự động suy luận (Auto Function Calling).
AI sẽ tự động:
Một số lưu ý:
Công nghệ không chờ đợi ai. Việc xây dựng Text-to-SQL Agent không chỉ là tạo ra một tính năng "cool ngầu", mà là trao quyền dữ liệu (Data Democratization).
Là .NET Developer, bạn đang nắm trong tay những công cụ mạnh mẽ nhất (C#, Azure OpenAI, Semantic Kernel). Đừng để rào cản ngôn ngữ lập trình khiến bạn nghĩ rằng AI chỉ dành cho Python. Hãy bắt đầu ngay hôm nay!
Dành cho các bạn muốn đào sâu vào kiến trúc, các tài liệu này của Microsoft giải thích rất kỹ:
Hãy để lại Comment bên dưới để chúng ta cùng thảo luận về những thách thức khi triển khai thực tế nhé! 👇
♻️ Repost nếu bạn thấy bài viết này hữu ích cho cộng đồng nhé.
#DotNet #AI #SemanticKernel #TextToSQL #ArtificialIntelligence #SoftwareArchitecture #Microsoft #AzureOpenAI #Coding #TechLead