Token là những mẩu chữ nhỏ mà mô hình ngôn ngữ thật sự đọc và viết: có khi là một từ ngắn, có khi là một phần của từ dài, một dấu câu, hay một cụm khoảng trắng. Mọi giới hạn bạn gặp khi dùng trợ lý viết mã, từ độ dài ngữ cảnh, độ dài câu trả lời, tốc độ phản hồi đến chi phí khi gọi qua API, đều được tính bằng token chứ không bằng số dòng hay số ký tự.
Với người viết mã, token có vài đặc điểm đáng biết: mã nguồn thường tốn token hơn văn xuôi, tiếng Việt có dấu thường tốn hơn tiếng Anh cho cùng một ý, và dữ liệu như tệp JSON dài có thể nuốt hết cửa sổ ngữ cảnh lúc nào không hay. Bài này giải thích cách token hình thành và cách dùng gọn mà không làm kém câu trả lời.
Token hình thành thế nào: từ vựng của mô hình
Trước khi huấn luyện, người làm mô hình xây một bộ từ vựng gồm vài chục nghìn đến vài trăm nghìn mẩu chữ. Cách phổ biến là bắt đầu từ từng ký tự hoặc từng byte, rồi gộp dần những cặp hay đi cùng nhau thành mẩu lớn hơn, lặp lại nhiều lần. Kỹ thuật này thường được gọi là mã hoá cặp byte (byte pair encoding). Kết quả là những chuỗi rất phổ biến như function, return, import thành một token, còn chuỗi hiếm bị cắt thành nhiều mảnh.
Khi bạn gửi chữ cho mô hình, bộ tách token cắt chữ đó theo từ vựng có sẵn. Mô hình chỉ làm việc với dãy số đại diện cho các token, rồi đoán token tiếp theo, rồi ghép lại thành chữ cho bạn đọc. Vì vậy hai mô hình khác hãng, thậm chí hai thế hệ của cùng một hãng, có thể đếm cùng một đoạn mã ra số token khác nhau. Con số cụ thể chỉ chính xác khi đếm bằng công cụ đếm của đúng mô hình đó.
Một quy tắc ước lượng hay được nhắc là với văn bản tiếng Anh thông thường, một token tương đương khoảng bốn ký tự. Quy tắc này hữu ích để ước chừng nhanh nhưng lệch nhiều với mã nguồn và với tiếng Việt, như hai phần dưới sẽ cho thấy.
Mã nguồn bị cắt thành token ra sao
Thụt lề và khoảng trắng. Bộ tách của nhiều mô hình mới gộp các khoảng trắng liên tiếp thành ít token, nhưng không phải mô hình nào cũng vậy. Tệp thụt lề bằng nhiều dấu cách ở mô hình cũ có thể tốn đáng kể chỉ cho phần trống.
Tên biến dài và tên tự đặt. Tên quen như user_id có thể chỉ một hai token. Tên tự đặt kiểu tongTienSauChietKhauKhachSi bị cắt thành nhiều mảnh. Điều này không có nghĩa là nên đặt tên ngắn khó hiểu; tên rõ nghĩa giúp AI đoán đúng hơn, đáng đổi lấy vài token.
Ký hiệu và dấu ngoặc. Mã có mật độ ký hiệu cao như biểu thức chính quy, mã đã nén một dòng, hay chuỗi mã hoá thì gần như mỗi ký tự là một token. Một tệp JavaScript đã nén để chạy trên web có thể tốn gấp nhiều lần so với bản gốc dễ đọc, mà lại khó hiểu hơn cho chính mô hình.
Dữ liệu dán kèm. Một tệp JSON mẫu vài nghìn dòng, một bảng CSV, một đoạn nhật ký lỗi lặp lại hàng trăm lần, thường tốn token hơn chính đoạn mã bạn hỏi. Đây là thủ phạm số một khiến ngữ cảnh đầy nhanh.
Chú thích và chuỗi tiếng Việt. Phần chữ tiếng Việt trong chú thích, thông báo lỗi, chuỗi giao diện được tính theo cách tách của tiếng Việt, thường tốn hơn tiếng Anh như phần tiếp theo giải thích.
Tiếng Việt và token: vì sao cùng ý mà tốn hơn
Bộ từ vựng của mô hình được xây chủ yếu từ dữ liệu huấn luyện, mà phần lớn dữ liệu công khai là tiếng Anh. Các chuỗi tiếng Anh phổ biến được gộp thành token lớn, còn tiếng Việt với dấu thanh, dấu mũ, chữ đ được mã hoá thành nhiều byte trong chuẩn UTF-8 và ít được gộp hơn. Kết quả là cùng một câu, bản tiếng Việt thường cần nhiều token hơn bản tiếng Anh. Mức chênh tuỳ bộ tách: các thế hệ mô hình gần đây đã cải thiện đáng kể cho nhiều ngôn ngữ, nhưng chênh lệch vẫn còn.
Trong thực tế viết mã, điều này ít khi là lý do để bỏ tiếng Việt. Câu hỏi của bạn thường ngắn, phần lớn token nằm ở mã và dữ liệu. Hỏi bằng tiếng Việt cho rõ ý vẫn tốt hơn hỏi bằng tiếng Anh vụng về. Chỗ đáng tính toán là khi bạn xây ứng dụng gọi mô hình qua API để xử lý hàng loạt văn bản tiếng Việt, như tóm tắt phản hồi khách hàng: khi đó chênh lệch token cộng dồn thành chênh lệch chi phí và tốc độ, nên đo thử trên dữ liệu thật trước khi ước ngân sách.
Một lưu ý nhỏ: chữ tiếng Việt có hai cách mã hoá dấu, dạng dựng sẵn và dạng tổ hợp. Văn bản sao chép từ một số nguồn dùng dạng tổ hợp, vừa tốn token hơn vừa có thể làm so sánh chuỗi trong mã bị sai. Nếu ứng dụng của bạn xử lý tiếng Việt, chuẩn hoá về một dạng trước khi lưu và trước khi gửi cho mô hình là thói quen tốt.
Token quyết định ba thứ bạn cảm nhận được
Ở góc người dùng, token hiện ra qua ba hiện tượng. Hiểu mối liên hệ giúp bạn chẩn đoán vì sao công cụ bỗng chậm hoặc cắt ngang câu trả lời.
| Thứ bạn thấy | Liên quan tới token thế nào | Ghi chú |
|---|---|---|
| Độ dài tối đa | Ngữ cảnh đầu vào và câu trả lời đầu ra đều có trần tính bằng token | Trần đầu ra thường nhỏ hơn nhiều so với trần đầu vào |
| Tốc độ | Đầu vào dài thì mô hình mất thêm thời gian đọc; đầu ra được viết ra lần lượt từng token | Câu trả lời dài luôn chậm hơn, dù mô hình nhanh |
| Chi phí | Gọi qua API thường tính theo số token vào và ra, đơn giá vào và ra thường khác nhau | Gói thuê bao cá nhân thường quy ra hạn mức sử dụng; cách tính cụ thể đổi theo hãng và thời điểm |
| Hạn mức tạm thời | Nhiều dịch vụ giới hạn số token mỗi phút hoặc mỗi ngày | Tác tử chạy lâu dễ chạm hạn mức này hơn trò chuyện thường |
Bài này không nêu giá cụ thể vì bảng giá thay đổi thường xuyên và khác nhau theo gói. Khi cần ước chi phí, hãy xem trang giá chính thức tại thời điểm bạn làm và nhân với số token đo được trên dữ liệu thật của mình.
Ước lượng số token cho một việc: ví dụ giả định
Ví dụ giả định: bạn định nhờ trợ lý rà một tệp Python khoảng 400 dòng cùng một tệp kiểm thử khoảng 200 dòng, và muốn biết có nằm gọn trong ngữ cảnh không.
- Đếm ký tự của hai tệp bằng công cụ có sẵn trên máy, ví dụ lệnh đếm ký tự của hệ điều hành. Giả sử tổng là khoảng 24 nghìn ký tự.
- Ước thô theo quy tắc khoảng bốn ký tự một token cho mã tiếng Anh, được khoảng 6 nghìn token. Vì mã có nhiều ký hiệu và chú thích tiếng Việt, cộng thêm biên an toàn, coi như 8 nghìn token.
- Cộng phần lời dặn hệ thống của công cụ và câu hỏi của bạn, vài nghìn token nữa.
- Chừa chỗ cho câu trả lời: nếu bạn muốn AI viết lại cả tệp, phần đầu ra có thể ngang phần đầu vào.
- So tổng với giới hạn ngữ cảnh và giới hạn đầu ra của mô hình bạn dùng, xem trong tài liệu chính thức. Nếu cần con số chính xác, dùng công cụ đếm token mà hãng cung cấp cho đúng mô hình đó.
Với các mô hình có cửa sổ lớn hiện nay, ví dụ này thường nằm gọn. Nhưng nếu bạn dán thêm một tệp dữ liệu mẫu vài nghìn dòng, tổng có thể tăng gấp nhiều lần chỉ vì phần dữ liệu.
Dùng ít token hơn mà không làm kém câu trả lời
Mục tiêu không phải tiết kiệm bằng mọi giá, mà là để token dành cho phần có ích. Những cách sau gần như không có mặt trái:
- Thay vì dán cả tệp dữ liệu, dán năm đến mười dòng đại diện cùng mô tả số lượng và cấu trúc.
- Cắt nhật ký lỗi chỉ còn phần đầu, phần lỗi chính và vài dòng ngăn xếp lời gọi liên quan, bỏ các dòng lặp lại.
- Gửi bản mã gốc dễ đọc, không gửi bản đã nén hay bản do công cụ đóng gói sinh ra.
- Yêu cầu AI trả về phần thay đổi hoặc chỉ hàm đã sửa, không viết lại cả tệp.
- Mở phiên mới khi đổi sang việc khác, thay vì kéo dài một phiên chứa đủ thứ không liên quan.
- Với tác tử, dặn chạy kiểm thử ở chế độ chỉ in lỗi, tránh để nhật ký thành công dài hàng nghìn dòng tràn vào ngữ cảnh.
Những thói quen này vừa giảm token vừa giảm nhiễu, nên thường làm câu trả lời tốt lên chứ không kém đi.
Những hiểu lầm hay gặp về token
"Một token là một từ." Chỉ đúng với một phần từ tiếng Anh phổ biến. Từ dài, tên riêng, chữ tiếng Việt có dấu và ký hiệu trong mã thường bị cắt thành nhiều token, còn vài chuỗi phổ biến lại gộp nhiều ký tự thành một.
"Cửa sổ lớn thì không cần để ý token nữa." Cửa sổ lớn giảm khả năng bị cắt, nhưng mỗi token thêm vào vẫn làm chậm câu trả lời, vẫn tính vào hạn mức, và như bài về cửa sổ ngữ cảnh đã nói, vẫn có thể làm loãng sự chú ý của mô hình.
"Mô hình đọc từng chữ cái nên đếm ký tự được chính xác." Mô hình thấy token chứ không thấy từng chữ cái, nên các việc như đếm số ký tự trong một chuỗi, đảo ngược chuỗi hay so độ dài thường dễ sai khi chỉ nhờ AI nghĩ trong đầu. Với những việc này, nên nhờ AI viết mã thực hiện rồi chạy mã, thay vì tin con số nó tự đếm.
"Rút gọn tên biến để tiết kiệm token." Số token tiết kiệm được rất nhỏ, còn cái giá là mã khó đọc cho cả người lẫn AI. Phần đáng cắt là dữ liệu và nhật ký thừa, không phải tên biến.
Câu hỏi thường gặp
Một dòng mã bằng bao nhiêu token?
Không có con số cố định. Một dòng ngắn như lệnh trả về có thể chỉ vài token, một dòng biểu thức chính quy dài có thể vài chục. Muốn biết chính xác hãy dùng công cụ đếm token của đúng mô hình bạn dùng.
Chú thích trong mã có bị tính token không?
Có. Mọi thứ được gửi cho mô hình đều tính, kể cả chú thích, khoảng trắng và dòng trống. Nhưng chú thích rõ ràng giúp AI hiểu ý định, nên đừng xoá chú thích chỉ để tiết kiệm token.
Dùng gói thuê bao thì có cần quan tâm token không?
Ít hơn, nhưng vẫn nên. Gói thuê bao thường có hạn mức sử dụng quy đổi từ lượng token, và giới hạn ngữ cảnh vẫn áp dụng. Phiên dài, dán nhiều dữ liệu sẽ chạm hạn mức hoặc làm câu trả lời kém đi.
Vì sao cùng đoạn mã mà hai công cụ báo số token khác nhau?
Vì mỗi mô hình dùng bộ tách token riêng với từ vựng riêng. Ngoài ra công cụ còn thêm lời dặn hệ thống và định dạng riêng vào trước khi gửi, nên con số cuối cùng khác nhau.
Token đầu ra có đắt hơn token đầu vào không?
Ở nhiều dịch vụ gọi qua API, đơn giá token đầu ra cao hơn đầu vào, vì mô hình phải sinh từng token một. Mức chênh cụ thể khác nhau theo hãng và theo mô hình, nên cần xem trang giá hiện hành.
Viết câu hỏi bằng tiếng Anh có tiết kiệm đáng kể không?
Với câu hỏi ngắn, phần tiết kiệm không đáng kể so với lượng token của mã đi kèm. Chỉ khi xử lý hàng loạt văn bản dài qua API thì chênh lệch mới cộng dồn thành con số đáng tính.