Phân tích mã nguồn Claude Code: Tại sao nó lại hữu ích hơn các công cụ lập trình AI khác?

Tiêu đề gốc: 《Một bài hiểu về mã nguồn Claude Code của Anthropic: Vì sao nó lại tiện hơn người khác?》

Tác giả gốc: Yuker, nhà phân tích AI

Ngày 31 tháng 3 năm 2026, nhà nghiên cứu an ninh Chaofan Shou phát hiện gói Claude Code mà Anthropic phát hành lên npm không bị tách bỏ file source map.

Điều này có nghĩa là: Toàn bộ mã nguồn TypeScript của Claude Code, 512.000 dòng, 1.903 tệp, cứ thế bị phơi bày công khai trên internet.

Tất nhiên tôi không thể xem hết ngần ấy mã trong vài giờ ngắn ngủi, vì vậy tôi đọc phần mã nguồn này với ba câu hỏi:

  1. Claude Code và các công cụ lập trình AI khác rốt cuộc khác nhau ở bản chất gì?

  2. Vì sao “cảm giác” khi nó viết code lại tốt hơn người khác?

  3. Trong 510.000 dòng mã đó, rốt cuộc giấu cái gì?

Sau khi đọc xong, phản ứng đầu tiên của tôi là: Đây không phải một trợ lý lập trình AI, mà là một hệ điều hành.

I. Trước hết kể một câu chuyện: Nếu bạn thuê một lập trình viên từ xa

Hãy tưởng tượng bạn thuê một lập trình viên từ xa và cấp cho anh ta quyền truy cập từ xa vào máy tính của bạn.

Bạn sẽ làm gì?

Nếu bạn làm theo cách của Cursor: bạn cho anh ta ngồi cạnh bạn, mỗi lần anh ta cần gõ lệnh thì bạn nhìn qua, bấm “Cho phép”. Đơn giản thô bạo nhưng bạn phải luôn canh chừng.

Nếu bạn làm theo cách của GitHub Copilot Agent: bạn đưa cho anh ta một máy ảo mới tinh để anh ta thoải mái nghịch trong đó. Xong rồi thì đẩy code lên, bạn duyệt và mới hợp nhất. An toàn nhưng anh ta không nhìn thấy môi trường cục bộ của bạn.

Nếu bạn làm theo cách của Claude Code:

Bạn cho nó dùng trực tiếp máy của bạn—nhưng bạn trang bị cho nó một hệ thống kiểm tra an ninh cực kỳ tinh vi. Nó có thể làm gì, không thể làm gì, những thao tác nào cần bạn bấm đồng ý, những thao tác nào có thể tự nó làm, thậm chí cả việc nó muốn dùng rm -rf cũng phải qua 9 lớp thẩm tra mới được thực thi.

Đây chính là ba triết lý bảo mật hoàn toàn khác nhau:

Vì sao Anthropic lại chọn con đường khó nhất?

Bởi chỉ bằng cách đó, AI mới có thể làm việc bằng terminal của bạn, môi trường của bạn, cấu hình của bạn—đây mới là “thực sự giúp bạn viết code”, chứ không phải “trong một căn phòng sạch sẽ viết giúp bạn một đoạn code rồi chép qua”.

Nhưng cái giá là gì? Họ đã viết 510.000 dòng code để làm điều đó.

II. Claude Code mà bạn nghĩ vs Claude Code thực tế

Đa số người nghĩ công cụ lập trình AI sẽ như thế này:

Người dùng nhập → gọi API LLM → trả kết quả → hiển thị cho người dùng

Claude Code thực ra là như thế này:

Người dùng nhập
→ lắp ráp động 7 lớp prompt hệ thống
→ chèn trạng thái Git, các quy ước dự án, trí nhớ lịch sử
→ 42 công cụ, mỗi cái đều kèm “hướng dẫn sử dụng” riêng
→ LLM quyết định dùng công cụ nào
→ thẩm tra an toàn 9 lớp (phân tích AST, bộ phân loại ML, kiểm tra sandbox…)
→ phân tích tranh chấp quyền (bàn phím cục bộ / IDE / Hook / bộ phân loại AI cùng cạnh tranh)
→ trễ 200ms chống bấm nhầm
→ thực thi công cụ
→ kết quả trả về theo luồng (streaming)
→ ngữ cảnh gần chạm giới hạn? → nén theo 3 lớp (micro-nén → tự động nén → nén hoàn toàn)
→ cần chạy song song? → sinh “đàn ong” các sub Agent
→ lặp cho tới khi hoàn thành nhiệm vụ

Mọi người hẳn rất tò mò phía trên là gì; không vội, chúng ta hãy bóc tách lần lượt.

III. Bí mật đầu tiên: Prompt không phải viết ra, mà là “lắp ghép” ra

Mở src/constants/prompts.ts, bạn sẽ thấy hàm này:

Có nhận ra SYSTEM_PROMPT_DYNAMIC_BOUNDARY không?

Đây là một ranh giới bộ nhớ đệm. Nội dung phía trên ranh giới là tĩnh; Claude API có thể cache chúng, tiết kiệm chi phí token. Nội dung phía dưới ranh giới là động—những thứ như nhánh Git hiện tại của bạn, cấu hình dự án CLAUDE.md của bạn, các sở thích/ghi nhớ bạn đã từng nói với nó… lần nào cũng khác nhau.

Điều này có nghĩa là gì?

Anthropic coi prompt như output được tối ưu của một bộ biên dịch. Phần tĩnh là “binary đã biên dịch”, phần động là “tham số lúc chạy”. Làm vậy mang lại lợi ích:

  1. Tiết kiệm tiền: phần tĩnh đi qua cache, không tính phí lặp lại

  2. Nhanh: cache hit thì bỏ qua xử lý các token đó

  3. Linh hoạt: phần động giúp mỗi cuộc hội thoại cảm nhận được môi trường hiện tại

Mỗi công cụ đều có “hướng dẫn sử dụng” độc lập

Điều khiến tôi chấn động hơn nữa là: trong mỗi thư mục công cụ đều có một tệp prompt.ts—đây là bản hướng dẫn sử dụng được viết riêng cho LLM.

Hãy xem prompt.ts của BashTool (src/tools/BashTool/prompt.ts, khoảng 370 dòng):

Đây không phải tài liệu viết cho con người đọc, mà là “chuẩn mực hành vi” viết cho AI. Mỗi khi Claude Code khởi động, các quy tắc này sẽ được nhúng vào prompt hệ thống.

Đó là lý do Claude Code chưa bao giờ tự ý git push --force, trong khi một số công cụ khác thì có—không phải mô hình thông minh hơn, mà là trong prompt đã nói rõ luật lệ rồi.

Ngoài ra, phiên bản nội bộ của Anthropic không giống phiên bản bạn dùng

Trong code có xuất hiện rất nhiều nhánh như vậy:

ant là nhân viên nội bộ của Anthropic. Phiên bản của họ có chỉ dẫn chi tiết hơn về phong cách code (“không viết comment trừ khi WHY không rõ”), chiến lược output mạnh tay hơn (“viết theo kiểu kim tự tháp ngược”), và một vài tính năng thí nghiệm vẫn đang trong A/B test (Verification Agent, Explore & Plan Agent).

Điều này cho thấy Anthropic chính là người dùng lớn nhất của Claude Code. Họ dùng chính sản phẩm của mình để phát triển sản phẩm của mình.

IV. Bí mật thứ hai: Có 42 công cụ, nhưng bạn chỉ thấy một phần nhỏ của tảng băng

Mở src/tools.ts, bạn sẽ thấy trung tâm đăng ký công cụ:

Có 42 công cụ, nhưng phần lớn bạn chưa bao giờ nhìn thấy trực tiếp. Bởi nhiều công cụ được tải trễ—chỉ khi LLM cần thì mới được chèn vào theo yêu cầu thông qua ToolSearchTool.

Vì sao lại làm vậy?

Vì mỗi thêm một công cụ thì prompt hệ thống lại phải thêm một đoạn mô tả, và token sẽ bị tốn thêm một phần chi phí. Nếu bạn chỉ muốn Claude Code giúp bạn sửa một dòng code, thì nó không cần tải “bộ điều phối lịch tác vụ” và “bộ quản lý cộng tác nhóm”.

Còn có một thiết kế thông minh hơn:

Đặt CLAUDE_CODE_SIMPLE=true, Claude Code sẽ chỉ còn ba công cụ: Bash, đọc tệp, sửa tệp. Đây là đường tắt cho người theo chủ nghĩa tối giản.

Tất cả công cụ đều xuất phát từ cùng một nhà máy

Chú ý các giá trị mặc định: isConcurrencySafe mặc định là false, isReadOnly mặc định là false.

Đây gọi là thiết kế fail-closed—nếu tác giả một công cụ quên khai báo thuộc tính an toàn, hệ thống sẽ mặc định rằng công cụ đó “không an toàn, có thể ghi vào”. Thà quá dè chừng còn hơn bỏ sót một rủi ro.

“Đọc trước rồi mới sửa” là luật bất di bất dịch

FileEditTool sẽ kiểm tra xem bạn đã dùng FileReadTool để đọc tệp này chưa. Nếu chưa, liền báo lỗi, không cho phép sửa.

Đó là lý do Claude Code không giống một số công cụ kia “tự bịa ra một đoạn code để ghi đè tệp của bạn”—nó bị ép buộc phải hiểu trước rồi mới sửa.

V. Bí mật thứ ba: Hệ thống trí nhớ—vì sao nó có thể “nhớ bạn”

Người dùng Claude Code đều có một cảm giác: nó như thể thật sự hiểu bạn.

Bạn nói với nó “đừng mock dữ liệu trong bài test”, lần sau trò chuyện nó sẽ không còn mock nữa. Bạn nói “tôi là kỹ sư backend, mới học React”, khi nó giải thích code frontend thì sẽ dùng phép so sánh từ backend.

Phía sau đó là một hệ thống trí nhớ hoàn chỉnh.

Dùng AI để truy xuất trí nhớ

Claude Code dùng một AI khác (Claude Sonnet) để quyết định “những ký ức nào liên quan đến cuộc hội thoại hiện tại”.

Không phải khớp từ khóa, không phải tìm kiếm vector—mà là để một mô hình nhỏ quét nhanh tất cả các tệp ghi nhớ: lấy tiêu đề và mô tả, chọn ra tối đa 5 cái phù hợp nhất, rồi nhúng toàn bộ nội dung của chúng vào ngữ cảnh của cuộc hội thoại hiện tại.

Chiến lược là “ưu tiên độ chính xác hơn khả năng thu hồi”—thà bỏ sót một ký ức có thể hữu ích còn hơn nhét vào một ký ức không liên quan, gây nhiễu ngữ cảnh.

Chế độ KAIROS: ban đêm “mơ”

Đây là phần khiến tôi thấy như khoa học viễn tưởng nhất.

Trong code có một cờ/tính năng gọi là KAIROS. Ở chế độ này, trí nhớ trong các cuộc hội thoại dài không được lưu trong các tệp có cấu trúc, mà tồn tại dưới dạng log append theo ngày. Sau đó có một kỹ năng /dream sẽ chạy “vào ban đêm” (thời gian hoạt động thấp), chưng cất các log thô đó thành các tệp chủ đề có cấu trúc.

AI “dọn dẹp” trí nhớ khi đang ngủ. Đây không còn là kỹ thuật nữa, mà là sinh học giả.

VI. Bí mật thứ năm: Nó không phải một Agent, mà là cả một đám

Khi bạn giao cho Claude Code một nhiệm vụ phức tạp, nó có thể lặng lẽ làm việc này:

Nó tạo ra một sub Agent.

Và sub Agent có cơ chế “tự nhận thức” được nhúng chặt chẽ để ngăn nó đệ quy sinh thêm sub Agent:

Đoạn code này nói rằng: “Bạn là một người làm công, không phải quản lý. Đừng nghĩ tới việc thuê thêm người, tự mình làm.”

Chế độ Coordinator: chế độ quản lý

Ở chế độ điều phối (coordinator), Claude Code biến thành một bộ lập kế hoạch thuần túy cho nhiệm vụ: nó không tự làm, chỉ phân công:

Nguyên tắc cốt lõi được viết trong comment của code:

“Parallelism is your superpower” chỉ cho tác vụ nghiên cứu chỉ đọc: chạy song song. Với tác vụ ghi file: nhóm theo từng file rồi chạy tuần tự (để tránh xung đột).

Tối ưu cực hạn cho Prompt Cache

Để tối đa hóa tỷ lệ cache hit của các sub Agent do fork, mọi kết quả công cụ của các sub proxy được fork đều dùng cùng một văn bản chỗ trống (placeholder) giống nhau:

“Fork started—processing in background”

Vì sao? Do prompt cache của Claude API dựa trên việc khớp tiền tố ở mức byte. Nếu tiền tố byte của 10 sub Agent hoàn toàn giống nhau, thì chỉ cần sub Agent đầu tiên cần “khởi động lạnh” (cold start), còn 9 cái sau sẽ khớp cache ngay.

Đây là một tối ưu giúp tiết kiệm vài xu Mỹ mỗi lần gọi, nhưng ở quy mô sử dụng lớn thì có thể tiết kiệm một lượng chi phí đáng kể.

VII. Bí mật thứ sáu: Nén theo ba lớp để hội thoại “không bao giờ vượt giới hạn”

Tất cả LLM đều có giới hạn ngữ cảnh (context window). Hội thoại càng dài thì lịch sử tin nhắn càng nhiều, cuối cùng chắc chắn sẽ vượt giới hạn.

Claude Code thiết kế ba lớp nén để xử lý việc đó:

Lớp một: micro-nén—chi phí nhỏ nhất

Micro-nén chỉ tác động đến kết quả gọi công cụ cũ—thay “nội dung tệp 500 dòng đã đọc cách đây 10 phút” bằng [Old tool result content cleared].

Prompt và mạch chính của hội thoại được giữ nguyên hoàn toàn.

Lớp hai: tự động nén—chủ động co lại

Khi lượng token tiêu thụ gần đạt ngưỡng của context window ở mức 87% (kích thước cửa sổ - 13,000 buffer), việc nén tự động sẽ được kích hoạt. Có một cơ chế ngắt (meltdown/fuse): sau khi nén thất bại liên tiếp 3 lần thì dừng thử để tránh vòng lặp chết.

Lớp ba: nén hoàn toàn—AI tóm tắt

Cho AI tạo tóm tắt cho toàn bộ đoạn hội thoại, rồi thay tất cả lịch sử tin nhắn bằng tóm tắt đó. Khi tạo tóm tắt, có một chỉ lệnh “tiền đề” cực kỳ nghiêm khắc:

Vì sao cần nghiêm khắc như vậy? Bởi nếu trong quá trình tóm tắt mà AI lại đi gọi công cụ thì sẽ phát sinh nhiều token hơn, phản tác dụng. Prompt này chính là đang nói: “Nhiệm vụ của bạn là tóm tắt, đừng làm gì khác.”

Ngân sách token sau khi nén:

· Khôi phục tệp: 50,000 tokens

· Giới hạn mỗi tệp: 5,000 tokens

· Nội dung kỹ năng: 25,000 tokens

Những con số này không phải “ước đoán bừa”—chúng là điểm cân bằng giữa việc “giữ đủ ngữ cảnh để tiếp tục làm việc” và “dành đủ dung lượng để nhận tin nhắn mới”.

VIII. Đọc xong phần mã nguồn này, tôi học được gì

90% công việc của AI Agent nằm ngoài chữ “AI”

Trong 510.000 dòng mã, phần thật sự gọi API LLM có thể chưa tới 5%. Còn lại 95% là gì?

· Kiểm tra an toàn (18 tệp chỉ để phục vụ một BashTool)

· Hệ thống quyền (quyết định 4 trạng thái allow/deny/ask/passthrough)

· Quản lý ngữ cảnh (nén 3 lớp + truy xuất trí nhớ AI)

· Phục hồi lỗi (cầu chì, exponential backoff, Transcript bền vững)

· Phối hợp nhiều Agent (điều phối đàn ong + liên lạc qua email)

· Tương tác UI (140 component React + IDE Bridge)

· Tối ưu hiệu năng (ổn định prompt cache + tiền nạp song song khi khởi động)

Nếu bạn đang làm sản phẩm AI Agent, đây chính là vấn đề bạn thực sự cần giải quyết. Không phải mô hình thông minh tới đâu, mà là “giàn giáo” của bạn có đủ vững chắc hay không.

Tốt prompt engineering là một bài toán hệ thống

Không phải viết một đoạn prompt đẹp rồi xong. Prompt của Claude Code là:

· Lắp ghép động 7 lớp

· Mỗi công cụ kèm “hướng dẫn sử dụng” độc lập

· Ranh giới cache được phân chia chính xác

· Tập lệnh phiên bản nội bộ và phiên bản bên ngoài khác nhau

· Thứ tự công cụ cố định để giữ ổn định cache

Đây là quản lý prompt theo hướng kỹ thuật hóa (engineering), không phải thủ công mỹ nghệ.

Thiết kế cho thất bại

Mỗi phụ thuộc bên ngoài đều có chiến lược xử lý thất bại tương ứng:

Anthropic coi Claude Code như một hệ điều hành

42 công cụ = hệ thống gọi hệ thống (system calls) + hệ thống quyền = quản lý quyền của người dùng kỹ năng hệ thống = ứng dụng chợ MCP giao thức = driver thiết bị Agent đàn ong = quản lý tiến trình nén ngữ cảnh = quản lý bộ nhớ Transcript bền vững = hệ thống tệp

Đây không phải “một chatbot trò chuyện thêm vài công cụ”, mà là một hệ điều hành lấy LLM làm lõi.

Tóm tắt

510.000 dòng mã. 1.903 tệp. 18 tệp an toàn chỉ dành cho một công cụ Bash.

9 lớp thẩm tra chỉ để giúp AI an toàn làm một lệnh gõ dòng lệnh cho bạn.

Đây là câu trả lời của Anthropic: Muốn AI thật sự hữu ích, bạn không thể nhốt nó trong lồng, cũng không thể thả nó chạy trần truồng. Bạn phải xây dựng cho nó một hệ thống niềm tin đầy đủ.

Cái giá của hệ thống niềm tin đó là 510.000 dòng mã.

Liên kết gốc

Bấm để tìm hiểu về các vị trí tuyển dụng của律动BlockBeats

Chào mừng bạn tham gia cộng đồng chính thức của律动 BlockBeats:

Telegram nhóm đăng ký: https://t.me/theblockbeats

Telegram nhóm thảo luận: https://t.me/BlockBeats_App

Tài khoản Twitter chính thức: https://twitter.com/BlockBeatsAsia

Xem bản gốc
Trang này có thể chứa nội dung của bên thứ ba, được cung cấp chỉ nhằm mục đích thông tin (không phải là tuyên bố/bảo đảm) và không được coi là sự chứng thực cho quan điểm của Gate hoặc là lời khuyên về tài chính hoặc chuyên môn. Xem Tuyên bố từ chối trách nhiệm để biết chi tiết.
  • Phần thưởng
  • Bình luận
  • Đăng lại
  • Retweed
Bình luận
Thêm một bình luận
Thêm một bình luận
Không có bình luận
  • Ghim