Cửa sổ ngữ cảnh là lượng chữ tối đa mà mô hình xem được trong một lượt trả lời, tính bằng token, gồm cả lời dặn của công cụ, mã bạn đưa, lịch sử trò chuyện và chính câu trả lời nó sắp viết. Thứ gì nằm ngoài cửa sổ thì với mô hình là không tồn tại. AI "quên" không phải vì trí nhớ kém, mà vì phần đó đã không còn được gửi kèm, hoặc bị tóm tắt cho gọn.
Với người viết mã, hiểu cửa sổ ngữ cảnh trả lời được nhiều câu hỏi khó chịu: vì sao đầu phiên AI làm đúng quy ước mà cuối phiên lại quên, vì sao dán cả tệp dài mà nó vẫn bỏ sót một hàm, vì sao mở phiên mới đôi khi tốt hơn cố giải thích thêm. Bài này giải thích ở mức thực hành.
Một lượt hỏi thật ra gửi đi những gì
Khi bạn gõ một câu hỏi ngắn trong khung trò chuyện của trình soạn thảo, thứ được gửi cho mô hình dài hơn nhiều so với câu bạn gõ. Thường gồm các phần sau, theo thứ tự tuỳ công cụ:
- Lời dặn hệ thống của công cụ: mô tả vai trò, quy tắc định dạng, danh sách công cụ được dùng. Phần này bạn không thấy nhưng nó chiếm chỗ.
- Nội dung tệp hướng dẫn dự án nếu bạn có tạo, như quy ước đặt tên, lệnh chạy kiểm thử, những điều cấm.
- Mã bạn chọn hoặc đính kèm, và những mẩu mã công cụ tự chọn thêm vì cho là liên quan.
- Toàn bộ hoặc một phần lịch sử trò chuyện trước đó trong phiên, gồm cả câu trả lời dài của AI.
- Với tác tử: kết quả của mọi lần đọc tệp, chạy lệnh trước đó, có khi là hàng trăm dòng nhật ký kiểm thử.
- Câu hỏi mới nhất của bạn.
Tất cả cộng lại phải nằm gọn trong cửa sổ, và còn phải chừa chỗ cho câu trả lời. Đó là lý do một phiên tác tử chạy kiểm thử in ra nhiều nhật ký có thể đầy cửa sổ rất nhanh, dù bạn chỉ gõ vài câu.
Giới hạn đo bằng token, và câu trả lời cũng nằm trong đó
Cửa sổ ngữ cảnh được đo bằng token, đơn vị mà mô hình cắt chữ ra để xử lý. Một token có thể là một từ tiếng Anh ngắn, một phần của từ dài, một dấu câu, hoặc vài ký tự khoảng trắng. Mã nguồn thường tốn token hơn văn xuôi tiếng Anh cùng độ dài, vì nhiều ký hiệu và thụt lề. Cách đếm cụ thể và cách mã tốn token được nói kỹ ở bài riêng về token trong cùng mục này.
Độ dài cửa sổ khác nhau rất nhiều giữa các mô hình và tăng nhanh qua từng thế hệ: có loại vài chục nghìn token, có loại hàng trăm nghìn, có loại công bố tới cả triệu. Con số cụ thể đổi theo phiên bản và gói tài khoản, nên khi cần hãy xem tài liệu chính thức. Ngoài giới hạn đầu vào, mỗi mô hình còn giới hạn riêng số token được viết ra trong một câu trả lời, thường nhỏ hơn nhiều.
Giới hạn đầu ra là nguyên nhân của một hiện tượng quen thuộc: bạn nhờ AI viết lại cả tệp dài, nó viết được hai phần ba rồi dừng giữa chừng, hoặc tự rút gọn bằng câu "phần còn lại giữ nguyên". Cách xử lý không phải ép nó viết dài hơn, mà là chia việc: sửa từng hàm, hoặc yêu cầu chỉ đưa ra phần thay đổi thay vì cả tệp.
Cửa sổ dài hơn không có nghĩa là nhớ đều hơn
Nhiều người nghĩ rằng cửa sổ đủ lớn thì cứ đưa cả dự án vào là xong. Thực tế, mô hình không chú ý đều tới mọi phần trong ngữ cảnh. Một nghiên cứu năm 2023 có tên Lost in the Middle cho thấy với các mô hình được thử nghiệm khi đó, thông tin đặt ở đầu hoặc cuối ngữ cảnh được dùng tốt hơn thông tin nằm ở giữa. Các mô hình mới đã cải thiện nhiều điểm này, nhưng hiện tượng "loãng" khi ngữ cảnh quá dài vẫn là điều người dùng hay gặp.
Trong lập trình, điều đó có nghĩa là dán mười tệp để hỏi về một hàm có thể cho kết quả kém hơn dán đúng hai tệp liên quan. Mô hình phải tự tìm cái kim trong đống rơm, và đôi khi nó lấy nhầm một hàm trùng tên ở tệp khác. Ngữ cảnh tốt là ngữ cảnh đủ và gọn, không phải ngữ cảnh nhiều.
Có một hệ quả thực hành nữa: chỉ dẫn quan trọng nên đặt ở chỗ dễ được chú ý. Ví dụ đặt yêu cầu chính ở cuối tin nhắn, ngay sau đoạn mã, thay vì chôn giữa hai đoạn mã dài. Với tác tử, lời dặn cố định nên nằm trong tệp hướng dẫn dự án, vì công cụ thường đưa tệp này vào vị trí nổi bật ở mỗi lượt.
Dấu hiệu phiên làm việc đã quá tải ngữ cảnh
AI lặp lại lỗi bạn đã chỉ ra. Bạn đã nói rõ cột trong bảng tên là ngay_tao, nửa giờ sau nó lại viết created_at. Lời nhắc ban đầu đã trôi xa hoặc bị tóm tắt mất chi tiết.
AI nhắc tới mã của phiên bản cũ. Bạn đã sửa một hàm ba lần trong phiên, AI lại trích dẫn bản đầu tiên. Ngữ cảnh chứa cả ba bản, và nó lấy nhầm.
Câu trả lời chậm hơn và chung chung hơn. Ngữ cảnh càng dài, mỗi lượt xử lý càng lâu. Câu trả lời cũng có xu hướng né chi tiết vì có quá nhiều thứ phải dung hoà.
Công cụ báo đã tóm tắt hoặc nén cuộc trò chuyện. Nhiều công cụ tự rút gọn lịch sử khi gần đầy. Sau thông báo đó, những chi tiết nhỏ như tên biến, giá trị cấu hình rất dễ mất.
Các công cụ xoay xở với giới hạn ngữ cảnh ra sao
Mỗi trợ lý có chiến lược riêng để đưa đúng thứ cần vào cửa sổ có hạn. Biết các chiến lược này giúp bạn hiểu vì sao công cụ thấy hoặc không thấy một tệp.
| Cách làm | Nguyên lý | Điểm yếu cần biết |
|---|---|---|
| Tóm tắt lịch sử | Khi gần đầy, phần đầu cuộc trò chuyện được nén thành bản tóm tắt ngắn | Mất chi tiết nhỏ: tên biến, con số, ngoại lệ bạn từng dặn |
| Tìm kiếm theo nghĩa | Mã được chia khúc và đánh chỉ mục; khi hỏi, công cụ tìm các khúc gần nghĩa nhất để gửi kèm | Có thể bỏ sót khúc liên quan nhưng dùng từ khác, hoặc lấy nhầm khúc giống tên |
| Tìm kiếm theo chữ | Tác tử tự chạy lệnh tìm theo tên hàm, tên biến | Chính xác với tên, kém khi bạn mô tả hành vi mà không biết tên |
| Tệp hướng dẫn dự án | Một tệp văn bản được tự động đưa vào mọi lượt | Tệp dài quá thì tự nó chiếm chỗ và làm loãng phần còn lại |
| Đọc theo nhu cầu | Tác tử chỉ mở tệp khi cần, đọc từng đoạn thay vì cả tệp | Tốn nhiều vòng hơn, và nó có thể dừng đọc trước khi tới đoạn quan trọng |
Không cách nào hoàn hảo, nên phần đóng góp của bạn vẫn quan trọng: chỉ tên tệp, tên hàm cụ thể khi biết, và nói rõ phạm vi khi giao việc.
Đưa đúng ngữ cảnh cho một câu hỏi lập trình
Một quy trình ngắn giúp câu hỏi trúng đích hơn mà không làm đầy cửa sổ:
- Nêu mục tiêu trong một câu ở đầu: muốn sửa lỗi gì, muốn thêm gì, ở ngôn ngữ và phiên bản nào.
- Đưa đúng hàm đang hỏi và những định nghĩa nó dùng trực tiếp, như cấu trúc dữ liệu, lớp, cấu trúc bảng. Không dán cả thư mục.
- Với lỗi, dán nguyên văn thông báo lỗi và phần ngăn xếp lời gọi liên quan, che hết mật khẩu, khoá và dữ liệu cá nhân trong đó.
- Nêu ràng buộc: không đổi tên hàm công khai, không thêm thư viện mới, giữ tương thích với phiên bản đang chạy.
- Đặt câu hỏi chính ở cuối tin nhắn, ngắn và cụ thể.
- Khi phiên đã dài và AI bắt đầu lặp lỗi, mở phiên mới, chép sang bản tóm tắt ngắn những gì đã chốt, thay vì tiếp tục giải thích.
Bước cuối là thói quen ít người làm nhưng hiệu quả nhất. Một phiên mới với năm dòng tóm tắt rõ ràng thường tốt hơn một phiên cũ với năm mươi tin nhắn chồng chéo.
Cùng một câu hỏi, hai cách đưa ngữ cảnh: ví dụ giả định
Ví dụ giả định: một trang bán hàng viết bằng JavaScript báo lỗi khi khách nhập mã giảm giá. Cùng một người hỏi, cùng một công cụ, chỉ khác cách đưa ngữ cảnh.
| Khía cạnh | Cách thứ nhất | Cách thứ hai |
|---|---|---|
| Câu hỏi | Sửa lỗi mã giảm giá không chạy | Hàm ap_dung_ma_giam trả về tổng âm khi mã giảm theo phần trăm lớn hơn tổng đơn; cần chặn không cho tổng dưới 0 |
| Mã đưa kèm | Dán cả thư mục giỏ hàng, khoảng hai mươi tệp | Dán hàm ap_dung_ma_giam, cấu trúc đối tượng mã giảm và một ca dữ liệu gây lỗi |
| Thông tin lỗi | Không có | Giá trị vào, giá trị ra thực tế, giá trị mong đợi |
| Kết quả thường gặp | AI đoán một nguyên nhân phổ biến, sửa nhầm hàm khác có tên gần giống | AI chỉ đúng dòng tính, thêm điều kiện chặn và gợi ý một ca kiểm thử |
Cách thứ hai tốn của bạn thêm hai phút để khoanh vùng, nhưng tiết kiệm nhiều vòng hỏi qua lại. Phần lớn thời gian "AI không hiểu ý" thật ra là thời gian ngữ cảnh chưa đủ hoặc đủ mà quá nhiễu.
Ngữ cảnh và chuyện dữ liệu nhạy cảm
Mọi thứ nằm trong ngữ cảnh đều được gửi tới nơi mô hình chạy. Với trợ lý dùng mô hình trên máy chủ của hãng, đó là máy chủ bên ngoài công ty bạn. Điều này đúng với cả những thứ bạn không trực tiếp dán: tệp công cụ tự chọn thêm, kết quả lệnh tác tử chạy, nhật ký có in biến môi trường.
Vì vậy hãy coi việc chọn ngữ cảnh cũng là việc chọn dữ liệu đi ra ngoài. Không đặt tệp chứa khoá thật trong thư mục mà tác tử được đọc, dùng tính năng loại trừ thư mục nếu công cụ có, và trước khi dán nhật ký lỗi thì lướt qua tìm mật khẩu, mã thông báo truy cập, số điện thoại, địa chỉ khách hàng. Dữ liệu mẫu dùng để hỏi AI nên là dữ liệu giả, giữ đúng định dạng nhưng không có thông tin của người thật.
Câu hỏi thường gặp
Cửa sổ ngữ cảnh lớn có giúp AI hiểu cả dự án không?
Giúp đưa được nhiều mã hơn vào một lượt, nhưng không bảo đảm AI dùng tốt tất cả. Với dự án lớn, đưa đúng phần liên quan và chỉ rõ tệp, tên hàm vẫn cho kết quả ổn định hơn.
Mở phiên trò chuyện mới có làm mất gì không?
Mất lịch sử của phiên cũ, nên mô hình không còn biết những gì đã bàn. Bù lại, ngữ cảnh sạch và gọn. Chép sang vài dòng tóm tắt các quyết định đã chốt là đủ để tiếp tục.
Vì sao AI viết lại cả tệp thì bị cắt ngang giữa chừng?
Mỗi câu trả lời có giới hạn số token đầu ra, thường nhỏ hơn nhiều so với cửa sổ đầu vào. Yêu cầu AI chỉ đưa phần thay đổi, hoặc sửa từng hàm một, sẽ tránh được chuyện này.
Tệp hướng dẫn dự án cho AI nên dài bao nhiêu?
Đủ ngắn để đọc trong vài phút: lệnh chạy và kiểm thử, quy ước quan trọng, những điều cấm. Tệp quá dài tự chiếm chỗ trong cửa sổ và làm các chỉ dẫn quan trọng bị loãng.
Mô hình có nhớ phiên làm việc hôm qua không?
Bản thân mô hình không nhớ. Một số công cụ có tính năng lưu ghi nhớ hoặc tự đọc lại tệp ghi chú, nhưng đó là phần mềm đưa lại thông tin vào ngữ cảnh, không phải mô hình tự nhớ.
Làm sao biết công cụ đã gửi những tệp nào cho mô hình?
Nhiều công cụ hiển thị danh sách tệp hoặc đoạn mã được tham chiếu trong mỗi câu trả lời. Nếu không thấy, hãy chủ động chỉ định tệp và hỏi AI tóm tắt lại những gì nó đang dựa vào.