Khám phá Kiến trúc Claude Code

Claude Code Arch

1. Mục đích của Framework điều phối

Việc gọi API LLM thuần túy không đủ để xây dựng một AI Agent tự hành. Claude Code CLI đóng vai trò như một lớp vỏ (Harness) bao bọc quanh LLM, giải quyết ba vấn đề cốt lõi:

🧠

Quản lý ngữ cảnh

Phân chia công việc thông minh, tránh việc nạp toàn bộ mã nguồn vào mỗi lượt tương tác, ngăn chặn tình trạng bão hòa cửa sổ ngữ cảnh.

📉

Kiểm soát tài nguyên

Tối ưu hóa việc gửi dữ liệu lặp lại giữa các lượt gọi. Cấu trúc lại luồng dữ liệu để giảm thiểu tối đa lượng token tiêu thụ thông qua Cache.

Xử lý song song

Kiến trúc đa tác vụ cho phép thực hiện đồng thời các thao tác như đọc file, tìm kiếm thông tin thông qua cơ chế Sub-agents.

2. Luồng thực thi vòng lặp (Control Flow)

Thay vì cơ chế "hỏi-đáp" một lần, hệ thống duy trì một quy trình lặp đi lặp lại tự động.

1. Nạp ngữ cảnh
Nối phần tiền tố và lịch sử (Context Window)
2. LLM Inference
Phân tích yêu cầu và sinh Token
3. Đánh giá Trạng thái
Model gọi: 'end_turn'
Kết thúc
Trả kết quả User
Model gọi: 'tool_use'
4. Chạy Công cụ (Local)
VD: Bash, Đọc File, Search
5. Thu thập kết quả Tool
Đóng gói thành XML/JSON
↺ Quay lại Bước 1

3. Hệ thống Lifecycle Hooks

Hooks cho phép lập trình viên (hoặc Framework) can thiệp vào vòng đời hoạt động của LLM. Claude Code phân chia Hooks thành 3 nhịp độ chính.

SessionStart & SessionEnd

Can thiệp khi ứng dụng Agent bắt đầu khởi động hoặc bị tắt.

Ví dụ (SessionStart): Tiêm thông tin môi trường (Hệ điều hành, Project Context, Coding Standards) trực tiếp vào System Prompt của Model trước khi phiên bắt đầu.

UserPromptSubmit, Stop & StopFailure

Nhịp Turn quản lý từng vòng lặp hỏi/đáp. Đây là nơi triển khai cơ chế "Tự sửa lỗi" (Self-Correction) rất mạnh mẽ.

Ứng dụng Hook `Stop`:
Khi LLM đòi dừng lại (end_turn) vì nghĩ đã code xong. Hook `Stop` sẽ kích hoạt tự động chạy Unit Test (VD: `npm test`).
- Nếu Test PASS: Trả về exit code 0 -> Cho phép dừng.
- Nếu Test FAIL: Trả về exit code 2 -> Framework **chặn LLM lại**, nhét log lỗi vào Context và ép LLM phải vòng lại sửa lỗi!

PreToolUse & PostToolUse

Bảo vệ hệ thống và kiểm soát dữ liệu liên quan đến việc thực thi câu lệnh Local.

PreToolUse: Đánh chặn khi LLM gọi lệnh nguy hiểm (VD: `rm -rf`). Hook này có thể sửa đổi lệnh thành `rm -rf --dry-run` trước khi thực thi để bảo vệ máy tính.
PostToolUse: Khi một lệnh Bash trả về kết quả quá dài (1 triệu dòng log), Hook này sẽ cắt bớt (truncate) chuỗi kết quả trước khi đưa lại vào Context Window để tránh tốn Token.

4. Phương pháp khởi tạo & Phân bổ Token

Khi cần chia nhỏ công việc cho các Sub-agents, hệ thống hỗ trợ 2 phương pháp. Khởi tạo Kế thừa (Fork) là kỹ thuật quan trọng nhất để tối ưu chi phí thông qua Context Caching.

So sánh tiêu thụ Token (Giả lập khởi tạo 5 Sub-agents)

Khởi tạo Độc lập (Vanilla)

Isolated
  • Cơ chế: Sub-agent bắt đầu với Prompt trắng tinh.
  • Chi phí: Toàn bộ lượng token phải tính phí từ đầu (Không hit cache).
  • Áp dụng: Các task rời rạc không cần ngữ cảnh (VD: Agent dịch thuật).
Tối ưu chi phí

Khởi tạo Kế thừa (Fork)

Shared Memory
  • Cơ chế: Sao chép toàn bộ lịch sử hội thoại hiện tại.
  • Chi phí: Nhờ cơ chế KV-Cache của LLM, phần lịch sử cũ được tái sử dụng (0đ), chỉ tính phí phần token mới sinh ra.
  • Áp dụng: Agent định dạng (Formatter) cần đọc lại kết quả của các Agent trước đó.

5. Cơ chế Xử lý Đầu ra của Sub-agent

Để tránh việc bộ nhớ của Parent Agent bị quá tải (Context Overflow), dữ liệu từ các Sub-agents không được đẩy trực tiếp lên mà phải đi qua quy trình "tóm lược" nghiêm ngặt.

Agent Tool Interface

Việc tạo Sub-agent được tính như một hành động tool_call. Khi Sub-agent chạy xong, kết quả trả về như một tool_response.

Summarization (Lọc rác)

Framework sẽ tự động loại bỏ chuỗi suy luận nội bộ (thinking steps) của Sub-agent, chỉ giữ lại văn bản Text tổng hợp cuối cùng.

Context Integration

Kết quả sạch được nối (append) vào cuối mảng Message của Parent Agent để đọc trong vòng lặp tiếp theo.

6. Quản lý trạng thái qua File System

Thay vì dùng Database cồng kềnh, mạng lưới Agent liên lạc với nhau thông qua một hệ thống file JSON cục bộ cực kỳ nhẹ nhàng.

/claude_code/.internal_state/
# Cấu trúc lưu trữ hộp thư nội bộ (Inbox)
🔒 system.lock Ngăn đụng độ ghi file (Concurrency)
📄 inbox_parent.json
⚙️ inbox_agent_search.json { "_internal": true }
# Cờ _internal ẩn file này khỏi giao diện người dùng.
API: SendMessage()

Ghi dữ liệu dạng broadcast đến nhiều inbox cùng lúc.

INTERACTIVE

7. Tầng Inference & Raw Payload View

Khám phá thực tế cách Framework lắp ráp bộ nhớ (Context Window) và gửi chuỗi Raw String xuống API Model thông qua Use Case: "Tổng hợp tin tức".

👉 CLICK VÀO TỪNG NODE TRÊN ĐỒ THỊ để mở Simulator. Bấm nút "Bước tiếp" để xem LLM nối Context ra sao!

👔

Parent Orchestrator

Mô phỏng Parent Context
🔍

Agent: Search

Chờ trả kết quả Search
🕷️

Agent: Scrape

Chờ đọc Content
🔥 CONTEXT CACHE HIT
✍️

Fork Agent (Formatter)

Tổng hợp & End Turn