1 điểm bởi GN⁺ 6 giờ trước | 1 bình luận | Chia sẻ qua WhatsApp
  • Trong công cụ edit của Pi, Claude Opus 4.8Sonnet 5 bị từ chối khi gọi vì tự thêm các trường không có trong schema vào bên trong edits[], cho thấy hiện tượng các mô hình mới nhất lại tuân thủ một số schema công cụ kém hơn so với các mô hình trước đó
  • Gọi công cụ là quá trình mô hình sinh ra văn bản dưới dạng các marker đặc biệt và JSON, nên khi sampling không có ràng buộc thì những quy ước đã học có thể lấn át schema
  • Trong các ca thất bại, bản thân oldTextnewText đều đúng nhưng vẫn bị gắn thêm các khóa giả như requireUnique, oldText2, matchCase, in_file; khả năng tái hiện cũng thay đổi tùy theo lịch sử agent và việc có bao gồm thinking block hay không
  • Claude Code là một harness đóng nhưng thực hiện rất nhiều hiệu chỉnh lỏng, như thử lại khi gọi sai, bí danh tham số, ép kiểu, khôi phục Unicode, lọc khóa không rõ, và không dùng chế độ strict
  • Gọi công cụ strict của Anthropic đã loại bỏ vấn đề này; nếu hiệu năng mô hình càng tăng lại càng bất lợi cho các schema công cụ thay thế, thì harness sẽ cần những bảo đảm mạnh hơn như ràng buộc ngữ pháp

Hồi quy xuất hiện trong công cụ edit của Pi

  • Khi theo dõi Pi issue, người ta phát hiện các model Claude mới nhất khi gọi công cụ edit của Pi đã thêm các trường không tồn tại vào trong mảng edits[]
  • Vấn đề này không xuất hiện ở model nhỏ mà ở Opus 4.8, và hiện tượng tương tự cũng được xác nhận trên Sonnet 5
  • Với các model Anthropic trước đó thì không thấy cùng vấn đề này, nghĩa là các model mạnh đời mới lại hoạt động tệ hơn trên schema công cụ cụ thể này
  • Fable không được thử vì bộ phân loại có thể âm thầm hạ yêu cầu xuống Opus

Gọi công cụ gần với sinh văn bản hơn

  • Việc gọi công cụ của LLM hoạt động theo cách mô hình nhận lịch sử hội thoại, system prompt và danh sách công cụ khả dụng, rồi sinh ra định dạng lời gọi bên trong một prompt lớn có chứa các marker đặc biệt
  • Đối số dự kiến của công cụ chỉnh sửa file có thể gồm path và mảng edits như sau
{
  "path": "some/file.py",
  "edits": [
    {
      "oldText": "text to replace",
      "newText": "replacement text"
    }
  ]
}
  • Harness sẽ kiểm tra đối số, thực hiện chỉnh sửa rồi đưa kết quả trở lại cho mô hình; nếu kiểm tra thất bại thì mô hình sẽ nhận lỗi và thường thử lại
  • Định dạng nội bộ của model Anthropic không được công khai, nhưng các marker ANTML từng bị rò rỉ hoặc xuất hiện trong trao đổi công khai
  • Định dạng này trông giống XML, nhưng thực ra gần với một tín hiệu in-band thuận tiện cho tokenization và huấn luyện hơn là XML thật sự
    • Các tham số chuỗi ở cấp cao nhất có thể được chèn inline
    • Các mảng đối tượng dường như được đưa vào dưới dạng tuần tự hóa JSON

Sinh không ràng buộc và sinh có ràng buộc ngữ pháp

  • Có hai cách chính để mô hình tạo đầu ra có cấu trúc
    • Yêu cầu mô hình sinh JSON khớp với schema rồi kiểm tra sau
    • Ngăn sampler ngay từ đầu không thể lấy mẫu JSON sai hoặc sai hình dạng schema
  • Cách thứ hai được gọi là giải mã nhận biết ngữ pháp hoặc giải mã có ràng buộc, trong đó các token vi phạm ngữ pháp sẽ bị mask
  • Nếu schema chỉ cho phép oldTextnewText, thì sampler có thể ngăn không cho sinh các khóa như "in_file" hay "type"
  • Nếu không có các ràng buộc như vậy, mô hình sẽ sinh theo các quy ước đã học thay vì tuân thủ chặt chẽ hợp đồng trừu tượng

Mẫu thất bại thực tế

  • Công cụ edit của Pi dùng mảng edits vì hỗ trợ nhiều phép thay thế chuỗi chính xác trong một lần gọi
  • Trong các lời gọi thất bại, các trường không được phép bị gắn thêm như sau
{
  "oldText": "...",
  "newText": "...",
  "requireUnique": true
}
{
  "oldText": "...",
  "newText": "...",
  "oldText2": "",
  "newText2": ""
}
  • Trong các thử nghiệm lặp lại, các khóa giả xuất hiện rất đa dạng như type, id, kind, unique, requireUnique, matchCase, in_file, forceMatchCount, children, notes, cost, oldText2, newText2, oldText_2, newText_2, event.0.additionalProperties, v.v.
  • Trong các lời gọi sai đã được xác nhận, payload oldTextnewText thực tế chính xác đến từng byte, nhưng đối tượng vẫn bị gắn thêm các khóa vô nghĩa ở cuối nên bị từ chối
  • Khả năng tái hiện phụ thuộc rất mạnh vào ngữ cảnh
    • Với prompt mới một lượt như “edit this file” thì không tái hiện được
    • Với lịch sử agent nơi mô hình đã đọc file, chẩn đoán vấn đề rồi dựng bản chỉnh sửa nhiều dòng thì lại tái hiện được
    • Cần có transcript của Petr Baudis mới tái hiện được
    • Nếu tiếp tục phiên người dùng đó, Opus 4.8 thất bại với xác suất khoảng 20%
    • Nếu bỏ thinking block khỏi lịch sử thì tỷ lệ thất bại giảm một nửa
    • Nếu bật gọi công cụ strict thì vấn đề biến mất trong lần chạy đó

Vì sao lại tệ hơn

  • Giả thuyết mạnh nhất là đây không phải suy giảm hiệu năng ngẫu nhiên mà là một sản phẩm của quá trình huấn luyện
  • Các model Anthropic trước đó được huấn luyện với một số công cụ, nhưng trước khi các harness do người dùng cung cấp như Claude Code trở thành mục tiêu rõ ràng
  • Các model Anthropic mới nhất nhiều khả năng đã được hậu huấn luyện với Claude Code hoặc một harness rất giống nó, và trong môi trường đó có thể đã học cả những lời gọi công cụ thành công lẫn các lỗi được chấp nhận
  • Công cụ edit của Claude Code có cấu trúc phẳng hơn, gần với file_path, old_string, new_stringreplace_all tùy chọn, chứ không phải cấu trúc edits[] lồng nhau của Pi
  • Client Claude Code hiệu chỉnh khá nhiều lỗi như thử lại khi dùng công cụ sai, bí danh tham số, ép kiểu, khôi phục Unicode và lọc khóa không xác định
  • Nếu reinforcement learning diễn ra bên trong harness như vậy hoặc mô phỏng của nó, thì các lời gọi công cụ hơi sai vẫn có thể hoàn thành tác vụ và nhận được phần thưởng
  • Khi một harness khác cung cấp công cụ chỉnh sửa cùng ý nghĩa nhưng bằng schema khác, thì với mô hình nó có thể ngày càng trở thành công cụ ngoài phân phối
  • Khi Opus 4.5 ra mắt, nó từng thích nghi rất tốt với các công cụ edit khác, nhưng hướng quan sát hiện tại cho thấy các schema công cụ thay thế có thể chịu bất lợi trong một hệ sinh thái công cụ quá khoan dung
  • text editor tool được tài liệu hóa, nhưng Claude Code không tuân theo chính xác định dạng đó, còn hoạt động nội bộ của Claude Code là harness đóng nên không thể thấy rõ

Harness lỏng lẻo của Claude Code

  • Claude Code là mã nguồn đóng, nhưng qua mã rút gọn có thể thấy nó rất khoan dung với dữ liệu đầu vào
  • Nó kiểm tra xem markup <invoke có bị rò ra phần văn bản mà mô hình nhìn thấy hay không; nếu có thì gửi telemetry rồi dùng state machine riêng để thử lại lời gọi sai
  • khôi phục escape Unicode để sửa các chuỗi \\uXXXX bị hỏng và lone surrogate trong giá trị chuỗi
  • Cũng có bí danh tham số theo từng công cụ
    • Edit chấp nhận old_str, old_string, new_str, new_string
    • path được chấp nhận như bí danh của file_path
  • Các khóa ngoài dự kiến sẽ bị lọc đi trong im lặng
  • Nó không dùng chế độ strict
    • Anthropic áp giới hạn độ phức tạp của định nghĩa công cụ trong chế độ strict, nên yêu cầu API có thể thất bại
    • Có vẻ đây là lý do Claude Code không thử chế độ strict

Chế độ strict và các hệ sinh thái khác

  • Cả model Anthropic lẫn harness đều đóng, nên khó đánh giá liệu cùng vấn đề có tiếp diễn trong các harness khác hay không
  • Model Codex cũng đóng, nhưng harness thì không đóng
  • gpt-oss được huấn luyện rõ ràng để dùng định dạng phản hồi harmony của OpenAI, và có nhiều tài liệu thể hiện cách tiếp cận của OpenAI
  • harmony đưa các channel và loại nội dung gọi công cụ trở thành một phần của định dạng prompt, đồng thời có thể chèn các marker như <|constrain|>json vào phần thân gọi công cụ
<|start|>assistant<|channel|>commentary to=functions.get_weather
<|constrain|>json<|message|>{"location":"San Francisco"}<|call|>
  • <|constrain|>json giúp stack suy luận dễ xác định ranh giới nơi cần chuyển sang lấy mẫu JSON có ràng buộc trong phần thân gọi công cụ
  • Các model GPT được host còn có tùy chọn cung cấp ngữ pháp LARK cho cú pháp mà công cụ người dùng phải tuân theo
  • Có vẻ Anthropic cũng làm một số xử lý tương tự trong chế độ strict, nhưng với tham số mảng lồng nhau thì mô hình vẫn phải sinh JSON có escape bên trong chuỗi literal cho nội dung file dài nhiều dòng
  • Các khóa giả xuất hiện ngay sau khi đóng chuỗi newText dài hàng trăm token, tại điểm entropy cao nơi mô hình phải chọn giữa }, "..."
  • Opus 4.8 và Sonnet 5 dường như có prior mạnh hơn về hình thức gọi công cụ edit, và prior đó gần với schema edit phẳng của Claude Code hơn
  • Việc chế độ strict của Anthropic sửa được vấn đề cho thấy phía server có thể đang từ chối việc lấy mẫu các khóa không được phép theo cấu trúc JSON schema
  • Ở các model Codex đã thử nghiệm không thấy kiểu hồi quy này, còn 5.6 bị loại vì không có quyền truy cập

Tác động tới thiết kế harness

  • Với model Anthropic, schema công cụ có thể không phải là một hợp đồng trừu tượng trung lập
  • Một số hình dạng công cụ gần với những gì mô hình đã thấy trong hậu huấn luyện hơn, còn một số thì xa hơn
  • Một số hình dạng có thể dễ hơn trong mã hóa ẩn của nhà cung cấp, còn một số lại khó vì phải viết một đối tượng JSON escape lớn trong mảng lồng nhau sau các chuỗi nhiều dòng dài
  • Ngay cả khi mô hình hiểu schema, trong tình huống có áp lực nó vẫn có thể thất bại khi lấy mẫu đúng cấu trúc
  • Trên Anthropic, nếu bật lấy mẫu strict thì vấn đề này có thể biến mất
  • Tuy vậy, hành vi của các model mới nhất cho thấy reinforcement learning tác động đến mô hình như thế nào, và cách chống lại prior của một harness cụ thể có thể bất lợi cho việc đạt hiệu năng cao nhất
  • Claude Code không phải mã nguồn mở và cũng không rõ nó làm gì trong môi trường RL, nên khó giả định rằng hành vi được huấn luyện để phù hợp với Claude Code sẽ chuyển tốt sang các công cụ khác
  • Càng có nhiều hậu huấn luyện diễn ra trong một harness thống trị, thì các harness khác càng phải thừa hưởng những đặc tính kỳ quặc của harness đó
  • Giải mã có ràng buộc có thể đi kèm đánh đổi về chất lượng, nhưng nếu các model mới nhất giỏi giải quyết tác vụ hơn trong khi lại kém hơn trong việc phát ra trung thành các schema công cụ thay thế, thì sẽ cần những bảo đảm mạnh hơn ở đâu đó trong harness

1 bình luận

 
Các ý kiến trên Lobste.rs
  • Nếu bạn tò mò về Fable, tôi hiểu rằng giờ đây Fable luôn thông báo rõ ràng khi hạ cấp
    Tôi cũng từng bị bộ phân loại chặn; có vẻ câu “hãy sắp xếp lỗi theo mức độ nghiêm trọng” nghe giống nghiên cứu bảo mật

    • Tôi định thử kiểm tra thêm
      Tôi biết họ đã nói sẽ không âm thầm làm ở phía sau, nhưng tôi vẫn chưa xác minh được cơ chế dùng để hạ cấp
  • Nếu giả thuyết này đúng, tác động có khả năng vượt ra ngoài các coding agent
    Với bất kỳ ứng dụng nào phụ thuộc vào tool calling ổn định, sau khi mô hình được hậu huấn luyện để phù hợp với môi trường thực thi ưa thích của một nhà cung cấp cụ thể, chúng có thể gặp tình trạng suy giảm hiệu năng tương tự

  • Nhân tiện, bài này được đăng với thẻ ai, không phải vibecoding
    Thật sự rất khó hiểu ranh giới của vibecoding trên trang này nằm ở đâu
    Bài này liên quan nhiều hơn đến LLM nền tảng, học tăng cường, và việc xây dựng môi trường thực thi xung quanh chúng
    Nếu cả điều này cũng là vibecoding thì tôi không biết thẻ ai còn được dùng ở đâu nữa

    • Ở đây vibecoding đã trở thành một kiểu chữ đỏ Scarlet Letter khổng lồ gắn lên mọi thứ có dính dáng, hoặc trông như có dính dáng dù chỉ chút ít, đến AI tạo sinh
      Trong vài tuần gần đây, từ những bài blog mang tính cảm hứng, README của các dự án lớn cấm đóng góp bằng LLM, cho đến các bài có quá nhiều câu kiểu “không phải X mà là Y”, tất cả đều bị gắn thẻ vibecoding
      Cá nhân tôi đã hoàn toàn từ bỏ việc quan tâm đến thẻ đó. Vì cộng đồng gắn nó quá phản xạ nên ý nghĩa thực tế của nó đã biến mất
      Tuy vậy, với riêng bài này thì, có thể nói, nó thực sự nói về các mô hình được dùng cho mục đích đó, nên tôi đồng ý việc gắn thẻ vibecoding
      Đồng thời tôi cũng đồng ý, đúng như lý do đã nêu, rằng ai không nên bị gỡ bỏ. Tôi muốn thêm lại, nhưng không hiểu sao bài này lại không có tùy chọn đó
  • Không có gì đáng ngạc nhiên. Khóa chân vào nhà cung cấp có lẽ là một phần của kế hoạch

    • Có lẽ cũng có phần nhằm giảm chi phí. Nếu mọi người đều dùng Claude Code thì prompt caching sẽ được cải thiện
      Kiểu “nếu bạn đang trả phí thuê bao Claude và đã gửi toàn bộ mã nguồn của mình cho chúng tôi, thì bạn cũng nhất thiết phải dùng UI miễn phí, thứ có thể chưa đủ mạnh để khóa chân bạn nếu tách riêng khỏi mô hình” hơi khác với cách khóa chân nhà cung cấp thuần túy thường vận hành
  • Việc mô hình hoạt động tối ưu trong môi trường thực thi mà nó được huấn luyện, tức môi trường do nhà phát triển mô hình tạo ra, là điều hợp lý
    Nếu nó đã trải qua học tăng cường rất lớn trên các trace kiểu Claude Code, thì tôi đã dự đoán rằng nó sẽ tệ đi đáng kể trong các môi trường thực thi không hoạt động giống Claude Code
    Cá nhân tôi lại ngạc nhiên hơn vì dường như nó vẫn làm khá tốt trong các môi trường thực thi bên thứ ba như Pi
    Việc lỗi chỉ xuất hiện sâu trong trace của agent cũng có vẻ hợp lý
    Đầu năm nay, với các mô hình GPT 5.2 và 5.3, tôi đã vật lộn với một lỗi ở phần sau của trace, khi agent in ra ls -ლა thay vì ls -la
    Tôi đã ghi ngắn gọn ở đây: https://github.com/openai/codex/issues/7988
    Theo kinh nghiệm của tôi, lỗi này cũng chỉ xảy ra sau khi trace đã đi sâu
    Trong ngữ cảnh dài, mô hình dường như không thể “suy nghĩ” rõ ràng và quay về với bản năng nguyên thủy
    Có lẽ ở điểm đó, khác biệt giữa phân phối huấn luyện của mô hình và môi trường thực thi, hoặc tác vụ mà người dùng ép mô hình thực hiện, sẽ ảnh hưởng đến hiệu năng một cách kịch tính nhất

    • Vấn đề không phải là nó được học tăng cường để hoạt động tốt hơn trong môi trường thực thi của chính nó
      Vấn đề là nó đã được học tăng cường quá nhiều đến mức thoái hóa trong các môi trường thực thi khác so với bản phát hành trước
      Đến điểm này, cần đặt những câu hỏi kiểu “liệu các dạng overfitting khác cũng đang bắt đầu xuất hiện không?”