Bỏ qua điều hướng
Khái niệm

Hook cho AI agent là gì? Cơ chế, các loại và cách cấu hình

Hướng dẫn dùng hook cho AI agent để kiểm soát, bảo mật và quản trị quy trình làm việc trên Claude Code, Cursor và Codex một cách tất định, an toàn.

Tuan Tran Van
8 phút đọc
Mục lục (10 phần)
  1. Hook cho AI agent là gì?
  2. Vì sao cần hook: kiểm soát tất định cho AI bất định
  3. Hook hoạt động như thế nào?
  4. Các loại hook: command, HTTP, MCP, prompt, agent
  5. Các sự kiện vòng đời và khả năng hỗ trợ nền tảng
  6. Cấu hình hook và quản trị tập trung
  7. Những mẫu ứng dụng thực tế
  8. Bảo mật, giới hạn và best practice
  9. Các câu hỏi thường gặp
  10. Tài liệu tham khảo

Hook cho AI agent là các trình xử lý (handler) do bạn tự định nghĩa, chạy tại những điểm then chốt trong vòng đời của agent (như Claude Code hay Cursor) để quan sát, ghi nhật ký, sửa đổi hoặc chặn đứng hành động của AI.

Khác với các chỉ thị prompt mang tính xác suất, hook can thiệp trước khi hành động tác động đến hệ thống thực, thông qua các cơ chế lập trình tất định. Đây là lớp kiểm soát mà bạn lập trình được, đặt ngay giữa quyết định của mô hình và việc thực thi trên máy.

Hook hoạt động như một cổng kiểm soát tất định nằm giữa quyết định của AI và việc thực thi trên hệ thống

Hook cho AI agent là gì?

Ở góc độ kỹ thuật hệ thống, hook là một lớp kiểm soát nằm giữa quyết định của mô hình ngôn ngữ lớn (Large Language Model, LLM) và hệ điều hành. Khi một sự kiện vòng đời được kích hoạt, agent gửi dữ liệu JSON có cấu trúc qua stdin tới trình xử lý của bạn. Hook xử lý xong rồi trả về kết quả qua stdout hoặc mã thoát (exit code) để điều phối luồng thực thi.

Việc chuẩn hóa các primitive này trên những nền tảng như Claude Code, Cursor, Codex và VS Code Copilot biến hook thành một "control plane" (lớp điều khiển) thực thụ. Bạn thực thi được chính sách bảo mật mà không cần can thiệp vào lõi mô hình hay dựng các proxy mạng phức tạp — vốn thường thất bại trước các giao thức như Model Context Protocol (MCP).

Vì sao cần hook: kiểm soát tất định cho AI bất định

Bạn không thể bảo mật một cơ sở dữ liệu bằng dòng comment "Làm ơn đừng DROP TABLE". Đó chính là nhược điểm của prompt engineering: nó chỉ mang tính xác suất. Dưới áp lực của các chuỗi suy luận phức tạp hay lỗi ảo giác (hallucination), AI hoàn toàn có thể bỏ qua các ranh giới đặt trong prompt.

So sánh chỉ thị prompt mang tính gợi ý, xác suất với hook là cổng chặn tất định mà AI không thể vượt qua

Hook chuyển tư duy từ "gợi ý" sang "thực thi hệ thống". Khi dùng hook để chặn lệnh rm -rf, bạn đang áp đặt một giới hạn vật lý mà AI không thể vượt qua, bất kể kỹ thuật prompt injection nào. Đây là sự tách biệt cần thiết giữa logic sáng tạo của AI và các quy tắc an toàn cốt lõi của hạ tầng.

Hook hoạt động như thế nào?

Quy trình thực thi hook tuân theo một luồng dữ liệu nghiêm ngặt:

Luồng hoạt động của hook: sự kiện kích hoạt, lọc qua matcher, thực thi handler và hợp nhất quyết định theo thứ tự deny, defer, ask, allow

  1. Sự kiện kích hoạt (event fires): một lifecycle event (ví dụ PreToolUse) xảy ra.
  2. Lọc qua matcher: agent kiểm tra matcher để xác định hook có áp dụng cho tool hiện tại (ví dụ Bash) hay không.
  3. Thực thi handler: script hoặc API được gọi với payload JSON chứa session_id, cwdtool_input.
  4. Ra quyết định (decision precedence): nếu nhiều hook cùng chạy, kết quả được hợp nhất theo thứ tự ưu tiên deny > defer > ask > allow.

Cơ chế "fail-open" được áp dụng mặc định: nếu hook lỗi hoặc timeout, agent vẫn tiếp tục chạy để không làm gián đoạn công việc, trừ khi bạn cấu hình ngược lại.

Các loại hook: command, HTTP, MCP, prompt, agent

Năm loại hook xếp theo tốc độ và chiều sâu suy luận: command, HTTP, MCP, prompt và agent

  • Command: chạy shell script cục bộ. Tốc độ cực nhanh (dưới 10ms), hoạt động offline, hợp với các bước kiểm tra regex.
  • HTTP: POST dữ liệu tới một API endpoint. Lý tưởng để quản trị tập trung, đẩy log vào SIEM (Splunk, Datadog).
  • MCP: gọi công cụ từ một máy chủ MCP đã kết nối để kiểm tra trạng thái hệ thống.
  • Prompt: dùng một model nhỏ (như Claude Haiku) để đánh giá đúng/sai cho các tình huống cần logic mờ.
  • Agent (thử nghiệm): khởi tạo một subagent để kiểm tra sâu hơn (đọc file, chạy test suite) trước khi cho phép agent chính dừng lượt.

Các sự kiện vòng đời và khả năng hỗ trợ nền tảng

Các nền tảng khác nhau về schema: Claude Code dùng PascalCase, còn Cursor dùng camelCase. Bảng dưới đối chiếu khả năng hỗ trợ những sự kiện chính:

Các sự kiện vòng đời trong một phiên agent theo trình tự: UserPromptSubmit, PreToolUse, PostToolUse và Stop

Sự kiện chínhClaude CodeCursorCodexỨng dụng chính
UserPromptSubmitbeforeSubmitPromptContext injection / che giấu PII
PreToolUsepreToolUseChặn lệnh nguy hiểm (hard gate)
PostToolUsepostToolUseAuto-formatter / ghi log kiểm toán
StopstopKiểm thử QA / xác nhận hoàn thành
SessionStartsessionStartNạp biến môi trường / git status
ConfigChangeKhôngKhôngGiám sát thay đổi file settings/skills

Claude Code có bề mặt sự kiện rộng nhất, bao gồm cả WorktreeCreateSetup cho các luồng CI/CD.

Cấu hình hook và quản trị tập trung

Hook có thể được định nghĩa tại ~/.claude/settings.json (global) hoặc .claude/settings.json (project). Trong môi trường doanh nghiệp, rủi ro lớn nhất là "shadow AI" (nhân viên dùng AI ngoài tầm kiểm soát của tổ chức) khi lập trình viên tự ý đặt "disableAllHooks": true.

Để xử lý, kỹ sư platform nên triển khai qua managed policy của MDM (Jamf, Intune) nhằm ghi đè quyền này, đảm bảo mọi phiên làm việc của AI đều nằm trong các rào chắn bảo mật của tổ chức.

Những mẫu ứng dụng thực tế

Security gate: chặn lệnh nguy hiểm

Dùng một script Bash để quét câu lệnh shell. Chú ý cách truy xuất tool_input cho chuẩn:

bash
#!/bin/bash
# .claude/hooks/guard-rm.sh
INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command')
 
if [[ "$COMMAND" == *"rm -rf"* ]]; then
  echo "Blocked: Destructive command detected." >&2
  exit 2 # Bắt buộc exit code 2 để chặn cứng
fi
exit 0

Auto-formatter: hook PostToolUse

Tự động chạy Prettier sau khi AI chỉnh sửa file để giữ codebase nhất quán:

json
"PostToolUse": [
  {
    "matcher": "Edit|Write",
    "hooks": [{
      "type": "command",
      "command": "file=$(jq -r '.tool_input.file_path') && npx prettier --write $file"
    }]
  }
]

Bảo mật, giới hạn và best practice

  1. Exit code 2 là bắt buộc: trong hệ thống quản trị AI, exit 2 là "hard block". exit 1 chỉ được coi là cảnh báo và agent vẫn có thể tiếp tục.
  2. Quản lý timeout: mặc định là 10 phút cho command, nhưng UserPromptSubmit chỉ có 30 giây. Script của bạn phải tối ưu để tránh treo agent.
  3. Ưu tiên tất định trước: luôn dùng regex hoặc blocklist trước khi gọi prompt hook để giảm độ trễ và chi phí.
  4. Tránh đệ quy: khi dùng agent hook, hãy đảm bảo subagent không kích hoạt lại chính hook đó, tạo thành vòng lặp vô hạn.
  5. Xây lớp adapter: do schema giữa Claude Code và Cursor không đồng nhất, hãy viết script hook như một lớp adapter xử lý được cả hai loại đầu vào.

Các câu hỏi thường gặp

Hook có làm chậm agent không? Script cục bộ tốn dưới 10ms. Hook qua mạng hoặc gọi LLM tốn 500ms đến 2 giây. Dùng async: true cho các tác vụ ghi log để không chặn luồng thực thi.

AI có tự tắt được hook không? Không. Hook chạy ngoài ngữ cảnh của model — trừ khi AI có quyền sửa file settings và bạn không đặt hook chặn việc sửa chính file đó.

Tôi có thể dùng hook để sửa nội dung AI viết không? Có. Dùng trường updatedInput trong PreToolUse hoặc additionalContext trong PostToolUse để điều hướng lại hành vi của agent.

Tài liệu tham khảo

Đọc tiếp

Chia sẻ bài viết

X / TwitterFacebookLinkedIn