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 podcast

Giả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-manageredu-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:

  1. Context = tiền — chỉ đưa vào những gì thực sự cần thiết
  2. Right tool for right task — Haiku cho task đơn giản, Sonnet cho task phức tạp
  3. Session hygiene — compact thường xuyên, đừng để history phình to
  4. Profile-based MCP — chỉ load server cần thiết cho từng loại task
  5. 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ị.

Nhận bài viết mới

Mình sẽ gửi email khi có bài mới. Không spam.