AI & mô hình ngôn ngữ

Lỗi đầu ra có cấu trúc của Ollama bỏ qua schema khi các mô hình tư duy trả lời trực tiếp

Các phiên bản Ollama từ 0.34.4 trở đi không áp dụng được JSON schema cho các mô hình tư duy (thinking models) bỏ qua bước suy luận, dẫn đến việc trả về văn bản không có cấu trúc kèm mã trạng thái HTTP 200.

Hình minh họa một giá đỡ server với biểu tượng JSON bị che khuất một phần bởi sương mù
Ảnh minh họa tạo riêng cho bài viết

Bài được dịch tự động từ bản gốc tiếng Anh.

Một bản cập nhật gần đây của Ollama đã giới thiệu một lỗi tinh vi nhưng nghiêm trọng ảnh hưởng đến đầu ra có cấu trúc từ các mô hình ngôn ngữ "tư duy" (thinking). Kể từ phiên bản 0.34.4, nếu mô hình quyết định trả lời prompt trực tiếp mà không đi vào giai đoạn suy luận nội bộ, nó sẽ hoàn toàn bỏ qua JSON schema được yêu cầu. Vấn đề này ảnh hưởng đến các nhà phát triển phụ thuộc vào định dạng dữ liệu chặt chẽ cho các quy trình tự động hóa, vì máy chủ trả về các cấu trúc không hợp lệ với mã trạng thái HTTP thành công.

Chuyện gì đã xảy ra

Vấn đề bắt nguồn từ cách Ollama xử lý các ràng buộc ngữ pháp (grammar constraints) cho những mô hình hỗ trợ chế độ "tư duy", chẳng hạn như Gemma 4. Trong nỗ lực áp dụng các quy tắc đầu ra có cấu trúc chỉ trong một lần chạy, phần mềm bọc JSON schema do người dùng định nghĩa bằng một ngữ pháp mong đợi có một khối tư duy (thinking block) xuất hiện trước tiên. Hệ thống giả định rằng bất kỳ văn bản nào xuất hiện trước thẻ đóng của khối tư duy đều là một phần của quá trình suy luận và do đó không bị ràng buộc. Việc thực thi schema chỉ kích hoạt sau khi khối tư duy kết thúc.

Khi một mô hình gặp câu hỏi đơn giản và chọn bỏ qua hoàn toàn giai đoạn tư duy, nó sẽ không bao giờ phát ra các thẻ mở hoặc đóng cho khối đó. Kết quả là, lớp bọc ngữ pháp coi câu trả lời trực tiếp là "văn bản trước thẻ đóng" và cho phép phản hồi kết thúc ngay lập tức. Vì ràng buộc schema về mặt kỹ thuật được gắn vào phần sau khối tư duy, và phần đó không bao giờ xuất hiện, đầu ra thô của mô hình bỏ qua mọi quy tắc định dạng. Nhật ký máy chủ không hiển thị lỗi, và phản hồi HTTP vẫn giữ nguyên ở trạng thái 200 OK, khiến sự cố khó bị phát hiện nếu không có xác thực chặt chẽ phía client.

Thử nghiệm trên Ollama 0.35.1 với mô hình gemma4:e2b đã xác nhận hành vi này. Khi được hỏi các câu hỏi thực tế đơn giản với tham số think: true, mô hình đôi khi bỏ qua suy luận và trả về các chuỗi trần trụi như "391" hoặc "Paris" thay vì đối tượng JSON bắt buộc. Ngược lại, mọi phản hồi bao gồm một khối tư duy đều tuân thủ nghiêm ngặt schema. Việc tắt hoàn toàn chế độ tư duy (think: false) cũng dẫn đến việc tuân thủ schema chính xác, cho thấy vấn đề cụ thể nằm ở tương tác giữa lớp bọc ngữ pháp tư duy và các câu trả lời trực tiếp.

Chi tiết quan trọng

  • Lỗi ảnh hưởng đến các phiên bản Ollama từ 0.34.4 trở lên, bao gồm cả bản phát hành hiện tại 0.35.1.
  • Nó đặc biệt tác động đến các mô hình "tư duy" như Gemma 4 khi tham số think được bật.
  • Các phản hồi bỏ qua giai đoạn tư duy trả về văn bản không có cấu trúc mặc dù đã yêu cầu JSON schema hợp lệ.
  • Máy chủ trả về HTTP 200 với done_reason: "stop", không cung cấp bất kỳ chỉ báo lỗi nào trong nhật ký.
  • Một pull request đang mở, #18783, đề xuất giải pháp sửa lỗi bằng cách buộc mô hình đi vào trạng thái tư duy.
  • Xác thực phía client hiện là cách đáng tin cậy duy nhất để phát hiện các phản hồi sai định dạng này.

Bối cảnh

Đầu ra có cấu trúc là một tính năng buộc các mô hình ngôn ngữ lớn phải trả lời theo một định dạng cụ thể, chẳng hạn như JSON, thay vì văn bản tự do. Điều này rất cần thiết cho việc tích hợp AI vào các pipeline phần mềm nơi mã downstream mong đợi các cấu trúc dữ liệu dự đoán được. Ollama triển khai điều này bằng cách chuyển đổi các JSON schema thành các ngữ pháp hạn chế các token mà mô hình có thể tạo ra.

Các mô hình "tư duy" là một lớp AI mới hơn tách biệt quá trình suy luận nội bộ khỏi câu trả lời cuối cùng. Chúng thường bọc chuỗi suy nghĩ (chain-of-thought) trong các thẻ đặc biệt, cho phép hệ thống phân biệt giữa công việc nháp và đầu ra cuối cùng. Thay đổi gần đây của Ollama đã cố gắng tối ưu hóa cách hai tính năng này hoạt động cùng nhau bằng cách coi khối tư duy và câu trả lời cuối cùng là một chuỗi ngữ pháp liên tục duy nhất. Tuy nhiên, sự tối ưu hóa này giả định rằng khối tư duy sẽ luôn tồn tại, tạo ra một điểm mù đối với các câu trả lời trực tiếp.

Tại sao điều này quan trọng

Đối với các đội ngũ vận hành cơ sở hạ tầng AI tự lưu trữ (self-hosted), độ tin cậy là yếu tố tối thượng. Lỗi này giới thiệu một chế độ thất bại thầm lặng (silent failure mode), nơi các ứng dụng nhận được dữ liệu trông có vẻ hợp lệ ở lớp truyền tải nhưng lại thất bại ở lớp ứng dụng. Nếu backend của bạn mong đợi một đối tượng JSON với các khóa cụ thể nhưng lại nhận được một chuỗi thuần túy, nó có thể bị crash hoặc hoạt động không ổn định. Vì lỗi không xuất hiện trong nhật ký máy chủ, việc gỡ lỗi có thể tốn nhiều thời gian, đặc biệt nếu sự cố chỉ kích hoạt trên các prompt đơn giản không đòi hỏi suy luận phức tạp.

Hơn nữa, điều này nhấn mạnh rủi ro khi dựa vào các tính năng thử nghiệm hoặc vừa được hợp nhất trong môi trường sản xuất. Thay đổi gây ra vấn đề này nhằm mục đích cải thiện hiệu suất và tính nhất quán, nhưng lại phá vỡ một thỏa thuận cơ bản của đầu ra có cấu trúc. Các đội ngũ sử dụng mô hình tư duy cho nhiệm vụ phân loại, trích xuất hoặc Q&A đơn giản giờ đây phải giả định rằng việc tuân thủ schema phụ thuộc vào quyết định nội bộ của mô hình về việc có suy luận hay không. Sự không chắc chắn này làm phức tạp việc thiết kế các agent AI mạnh mẽ và đòi hỏi các thực hành lập trình phòng thủ bổ sung.

Bạn có thể làm gì

  • Xác thực tất cả các phản hồi có cấu trúc so với JSON schema mong đợi trong ứng dụng client của bạn trước khi xử lý.
  • Nếu không cần suy luận cho một nhiệm vụ cụ thể, hãy đặt think: false để đảm bảo schema được áp dụng trực tiếp cho đầu ra.
  • Giám sát các phản hồi thiếu cấu trúc mong đợi và ghi nhật ký chúng riêng biệt để phân tích.
  • Sử dụng script toolkit cộng đồng check-ollama-format-think.sh để kiểm tra xem mô hình và phiên bản cụ thể của bạn có bị ảnh hưởng hay không.
  • Cân nhắc khóa (pin) phiên bản Ollama của bạn hoặc tránh sử dụng các mô hình tư duy cho các nhiệm vụ đầu ra có cấu trúc quan trọng cho đến khi có bản vá lỗi được phát hành.
  • Xem xét các pull request đang mở, đặc biệt là #18783, để cập nhật tình trạng bản vá chính thức.

Tin khác

Tất cả tin