Tự xây hệ thống Text-to-SQL với Vanna.ai: Để AI ‘gánh’ bớt 80% task báo cáo lặt vặt

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

Nỗi ám ảnh mang tên “Em ơi xuất hộ anh cái report”

Nếu bạn là Data Engineer hay Backend Developer, chắc hẳn không lạ gì cảnh đang tập trung code thì nhận được tin nhắn nhờ vả từ phòng Marketing. Những câu hỏi như “Doanh thu tuần trước ở miền Bắc là bao nhiêu?” tuy không khó nhưng lại ngốn rất nhiều thời gian vụn vặt. Sau nửa năm đưa Vanna.ai vào vận hành thực tế (production), mình nhận thấy đây là giải pháp cứu cánh thực sự.

Hệ thống này giúp giảm tới 70% các ticket truy vấn lặt vặt cho team data. Thay vì ngồi viết hàng chục câu SQL mỗi ngày, mình huấn luyện AI hiểu cấu trúc database để nó tự phục vụ người dùng. Bài viết này mình sẽ cùng anh em mổ xẻ cách thiết lập một hệ thống Text-to-SQL hoàn chỉnh bằng Python và Vanna.ai.

Tại sao chọn Vanna.ai thay vì Prompt Engineering thuần túy?

Nhiều bạn sẽ thắc mắc: “Sao không copy schema vào ChatGPT rồi bảo nó viết SQL cho lẹ?”. Thực tế, với database doanh nghiệp lên tới hơn 200 bảng và hàng nghìn cột, việc quăng toàn bộ schema vào prompt là bất khả thi. Bạn sẽ sớm chạm giới hạn token và đối mặt với rủi ro bảo mật dữ liệu nghiêm trọng.

Vanna.ai giải quyết vấn đề này bằng hướng tiếp cận RAG (Retrieval-Augmented Generation) chuyên biệt. Dữ liệu thật của bạn vẫn nằm im tại chỗ. Vanna chỉ lưu trữ metadata như DDL, mô tả cột và các câu SQL mẫu dưới dạng vector. Khi có câu hỏi, nó tìm kiếm những cấu trúc liên quan nhất để làm ngữ cảnh cho LLM. Kết quả? Độ chính xác thực tế tăng từ 60% lên hơn 92% sau khi được train kỹ.

3 lớp cốt lõi giúp Vanna.ai vận hành mượt mà

Để triển khai hiệu quả, bạn cần nắm vững cách Vanna phân tầng quản lý:

  • Infrastructure: Nơi bạn chọn “bộ não” (GPT-4, Claude 3, Ollama) và kho chứa vector (ChromaDB, Pinecone).
  • Knowledge Base: Kho tri thức chứa các câu lệnh DDL, tài liệu mô tả nghiệp vụ và các câu SQL chuẩn đã được kiểm chứng.
  • Execution: Cầu nối trực tiếp vào DB để thực thi câu lệnh SQL và trả về kết quả dạng bảng hoặc biểu đồ trực quan.

Bắt tay vào thực hiện: Xây dựng hệ thống Text-to-SQL

Chúng ta sẽ demo trên SQLite. Các bước này áp dụng tương tự cho PostgreSQL, MySQL hay SQL Server trong môi trường production.

1. Thiết lập môi trường

Anh em nên dùng Python 3.9 trở lên và tạo môi trường ảo để tránh xung đột thư viện.

pip install vanna

2. Cấu hình Vanna

Vanna rất linh hoạt cho phép chạy hoàn toàn local để bảo mật tuyệt đối. Ở ví dụ này, mình dùng OpenAI làm bộ não xử lý ngôn ngữ và ChromaDB để lưu trữ vector tri thức.

import vanna as vn
from vanna.openai import OpenAI_Chat
from vanna.chromadb import ChromaDB_VectorStore

class MyVanna(ChromaDB_VectorStore, OpenAI_Chat):
    def __init__(self, config=None):
        ChromaDB_VectorStore.__init__(self, config=config)
        OpenAI_Chat.__init__(self, config=config)

vn = MyVanna(config={'api_key': 'YOUR_OPENAI_API_KEY', 'model': 'gpt-4'})

3. Kết nối Cơ sở dữ liệu

Kết nối thử nghiệm với file database my_business.sqlite.

vn.connect_to_sqlite('my_business.sqlite')

4. Huấn luyện tri thức (Training) – Giai đoạn sống còn

AI chỉ thông minh khi nó hiểu rõ “luật chơi” trong DB của bạn. Đừng bao giờ nạp data qua loa. Mình thường chia training làm 3 lớp để tối ưu độ chính xác:

Lớp 1: Nạp cấu trúc bảng (DDL). Giúp AI biết bảng nào chứa thông tin gì.

ddl = vn.run_sql("SELECT sql FROM sqlite_master WHERE type='table';")
for table_ddl in ddl['sql']:
    vn.train(ddl=table_ddl)

Lớp 2: Tài liệu nghiệp vụ (Documentation). AI sẽ lúng túng nếu status_id = 1 nghĩa là “Đã thanh toán” nhưng bạn không giải thích.

vn.train(documentation="Cột status_id: 1 là Thành công, 0 là Hủy đơn.")

Lớp 3: Câu SQL mẫu (Golden SQL). Đây là cách dạy AI hiệu quả nhất thông qua ví dụ thực tế.

vn.train(sql="SELECT customer_name, SUM(total_amount) FROM orders GROUP BY 1 ORDER BY 2 DESC LIMIT 10;")

5. Chạy thử nghiệm

Giờ là lúc tận hưởng thành quả bằng cách đặt câu hỏi bằng tiếng Việt tự nhiên.

question = "Ai là khách hàng mua nhiều hàng nhất tháng này?"
sql = vn.generate_sql(question)
print(f"SQL tạo ra: {sql}")

df = vn.run_sql(sql)
print(df)

Bài học xương máu sau 6 tháng vận hành thực tế

Đưa AI vào thực tế khó hơn nhiều so với việc chạy demo trên máy cá nhân. Dưới đây là những lưu ý then chốt:

  • Đặt tên có tâm: Nếu DB của bạn toàn table_1, col_a thì AI chắc chắn sẽ đoán sai. Hãy viết Documentation thật chi tiết cho những cột có tên khó hiểu.
  • Ưu tiên bảo mật: Đừng bao giờ dùng user root. Hãy tạo một user Read-Only và chỉ cấp quyền truy cập vào các bảng cần thiết, tránh xa thông tin nhạy cảm như mật khẩu hay token.
  • Vòng lặp phản hồi (Feedback Loop): Mỗi tuần mình đều check lại các câu hỏi AI trả lời sai. Mình sửa lại SQL cho đúng rồi nạp ngược vào vn.train(). Hệ thống sẽ khôn lên trông thấy chỉ sau 2-3 tuần.
  • Tận dụng Visualization: Vanna tích hợp Plotly rất mượt. Yêu cầu AI vẽ biểu đồ trực tiếp từ kết quả truy vấn thường khiến các sếp cực kỳ ấn tượng.

Lời kết

Truy vấn dữ liệu bằng ngôn ngữ tự nhiên không còn là chuyện viễn tưởng. Với Vanna.ai, việc xây dựng hệ thống Text-to-SQL đã trở nên thực tế và dễ tiếp cận hơn bao giờ hết.

AI chưa thể thay thế Data Engineer trong các báo cáo tài chính hóc búa. Tuy nhiên, nó dư sức “xử” đẹp 80% yêu cầu truy vấn lặt vặt mỗi ngày. Chúc anh em sớm giải phóng sức lao động và không còn phải nghe câu “Em ơi check hộ anh cái này” giữa giờ nghỉ trưa nữa!

Share: