Structured Output trong LLM: JSON Mode, Tool Use và Schema Enforcement

Structured output đang trở thành tính năng quan trọng nhất khi tích hợp LLM vào ứng dụng thực tế. Thay vì để model trả về văn bản tự do rồi tự bốc thuốc parse JSON bằng regex, structured output ép model tuân theo JSON schema đã khai báo từ trước, giúp code tích hợp chắc chắn và giảm lỗi runtime. Bài viết này sẽ giải thích structured output là gì, các cách triển khai phổ biến và lúc nào nên dùng cách nào.

JSON Schema editor interface showing AccidentDetail property configuration

Structured Output là gì?

Structured output (đầu ra có cấu trúc) là cơ chế ràng buộc LLM chỉ sinh ra dữ liệu đúng định dạng đã khai báo, thường là JSON theo một JSON schema cụ thể. Khác với cách prompt “hãy trả về JSON” thông thường — vốn vẫn có thể sinh markdown, text thừa hoặc JSON sai kiểu dữ liệu — structured output đảm bảo hợp lệ ở tầng sinh token, không phải ở tầng hậu xử lý.

Lợi ích rõ ràng: không cần viết code sửa lỗi JSON lặt vặt, không phải retry khi model sai định dạng, schema là điểm kiểm tra rõ ràng giữa prompt và lời gọi API. Với ứng dụng production, đây là khác biệt giữa bản demo chạy được và hệ thống vận hành ổn định.

Ba cách tiếp cận chính

Hiện có ba hướng triển khai structured output phổ biến, mỗi hướng có mức đảm bảo khác nhau:

Cách tiếp cận Cơ chế Đảm bảo hợp lệ
JSON Mode Prompt yêu cầu JSON + model cố gắng trả JSON Thấp, có thể sai schema
Structured Outputs / response_format Khai báo JSON schema trong API, model tôn trọng schema Cao, theo schema chặt chẽ
Function Calling / Tool Use Model chọn gọi hàm với tham số đúng định dạng khai báo Cao, kèm luôn ngữ nghĩa hành động

OpenAI cung cấp Structured Outputs qua tham số response_format kết hợp với cấu hình JSON schema trên tài liệu chính thức. Khi bật, model chỉ sinh token hợp lệ với schema, kể cả các ràng buộc như enum, kiểu lồng nhau hay danh sách phần tử. Anthropic đi theo hướng tool use: định nghĩa hàm với tham số JSON schema, model tự quyết định gọi hàm nào và sinh tham số đúng cấu trúc — phù hợp với agent có nhiều hành động thực tế.

Constrained decoding cho model nguồn mở

Với model chạy local, cách tiếp cận gọi là constrained decoding: trong lúc sinh token, hệ thống tính toán và cấm mọi token khiến output lệch khỏi grammar đã khai báo, nên kết quả luôn hợp lệ về mặt cú pháp. Các framework phổ biến:

  • Outlines — thư viện Python dùng với mọi model, hỗ trợ JSON schema, regex và grammar. Xem tài liệu Outlines.
  • vLLM — serving engine thông lượng cao, tích hợp backend xgrammar và guidance để sinh output có cấu trúc trong tham số structured_outputs. Xem hướng dẫn vLLM.
  • llama.cpp — dùng GBNF grammar file để ràng buộc token ở tầng C++ thuần, chạy được trên cả CPU yếu.

Example JSON code showing nested object structure for address data

Điểm mạnh của hướng này là minh bạch, không phụ thuộc vendor và không tốn phí API; nhược điểm là phải tự vận hành hạ tầng và grammar không hiểu ngữ nghĩa, chỉ đảm bảo cú pháp.

Use case thực tế

Structured output xuất hiện ở khắp nơi trong ứng dụng AI hiện đại:

  • Trích xuất dữ liệu — đọc hóa đơn, hợp đồng, email rồi trả về các field chuẩn hóa.
  • Phân loại — sentiment, spam, gán topic phải nằm trong danh sách enum cố định.
  • Agent gọi công cụ — model quyết định gọi tool với tham số đúng kiểu, nền tảng của mọi agent tự động hóa.
  • Trả dữ liệu cho UI — frontend render trực tiếp JSON từ API LLM mà không cần lớp chuyển đổi.

Chọn cách nào?

Nếu dùng API đám mây và cần độ chắc chắn cao, Structured Outputs hoặc tool use là lựa chọn đúng vì nhà cung cấp lo phần ràng buộc token. Nếu chạy model nguồn mở, cần kiểm soát hạ tầng hoặc muốn tránh khóa vendor, constrained decoding với Outlines hoặc vLLM là con đường hợp lý. JSON Mode đơn giản chỉ phù hợp cho prototype, nơi sai format không gây hậu quả.

Kết luận

Structured output không còn là tùy chọn nâng cao mà là yêu cầu cơ bản khi đưa LLM vào production. Từ JSON schema khai báo trong API đám mây đến grammar ràng buộc token trên model local, mọi hướng đều hội tụ ở một mục tiêu: output phải đúng cấu trúc ngay từ lần sinh đầu tiên. Bắt đầu từ bài toán nhỏ như trích xuất dữ liệu, sau đó mở rộng dần sang agent phức tạp — nền tảng structured output sẽ giúp bạn tránh được lớp bùa chú sửa lỗi JSON tốn thời gian nhất.

Nguồn tham khảo: OpenAI Structured Outputs · Anthropic Tool Use · vLLM Structured Outputs

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

SGLang là gì?

SGLang là gì? SGLang là framework serving engine dành cho LLM và multimodal models, được phát triển dưới dự án LMSYS. Framework này tập trung vào throughput cực cao và…

Xem thêm

LangGraph: Framework AI Agent trạng thái dựa trên đồ thị

LangGraph là gì? LangGraph là framework mã nguồn mở do LangChain AI phát triển, chuyên dụng để xây dựng các AI Agent có trạng thái phức tạp. Khác với các…

Xem thêm

LLM Inference Optimization: vLLM, TGI, llama.cpp, TensorRT-LLM so sánh chi tiết

LLM Inference Optimization: vLLM, TGI, llama.cpp, TensorRT-LLM so sánh chi tiết Sau khi huấn luyện xong LLM, phần tốn kém nhất là inference — chạy mô hình để sinh văn…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất