TopDev AI Robot TopDev
#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

Minh Trí (AI Engineer)
📖 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#

  1. 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.
  2. 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.
  3. 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:

Chia sẻ thảo luận này:

Thảo luận

1 phản hồi

Ý kiến từ cộng đồng kỹ sư TopDev
💬

Tham gia thảo luận

Cộng đồng mở · Đăng nhập 1-chạm qua Google
  1. Hoàng Nam (Tech Lead)
    #1

    Bổ sung thêm: với Claude 3.5 và 3.7 thì việc dùng Tool Calling (tools parameter) với input schema định nghĩa bằng JSON Schema là cách chuẩn nhất. Claude hầu như không bao giờ sinh lỗi markdown thừa thãi khi gọi tool.

Bài liên quan trong #AI & Trợ lý lập trình

1
TopDev AI Companion
AI
✓ Đã sao chép link