Ba pull request đã được merge vào nhánh chính của kho openai/codex hé lộ hướng cải tổ cách Codex quản lý cửa sổ ngữ cảnh: khi phiên làm việc vượt quá giới hạn cửa sổ, hệ thống không còn tạo tóm tắt để nén lịch sử, mà chuyển sang kích hoạt thẳng một cửa sổ hoàn toàn mới để tiếp tục công việc. Các năng lực liên quan đều nằm sau feature flag `Feature::TokenBudget`, chưa chính thức ra mắt.
Cách làm hiện tại là nén theo kiểu tóm tắt. Khi cửa sổ sắp đầy, hệ thống gửi yêu cầu để server cô đọng đoạn hội thoại trước đó thành một bản tóm tắt, rồi dùng nó thay cho lịch sử gốc. Cách này có hai khoản chi phí cố định: việc tạo tóm tắt tự nó tốn token, và việc nén là có mất mát — các quy ước giao diện, tên đường dẫn, những quyết định chốt từ vài lượt trước đó đều có thể bị xóa nhòa trong quá trình cô đọng. Những ai từng dùng Codex chạy tác vụ dài không lạ gì kiểu lỗi thứ hai này — mô hình quên mất quy tắc đã chốt hai tiếng trước, nhưng vẫn trả lời rất tự tin.
Mô hình có thể tự xin một trang giấy mới
Bước đầu tiên là PR #27488, merge ngày 11 tháng 6, tiêu đề "Add new context window tool". PR này thêm công cụ `new_context`, chỉ mở cho mô hình sử dụng, và tác giả mô tả nó là "escape hatch" cho lúc cửa sổ hiện tại trở nên khó dùng.
Yêu cầu này được ghi nhận trên `AutoCompactWindow`, tiêu thụ ngay sau khi lấy mẫu, và yêu cầu tiếp theo trong cùng lượt sẽ rơi vào cửa sổ mới. Điểm khởi đầu của cửa sổ mới là một checkpoint nén không kèm tóm tắt, chỉ giữ lại ngữ cảnh ban đầu, còn lịch sử hội thoại trước đó không được mang theo.
Dọn dẹp thủ công cũng đi cùng một đường
Bước thứ hai là PR #29743, merge ngày 23 tháng 6. PR này gộp nén thủ công và nén tự động vào chung một vòng đời `compact_token_budget`: khi token budget được bật, việc nén không còn xin tóm tắt từ server nữa, mà nạp thẳng một bộ ngữ cảnh khởi đầu hoàn toàn mới ngay tại chỗ.
Chi tiết kỹ thuật ở bước này khá thận trọng: hành vi có thể quan sát từ bên ngoài được giữ nguyên, hook compact vẫn kích hoạt như thường, sự kiện vòng đời `ContextCompaction` vẫn được phát ra như cũ. Nói cách khác, các client phụ thuộc vào những sự kiện này không cần sửa gì, phần thay đổi chỉ nằm ở bên trong.
Phần lấy lại được giao cho lịch sử và ghi chú
Hai bước đầu mới giải quyết chuyện "bỏ đi", còn PR #39827, merge ngày 21 tháng 8, mới bù lại phần "lấy lại". Mô tả của PR này nói thẳng: các phiên dùng token budget cần một cách để khôi phục ngữ cảnh hội thoại trước đó, và giữ được trạng thái công việc khi chuyển qua cửa sổ khác.
PR này thêm hai nhóm công cụ. Công cụ lịch sử phụ trách liệt kê cửa sổ và mục, đọc một mục cụ thể, tìm kiếm trong nội dung phiên làm việc; công cụ ghi chú phụ trách liệt kê, đọc, tìm kiếm, thêm và ghi vào ghi chú lâu dài. Các lệnh gọi đi qua backend của Codex, cần nhà cung cấp OpenAI và xác thực backend, cũng nằm sau feature flag `features.token_budget.use_history_notes_history`.
Về mặt kỹ thuật có vài chỗ giới hạn tốc độ: đầu ra được xử lý theo kiểu nhận biết cắt bớt, tham số yêu cầu có giới hạn biên. Ý kiến từ review tự động tập trung vào giới hạn 10.000 token cho kết quả dạng văn bản thuần, giới hạn tham số cho thao tác ghi chú, và đề xuất triển khai theo từng giai đoạn.
Thứ bị thay thế thực chất là gì
Nén tóm tắt và mở cửa sổ mới kèm tra cứu, về bản chất là hai chiến lược ghi nhớ khác nhau. Cái trước là nén có mất mát ngầm định, mô hình không biết mình đã mất gì, cũng không có cách lấy lại. Cái sau là khởi động lại không trạng thái một cách tường minh, mô hình biết rõ nội dung cũ vẫn còn ở đâu đó, cần thì đi tra.
Cái giá phải trả cũng đổi chỗ theo. Thất bại của nén có mất mát diễn ra âm thầm; thất bại của việc mở cửa sổ mới sẽ biến thành "đáng lẽ phải tra mà không tra" hoặc "có tra nhưng tra không trúng". Cái trước khó gỡ lỗi, cái sau ít nhất còn thấy được trong log. Với các agent chạy tác vụ dài, một thất bại có thể quan sát được vẫn dễ xử lý hơn nhiều so với một thất bại im lặng.
Khoản tiền tiết kiệm được là lợi ích ở phía còn lại. Tóm tắt phải qua một lượt gọi mô hình, và trong phiên dài chi phí này lặp lại nhiều lần; mở cửa sổ mới không phát sinh lượt gọi đó, tra cứu chỉ diễn ra khi cần và theo từng mục. Với người dùng nặng chạy hết hạn mức mỗi ngày, đây là khoản tiết kiệm thực chất.
Điều cần nói rõ là nhịp độ triển khai: PR được merge không có nghĩa là tính năng đã ra mắt. Cả ba thay đổi này đều đang nằm sau feature flag, review tự động vẫn còn đề xuất triển khai theo từng giai đoạn. Từ phiên bản công cụ đầu tiên hồi tháng 6 đến phần bổ sung lịch sử và ghi chú vào tháng 8, OpenAI đã mài giũa hướng đi này hơn hai tháng, còn thời điểm bật flag và bật cho ai thì hồ sơ trong kho mã nguồn chưa cho câu trả lời.
Nguồn tham khảo: ba pull request đã được merge trong kho openai/codex, CocoLoop, ý kiến review tự động trên GitHub; tên công cụ, tên feature flag và trạng thái merge đã được đối chiếu từng mục theo hồ sơ trong kho mã nguồn.