Vì sao Claude Code lại tốt đến vậy
(minusx.ai)- Claude Code là một AI agent/quy trình làm việc cực kỳ xuất sắc về mặt khả năng sử dụng
- Nhờ sự đơn giản về kiến trúc và vòng lặp điều khiển rõ ràng, nó mang lại trải nghiệm dễ gỡ lỗi và bảo trì
- Bằng cách giảm thiểu việc áp dụng RAG và tích cực tận dụng prompt tinh chỉnh cùng các tệp ngữ cảnh, nó tối đa hóa thế mạnh của LLM
- Duy trì độ rõ ràng và tính nhất quán trong công việc thông qua nhiều công cụ (tool) và hướng dẫn rõ ràng
- Thay vì theo đuổi sự phức tạp, nó có ưu điểm là có thể giúp bạn tự triển khai một LLM agent tương tự bằng cấu trúc dễ hiểu và thiết kế prompt
Tổng quan
- Claude Code (sau đây gọi là CC) mang lại trải nghiệm hài lòng nhất trong số các AI agent/quy trình làm việc lập trình hiện có
- Điểm mạnh của CC nằm ở chỉnh sửa mã đúng mục tiêu, giảm bớt gián đoạn không cần thiết, và mang đến UX dễ chịu nhờ vẫn giữ quyền kiểm soát cho người dùng
- Mô hình Claude 4 và cơ chế Interleaved Thinking đặc trưng đóng vai trò cốt lõi, nhưng ngay cả khi so với các công cụ khác cùng dùng mô hình tương tự như Cursor hay Github Copilot, nó vẫn gây ít phiền toái hơn
- Bài viết này mổ xẻ nguyên lý triển khai của CC và cung cấp hướng dẫn thực chiến để xây dựng LLM agent riêng có thể đem lại trải nghiệm tương tự
Đức tính cốt lõi của Claude Code: sự đơn giản
- Bài học lớn nhất là “hãy giữ mọi thứ đơn giản (Keep Things Simple, Dummy)”
- Với LLM agent, nếu đưa vào các cấu trúc phức tạp như multi-agent, RAG phức tạp, hệ thống kiểm chứng..., việc gỡ lỗi và cải tiến sẽ trở nên cực kỳ khó khăn
- CC áp dụng một vòng lặp chính duy nhất, bộ công cụ đơn giản, cấu trúc có thể nắm bắt ngay, và đặt toàn bộ logic cốt lõi trong một tệp để loại bỏ boilerplate và độ phức tạp không cần thiết
Vì sao sự đơn giản lại quan trọng
- Thay vì kiến trúc multi-agent, nó xử lý phần lớn công việc trong một luồng chính
- Các phần như tóm tắt lịch sử hay hợp nhất thông điệp phục vụ UX chỉ được áp dụng ở dạng bổ trợ
- Khi cần xử lý việc phức tạp, nó tự sao chép chính mình để tách thành sub-agent (không có phân nhánh đệ quy, chỉ cho phép một cấp)
- Tích cực sử dụng danh sách việc cần làm (todo list)
- Các vấn đề phức tạp được chia nhỏ và xử lý ở sub-agent, nhưng kết quả được hợp nhất trở lại vào lịch sử thông điệp chính
- Những cấu trúc đa tầng quá trừu tượng như multi-agent hay điều hướng đồ thị ngược lại có nguy cơ làm giảm độ ổn định và khả năng mở rộng của hệ thống
Tích cực tận dụng mô hình gọn nhẹ
- Sử dụng các mô hình LLM gọn nhẹ như claude-3-5-haiku cho phần lớn yêu cầu
- Xử lý hiệu quả nhiều tác vụ như đọc tệp lớn, phân tích trang web, tóm tắt lịch sử git
- Khi dùng mô hình gọn nhẹ, chi phí có thể giảm tới 70–80%
- Khuyến nghị sử dụng tổ hợp mô hình được tối ưu hóa cho mọi lệnh gọi chức năng chính
Thiết kế prompt tinh vi
- Prompt hệ thống của CC có quy mô rất lớn (khoảng 2800 tokens) và gồm nhiều phần khác nhau (tone & style, quản lý công việc, chính sách dùng công cụ, thông tin OS/thư mục...)
- Luôn bao gồm toàn bộ các tệp ngữ cảnh như claude.md để tối đa hóa độ phong phú của ngữ cảnh
- Prompt hệ thống hướng dẫn rất chi tiết về các quy tắc mang tính chính sách, ví dụ minh họa, điểm cần lưu ý, thời điểm dùng công cụ...
Kết hợp đồng thời XML và Markdown
- Trong prompt, XML tag và cấu trúc Markdown được dùng cùng lúc
- Truyền đạt thông tin chi tiết và điều kiện phân nhánh bằng các thẻ như
<system-reminder>,<good-example>,<bad-example> - Phân chia section rõ ràng bằng markdown heading
- Truyền đạt thông tin chi tiết và điều kiện phân nhánh bằng các thẻ như
Tầm quan trọng của tệp ngữ cảnh
- Chỉ riêng việc có hay không có claude.md cũng tạo ra khác biệt hiệu năng rất lớn cho CC
- Đây là yếu tố thiết yếu để truyền đạt các quy tắc bổ sung khó suy ra từ codebase (loại trừ thư mục/thư viện, chính sách ưu tiên...)
- MinusX cũng đang hệ thống hóa sở thích của nhóm/người dùng bằng minusx.md
Giảm thiểu RAG, tận dụng tìm kiếm bằng LLM
- Thay vì RAG (Retrieval Augmented Generation), CC ưu tiên cấu trúc dựa trên tìm kiếm mã trực tiếp bằng các lệnh như
ripgrep,jq,find, giống như một lập trình viên thực thụ- Đây là phương án thay thế cho các khả năng thất bại ẩn xuất phát từ cấu hình RAG phức tạp (ví dụ: hàm tương đồng, re-ranker, chunking)
- Vì LLM trực tiếp khám phá và hiểu ngữ cảnh mã thật, số lượng thành phần chuyển động được giảm xuống, đồng thời còn có thể kỳ vọng hiệu quả tốt hơn trong huấn luyện RL
Thiết kế công cụ (tool) và cấu trúc phân tầng
- CC hỗ trợ đầy đủ các công cụ mức thấp (Bash, Read, Write), mức trung bình (Edit, Grep, Glob), và mức cao (Task, WebFetch, v.v.)
- Các công cụ cần thiết được tách riêng dựa trên tần suất sử dụng, độ chính xác...
- Mô tả, ví dụ, thời điểm sử dụng của từng tool được nêu rõ trong prompt hệ thống
- Công việc phức tạp được quản lý nhất quán thông qua
Taskhoặc các tool cấp cao
Quản lý Todo tường minh để tránh mất ngữ cảnh
- Để giải quyết vấn đề điển hình của LLM agent chạy dài hạn (mất ngữ cảnh, lạc hướng), CC quản lý trạng thái bằng danh sách Todo được duy trì trực tiếp
- Thay vì hệ thống multi-agent, mô hình tự chủ cập nhật Todo để vừa giữ được định hướng công việc vừa đảm bảo tính linh hoạt
Kiểm soát tone, style và mức độ thân thiện của agent
- Tone, style, mức độ chủ động... được quản lý ở các section riêng
- Thiết kế trải nghiệm người dùng nhất quán với các quy tắc như hạn chế giải thích không cần thiết, chỉ cho phép emoji khi được yêu cầu rõ ràng
- Dùng các từ nhấn mạnh mạnh như “IMPORTANT”, “NEVER”, “ALWAYS” để truyền đạt điểm cần chú ý
Thiết kế thuật toán phán đoán và luồng xử lý
- Các thuật toán chính mà LLM phải tuân theo được mô tả rõ ràng và minh họa bằng ví dụ
- So với việc chỉ liệt kê Do/Don't, lưu đồ và checklist theo từng bước hiệu quả hơn trong việc giữ ổn định thuật toán
- Cũng tính đến khả năng xung đột giữa nhiều chỉ dẫn và ví dụ, nên phạm vi vai trò và chính sách được nêu rõ một cách có cấu trúc
Mẫu thiết kế và mẹo áp dụng thực chiến
- Những quan điểm mạnh mẽ và cấu trúc này hoàn toàn có thể được lấy làm chuẩn tham chiếu ngay khi thiết kế agent riêng
- Thay vì lạm dụng framework khiến mọi thứ rối rắm, điều quan trọng là thiết kế cấu trúc đơn giản nhưng hiệu quả
- Trên thực tế, MinusX cũng đang áp dụng nhiều nguyên tắc này và có kế hoạch mở rộng dần
Kết luận
- Bài học lớn nhất từ Claude Code: “Sự đơn giản là sức mạnh lớn nhất”
- Độ rõ ràng về cấu trúc, thiết kế prompt có ý nghĩa, và tổ hợp công cụ gọn nhẹ là nền tảng tạo nên một LLM agent mạnh mẽ
- Khi phát triển LLM agent của riêng mình, rất đáng để tham khảo tích cực triết lý thiết kế và các hướng dẫn của CC
2 bình luận
Tuyệt quá, hạnh phúc ghê, đỉnh nhất luôn, ngọt ngào quá, muốn tiếp tục mãi
Ý kiến trên Hacker News
Tôi tin rằng sự đơn giản kiểu KISS luôn chiến thắng, và thấy bài viết này rất hữu ích vì đã hệ thống lại điều đó rất tốt
Hơi tiếc vì Claude Code không phải mã nguồn mở, nhưng cũng có giới thiệu một số công cụ giúp hiểu rõ hơn cách nó hoạt động; nếu thực sự muốn biết nó vận hành ra sao thì nên thử Claude Trace
https://github.com/badlogic/lemmy/tree/main/apps/claude-trace
Công cụ này tạo ra một tệp JSON hiển thị mọi công cụ và prompt đã dùng trong phiên, cùng một tệp HTML được định dạng dễ xem
https://github.com/All-Hands-AI/OpenHands?tab=readme-ov-file
Cũng có thể xem cả system prompt
Có vẻ mô hình được huấn luyện để mặc định chia công việc thành nhiều bước và kiên nhẫn giải quyết, nên cũng khá vững trước các trường hợp thất bại
Có ý kiến cho rằng bài này hữu ích vì cho thấy một tổ chức lấy LLM làm trung tâm tiếp cận vấn đề ra sao trong thời điểm các hệ thống đa tác tử đang được chú ý; bản thân người đó cũng đang thử nhiều góc nhìn thiết kế khác nhau trong công việc hằng ngày nên thấy khá đồng cảm
Các insight chính là
(1) Prompt dài cũng không sao, và nhất định phải đưa vào phần mô tả cơ bản như mục đích của công cụ hay cách nó hỗ trợ
(2) Gọi tool chỉ là phần rất sơ khai nên cần phản ánh nhiều ngữ cảnh hơn nữa, chẳng hạn khi nào nên dùng và khi nào không nên dùng
(3) Quản lý trạng thái hệ thống dưới dạng message là ổn; từng nghĩ đến các cách cầu kỳ hơn như lưu dataframe hay parse biến, nhưng nếu context window đủ dài thì chỉ dùng message cũng đã đủ
Cũng đã thử các mô hình như OpenAI, Google Gemini, nhưng cảm giác không tốt bằng các mô hình của Anthropic và còn chậm hơn; prompt càng dài thì càng hay quên tool hoặc trả kết quả sai định dạng
Rõ ràng và đơn giản là ưu tiên cao nhất
Có người hỏi Google Gemini, đặc biệt là bản Pro, so với Claude ra sao; họ thích nhiều sản phẩm của Google nhưng lo về việc Google hay khai tử sản phẩm, cách kiểm soát doanh nghiệp như với Chrome, và cả vấn đề kiểm duyệt
Chiến lược riêng của người này là dùng Gemini để tạo tóm tắt dự án và kế hoạch thiết kế cấp cao, sau đó dùng gpt5 để tinh chỉnh và thiết kế workflow chi tiết hơn, ví dụ tài liệu XML, rồi chuyển lại cho Claude; chỉ vậy thôi cũng gần như tránh được cảnh Claude loay hoay mất phương hướng
https://www.tbench.ai/leaderboard
Có người cho rằng bản thân model nền tảng rất mạnh với công việc lập trình thực tế nên người dùng mới đánh giá cao như vậy, khác với các bài toán benchmark thông thường; chỉ cần dùng GitHub Copilot cũng thấy Claude vượt trội rõ rệt so với các model của OpenAI hay Google, khoảng cách lớn đến mức các model khác gần như trở nên vô dụng trong thực tế
Có người đang dùng Claude Code để debug vấn đề liên quan Elastic trên Security Onion, nhưng cứ vài phút là nó bắt đầu tuôn ra những đoạn JS khó hiểu rồi báo lỗi “Error: kill EPERM”
Nhìn log thì có vẻ nó giết tiến trình Node.js nên có thể khiến chính Claude cũng chết theo, hoặc như thể không giải được bài toán nên tự thoát luôn
Dù sao thì nếu tiến trình còn sống được lâu hơn một chút, có lẽ nó đã giúp thêm được nhiều hơn
Người này nghĩ rằng trong tương lai, các ngôn ngữ, nền tảng và kiến trúc mà LLM hiểu rõ nhất sẽ dần chiếm ưu thế; ví dụ nếu LLM xử lý nodejs tốt hơn gấp 10 lần thì ngay từ đầu chọn nodejs thay vì Elixir hay Go cũng là điều hợp lý, và cả lập trình viên junior cũng có thể làm việc như mid-level hoặc senior nhờ LLM hỗ trợ
sudođể chạy tiến trình với quyền superuserCó người nói họ đã xây toàn bộ MVP đầu tiên của startup bằng Claude Code và hiện đã có cả khách hàng trả tiền; tất nhiên vẫn có nỗi lo nền tảng rằng chỉ cần xảy ra một sự cố SEV là mọi thứ có thể sụp đổ rất nhanh, nhưng họ vẫn tiếp tục tích cực dùng Claude cho việc vá lỗ hổng bảo mật, phát triển hướng kiểm thử và thiết kế kiến trúc phần mềm theo lộ trình dài hạn
Họ hy vọng những câu chuyện như vậy sẽ ngày càng trở nên phổ biến
Có ý kiến rằng nếu luận điểm “Keep things simple” là đúng thì cách làm này lại có vẻ hơi phức tạp
Người đó từ trước đến nay vẫn làm được khá nhiều việc chỉ bằng cách đơn giản là mỗi lần đưa ra một prompt hỏi đúng thứ mình cần
Họ chưa thật sự tin những cấu trúc phức tạp được bàn tới mang lại thêm giá trị gì so với một prompt được viết cẩn thận
Ví dụ với kiểu câu hỏi như "cách tạo vòng lặp while trong một ngôn ngữ mới học" thì một câu prompt ngắn có khi lại hiệu quả hơn
Luồng điều khiển còn khiến họ thấy mơ hồ hơn, và cũng nghi ngờ liệu LLM có thực sự tận dụng tốt phần appendix như tool hay system prompt hay không; nếu yêu cầu quá phức tạp thì có thể một phần sẽ bị bỏ qua hoặc chỉ tốn token
Với họ, cách lập trình bằng cách ném từng prompt riêng lẻ theo từng mảnh thấy tự nhiên hơn nhiều
Họ muốn xem thử các ví dụ hay prompt từ những người dùng cách khác
Cũng tò mò trong thực tế mọi người xây cả một chương trình với LLM như thế nào, và muốn tìm các ví dụ chia nhỏ theo từng prompt để tham khảo
Nhân tiện, ở cuối bài có link minusx.com nhưng chứng chỉ bảo mật của trang đã hết hạn từ 553 ngày trước, nên trang không còn hợp lệ và cần cẩn thận khi truy cập