Giảm 70% chi phí Claude Code — Bài học thực tế từ dự án EdTech
Từ việc cháy token không kiểm soát đến tối ưu được 70% chi phí Claude Code — những bài học thực chiến khi xây dựng nền tảng EdTech với AI coding assistant.
Nghe bài viết này dưới dạng podcastGiảm 70% chi phí Claude Code — Bài học thực tế từ dự án EdTech
Khi mới bắt đầu dùng Claude Code để build edu-manager và edu-ai-platform, mình không để ý đến cost. Cứ chat, cứ code, cứ để AI làm việc. Đến cuối tháng nhìn bill mới giật mình — token burn rate cao hơn kỳ vọng gấp 3 lần.
Sau vài tuần mày mò, mình cắt được khoảng 70% chi phí mà không ảnh hưởng đến chất lượng output. Bài này tổng hợp lại những gì mình đã làm.
Vấn đề cốt lõi: Context window là tiền
Claude Code hoạt động bằng cách đọc context — mỗi token trong context đều tốn tiền, cả input lẫn output. Vấn đề là nhiều thứ bơm token vào context mà bạn không nhận ra:
- CLAUDE.md quá dài → đọc mỗi lần khởi tạo session
- MCP servers không cần thiết → overhead khi load tool definitions
- File lớn được đính kèm tự động → context bị nhồi nhét
- Conversation history dài → accumulated context phình to
Hiểu được điều này, mình bắt đầu tấn công từng điểm.
1. Trim CLAUDE.md xuống còn cốt lõi
CLAUDE.md ban đầu của mình dài ~400 dòng — bao gồm toàn bộ kiến trúc, convention, hướng dẫn từng module. Tưởng là tốt nhưng thực ra mỗi lần Claude Code khởi động, nó đọc hết file này.
Cách fix: Tách CLAUDE.md thành nhiều file nhỏ theo domain:
/CLAUDE.md ← chỉ giữ 50-80 dòng cốt lõi
/docs/architecture.md ← chi tiết kiến trúc (khi cần mới đọc)
/docs/conventions.md ← coding conventions
/apps/edu-manager/CLAUDE.md ← context riêng cho từng app
CLAUDE.md gốc chỉ giữ lại:
- Stack chính (NestJS + Next.js + Mastra)
- Quy tắc tuyệt đối không được vi phạm
- Pointer đến các doc chi tiết
Kết quả: giảm ~200 token mỗi lần khởi tạo. Nhân với hàng chục session mỗi ngày → đáng kể.
2. Tắt MCP servers không dùng đến
Mình có setup 6-7 MCP servers: filesystem, git, postgres, browser, custom tools... Nhưng không phải lúc nào cũng cần tất cả.
Mỗi MCP server active sẽ inject tool definitions vào context. Với 5 tools × 200 token/tool = 1000 token overhead mỗi request.
Cách fix: Tạo profile riêng cho từng task:
// .claude/profiles/backend.json
{
"mcpServers": ["filesystem", "postgres", "git"]
}
// .claude/profiles/frontend.json
{
"mcpServers": ["filesystem", "browser", "git"]
}
Khi làm backend thì chỉ load backend profile, không cần browser MCP. Khi làm frontend thì không cần postgres MCP.
3. Model routing — không phải task nào cũng cần Sonnet
Đây là lever mạnh nhất. Claude Code mặc định dùng Sonnet cho mọi thứ, nhưng nhiều task đơn giản Haiku làm được hoàn toàn.
Mình phân loại task:
| Task | Model | Lý do |
|---|---|---|
| Giải thích lỗi đơn giản | Haiku | Không cần reasoning phức tạp |
| Viết unit test boilerplate | Haiku | Pattern lặp lại, ít sáng tạo |
| Refactor phức tạp | Sonnet | Cần hiểu deep context |
| Thiết kế kiến trúc | Sonnet | Cần reasoning nhiều bước |
| Sinh code từ spec rõ ràng | Haiku | Spec đã clear, chỉ cần translate |
Haiku rẻ hơn Sonnet khoảng 5-6 lần. Nếu 40% task của bạn có thể dùng Haiku, tiết kiệm được ~25-30% tổng chi phí.
4. VSCode Extension vs CLI — chọn đúng tool
Mình phát hiện ra sự khác biệt quan trọng:
- VSCode Extension: tự động index toàn bộ workspace, gửi nhiều context hơn
- CLI (
claude): chỉ gửi những gì bạn explicit chỉ định
Với những task cần làm việc trên file cụ thể, dùng CLI và chỉ định file rõ ràng:
# Thay vì mở Extension và chat
claude "Fix the auth middleware" --file src/auth/middleware.ts
# Thay vì để nó tự tìm
claude "Add validation to UserDTO" --file src/users/dto/user.dto.ts
CLI ít overhead hơn Extension khoảng 20-30% trong các trường hợp file-specific.
5. Compact conversation thường xuyên
Claude Code giữ conversation history trong session. Sau 10-15 turns, history này chiếm phần lớn context budget.
Thói quen mới:
- Sau mỗi task hoàn thành →
/clearđể reset conversation - Không dùng 1 session dài cho nhiều task khác nhau
- Mỗi task = 1 focused session ngắn
Nghe đơn giản nhưng thay đổi này một mình tiết kiệm ~20% chi phí vì tránh được context accumulation.
6. GitHub Actions — tránh Coolify rebuild không cần thiết
Monorepo với nhiều services, mỗi lần push là Coolify rebuild tất cả — tốn thời gian và nếu dùng AI để generate CI/CD thì tốn token.
Setup path-based filtering trong GitHub Actions:
# .github/workflows/deploy-edu-manager.yml
on:
push:
paths:
- 'apps/edu-manager/**'
- 'packages/shared/**'
# .github/workflows/deploy-edu-ai-platform.yml
on:
push:
paths:
- 'apps/edu-ai-platform/**'
- 'packages/shared/**'
Chỉ deploy service nào có thay đổi thực sự. Giảm noise, giảm lần Claude Code phải troubleshoot CI failures.
Tổng kết — Con số thực tế
Sau khi áp dụng tất cả các kỹ thuật trên, đây là breakdown tiết kiệm ước tính:
| Kỹ thuật | Tiết kiệm ước tính |
|---|---|
| Trim CLAUDE.md | ~10% |
| Tắt MCP không cần | ~15% |
| Model routing Haiku/Sonnet | ~25% |
| CLI thay Extension (khi phù hợp) | ~10% |
| Compact conversation | ~15% |
| Tổng cộng | ~70% |
Quan trọng hơn số liệu: mình không cảm thấy bị giới hạn sau khi tối ưu. Những task cần Sonnet vẫn dùng Sonnet. Những task cần context đầy đủ vẫn có. Chỉ là cắt bỏ những gì thực sự lãng phí.
Kết luận
Claude Code là công cụ mạnh, nhưng dùng không khéo thì cost leo thang rất nhanh. Những nguyên tắc cốt lõi:
- Context = tiền — chỉ đưa vào những gì thực sự cần thiết
- Right tool for right task — Haiku cho task đơn giản, Sonnet cho task phức tạp
- Session hygiene — compact thường xuyên, đừng để history phình to
- Profile-based MCP — chỉ load server cần thiết cho từng loại task
- CLI vs Extension — biết khi nào dùng cái nào
Nếu bạn đang dùng Claude Code cho dự án và chưa để ý đến cost optimization, hãy bắt đầu từ điểm số 3 (model routing) và số 5 (compact conversation) — hai điểm này dễ làm nhất và impact cao nhất.
Chưa có bình luận
Để lại bình luận
Bình luận sẽ được phê duyệt trước khi hiển thị.