ai-054Đọc toàn bộ đề miễn phí

Quản Lý Bộ Nhớ Hội Thoại Trượt Giới Hạn Token & Tóm Tắt (Memory Buffer)

{"role": "system", "content": f"Summary of previous conversation: {summary_text}"} đặt ngay sau tin nhắn system ban đầu.

AITrung bình35 phút

Tiến độ của tôi ở bài này

Điểm được lưu vào tài khoản sau khi chấm bài.

Đang tải điểm của bạn…

Kiến thức và chủ đề

llmai-agentsconversation-memorycontext-windowprompt-engineering

Kiến thức tiên quyết: python-dict-json.

Nội dung đề bài

Mục tiêu kiến thức

  • Trong ứng dụng Chatbot hoặc AI Agent, khi người dùng trò chuyện kéo dài, tổng số token của lịch sử sẽ vượt quá Context Window của mô hình hoặc gây tốn kém chi phí token không cần thiết.
  • Chiến lược Quản lý Bộ nhớ Hội thoại:
  • Token Estimation: Để đơn giản và nhanh, số token của một tin nhắn bằng len(content.split()) + 4 (4 tokens overhead cho role và formatting).
  • Bảo toàn System Prompt: Tin nhắn hệ thống đầu tiên (role == "system") LUÔN LUÔN được giữ lại nguyên vẹn ở vị trí đầu.
  • Cửa sổ trượt (Sliding Window): Lấy các tin nhắn mới nhất từ cuối ngược lên đầu sao cho tổng số token (bao gồm cả system prompt) không vượt quá max_tokens.
  • Tóm tắt nén (Summary Compression): Khi các tin nhắn cũ bị đẩy ra ngoài cửa sổ, chúng được thay thế bằng một tin nhắn tóm tắt ngắn:

{"role": "system", "content": f"Summary of previous conversation: {summary_text}"} đặt ngay sau tin nhắn system ban đầu.

Yêu cầu

Xây dựng lớp ConversationMemoryManager:

class ConversationMemoryManager:
    def __init__(self, max_tokens: int = 100):
        pass

    def add_message(self, role: str, content: str) -> None:
        pass

    def set_summary(self, summary_text: str) -> None:
        pass

    def get_context_messages(self) -> list[dict[str, str]]:
        pass
  • get_context_messages():
  • Ưu tiên:
  • Base system message đầu tiên (nếu có trong lịch sử).
  • Summary message (nếu set_summary đã được gọi): {"role": "system", "content": f"Summary of previous conversation: {summary_text}"}.
  • Các tin nhắn trò chuyện gần đây nhất (role in ["user", "assistant"]). Lấy từ tin nhắn mới nhất lùi dần về trước, dừng lại khi việc thêm một tin nhắn sẽ làm tổng số token vượt quá max_tokens.
  • Trả về danh sách các tin nhắn theo đúng thứ tự thời gian (chronological order).

Input

  • Lớp ConversationMemoryManager(max_tokens): Khởi tạo đối tượng với các tham số, trọng số hoặc cấu hình tương ứng.

Output

  • Các phương thức của ConversationMemoryManager: Trả về kết quả tính toán hoặc cập nhật trạng thái nội bộ của đối tượng.

Ràng buộc

  • Thời gian chạy tối đa: 2000ms.
  • Giới hạn bộ nhớ: 256MB.
  • Dữ liệu đầu vào hợp lệ theo đúng kiểu dữ liệu và miền giá trị được mô tả.

Ví dụ 1

Input

mem = ConversationMemoryManager(max_tokens=20)
mem.add_message('system', 'You assistant')
mem.add_message('user', 'Hello there')
mem.add_message('assistant', 'Hi human')
mem.add_message('user', 'Need help')
ctx = mem.get_context_messages()

Output

[{'role': 'system', 'content': 'You assistant'}, {'role': 'assistant', 'content': 'Hi human'}, {'role': 'user', 'content': 'Need help'}]

Giải thích

Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.

Ví dụ 2

Input

mem = ConversationMemoryManager(max_tokens=50)
mem.add_message('system', 'Base instructions')
mem.set_summary('User is asking about Python and LoRA.')
mem.add_message('user', 'Can you show code?')
ctx = mem.get_context_messages()

Output

[{'role': 'system', 'content': 'Base instructions'}, {'role': 'system', 'content': 'Summary of previous conversation: User is asking about Python and LoRA.'}, {'role': 'user', 'content': 'Can you show code?'}]

Giải thích

Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.