QueryGPT: Cách Uber Biến Câu Hỏi Tiếng Anh Thành SQL Bằng Generative AI

Tìm hiểu cách Uber xây dựng QueryGPT — hệ thống dùng LLM, vector database và RAG để tự động tạo câu truy vấn SQL phức tạp từ ngôn ngữ tự nhiên, giúp giảm thời gian soạn query từ 10 phút xuống còn 3 phút.

Khau Van Nam 9 phút đọc
Mục lục

SQL là ngôn ngữ hàng ngày của hàng nghìn kỹ sư, quản lý vận hành và nhà khoa học dữ liệu tại Uber. Nhưng không phải ai cũng rành SQL. Và ngay cả người rành, việc soạn một câu query phức tạp trên schema hàng trăm cột vẫn mất nhiều thời gian.

QueryGPT ra đời để giải quyết bài toán đó: nhập câu hỏi bằng tiếng Anh bình thường, nhận lại câu SQL hoàn chỉnh.

1. Động lực: Tại sao phải làm QueryGPT?

Mỗi tháng, nền tảng dữ liệu của Uber xử lý khoảng 1.2 triệu truy vấn tương tác. Trong đó, nhóm Vận hành (Operations) đóng góp khoảng 36% — một con số khổng lồ, phần lớn đến từ những người không phải kỹ sư chuyên nghiệp.

Thống kê sử dụng Querybuilder tại Uber

Trung bình, một người cần 10 phút để soạn một câu query. Với QueryGPT, thời gian đó rút xuống còn 3 phút — tiết kiệm 70% thời gian mỗi lần.

Tác động của QueryGPT lên năng suất

Kết quả hiện tại sau khi ra mắt hạn chế với nhóm Operations và Support: khoảng 300 người dùng hoạt động mỗi ngày, với 78% báo cáo rằng họ soạn query nhanh hơn trước.

2. Phiên bản đầu tiên: Hackdayz v1

Hệ thống khởi đầu từ một cuộc hackathon nội bộ. Ý tưởng đơn giản: dùng RAG (Retrieval-Augmented Generation) kết hợp với tìm kiếm K-Nearest Neighbor để lấy ngữ cảnh phù hợp trước khi gọi LLM.

Kiến trúc Hackdayz v1 của QueryGPT

Cụ thể, quy trình như sau:

  1. Người dùng nhập câu hỏi bằng tiếng Anh.
  2. Hệ thống vector hóa câu hỏi, tìm 3 bảng liên quan và 7 câu SQL mẫu gần nhất.
  3. Tất cả ngữ cảnh được đưa vào prompt của LLM để sinh ra câu SQL.

Phiên bản này hoạt động được với 7 bảng tier-1 và 20 câu SQL mẫu. Nhưng khi mở rộng, các vấn đề nghiêm trọng xuất hiện.

Ví dụ: Schema bảng uber.trips_data

Schema bảng uber.trips_data với hàng trăm cột

Hệ thống còn cần xử lý các quy ước đặc thù của Uber như cách tính ngày tháng trong nội bộ:

Hướng dẫn xử lý date đặc thù của Uber trong prompt

Và đây là ví dụ câu SQL được sinh ra từ phiên bản đầu tiên:

Ví dụ SQL được QueryGPT sinh ra kèm giải thích

Ba vấn đề cốt lõi của v1

1. Semantic matching yếu: So sánh độ tương đồng thuần túy trên câu lệnh CREATE TABLESELECT không phản ánh được ý nghĩa nghiệp vụ. Người dùng hỏi về “chuyến xe bị hủy” nhưng hệ thống lại kéo về bảng không liên quan.

2. Không hiểu ý định: Chuyển từ câu hỏi tự nhiên sang schema phù hợp cần một bước phân loại trung gian. Không có bước này, kết quả thiếu chính xác.

3. Token explosion: Các bảng tier-1 của Uber có đến 200+ cột. Một schema đầy đủ tiêu tốn 40.000–60.000 token, vượt giới hạn của nhiều model và đội chi phí API lên rất cao.

3. Kiến trúc hiện tại: Hệ thống Multi-Agent

Uber thiết kế lại QueryGPT từ nền tảng, đưa vào ba tầng agent chuyên biệt.

Kiến trúc đầy đủ của QueryGPT phiên bản production

Workspaces — Tổ chức dữ liệu theo nghiệp vụ

Thay vì để toàn bộ hàng nghìn bảng vào một “mớ hỗn độn”, QueryGPT tổ chức chúng thành các workspace theo từng domain nghiệp vụ:

WorkspaceNội dung
MobilityChuyến xe, tài xế, tài liệu
AdsQuảng cáo, chiến dịch
Core ServicesDịch vụ lõi
Platform EngineeringHạ tầng kỹ thuật
ITNội bộ

Ngoài ra, người dùng có thể tự tạo workspace riêng cho nhu cầu đặc thù.

Intent Agent — Hiểu câu hỏi trước khi tìm kiếm

Đây là điểm khác biệt lớn so với v1. Thay vì tìm kiếm ngay, Intent Agent dùng LLM để phân loại câu hỏi vào đúng workspace trước. Điều này thu hẹp phạm vi tìm kiếm, giảm nhiễu và tăng chính xác đáng kể.

Table Agent — Xác nhận bảng trước khi query

Giao diện Table Agent cho phép người dùng xác nhận bảng

Table Agent đề xuất danh sách bảng liên quan và cho người dùng quyền override — chọn lại bảng khác nếu gợi ý chưa đúng. Đây là cơ chế “human-in-the-loop” quan trọng, giúp hệ thống học từ phản hồi người dùng.

Column Prune Agent — Cắt bớt để tiết kiệm token

Ngay cả với model 128K token context, các bảng lớn vẫn gây vấn đề về chi phí và độ trễ. Column Prune Agent giải quyết bằng cách:

  1. Nhận schema đầy đủ của bảng.
  2. Dùng LLM đánh giá từng cột: cột nào liên quan đến câu hỏi, cột nào không.
  3. Loại bỏ cột không liên quan trước khi đưa vào prompt chính.

Kết quả schema sau khi Column Prune Agent xử lý

Kết quả: giảm đáng kể chi phí API và độ trễ mà không mất thông tin quan trọng.

4. Framework Đánh Giá

Làm sao biết QueryGPT có thực sự hoạt động tốt không? Uber xây dựng một hệ thống đánh giá nghiêm ngặt.

Bộ câu hỏi chuẩn (Evaluation Set)

Nhóm kỹ sư thu thập câu hỏi thực tế từ log của QueryGPT, sau đó xác minh thủ công:

  • Intent đúng không?
  • Schema cần thiết là gì?
  • Câu SQL “vàng” (golden SQL) là gì?

Bộ câu hỏi này bao gồm nhiều domain nghiệp vụ khác nhau để đảm bảo độ đa dạng.

Hai luồng đánh giá

Vanilla Flow: Chạy toàn bộ pipeline từ đầu đến cuối — từ nhận câu hỏi, phân loại intent, chọn bảng đến sinh SQL. Đo hiệu năng thực tế.

Decoupled Flow: Bỏ qua các bước đầu, cung cấp trực tiếp intent và danh sách bảng đúng. Đo chất lượng của riêng bước sinh SQL, tách biệt khỏi các bước trước.

Các chỉ số đo lường

Chỉ sốÝ nghĩa
Intent AccuracyIntent được phân loại có đúng không
Table Overlap ScoreMức độ trùng khớp giữa bảng được chọn và bảng cần thiết (0–1)
Successful ExecutionQuery có chạy không lỗi không
Output ValidationQuery có trả về ít nhất 1 dòng dữ liệu không
Query SimilarityĐộ tương đồng với golden SQL do LLM đánh giá (0–1)

Dashboard đánh giá QueryGPT — môi trường staging

Dashboard đánh giá QueryGPT — so sánh giữa các môi trường

Thống kê chi tiết cho các câu hỏi thất bại

Tổng hợp độ chính xác và độ trễ theo từng metric

Giới hạn của framework đánh giá

Không có hệ thống đánh giá nào hoàn hảo. Với QueryGPT, ba giới hạn chính là:

  • LLM không deterministic: Cùng một câu hỏi, kết quả có thể khác nhau ~5% giữa các lần chạy.
  • Không thể bao phủ toàn bộ: Uber có hàng trăm nghìn dataset — bộ test chỉ là mẫu nhỏ.
  • Nhiều cách đúng: Một câu hỏi có thể có nhiều câu SQL đúng khác nhau, không phải chỉ một “golden SQL”.

5. Bài học từ thực tế

LLM rất giỏi phân loại — nếu được giao đúng việc

Intent Agent, Table Agent, Column Prune Agent đều hoạt động hiệu quả vì chúng được thiết kế để làm một việc cụ thể, rõ ràng. Khi giao cho LLM nhiệm vụ quá rộng (“làm tất cả mọi thứ”), hiệu quả giảm rõ rệt. Khi tách nhỏ thành các agent chuyên biệt, mỗi agent làm tốt phần việc của mình.

Đây là bài học áp dụng được cho bất kỳ hệ thống AI nào: decompose thành các task nhỏ, rõ ràng thay vì để một model xử lý tất cả.

Hallucination vẫn là thách thức chưa giải quyết triệt để

Các câu SQL được sinh ra đôi khi tham chiếu đến bảng hoặc cột không tồn tại. Uber đang giải quyết bằng prompt engineering, cho phép người dùng chat nhiều vòng để tinh chỉnh, và đang nghiên cứu validation agent tự động kiểm tra SQL trước khi trả về.

Câu hỏi của người dùng thường thiếu ngữ cảnh

Có người nhập câu hỏi rất chi tiết với đầy đủ thuật ngữ. Có người chỉ nhập 5 từ và có lỗi chính tả. Uber giải quyết bằng Prompt Expander — một bước tiền xử lý dùng LLM để mở rộng câu hỏi ngắn thành câu hỏi có đủ ngữ cảnh trước khi đưa vào pipeline chính.

Thanh chất lượng cho SQL cao hơn nhiều so với text thông thường

Người dùng kỳ vọng SQL được sinh ra chạy được ngay lập tức. Một câu trả lời “gần đúng” trong chat thì được chấp nhận, nhưng một câu SQL có lỗi cú pháp thì không. Điều này đặt ra yêu cầu cao hơn nhiều về độ chính xác so với các ứng dụng AI thông thường.

Kết luận

QueryGPT là ví dụ điển hình cho việc ứng dụng AI tạo sinh vào bài toán thực tế với quy mô lớn. Ba điểm đáng học nhất từ dự án này:

  1. Kiến trúc multi-agent chuyên biệt hiệu quả hơn nhiều so với một model “làm tất cả”.
  2. Human-in-the-loop (Table Agent với override) là cơ chế thiết yếu để hệ thống AI hoạt động tin cậy ở production.
  3. Evaluation framework nghiêm ngặt là điều kiện bắt buộc để cải tiến liên tục — không đo được thì không cải thiện được.

Với 300 người dùng hoạt động mỗi ngày và 78% báo cáo tiết kiệm thời gian, QueryGPT đang mở ra quyền truy cập dữ liệu cho những người trước đây phải phụ thuộc vào kỹ sư mỗi khi cần một con số.


Tham khảo: Uber Engineering Blog — QueryGPT: Natural Language to SQL Using Generative AI

Tác giả gốc: Jeffrey Johnson, Callie Busch, Abhi Khune, Pradeep Chakka và đội ngũ Data Platform tại Uber.

Nhắn qua Telegram