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

Llama-server Responses API báo cáo sai các kết quả bị cắt ngắn là đã hoàn tất

Một lỗi trong bản build b11753 của llama.cpp khiến endpoint /v1/responses đánh dấu các phản hồi bị cắt và các lệnh gọi công cụ không hợp lệ là đã hoàn tất, gây rủi ro hỏng dữ liệu cho các tác nhân AI tự host.

Minh họa một máy chủ đánh dấu một tác vụ chưa hoàn thành là đã xong
Ả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 lỗi tương thích nghiêm trọng đã được xác định trong endpoint /v1/responses tương thích OpenAI của llama-server, ảnh hưởng đến các triển khai mô hình ngôn ngữ lớn tự host. Tính đến ngày 20 tháng 10 năm 2026, vấn đề này vẫn tồn tại trong bản build llama.cpp b11753, nơi máy chủ báo cáo sai các phản hồi bị cắt ngắn và các lệnh gọi công cụ chưa hoàn chỉnh là đã hoàn tất thành công. Sự khác biệt này đặt ra rủi ro cho các nhà phát triển xây dựng các tác nhân tự động phụ thuộc vào tín hiệu trạng thái chính xác để thực hiện các tác vụ tiếp theo.

Chuyện gì đã xảy ra

Vấn đề cốt lõi nằm ở cách llama-server chuyển đổi các trạng thái tạo sinh nội bộ sang định dạng Responses API. Khi một yêu cầu đạt đến giới hạn token được xác định bởi max_output_tokens, engine chat completion cơ sở nhận diện đúng lý do dừng là "length" (độ dài). Tuy nhiên, khi kết quả này được chuyển đổi thành đối tượng Responses API, máy chủ hard-code trường status thành "completed" (đã hoàn tất) bất kể đầu ra có kết thúc hay bị cắt ngang. Hành vi này ảnh hưởng đến cả kịch bản tạo văn bản tiêu chuẩn và kịch bản gọi hàm.

Trong quá trình kiểm thử với các mô hình như Gemma-3-1b-it và Qwen3-0.6B, các yêu cầu bị giới hạn ở tám token trả về trạng thái "completed" với chi tiết chưa hoàn chỉnh là null, mặc dù văn bản kết thúc giữa câu. Nghiêm trọng hơn, các lệnh gọi công cụ bị cắt ngắn bởi giới hạn token trả về các đối số JSON không hợp lệ—chẳng hạn như {"path": "/—nhưng vẫn được đánh dấu là các mục đã hoàn tất. Các client tin tưởng vào cờ trạng thái này có thể cố gắng phân tích cú pháp JSON hỏng hoặc thực thi các lệnh một phần, dẫn đến các lỗi im lặng hoặc lỗi không mong muốn trong môi trường production.

Chi tiết chính

  • Lỗi ảnh hưởng đến bản build llama.cpp b11753 và cụ thể tác động đến endpoint /v1/responses, trong khi /v1/chat/completions báo cáo đúng finish_reason: "length".
  • Các đối số lệnh gọi công cụ bị cắt ngắn được trả về dưới dạng các mục function_call hợp lệ với trạng thái "completed", mặc dù chứa JSON sai định dạng không thể phân tích cú pháp.
  • Các phản hồi streaming cũng không phát ra sự kiện response.incomplete, thay vào đó kết thúc bằng response.completed và bỏ qua tín hiệu function_call_arguments.done dự kiến.
  • Chỉ số đáng tin cậy duy nhất để phát hiện việc cắt ngắn trong Responses API là kiểm tra xem usage.output_tokens có bằng với max_output_tokens được yêu cầu hay không, mặc dù đây chỉ là heuristic chứ không phải trạng thái xác định.
  • Mã nguồn trong tools/server/server-task.cpp chứa bảy trường hợp mà status được hard-code thành "completed", không có logic để đọc lý do dừng cơ sở hoặc đặt status thành "incomplete".
  • Không có bản vá upstream hay pull request nào được merge cho issue ggml-org/llama.cpp#30773 tính đến ngày 20 tháng 10 năm 2026.

Bối cảnh

Responses API là một đặc tả mới hơn được thiết kế cho các tương tác giống tác nhân, cho phép các mô hình trả về đầu ra có cấu trúc bao gồm các bước suy luận và lệnh gọi công cụ. Llama-server triển khai điều này bằng cách chuyển đổi các yêu cầu Responses đầu vào thành các yêu cầu Chat Completions tiêu chuẩn bên trong. Mặc dù quy trình tạo sinh hoạt động đúng, lớp chuyển đổi thất bại trong việc ánh xạ finish_reason của chat completion trở lại các trường status và incomplete_details của Responses API. Việc chuyển đổi một chiều này làm mất đi các tín hiệu lỗi quan trọng, khiến các client không biết rằng mô hình đã không hoàn thành suy nghĩ hoặc lệnh của mình.

Đối với các nhà phát triển, điều này nhấn mạnh một cạm bẫy phổ biến trong các lớp tương thích: đảm bảo rằng các trạng thái lỗi và điều kiện biên được giữ nguyên qua các lần dịch API. Một trường status chỉ hữu ích nếu nó có thể phản ánh chính xác các kết quả tiêu cực. Trong trường hợp này, máy chủ ưu tiên trả về nội dung hơn là truyền thông mức độ hoàn chỉnh, giả định rằng hầu hết các phản hồi sẽ nằm trong giới hạn. Giả định này sụp đổ đối với các tác vụ phức tạp đòi hỏi ngữ cảnh dài hoặc thực thi công cụ chính xác.

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

Đối với các đội ngũ chạy các tác nhân AI tự host, lỗi này giới thiệu một khoảng trống độ tin cậy tinh vi nhưng nguy hiểm. Các hệ thống tự động thường dựa vào trường status để quyết định có tiến hành tác vụ hay không. Nếu một tác nhân nhận được trạng thái "completed" cho một đường dẫn file hoặc đoạn mã bị cắt ngắn, nó có thể cố gắng thực thi một lệnh một phần. Điều này có thể dẫn đến hỏng dữ liệu, triển khai thất bại hoặc lỗ hổng bảo mật nếu đầu vào một phần bị hiểu sai bởi các hệ thống tiếp theo. Rủi ro cao nhất đối với các mô hình nhỏ hoặc prompt phức tạp nơi giới hạn token thường xuyên bị chạm tới.

Hơn nữa, vấn đề này làm phức tạp hóa việc debug. Bởi vì máy chủ không báo cáo lỗi, nhật ký có thể hiển thị các hoàn tất thành công ngay cả khi đầu ra không sử dụng được. Các nhà phát triển có thể nhầm lẫn quy trách nhiệm cho khả năng suy luận của mô hình hoặc kỹ năng định dạng JSON, thay vì xác định việc cắt ngắn ở cấp độ hạ tầng. Sự hướng dẫn sai lệch này lãng phí thời gian kỹ thuật và có thể dẫn đến việc chuyển đổi mô hình không cần thiết hoặc các điều chỉnh prompt engineering không giải quyết được nguyên nhân gốc rễ.

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

  • Triển khai xác thực phía client để coi bất kỳ phản hồi nào mà usage.output_tokens bằng max_output_tokens là có khả năng bị cắt ngắn và xác minh tính toàn vẹn của đầu ra trước khi sử dụng.
  • Xác thực nghiêm ngặt tất cả các đối số lệnh gọi công cụ dưới dạng JSON trước khi thực thi; từ chối bất kỳ mục function_call nào không phân tích cú pháp được, bất kể trạng thái được báo cáo.
  • Ưu tiên sử dụng endpoint /v1/chat/completions cho các tác vụ quan trọng nếu kiến trúc ứng dụng của bạn cho phép, vì nó báo cáo đúng finish_reason: "length" cho các đầu ra bị cắt ngắn.
  • Tăng giới hạn max_output_tokens cho các workflow tác nhân để giảm tần suất cắt ngắn, đảm bảo mô hình có đủ không gian để hoàn thành suy luận phức tạp hoặc định nghĩa công cụ.
  • Chạy các script chẩn đoán như check-llama-responses-status.sh trên triển khai của bạn để xác nhận xem phiên bản và cấu hình cụ thể của bạn có bị ảnh hưởng bởi hành vi status hard-code này hay không.
  • Theo dõi các repository upstream để tìm bản vá cho llama.cpp issue #30773, và cân nhắc đóng góp một bản vá ánh xạ lý do dừng của chat completion sang trường status của Responses API nếu bạn có khả năng.

Tin khác

Tất cả tin