
Structured Output Trong LLM: JSON Mode, Function Calling Và Cách Nhận Dữ Liệu Đáng Tin Cậy

LLM sinh văn bản tự nhiên, nhưng trong production, ta thường cần output có cấu trúc cố định: JSON, database records, API calls. Structured Output là kỹ thuật buộc LLM output đúng schema đã định — không cần retry, không cần parse lại. Bài viết này phân tích các phương pháp từ đơn giản đến nâng cao, kèm so sánh chi tiết.
1. JSON Mode — Đảm Bảo JSON Hợp Lệ
OpenAI JSON mode (có từ GPT-3.5-turbo) yêu cầu model output đúng định dạng JSON bằng cách truyền response_format: {type: "json_object"}. Tuy nhiên, JSON mode chỉ đảm bảo output là JSON hợp lệ, KHÔNG đảm bảo dữ liệu đúng schema:
- Thiếu trường bắt buộc (required fields bị bỏ)
- Sai kiểu dữ liệu (string thay vì number)
- Enum value không đúng
- Cần thêm bước validate + retry
OpenAI khuyến nghị rõ ràng: “JSON mode đảm bảo output là JSON hợp lệ, Structured Outputs đảm bảo tuân theo schema.” Nói cách khác, JSON mode là bước đầu, Structured Outputs là giải pháp hoàn chỉnh.
2. Structured Outputs — Đảm Bảo Đúng Schema
Structured Outputs (OpenAI, từ GPT-4o trở đi) là bước tiến: API ép model output vừa đúng JSON vừa đúng schema (kiểu dữ liệu, trường bắt buộc, giá trị enum). Cú pháp:
response_format: {type: "json_schema", json_schema: {strict: true, schema: {...}}}- Đảm bảo output không cần validate lại — không cần retry cho schema violations
- Model được hỗ trợ: GPT-4o, GPT-4o-mini, GPT-5.6+
Lợi ích chính theo tài liệu OpenAI:
- Reliable type-safety: Không cần validate hoặc retry responses sai format
- Explicit refusals: Model từ chối vì lý do an toàn được phát hiện chương trình được
- Simpler prompting: Không cần prompts mạnh mẽ để đạt format nhất quán
3. Function Calling / Tool Use — Gọi External Function
Function Calling khác Structured Output ở một điểm quan trọng: model tự quyết định khi nào gọi function. Khi gọi, model tạo JSON đúng schema cho function parameters. Anthropic gọi đây là Tool Use, Google gọi Function Calling.
Hai tính năng thường kết hợp: Structured Output đảm bảo dữ liệu đầu ra đúng format, Tool Use cho phép LLM tương tác bên ngoài (tìm kiếm web, tính toán toán học, gọi API). Ví dụ: một chatbot có thể tự động call weather API khi user hỏi thời tiết, dùng Structured Output để đảm bảo response trả về đúng format “city”, “temperature”, “forecast”.
4. Constrained Decoding — Kiểm Soát Ở Cấp Inference
Phương pháp này hoạt động ở level sinh token: grammar/schema được biên dịch thành bộ lọc grammar, giới hạn tập token hợp lệ tại mỗi bước sinh. Anthropic mô tả: “compile JSON schemas into a grammar that constrains Claude’s output.”
- Outlines (dottxt-ai/outlines): thư viện Python, hoạt động với mọi model — OpenAI, Ollama, vLLM
- llama.cpp GBNF: formal grammar hỗ trợ full Unicode, token-level constraints
- xgrammar (MLC AI): engine nhanh, portable, backend cho vLLM

5. So Sánh Prompt-based vs API-level
Bảng so sánh chi tiết dưới đây giúp chọn phương pháp phù hợp:
| Tiêu chí | Prompt-based | API-level (Structured Outputs) |
|---|---|---|
| Reliability | Phụ thuộc instruction-following | Guaranteed tại generation time |
| Retry logic | Cần validate + retry loop | Không cần retry schema violations |
| Token cost | Prompt dài hơn, waste token retry | Output chính xác, tiết kiệm token |
| Setup | Đơn giản, không cần SDK mới | Cần SDK hỗ trợ (Python/JS SDK) |
| Model support | Mọi model | GPT-4o+, Claude Opus 5+, Gemini 3.7+ |
| Validation | Cần thư viện validate riêng | Schema enforcement server-side |
Xu hướng industry rõ ràng: từ “retry on error” sang “guarantee at generation time”. Cả OpenAI, Anthropic, Google đều đã triển khai trên model mới nhất.
6. Ứng Dụng Thực Tế
- Data extraction: Trích xuất thông tin từ research paper, hóa đơn, email thành JSON — không cần validate lại. Xem hướng dẫn tại OpenAI Structured Outputs
- Chain-of-thought tutoring: OpenAI dùng Structured Outputs cho tutoring math, đảm bảo mỗi bước tuân theo format bài giảng
- Content moderation: Output classification đúng schema cho hệ thống kiểm duyệt tự động
- HTML generation: Tạo HTML đúng cấu trúc từ prompt, không bị sai tag
- Database insertion: Output trực tiếp thành INSERT statements đúng format
Tham khảo thêm: Outlines cho phép áp dụng structured output với mọi model chạy cục bộ.
7. Xu Hướng Industry
Cả ba nhà cung cấp lớn (OpenAI, Anthropic, Google) đều đã có Structured Outputs trên model mới nhất. Anthropic Claude Opus 5+ hỗ trợ JSON outputs và strict tool use riêng biệt hoặc kết hợp. Google Gemini 3.7 Flash+ hỗ trợ qua response_format API.
Về phía open source, Outlines và xgrammar cho phép áp dụng với mọi model, kể cả chạy cục bộ qua llama.cpp hay vLLM. Điều này đặc biệt quan trọng cho các tổ chức muốn dùng LLM private, không gửi data qua API.
Xu hướng chung rõ ràng: structured output không còn là “nice to have” — nó là yêu cầu bắt buộc cho bất kỳ ứng dụng LLM nào trong production.
