DEV Community

Cover image for Cách giảm chi phí token của agent từ CLI (Hướng dẫn 2026)
Sebastian Petrus
Sebastian Petrus

Posted on • Originally published at apidog.com

Cách giảm chi phí token của agent từ CLI (Hướng dẫn 2026)

Một tác nhân mã hóa CLI (Claude Code, Codex hoặc công cụ tương tự) có thể đốt token rất nhanh: đọc hàng chục tệp, chạy test nhiều lần, đưa log dài vào ngữ cảnh và phát lại toàn bộ lịch sử ở mỗi lượt. Với một nhóm kỹ sư dùng tác nhân cả ngày, chi phí này không còn là phần nhỏ của hóa đơn. Tin tốt: phần lớn token bị lãng phí có thể giảm ngay từ dòng lệnh mà không cần đổi mô hình hoặc chấp nhận đầu ra kém hơn.

Dùng thử Apidog hôm nay

TL;DR

Để giảm chi phí token của tác nhân CLI:

  • Khoanh vùng tập hợp tệp trước khi giao việc.
  • Giữ CLAUDE.md hoặc tệp bộ nhớ dự án thật ngắn.
  • Dùng /compact hoặc /clear giữa các tác vụ.
  • Bật prompt caching cho phần prompt ổn định.
  • Định tuyến tác vụ đơn giản sang mô hình rẻ hơn.
  • Cắt bớt output của test, install, diff và log.
  • Đo chi phí theo từng lần chạy, không chỉ nhìn hóa đơn cuối tháng.

Token bị tiêu ở đâu trong một lần chạy tác nhân CLI?

Mỗi lượt của tác nhân gửi một payload đầu vào đến mô hình và nhận lại payload đầu ra. Bạn trả tiền cho cả hai. Trên nhiều nhà cung cấp, token đầu ra thường đắt hơn token đầu vào, nhưng token đầu vào mới là phần dễ phình to nhất vì nó bao gồm rất nhiều ngữ cảnh lặp lại.

Một payload đầu vào thường có:

  • System prompt và định nghĩa tool: hướng dẫn tác nhân, schema JSON của tool, quy tắc hành vi.
  • Tệp bộ nhớ dự án: ví dụ CLAUDE.md, quy ước repo, lệnh build/test.
  • Lịch sử hội thoại: tin nhắn người dùng, phản hồi mô hình, tool call, tool result.
  • Nội dung tệp đã đọc: một lần đọc toàn bộ tệp 1.200 dòng có thể thành hàng chục nghìn token.
  • Output của tool: log test, npm install, stack trace, git diff, lockfile.

Điểm quan trọng: lịch sử hội thoại được gửi lại ở mỗi lượt. Một phiên 30 lượt không chỉ tốn gấp 30 lần một lượt; các lượt sau còn kéo theo toàn bộ nội dung trước đó. Vì vậy, phiên dài, lan man là một trong những nguồn lãng phí lớn nhất.

Nếu bạn muốn hiểu thêm về phiên và giới hạn token trong thực tế, xem thêm bài viết về cách cửa sổ token Claude Code được đặt lại.

Một chi phí liên quan khác là debugging API. Khi tác nhân gọi một API nội bộ chưa ổn định, nó có thể thử lại, đọc lỗi, đọc tài liệu, sửa code rồi lặp tiếp. Mỗi vòng như vậy đều tiêu token.

💡 Nếu tác nhân của bạn làm việc với API, hãy thiết kế, mock và kiểm thử API trong Apidog trước khi đưa tác nhân vào luồng xử lý. Khi API có hợp đồng rõ ràng, tác nhân sẽ ít phải đoán, ít phải thử sai và ít đốt token hơn.

1. Khoanh vùng tập hợp làm việc trước khi chạy tác nhân

Token rẻ nhất là token không bao giờ được gửi.

Đừng mở tác nhân ở root repo rồi prompt kiểu:

claude "tái cấu trúc logic thanh toán"
Enter fullscreen mode Exit fullscreen mode

Prompt này buộc tác nhân phải tự khám phá codebase. Nó có thể đọc nhiều file không liên quan trước khi tìm đúng chỗ.

Thay vào đó, hãy chỉ rõ phạm vi:

claude "tái cấu trúc logic retry để dùng exponential backoff.
Chỉ chỉnh src/payments/retry.ts và test tương ứng."
Enter fullscreen mode Exit fullscreen mode

Hoặc nếu chưa biết chính xác tệp:

claude "tìm logic retry trong thư mục src/payments.
Chỉ đọc các file liên quan trực tiếp, không quét toàn repo."
Enter fullscreen mode Exit fullscreen mode

Nguyên tắc thực tế:

  • Giao một tác vụ rõ ràng cho mỗi phiên.
  • Nêu thư mục hoặc file cụ thể.
  • Nói rõ phần nào không được động vào.
  • Nếu cần khám phá, giới hạn ở một thư mục nhỏ.

Các mẫu làm việc trong quy trình làm việc của Claude Code cũng nhấn mạnh thói quen khoanh vùng này.

2. Giữ tệp bộ nhớ dự án thật ngắn

Các tệp như CLAUDE.md thường được nạp vào ngữ cảnh ở nhiều lượt. Nếu tệp này biến thành wiki dài 4.000 token, bạn đang trả tiền cho nó liên tục.

Kiểm tra nhanh kích thước tương đối:

wc -c CLAUDE.md | awk '{print "≈", int($1/4), "tokens per turn"}'
Enter fullscreen mode Exit fullscreen mode

Một CLAUDE.md tốt nên chứa:

# Project conventions

## Commands

- Build: npm run build
- Test: npm test -- --runInBand
- Lint: npm run lint

## Coding rules

- TypeScript strict mode.
- Do not edit generated files.
- Prefer small functions.
- Add tests for changed behavior.

## Important paths

- API clients: src/api/
- Payment logic: src/payments/
- Generated files: src/generated/ (do not edit)
Enter fullscreen mode Exit fullscreen mode

Không nên nhét vào:

  • Tài liệu onboarding dài.
  • Lịch sử kiến trúc.
  • Toàn bộ API docs.
  • Nội dung chỉ dùng cho một tác vụ hiếm gặp.

Nếu tài liệu dài vẫn cần thiết, để đường dẫn cho tác nhân đọc khi cần:

For payment provider details, read docs/payments/provider-contract.md only when required.
Enter fullscreen mode Exit fullscreen mode

3. Dùng /compact hoặc /clear giữa các tác vụ

Khi bạn hoàn thành một việc và chuyển sang việc khác, đừng tiếp tục dùng cùng phiên chỉ vì tiện. Mỗi lượt mới sẽ kéo theo lịch sử cũ.

Trong Claude Code:

/compact
Enter fullscreen mode Exit fullscreen mode

Dùng khi bạn vẫn cần giữ tóm tắt ngắn của phiên trước nhưng muốn loại bỏ transcript thô.

/clear
Enter fullscreen mode Exit fullscreen mode

Dùng khi bắt đầu tác vụ mới không liên quan.

Quy trình đơn giản:

  1. Bắt đầu phiên cho một tác vụ cụ thể.
  2. Chạy tác nhân, review diff, test.
  3. Khi xong, dùng /compact nếu cần tiếp tục cùng chủ đề.
  4. Dùng /clear trước khi chuyển sang tác vụ khác.

Việc này thường giảm mạnh lượng context được gửi lại trong các phiên dài.

4. Cấu hình ignore để tác nhân không đọc rác

Tác nhân không nên đọc:

  • node_modules/
  • dist/
  • build/
  • coverage output
  • generated files
  • lockfile lớn nếu không cần
  • log hoặc artifact CI

Ví dụ .gitignore hoặc tệp ignore tương ứng của agent:

node_modules/
dist/
build/
coverage/
*.log
src/generated/
Enter fullscreen mode Exit fullscreen mode

Nếu repo có lockfile lớn, bạn có thể nhắc tác nhân:

Không đọc package-lock.json trừ khi tác vụ liên quan trực tiếp đến dependency resolution.
Enter fullscreen mode Exit fullscreen mode

Lợi ích của bước này là lâu dài: cấu hình một lần, tiết kiệm ở mọi lần chạy.

5. Bật prompt caching cho phần ổn định

Prompt caching cho phép nhà cung cấp lưu một tiền tố ổn định của request, ví dụ:

  • system prompt
  • tool definitions
  • quy ước repo
  • hướng dẫn cố định

Các request sau dùng lại tiền tố đó với chi phí thấp hơn đáng kể.

Theo tài liệu prompt caching của Anthropic, cache write có chi phí cao hơn input token thông thường, nhưng cache read chỉ khoảng 10% input cơ bản. Nghĩa là phần prefix ổn định có thể được giảm giá khoảng 90% khi cache hit. Con số cụ thể có thể thay đổi theo nhà cung cấp và thời điểm, nên luôn kiểm tra trang giá chính thức.

Nguyên tắc cấu trúc:

tools → system → messages
Enter fullscreen mode Exit fullscreen mode

Đặt phần ổn định lên trước, phần thay đổi xuống sau.

Ví dụ nếu bạn gọi model trực tiếp:

response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=2048,
    system=[
        {
            "type": "text",
            "text": SYSTEM_PROMPT + REPO_CONVENTIONS,
            "cache_control": {"type": "ephemeral"},
        }
    ],
    messages=[
        {
            "role": "user",
            "content": user_task,
        }
    ],
)

u = response.usage

print("cache write:", u.cache_creation_input_tokens)
print("cache read :", u.cache_read_input_tokens)
print("fresh input:", u.input_tokens)
Enter fullscreen mode Exit fullscreen mode

Lưu ý vận hành:

  • Không chèn timestamp vào prefix được cache.
  • Không thay đổi byte trước cache breakpoint nếu không cần.
  • Gom các lần chạy liên quan gần nhau để tăng khả năng cache hit.
  • Đo cache_read_input_tokens để xác nhận cache thật sự hoạt động.

Nếu caching chưa đủ, bạn có thể kết hợp với các mẹo định tuyến trong bài chạy GPT-5.5 miễn phí qua Codex.

6. Định tuyến tác vụ đơn giản sang mô hình rẻ hơn

Không phải mọi việc đều cần mô hình mạnh nhất.

Các tác vụ thường có thể chạy bằng mô hình rẻ hơn:

  • viết commit message
  • tóm tắt diff
  • tạo changelog
  • giải thích lỗi lint đơn giản
  • đổi tên biến
  • viết test boilerplate
  • format lại tài liệu

Ví dụ:

claude --model haiku "viết commit message theo Conventional Commits cho diff đã stage"

claude --model sonnet "thiết kế lại lớp caching cho payment service"
Enter fullscreen mode Exit fullscreen mode

Cách đặt mặc định hợp lý:

  • Mặc định dùng mô hình rẻ cho tác vụ cơ học.
  • Chỉ nâng lên mô hình mạnh khi cần reasoning, thiết kế hoặc refactor phức tạp.
  • Tách tác vụ phụ ra khỏi phiên chính nếu có thể.

Nếu framework agent hỗ trợ sub-agent, hãy cho sub-agent dùng mô hình rẻ và context nhỏ. Sub-agent có thể tìm kiếm, tóm tắt, lọc kết quả rồi trả lại thông tin cô đọng cho agent chính.

Các mẫu tự động hóa trong lệnh mục tiêu trên Codex và Claude Code là ví dụ hữu ích cho kiểu ủy quyền này.

Nếu bạn dùng gói có giới hạn thay vì trả theo token thuần túy, định tuyến còn giúp kéo dài quota. Việc tăng giới hạn hàng tuần của Claude Code có ích, nhưng không thay thế được việc dùng đúng mô hình cho đúng việc.

7. Cắt bớt output của tool

Tool output là nguồn lãng phí dễ bị bỏ qua. Mỗi dòng log được trả về cho tác nhân có thể đi vào context và tiếp tục được phát lại ở lượt sau.

Làm command im lặng hơn

Thay vì:

npm test
Enter fullscreen mode Exit fullscreen mode

Dùng:

npm test --silent -- --reporter=dot
Enter fullscreen mode Exit fullscreen mode

Thay vì:

npm install
Enter fullscreen mode Exit fullscreen mode

Dùng:

npm install --silent --no-audit --no-fund
Enter fullscreen mode Exit fullscreen mode

Chỉ trả về phần log quan trọng

pytest -q 2>&1 | tail -n 30
Enter fullscreen mode Exit fullscreen mode
npm test 2>&1 | grep -E "(FAIL|✗|Error)" | head -n 20
Enter fullscreen mode Exit fullscreen mode
git diff --stat
Enter fullscreen mode Exit fullscreen mode

Chỉ dùng full diff khi thật sự cần:

git diff src/payments/retry.ts
Enter fullscreen mode Exit fullscreen mode

Tránh đọc toàn bộ file lớn

Thay vì để tác nhân đọc file 1.500 dòng, yêu cầu nó tìm symbol trước:

Tìm hàm xử lý retry trong src/payments/retry.ts.
Chỉ đọc vùng code quanh hàm đó, không đọc toàn bộ file nếu không cần.
Enter fullscreen mode Exit fullscreen mode

Hoặc dùng CLI:

grep -n "function retry" src/payments/retry.ts
sed -n '120,220p' src/payments/retry.ts
Enter fullscreen mode Exit fullscreen mode

Khác biệt có thể là vài trăm token thay vì hàng chục nghìn token.

8. Giới hạn truy xuất trong RAG hoặc code search

Nếu tác nhân dùng tìm kiếm codebase hoặc RAG trên tài liệu, hãy giới hạn:

  • số lượng đoạn trả về
  • kích thước mỗi đoạn
  • thư mục được tìm kiếm
  • loại file được phép đọc

Ví dụ prompt:

Tìm tối đa 5 đoạn liên quan nhất.
Mỗi đoạn không quá 200 token.
Ưu tiên src/payments và docs/payments.
Không đọc generated files.
Enter fullscreen mode Exit fullscreen mode

Mười đoạn ngắn, đúng trọng tâm thường tốt hơn năm mươi đoạn dài làm nhiễu context. Bạn trả tiền cho mọi token được truy xuất, dù mô hình có dùng hay không.

9. Đo chi phí theo từng lần chạy

Bạn không thể tối ưu thứ mình không đo.

Nếu gọi API trực tiếp, lưu usage metadata:

u = response.usage

INPUT_RATE  = 3.00 / 1_000_000
OUTPUT_RATE = 15.00 / 1_000_000
CACHE_READ  = 0.30 / 1_000_000
CACHE_WRITE = 3.75 / 1_000_000

cost = (
    u.input_tokens * INPUT_RATE +
    u.output_tokens * OUTPUT_RATE +
    u.cache_read_input_tokens * CACHE_READ +
    u.cache_creation_input_tokens * CACHE_WRITE
)

print(
    f"run cost ≈ ${cost:.4f} "
    f"(in={u.input_tokens} out={u.output_tokens} "
    f"cache_read={u.cache_read_input_tokens})"
)
Enter fullscreen mode Exit fullscreen mode

Các mức giá trên chỉ để minh họa. Hãy thay bằng giá thực tế của model bạn dùng.

Nếu dùng CLI agent, có thể đo bằng cách:

# Kiểm tra chi phí phiên nếu CLI hỗ trợ
claude /cost
Enter fullscreen mode Exit fullscreen mode

Hoặc tách API key theo dự án/tác nhân để dashboard nhà cung cấp phân bổ chi phí rõ hơn.

Một wrapper script đơn giản cũng đủ hữu ích:

#!/usr/bin/env bash

TASK_LABEL="$1"
shift

START=$(date -Iseconds)

claude "$@"

END=$(date -Iseconds)

echo "$START,$END,$TASK_LABEL" >> agent-runs.csv
Enter fullscreen mode Exit fullscreen mode

Sau đó ghi thêm chi phí/token từ CLI hoặc dashboard vào CSV. Sau một tuần, bạn sẽ biết tác vụ nào đang tốn tiền nhất.

Bảng so sánh chiến thuật

Chiến thuật Mức tiết kiệm token điển hình Nỗ lực
Khoanh vùng tập hợp làm việc 30–60% input mỗi lần chạy Thấp
Rút gọn tệp bộ nhớ dự án 5–15% mỗi lượt Thấp
/compact hoặc /clear giữa các tác vụ 40–80% trong phiên dài Thấp
Prompt caching cho prefix ổn định ~90% trên phần được cache Trung bình
Định tuyến mô hình 50–80% trên tác vụ phụ phù hợp Trung bình
Tool output im lặng hoặc đã lọc 20–50% với workflow nhiều tool Thấp
Đọc có mục tiêu thay vì đọc toàn file 70–95% trên file lớn Thấp
Giới hạn RAG/code search 30–60% với agent dùng truy xuất nhiều Trung bình
Đo chi phí từng lần chạy Không giảm trực tiếp, nhưng giúp tối ưu đúng chỗ Thấp

Các con số trên chỉ mang tính minh họa. Mức tiết kiệm thực tế phụ thuộc vào mức lãng phí ban đầu trong workflow của bạn.

Checklist triển khai nhanh

Áp dụng theo thứ tự này để có hiệu quả nhanh:

  1. Rút gọn CLAUDE.md.
  2. Thêm ignore cho dist/, build/, coverage/, generated files.
  3. Luôn prompt với file/thư mục cụ thể.
  4. Dùng /clear khi đổi tác vụ.
  5. Dùng /compact khi phiên dài nhưng vẫn cùng chủ đề.
  6. Chuyển command test/install sang chế độ ít log.
  7. Dùng git diff --stat trước khi full diff.
  8. Đặt model rẻ cho commit message, changelog, tóm tắt.
  9. Bật prompt caching nếu bạn gọi model trực tiếp.
  10. Ghi lại token/chi phí theo từng tác vụ đại diện.

Kết luận

Chi phí token của tác nhân CLI thường không đến từ phần reasoning thật sự, mà từ context thừa, log thừa, lịch sử phiên quá dài và việc dùng mô hình đắt cho tác vụ đơn giản.

Bắt đầu bằng các thay đổi rẻ nhất: khoanh vùng tác vụ, làm sạch tệp bộ nhớ, cắt output tool và reset phiên đúng lúc. Sau đó thêm prompt caching, model routing và đo chi phí theo từng lần chạy. Khi các thói quen này trở thành mặc định, hóa đơn giảm mà chất lượng công việc vẫn giữ nguyên.

Top comments (0)