Vấn đề LLM trả về JSON không chuẩn

Các mô hình ngôn ngữ lớn (LLM) ngày càng mạnh mẽ trong việc hiểu và tạo ra văn bản, nhưng việc yêu cầu chúng trả về dữ liệu có cấu trúc, đặc biệt là JSON, vẫn là một thách thức. Khi LLM không tuân thủ nghiêm ngặt cú pháp JSON, hệ thống xử lý phía sau sẽ gặp lỗi. Điều này giống như việc yêu cầu một người viết báo cáo theo một mẫu cụ thể, nhưng họ lại thêm vào các ghi chú cá nhân hoặc bỏ sót các trường bắt buộc, khiến báo cáo trở nên vô dụng đối với người nhận.

Lỗi phổ biến nhất là cú pháp không chính xác, ví dụ như dấu ngoặc nhọn bị thiếu, dấu phẩy đặt sai vị trí, hoặc các chuỗi không được định dạng đúng. Ngay cả những lỗi nhỏ nhất cũng có thể khiến toàn bộ cấu trúc JSON trở nên không hợp lệ.

Giải pháp: Kỹ thuật ba lớp (Three-Layer Approach)

Để khắc phục vấn đề này, một giải pháp hiệu quả là áp dụng kỹ thuật ba lớp. Kỹ thuật này chia quá trình tương tác với LLM thành ba giai đoạn riêng biệt, mỗi giai đoạn có một vai trò cụ thể trong việc đảm bảo đầu ra JSON chuẩn xác.

Lớp 1: Lớp yêu cầu (Prompt Layer)

Đây là lớp đầu tiên, nơi chúng ta xây dựng và gửi yêu cầu đến LLM. Mục tiêu của lớp này là cung cấp cho LLM hướng dẫn rõ ràng nhất có thể về định dạng JSON mong muốn. Điều này bao gồm việc chỉ định cấu trúc, các trường cần có, kiểu dữ liệu cho từng trường, và các ràng buộc khác.

Một prompt hiệu quả cần:

  • Mô tả rõ ràng mục đích của dữ liệu JSON.
  • Cung cấp một ví dụ về cấu trúc JSON mong muốn.
  • Nhấn mạnh tầm quan trọng của việc tuân thủ cú pháp JSON chuẩn.
  • Có thể bao gồm các yêu cầu về kiểu dữ liệu (string, number, boolean, array, object).

Ví dụ về một prompt:

"Bạn là một trợ lý AI chuyên nghiệp. Hãy phân tích văn bản sau đây và trích xuất thông tin dưới dạng một đối tượng JSON. JSON phải có cấu trúc sau:
{
  "tieu_de": "string",
  "tom_tat": "string",
  "tac_gia": "string",
  "ngay_xuat_ban": "YYYY-MM-DD"
}
Đảm bảo mọi trường đều có giá trị và tuân thủ cú pháp JSON chuẩn. Không thêm bất kỳ văn bản giải thích nào ngoài JSON."

Lớp 2: Lớp Trích xuất và Phân tích (Extraction & Parsing Layer)

Sau khi LLM trả về kết quả, lớp thứ hai sẽ tiếp nhận đầu ra này. Nhiệm vụ chính của lớp này là cố gắng phân tích (parse) chuỗi văn bản nhận được như một đối tượng JSON. Nếu việc phân tích thành công, nghĩa là LLM đã trả về JSON hợp lệ.

Tuy nhiên, nếu việc phân tích thất bại, chúng ta biết rằng đầu ra của LLM có vấn đề về cú pháp. Đây là lúc vòng repair phát huy tác dụng.

Lớp 3: Lớp Sửa chữa (Repair Layer)

Khi lớp phân tích phát hiện lỗi cú pháp, lớp sửa chữa sẽ can thiệp. Lớp này có trách nhiệm cố gắng tự động sửa các lỗi phổ biến trong chuỗi JSON không hợp lệ trước khi thử phân tích lại.

Các kỹ thuật sửa chữa có thể bao gồm:

  • Bổ sung dấu ngoặc nhọn hoặc dấu ngoặc vuông bị thiếu.
  • Thêm dấu phẩy vào cuối các mục trong mảng hoặc đối tượng (nếu cần).
  • Đảm bảo các chuỗi được bao quanh bởi dấu ngoặc kép đúng cách.
  • Xử lý các ký tự đặc biệt hoặc ký tự thoát không hợp lệ.

Sau khi áp dụng các quy tắc sửa chữa, chuỗi văn bản sẽ được đưa trở lại Lớp 2 để thử phân tích lại. Quá trình này có thể lặp đi lặp lại cho đến khi JSON hợp lệ hoặc chúng ta quyết định rằng đầu ra của LLM không thể sửa được.

Sơ đồ minh họa kỹ thuật ba lớp và vòng repair cho LLM trả về JSON

Vòng Repair (Repair Loop)

Vòng repair là cơ chế cốt lõi cho phép hệ thống trở nên mạnh mẽ hơn khi đối mặt với đầu ra không hoàn hảo từ LLM. Nó hoạt động như một bộ lọc thông minh:

  1. LLM tạo ra chuỗi văn bản.
  2. Lớp Trích xuất & Phân tích cố gắng parse chuỗi đó thành JSON.
  3. Nếu thành công, dữ liệu JSON hợp lệ được trả về.
  4. Nếu thất bại, Lớp Sửa chữa cố gắng sửa lỗi cú pháp.
  5. Chuỗi đã sửa được đưa trở lại Lớp 2 để thử parse lại.
  6. Quá trình này lặp lại cho đến khi thành công hoặc đạt đến giới hạn số lần thử.

Kỹ thuật này giống như việc bạn nhờ một người hướng dẫn vẽ tranh. Nếu họ vẽ sai, bạn không yêu cầu họ vẽ lại toàn bộ mà chỉ ra chỗ sai và hướng dẫn họ sửa từng nét một. Vòng repair làm điều tương tự với cấu trúc dữ liệu.

Tối ưu hóa và các cân nhắc

Để kỹ thuật này hoạt động hiệu quả, cần cân nhắc:

  • Độ phức tạp của Prompt: Một prompt rõ ràng, chi tiết với ví dụ cụ thể sẽ giảm thiểu lỗi ngay từ đầu.
  • Thư viện Parsing và Sửa chữa: Sử dụng các thư viện mạnh mẽ có khả năng xử lý các trường hợp lỗi JSON phổ biến.
  • Giới hạn Số lần Thử: Đặt giới hạn cho vòng lặp sửa chữa để tránh tình trạng lặp vô hạn nếu LLM liên tục trả về dữ liệu không thể sửa.
  • Phản hồi cho LLM (Tùy chọn): Trong một số trường hợp, có thể gửi lại thông báo lỗi cho LLM để nó thử tạo lại JSON dựa trên phản hồi. Tuy nhiên, điều này làm tăng độ phức tạp và chi phí.

Việc bắt LLM trả về JSON chuẩn xác là cần thiết cho việc tích hợp chúng vào các quy trình tự động hóa và ứng dụng thực tế. Kỹ thuật ba lớp kết hợp với vòng repair cung cấp một giải pháp mạnh mẽ để đạt được mục tiêu này, biến LLM từ công cụ tạo văn bản thành nguồn dữ liệu có cấu trúc đáng tin cậy.