#AI & Trợ lý lập trình#Backend & Microservices
Function Calling trong LLM: Bí quyết validate JSON Schema với Zod không bao giờ bị lỗi parse
📖 2 phút đọc 💬 1 phản hồi
⚡ Tóm tắt 30 giây bởi TopDev AI
AI Overview Nỗi ám ảnh khi LLM trả về JSON bị lỗi cú pháp Khi lập trình ứng dụng AI có sử dụng Function Calling Tool Use hoặc yêu cầu LLM trích xuất dữ liệu có cấu trúc Structured Outputs, một trong những lỗi gâ…
☰ Mục lục bài viết (4 phần) Mở / Đóng mục lục
Nỗi ám ảnh khi LLM trả về JSON bị lỗi cú pháp#
Khi lập trình ứng dụng AI có sử dụng Function Calling (Tool Use) hoặc yêu cầu LLM trích xuất dữ liệu có cấu trúc (Structured Outputs), một trong những lỗi gây crash backend phổ biến nhất là:
- LLM chèn thêm ký tự markdown ```json ở đầu và cuối.
- Quên dấu ngoặc nhọn hoặc dấu phẩy ở các nested object.
- Trả về kiểu dữ liệu chuỗi thay vì số hoặc mảng rỗng.
Để hệ thống hoạt động ổn định 99.99% trong production, chúng ta cần kết hợp giữa Zod Schema và tính năng Structured Outputs của nhà cung cấp API.
Giải pháp tích hợp với OpenAI & Anthropic SDK#
TYPESCRIPT
import { z } from 'zod';
import { zodToJsonSchema } from 'zod-to-json-schema';
import OpenAI from 'openai';
// 1. Định nghĩa Schema chặt chẽ bằng Zod
const UserProfileExtractSchema = z.object({
fullName: z.string().describe('Họ và tên ứng viên'),
yearsOfExperience: z.number().int().nonnegative().describe('Số năm kinh nghiệm làm việc'),
skills: z.array(z.string()).min(1).describe('Danh sách các kỹ năng kỹ thuật chính'),
seniorityLevel: z.enum(['Junior', 'Middle', 'Senior', 'Lead']),
salaryExpectationVND: z.number().optional().describe('Mức lương mong muốn tính theo VND')
});
type UserProfile = z.infer<typeof UserProfileExtractSchema>;
// 2. Sử dụng OpenAI Structured Outputs (json_schema)
const openai = new OpenAI();
const completion = await openai.chat.completions.create({
model: 'gpt-4o-2024-08-06',
messages: [
{ role: 'system', content: 'Bạn là trợ lý trích xuất hồ sơ ứng viên IT chính xác.' },
{ role: 'user', content: 'Hồ sơ: Nguyễn Văn A, 5 năm kinh nghiệm Node.js, React, mong muốn mức lương 40 triệu.' }
],
response_format: {
type: 'json_schema',
json_schema: {
name: 'candidate_profile',
strict: true, // Ép buộc tuân thủ 100% schema!
schema: zodToJsonSchema(UserProfileExtractSchema)
}
}
});
const result = UserProfileExtractSchema.parse(JSON.parse(completion.choices[0].message.content!));
console.log('Parsed successfully:', result.fullName, result.seniorityLevel);
3 nguyên tắc để không bị Hallucination khi parse JSON#
- Luôn bật
strict: true: Khi có thuộc tính này, OpenAI sẽ dùng kỹ thuật Constrained Decoding tại tầng logits, loại bỏ hoàn toàn khả năng sinh ra token sai ngữ pháp JSON. - Khai báo
describe()chi tiết: LLM dựa vào phần mô tả của từng trường trong Zod schema để hiểu chính xác mục đích cần trích xuất. - Thêm cơ chế Fallback Retry: Luôn bọc hàm parse trong khối try/catch và cho phép thử lại tối đa 2 lần kèm error message cụ thể của Zod nếu có lỗi xảy ra.
Góc thảo luận#
Anh em đang dùng giải pháp nào để ép AI trả về dữ liệu chuẩn JSON? Có ai gặp trường hợp model vẫn cố chấp trả về text tự do chưa?
Xem thêm nội dung liên quan:
Tác giả bài viết
Minh Trí (AI Engineer)
Tham gia từ thg 7 2026 · 15 bài viết · 25 phản hồi
Thảo luận
1 phản hồi
💬
Tham gia thảo luận
Cộng đồng mở · Đăng nhập 1-chạm qua Google
Bài liên quan trong #AI & Trợ lý lập trình
-
Lập trình viên có bị thay thế bởi AI không? 5 kỹ năng bắt buộc phải nâng cấp trong 2 năm tới
Hoàng Nam (Tech Lead) · 💬 1 -
Áp dụng Model Context Protocol (MCP) của Anthropic để kết nối AI với Postgres và Docker
Hoàng Nam (Tech Lead) · 💬 1 -
So sánh mô hình Embedding đa ngữ: OpenAI text-embedding-3 vs BGE-M3 vs Cohere
Minh Trí (AI Engineer) · 💬 1 -
Xây dựng Voice AI Agent thời gian thực với WebRTC và Whisper Live: Độ trễ dưới 500ms
Lan Anh (Senior Frontend) · 💬 1 -
Cấu hình Rate Limiting ở tầng Nginx và API Gateway: Chống DDOS Layer 7 hiệu quả
Đức Huy (DevOps Specialist) · 💬 1