𝗧𝗼̂𝗶 đ𝗮̃ 𝘁𝗵𝘂̛̉ 𝘁𝗵𝗲̂𝗺 𝗔𝗜 𝗖𝗵𝗮𝘁 𝘃𝗮̀𝗼 𝘂̛́𝗻𝗴 𝗱𝘂̣𝗻𝗴 𝗰𝘂̉𝗮 𝗺𝗶̀𝗻𝗵 𝘃𝗮̀ 𝘃𝗮́𝗽 𝗽𝗵𝗮̉𝗶 𝗺𝗼̣̂𝘁 𝗯𝘂̛́𝗰 𝘁𝘂̛𝗼̀𝗻𝗴
Tôi đã thử thêm một trợ lý chat AI vào công cụ quản lý dự án của mình. Tôi muốn người dùng có thể đặt câu hỏi về các tác vụ quá hạn hoặc ghi chú cuộc họp. Ngỡ là dễ dàng. Tôi nghĩ mình chỉ cần gọi một API là xong. Tôi đã lầm.
Sau 15 tin nhắn, AI trở nên chậm chạp và mất mạch lạc. API bắt đầu báo lỗi vì cuộc hội thoại quá dài. Tôi đã sử dụng GPT-4 với giới hạn 8k token. Mỗi tin nhắn đều bao gồm các mô tả và ghi chú dài. Lịch sử hội thoại tăng lên quá nhanh.
Tôi đã thử ba cách khắc phục khác nhau:
- Cắt bớt lịch sử (Truncating history): Tôi chỉ giữ lại vài tin nhắn gần nhất. Cách này giúp tăng tốc độ nhưng AI sẽ quên hết mọi thứ khác.
- Tóm tắt (Summarization): Tôi yêu cầu AI tóm tắt cuộc trò chuyện sau mỗi 5 tin nhắn. Cách này giúp cải thiện bộ nhớ nhưng lại làm tăng chi phí và độ trễ (latency).
- Chấm điểm mức độ liên quan (Relevance scoring): Tôi cố gắng chỉ giữ lại những tin nhắn liên quan nhất. Việc này đòi hỏi một vector store và làm tăng thêm quá nhiều sự phức tạp.
Tôi nhận ra mình cần một chiến lược tốt hơn. Tôi đã quyết định chọn hai phương pháp: streaming và một cửa sổ ngữ cảnh cố định (fixed context window).
Streaming giúp ứng dụng có cảm giác nhanh hơn. Người dùng thấy văn bản xuất hiện ngay lập tức thay vì phải chờ đợi toàn bộ câu trả lời. Tôi đã sử dụng Server-Sent Events để gửi các đoạn văn bản (chunks) ngay khi chúng vừa đến.
Tôi cũng chia ngữ cảnh của mình thành ba phần:
- System prompt: Một tập hợp các chỉ dẫn cố định.
- Dynamic context: Các cập nhật dự án và trạng thái tác vụ gần đây.
- Conversation history: Một cửa sổ trượt (sliding window) của các tin nhắn gần đây.
Tôi không gửi toàn bộ lịch sử mỗi lần. Tôi chỉ gửi vừa đủ thông tin để trả lời câu hỏi hiện tại. Điều này đã giúp giảm 40% kích thước payload của tôi. Nó giúp tôi tiết kiệm chi phí và cải thiện tốc độ.
Nếu bạn xây dựng các tính năng AI, hãy nhớ: Streaming mang lại cho bạn tốc độ. Một chiến lược ngữ cảnh tốt mang lại cho bạn sự thông minh.
Bạn quản lý bộ nhớ hội thoại trong ứng dụng của mình như thế nào? Bạn sử dụng sliding windows hay summarization?