Product Management
Đăng nhập
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Bài 7 — Ngữ cảnh, bộ nhớ và điều phối tác vụ lớn

Đã đọc 0/9 mục · còn khoảng 3 phút
Cách chúng tôi ghi nhận

Một mục được tính là đã đọc khi nó nằm giữa màn hình đủ lâu so với độ dài của nó (bảng và sơ đồ tính một nửa), bạn vẫn đang cuộn hoặc bấm phím, và bạn đã thấy tới cuối mục. Lướt nhanh hoặc để tab mở không được tính. Chúng tôi chỉ lưu thời gian đọc từng mục — không lưu gì khác.

Agent nhỏ chạy tốt trên task đơn giản. Nhưng khi task lớn — "refactor cả module", "thêm tính năng đa file" — bạn đụng trần context window và agent bắt đầu "quên". Bài này về quản lý ngữ cảnh và chia nhỏ tác vụ.

Vấn đề: context window có hạn

Mỗi lần gọi LLM, toàn bộ messages (task + mọi file đã đọc + mọi output test) được gửi lại. Sau 15–20 vòng, history phình to, tốn token và có thể vượt giới hạn. Ba chiến lược xử lý:

Chiến lược 1: Chỉ nạp ngữ cảnh cần thiết

Đừng để agent read_file toàn bộ dự án. Thay vào đó cung cấp tool tìm kiếm để nạp đúng thứ cần:

def search_code(pattern):
    import subprocess
    r = subprocess.run(f"grep -rn '{pattern}' . --include='*.py'",
                       shell=True, capture_output=True, text=True)
    return r.stdout[:3000] or "Không tìm thấy."

Agent giỏi giống lập trình viên giỏi: grep để định vị rồi mới đọc file liên quan, thay vì đọc mù cả repo.

Chiến lược 2: Nén (compaction) lịch sử

Khi history dài, tóm tắt các vòng cũ thành một message ngắn:

nếu đếm_token(messages) > NGƯỠNG:
    tóm_tắt = llm("Tóm tắt tiến độ, quyết định, file đã sửa:", messages[1:-4])
    messages = [system, {role:user, content: "[Tóm tắt trước đó] " + tóm_tắt},
                *messages[-4:]]   # giữ vài lượt gần nhất nguyên vẹn

Giữ nguyên vài lượt gần nhất (chi tiết còn cần), nén phần cũ (chỉ cần kết luận). Đây là kỹ thuật nhiều framework agent thực dùng để chạy phiên dài.

Chiến lược 3: Chia nhỏ bằng kế hoạch (planning)

Với task lớn, ép agent lập kế hoạch trước, rồi thực thi từng mục:

1. Yêu cầu agent xuất danh sách bước (TODO list).
2. Thực hiện từng bước; sau mỗi bước cập nhật trạng thái (done/failed).
3. Chỉ giữ chi tiết bước hiện tại trong context; bước xong ⇒ tóm tắt.

Kế hoạch tường minh giúp agent không lạc hướng giữa chừng và giúp bạn theo dõi tiến độ.

Ví dụ: thêm endpoint API mới (đa file)

  • Agent lập TODO: (a) thêm route, (b) thêm handler, (c) thêm test, (d) chạy test.
  • search_code("register_route") → định vị nơi khai báo route.
  • Làm tuần tự (a)→(d), sau mỗi bước cập nhật TODO và chạy test liên quan.
  • Khi history phình, nén các bước đã xong thành một dòng tóm tắt.

Khung tư duy: ngân sách ngữ cảnh (context budget)

Coi context window như ngân sách phải tiêu khôn ngoan:

  • Ưu tiên cao: system prompt, task gốc, file đang sửa, lỗi mới nhất.
  • Ưu tiên thấp: output test cũ, file đã đọc nhưng không còn liên quan.
  • Khi cạn ngân sách, cắt ưu tiên thấp trước (nén/loại), giữ ưu tiên cao.

Checklist quản lý ngữ cảnh

  • [ ] Có tool search để nạp đúng ngữ cảnh, tránh đọc mù.
  • [ ] Theo dõi kích thước history; nén khi vượt ngưỡng.
  • [ ] Giữ nguyên vài lượt gần nhất khi nén.
  • [ ] Task lớn có bước lập kế hoạch tường minh (TODO).
  • [ ] Trạng thái từng bước được cập nhật để agent (và bạn) theo dõi.

Sai lầm thường gặp

  • Để agent đọc cả repo vào context. Tràn token, loãng thông tin, LLM lú lẫn. Dùng search + đọc có chọn lọc.
  • Nén quá tay, mất chi tiết vòng gần nhất. Agent quên mình vừa sửa gì và lặp lại. Luôn giữ nguyên vài lượt cuối.
  • Không lập kế hoạch cho task lớn. Agent làm rời rạc, sửa chỗ này quên chỗ kia, kết quả nửa vời.
  • Bỏ qua đếm token. Đến khi API báo vượt giới hạn thì phiên đã hỏng; hãy chủ động nén.
  • Tóm tắt bằng chính LLM mà không kiểm tra, khiến thông tin sai lọt vào bản nén và lan ra các vòng sau.
Học xong bài này rồi? Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu, và học hết khóa thì có chứng chỉ. Lưu tiến độ của tôi