Bỏ qua điều hướng

Quản lý context Claude Code: khi nào compact, handoff hay half-clone?

Mẹo Claude Code về context: vì sao hội thoại mới chạy tốt nhất, cách viết HANDOFF.md, rẽ nhánh bằng /branch, half-clone và tìm lại lịch sử chat.

Tuan Tran Van
11 phút đọc
Mục lục (9 phần)
  1. Vì sao hội thoại mới thường cho kết quả tốt nhất?
  2. Có nên để Claude tự compact không?
  3. Viết tài liệu bàn giao HANDOFF.md như thế nào?
  4. Rẽ nhánh hội thoại bằng /branch và --fork-session như thế nào?
  5. Half-clone giúp giảm context như thế nào?
  6. Tự động gợi ý half-clone bằng hook Stop như thế nào?
  7. Tìm lại hội thoại cũ ở đâu?
  8. Nên dùng cách nào khi context sắp đầy?
  9. Tài liệu tham khảo

Context của AI cũng giống như sữa: ngon nhất khi còn tươi và cô đặc. Hội thoại càng dài, Claude càng phải xử lý nhiều thông tin cũ, khiến chất lượng câu trả lời có xu hướng giảm dần.

Đây là phần hai trong loạt bài khám phá 50 mẹo Claude Code từ repo claude-code-tips của YK Sugi. Phần này tập trung vào bốn mẹo về ngữ cảnh (context), gồm mẹo số 5, 8, 12 và 21. Tất cả đều xoay quanh một câu hỏi thực tế: khi phiên làm việc đã kéo dài, làm sao để giữ lại tiến độ mà vẫn giúp Claude xử lý công việc với một context gọn gàng?

Có bốn cách để làm việc này, theo thứ tự mức độ kiểm soát tăng dần: để Claude tự compact, compact thủ công, viết tài liệu bàn giao và chia đôi hội thoại bằng half-clone.

Vì sao hội thoại mới thường cho kết quả tốt nhất?

Một phiên Claude Code mới thường chạy tốt nhất vì chưa phải xử lý lượng context tích tụ từ những đoạn hội thoại trước. Càng trò chuyện lâu, context càng phình to và hiệu năng càng có xu hướng giảm. Vì vậy, có một quy tắc đơn giản: bắt đầu hội thoại mới khi chuyển sang chủ đề khác, hoặc khi nhận thấy chất lượng câu trả lời bắt đầu đi xuống.

Hình ảnh ví context như sữa rất dễ nhớ vì có hai ý. "Tươi" nghĩa là đừng kéo dài một hội thoại để làm những việc không liên quan. Chẳng hạn, thông tin về bug đăng nhập hồi sáng chẳng giúp ích gì cho việc viết migration vào buổi chiều. Còn "cô đặc" nghĩa là khi cần chuyển thông tin sang phiên mới, hãy mang theo phần cốt lõi đã chắt lọc thay vì toàn bộ lịch sử hội thoại.

Tuy nhiên, chuyển sang phiên mới cũng có cái giá của nó: bạn mất những gì Claude đã hiểu về nhiệm vụ. Ba phần tiếp theo sẽ giới thiệu ba cách giữ lại phần hiểu biết cần thiết mà không tốn quá nhiều context. Nếu muốn tìm hiểu kỹ hơn vì sao chất lượng giảm dần khi hội thoại kéo dài, bạn có thể đọc bài lệnh compact chống context rot để hiểu cơ chế đằng sau hiện tượng này.

Có nên để Claude tự compact không?

Claude Code có lệnh /compact để tóm tắt hội thoại và giải phóng dung lượng context. Khi context đầy, Claude cũng tự động compact. Bạn có thể yêu cầu quá trình này diễn ra sớm hơn bằng /autocompact. Dù vậy, repo khuyến nghị bạn chủ động compact và tự điều chỉnh nội dung, thay vì hoàn toàn dựa vào cơ chế tự động.

Tác giả repo tắt hẳn auto-compact trong /config để tự quyết định thời điểm compact cũng như nội dung cần giữ lại. Lý do khá đơn giản: bản tóm tắt tự động không biết đâu là thông tin quan trọng nhất với bạn. Nó có thể giữ lại một đoạn tranh luận đã kết thúc mà lại bỏ sót một ràng buộc nhỏ bạn chỉ nhắc đến đúng một lần.

Tắt auto-compact không có nghĩa là bạn chẳng bao giờ compact. Thay vào đó, bạn tự chọn thời điểm, thường là sau khi hoàn thành một cột mốc, đồng thời quyết định những thông tin nào cần được giữ lại. Tuy nhiên, cách hiệu quả nhất để bảo toàn thông tin không phải là tạo bản tóm tắt, mà là viết một tài liệu bàn giao.

Viết tài liệu bàn giao HANDOFF.md như thế nào?

Thay vì compact hội thoại, bạn có thể yêu cầu Claude viết một file bàn giao trước khi chuyển sang phiên mới. File này ghi lại mục tiêu, những gì đã thử, kết quả nào thành công, kết quả nào thất bại và bước tiếp theo. Nhờ vậy, một tác nhân bắt đầu với context trống chỉ cần đọc file này là có thể tiếp tục công việc. Prompt mẫu trong repo như sau:

Put the rest of the plan in the system-prompt-extraction folder as HANDOFF.md. Explain what you have tried, what worked, what didn't work, so that the next agent with fresh context is able to just load that file and nothing else to get started on this task and finish it up.

Trong ví dụ này, Claude tạo một file dài 129 dòng. File mở đầu bằng mục tiêu "giảm khoảng 45% system prompt của Claude Code (đang ở 11%, cần thêm khoảng 34%)", tiếp theo là tiến độ thực hiện và các script đã viết.

Đừng vội mở phiên mới ngay sau khi file hoàn thành. Hãy đọc lướt qua để kiểm tra xem có thiếu thông tin nào không, rồi hỏi Claude bổ sung nếu cần. Chẳng hạn, bạn có thể hỏi: "Bạn đã ghi chú về việc thử nghiệm từng bước thay vì làm tất cả một lúc chưa?". Một câu hỏi như vậy có thể giúp bạn tránh mất cả buổi chiều ở phiên làm việc tiếp theo.

Khi bắt đầu phiên mới, bạn chỉ cần dán đường dẫn đến file, không cần giải thích thêm:

> experiments/system-prompt-extraction/HANDOFF.md

Trong các phiên tiếp theo, hãy yêu cầu tác nhân cập nhật chính file đó để người kế nhiệm có thể tiếp tục công việc. Repo có sẵn skill /handoff để tự động hóa quy trình này. Skill sẽ kiểm tra xem HANDOFF.md đã tồn tại chưa, đọc nội dung nếu có, rồi tạo file mới hoặc cập nhật các mục về mục tiêu, tiến độ, kết quả thành công, kết quả thất bại và bước tiếp theo.

Skill này nằm trong thư mục skills/handoff của repo và trong plugin dx, sẽ được giới thiệu ở phần tám. Tôi thích cách này hơn compact vì file bàn giao là tài liệu bạn có thể đọc, chỉnh sửa và commit. Trong khi đó, bản tóm tắt sau khi compact chỉ nằm trong hội thoại, khó kiểm tra và chỉnh sửa trực tiếp hơn.

Rẽ nhánh hội thoại bằng /branch và --fork-session như thế nào?

Đôi khi, bạn muốn thử một hướng tiếp cận khác từ một thời điểm cụ thể mà không làm gián đoạn mạch công việc chính. Claude Code đã hỗ trợ sẵn tính năng này. Bạn có thể gõ /branch ngay trong hội thoại để tạo nhánh từ thời điểm hiện tại, hoặc dùng cờ --fork-session cùng với --resume hay --continue khi khởi động. Ví dụ: claude -c --fork-session. Hội thoại gốc vẫn được giữ nguyên, và bạn có thể quay lại bằng /resume.

Vì --fork-session không có dạng viết tắt, repo đề xuất tạo một hàm shell bọc lệnh claude để tự chuyển --fs thành --fork-session:

bash
claude() {
  local args=()
  for arg in "$@"; do
    if [[ "$arg" == "--fs" ]]; then
      args+=("--fork-session")
    else
      args+=("$arg")
    fi
  done
  command claude "${args[@]}"
}

Hàm này xử lý mọi lệnh claude, thay --fs bằng --fork-session và giữ nguyên các tham số còn lại. Nó tương thích với alias đã giới thiệu ở phần một, nên bạn có thể dùng cả c -c --fs lẫn ch -c --fs.

Rẽ nhánh đặc biệt hữu ích khi bạn đang cân nhắc hai cách tiếp cận. Hãy thử cách thứ nhất trên nhánh mới. Nếu không hiệu quả, bạn chỉ cần quay lại điểm rẽ để tiếp tục hướng cũ, không phải giải thích lại toàn bộ bối cảnh từ đầu.

Half-clone giúp giảm context như thế nào?

Half-clone là script tạo bản sao của một hội thoại dài nhưng chỉ giữ lại nửa sau. Cách này giúp giảm số token mà vẫn bảo toàn phần công việc gần nhất, bởi nửa sau thường chứa trạng thái hiện tại của nhiệm vụ. Tin nhắn đầu tiên trong bản sao có nhãn như [HALF-CLONE Jan 7 14:30] để bạn dễ nhận biết phiên đang làm việc.

Nếu nửa sau vẫn còn quá dài, bạn có thể dùng biến thể quarter-clone (cờ --quarter hoặc skill quarter-clone) để chỉ giữ lại một phần tư cuối hội thoại. Bản sao sẽ có nhãn [QUARTER-CLONE <timestamp>].

Để cài đặt thủ công, hãy tạo symlink cho script và hai skill:

bash
ln -s /path/to/this/repo/scripts/half-clone-conversation.sh ~/.claude/scripts/half-clone-conversation.sh
ln -s /path/to/this/repo/skills/half-clone ~/.claude/skills/half-clone
ln -s /path/to/this/repo/skills/quarter-clone ~/.claude/skills/quarter-clone

Nếu cài qua plugin dx, bạn không cần tạo symlink. Tuy nhiên, script cần đọc thư mục ~/.claude, nơi lưu file hội thoại và lịch sử. Để tránh bị hỏi quyền truy cập mỗi khi làm việc trong một dự án, hãy thêm quyền này vào file settings toàn cục ~/.claude/settings.json:

json
{
  "permissions": {
    "allow": ["Read(~/.claude)"]
  }
}

Khác với compact, half-clone không tóm tắt nội dung. Script giữ nguyên văn tin nhắn của bạn và của Claude, chỉ loại bỏ phần hội thoại cũ. Bạn sẽ mất phần đầu, nhưng nội dung còn lại không bị diễn giải hay viết lại.

Tự động gợi ý half-clone bằng hook Stop như thế nào?

Bạn có thể dùng một hook để Claude Code tự kích hoạt /half-clone khi context quá dài. Script check-context.sh trong repo chạy sau mỗi câu trả lời của Claude để kiểm tra mức sử dụng context. Khi mức này vượt 85%, script ngăn Claude dừng lại và yêu cầu Claude chạy /half-clone. Kết quả là một hội thoại mới chỉ chứa nửa sau, để một tác nhân mới tiếp tục công việc.

Trước tiên, sao chép script vào thư mục scripts:

bash
cp /path/to/this/repo/scripts/check-context.sh ~/.claude/scripts/check-context.sh
chmod +x ~/.claude/scripts/check-context.sh

Sau đó, khai báo hook Stop trong ~/.claude/settings.json:

json
{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/scripts/check-context.sh"
          }
        ]
      }
    ]
  }
}

Có một điều kiện bắt buộc: bạn phải tắt auto-compact bằng cách vào /config > Auto-compact > false. Nếu không, Claude Code có thể compact trước khi hook kịp chạy.

So với auto-compact, cách này có hai ưu điểm: kết quả xác định (deterministic) và tốc độ nhanh. Với cùng một hội thoại, script luôn cắt ra cùng một kết quả, đồng thời giữ nguyên tin nhắn gốc thay vì tóm tắt chúng.

Tìm lại hội thoại cũ ở đâu?

Claude Code lưu toàn bộ lịch sử hội thoại ngay trên máy của bạn, trong thư mục ~/.claude/projects/. Mỗi dự án có một thư mục riêng, được đặt tên theo đường dẫn dự án với dấu / thay bằng -. Chẳng hạn, lịch sử của dự án /Users/yk/Desktop/projects/claude-code-tips nằm tại:

~/.claude/projects/-Users-yk-Desktop-projects-claude-code-tips/

Mỗi hội thoại được lưu trong một file .jsonl, nên bạn có thể dùng vài lệnh bash cơ bản để tìm kiếm:

bash
# Tìm mọi hội thoại có nhắc tới "Reddit"
grep -l -i "reddit" ~/.claude/projects/-Users-yk-Desktop-projects-*/*.jsonl
 
# Tìm các hội thoại hôm nay về một chủ đề
find ~/.claude/projects/-Users-yk-Desktop-projects-*/*.jsonl -mtime 0 -exec grep -l -i "keyword" {} \;
 
# Chỉ lấy các tin nhắn của người dùng trong một hội thoại (cần jq)
cat ~/.claude/projects/.../conversation-id.jsonl | jq -r 'select(.type=="user") | .message.content'

Nếu muốn nhàn hơn, bạn có thể hỏi thẳng Claude Code: "Hôm nay mình đã nói gì về X?". Claude sẽ tự tìm trong lịch sử để trả lời. Mẹo này kết hợp tốt với các cách trên: lịch sử hội thoại cũ vẫn còn nguyên, nên bạn có thể thoải mái mở phiên mới mà không lo mất dấu công việc.

Nên dùng cách nào khi context sắp đầy?

CáchGiữ lại gìHợp khi
/clear, phiên mớiKhông gì cảChuyển sang chủ đề khác hẳn
/compactBản tóm tắt do Claude tự viếtCần chỗ trống nhanh, không quá quan trọng chi tiết
HANDOFF.mdTài liệu bàn giao bạn đã duyệtNhiệm vụ dài, nhiều ngõ cụt cần ghi lại
/branch, --fsToàn bộ hội thoại tới điểm rẽMuốn thử một hướng khác mà không mất mạch chính
Half-cloneNguyên văn nửa sau (hoặc một phần tư)Hội thoại dài, phần mới nhất là phần quan trọng

Nếu chỉ chọn một thói quen để áp dụng, tôi khuyên bạn nên bắt đầu với file bàn giao. Cách này buộc cả bạn lẫn Claude xác định rõ nhiệm vụ đang ở đâu và cần làm gì tiếp theo. Đó cũng chính là những thông tin quan trọng giúp một context mới bắt đầu làm việc hiệu quả.

Tài liệu tham khảo

Chia sẻ bài viết

X / TwitterFacebookLinkedIn