- Quá trình xây dựng agent vẫn phức tạp, và các lớp trừu tượng của SDK thường bị phá vỡ ở giai đoạn sử dụng công cụ thực tế
- Quản lý cache khác nhau giữa các nền tảng, nên quản lý thủ công có tính dự đoán và hiệu quả hơn; cách dùng điểm cache tường minh của Anthropic SDK được ưa chuộng
- Vòng lặp tăng cường (reinforcement loop) đóng vai trò then chốt trong theo dõi trạng thái công việc và khôi phục sau thất bại; cần cô lập lỗi riêng để tránh làm vòng lặp sụp đổ
- Quản lý trạng thái dùng chung cần một cấu trúc phân cấp giống hệ thống tệp, được dùng làm nền tảng trao đổi dữ liệu giữa các công cụ thực thi mã và suy luận
- Công cụ đầu ra và lựa chọn mô hình vẫn đầy khó khăn; các mô hình Haiku, Sonnet và Gemini tiếp tục là những lựa chọn chính, cho thấy độ phức tạp của thiết kế agent vẫn còn nguyên
Lựa chọn SDK cho agent
- Khi xây dựng agent, cần chọn giữa việc dùng trực tiếp SDK gốc như OpenAI, Anthropic hay dùng lớp trừu tượng cấp cao như Vercel AI SDK hoặc Pydantic
- Tác giả cho biết trước đây từng chỉ dùng provider abstraction của Vercel AI SDK, nhưng hiện tại sẽ không lặp lại lựa chọn đó
- Khác biệt giữa các mô hình quá lớn, nên cần tự xây dựng lớp trừu tượng agent, và lớp trừu tượng của các SDK hiện có không phù hợp
- Có những khác biệt tinh vi ở kiểm soát cache, yêu cầu reinforcement, prompt công cụ, v.v.
- Vercel SDK gặp vấn đề ở xử lý công cụ phía provider
- Có trường hợp công cụ tìm kiếm web của Anthropic làm hỏng lịch sử tin nhắn
- Khi dùng trực tiếp Anthropic SDK, việc quản lý cache và thông báo lỗi rõ ràng hơn
- Kết luận là hiện tại cách tiếp cận dùng trực tiếp SDK mà không qua lớp trừu tượng được đánh giá có lợi hơn
Bài học về quản lý cache
- Cách tiếp cận cache khác nhau theo từng nền tảng; Anthropic tính phí cho cache và yêu cầu quản lý tường minh
- Quản lý thủ công được ưa chuộng vì giúp chi phí và mức độ tận dụng cache dễ dự đoán hơn
- Cache tường minh cho phép thực thi phân nhánh hội thoại hoặc chỉnh sửa ngữ cảnh
- Có thể đặt nhiều điểm cache sau system prompt, ở phần đầu hội thoại, v.v.
- Để duy trì cache, system prompt và lựa chọn công cụ phải tĩnh; thông tin động như thời gian được truyền trong các tin nhắn phía sau
- Tận dụng mạnh vòng lặp reinforcement cùng với cache để tăng khả năng dự đoán chi phí và quyền kiểm soát
Reinforcement bên trong vòng lặp agent
- Khi thực thi công cụ, ngoài việc trả về kết quả đơn thuần còn có thể bơm lại vào vòng lặp các thông tin như mục tiêu, trạng thái công việc, nguyên nhân thất bại
- Các công cụ tự tăng cường (self-reinforcement) như công cụ todo write của Claude Code giúp vòng lặp tiến triển tốt hơn
- Khi môi trường thay đổi hoặc đến lúc khôi phục sau lỗi, có thể chèn thông tin thay đổi trạng thái để đảm bảo độ ổn định của vòng lặp
- Ví dụ: khi thử lại dựa trên dữ liệu đã hỏng, có thể chèn thông điệp để quay lại bước trước đó
Cô lập lỗi (Isolate Failures)
- Những tác vụ được dự đoán sẽ thất bại lặp đi lặp lại nên được tách ra chạy bằng subagent; chỉ báo cáo kết quả thành công về vòng lặp cấp trên
- Tóm tắt các lần thử thất bại có thể dùng làm tư liệu học cho tác vụ tiếp theo
- Trong Anthropic SDK, có thể dùng tính năng chỉnh sửa ngữ cảnh (context editing) để loại bỏ bản ghi thất bại
- Không giữ lại toàn bộ thông tin lỗi mà chỉ để lại phần cần thiết
- Tuy nhiên, chỉnh sửa ngữ cảnh có thể làm mất hiệu lực cache và khiến chi phí tăng lên
Subagent và hệ thống tệp dùng chung
- Phần lớn agent hoạt động theo kiểu thực thi mã và tạo sinh, nên cần một kho dữ liệu dùng chung
- Để làm điều này, người ta dùng hệ thống tệp ảo (VFS)
- Các công cụ khác nhau như tạo ảnh, nén, suy luận phải chia sẻ cùng đường dẫn tệp
- Các công cụ
ExecuteCode và RunInference phải có thể truy cập cùng một hệ thống tệp
- Cấu trúc này là yếu tố thiết yếu để loại bỏ nút thắt trao đổi dữ liệu và xử lý các tác vụ liên tiếp trong vòng lặp
Công cụ đầu ra (Output Tool)
- Agent không hoạt động như một phiên chat mà theo vòng lặp tin nhắn nội bộ riêng tư; việc giao tiếp với bên ngoài được thực hiện qua công cụ đầu ra
- Công cụ đầu ra phụ trách giao tiếp bên ngoài như gửi email
- Khó kiểm soát giọng điệu và văn phong của công cụ đầu ra; khi dùng LLM phụ trợ (Gemini 2.5 Flash), chất lượng giảm và độ trễ tăng
- Công cụ cấp dưới không có đủ ngữ cảnh nên tạo ra kết quả thiếu chính xác
- Nếu khi kết thúc vòng lặp mà công cụ đầu ra chưa được gọi, có thể chèn thông điệp reinforcement để thúc đẩy việc gọi công cụ này
Lựa chọn mô hình
- Haiku và Sonnet có hiệu năng gọi công cụ tốt nên được dùng làm mô hình chính cho vòng lặp
- Gemini 2.5 phù hợp để tóm tắt tài liệu lớn, xử lý PDF và trích xuất thông tin từ hình ảnh
- Mô hình Sonnet có nhược điểm là thường xuyên vướng bộ lọc an toàn
- Các mô hình dòng GPT không cho thấy nhiều kết quả nổi bật trong vòng lặp chính
- Không thể đánh giá tổng chi phí chỉ bằng chi phí token
- Mô hình gọi công cụ tốt hơn có thể hoàn thành cùng tác vụ với ít token hơn
Kiểm thử và đánh giá (Evals)
- Tự động hóa kiểm thử và đánh giá agent được chỉ ra là vấn đề khó nhất
- Khác với prompt, không thể chỉ đánh giá đơn giản từ hệ thống bên ngoài
- Cần khả năng quan sát (observability) hoặc đo đạc/ghi nhận (instrumentation) dựa trên dữ liệu thực thi thực tế
- Tác giả nói rằng đến nay vẫn chưa tìm được phương pháp đánh giá thực sự thỏa đáng
Cập nhật về coding agent
- Không có nhiều thay đổi lớn liên quan đến coding agent
- Gần đây tác giả đang thử nghiệm agent Amp và đánh giá cao cấu trúc tương tác giữa Oracle subagent và vòng lặp chính
- Amp và Claude Code tạo cảm giác là những thiết kế hướng tới nhà phát triển, do chính những người thực sự dùng công cụ của họ tạo ra
1 bình luận
Ý kiến trên Hacker News
Tôi đã khởi nghiệp trong lĩnh vực này khoảng 2 năm trước. Hiện công ty đang vận hành tốt
Điều tôi học được trong 2 năm qua là, nhiều kỹ thuật thực chất chỉ là tối ưu hóa tạm thời để bù đắp cho các giới hạn hiện tại của LLM. Công nghệ phát triển quá nhanh nên vấn đề của hôm nay có thể biến mất vào ngày mai
Trước đây, khi AWS chưa có tính năng mã hóa đĩa, đội của tôi đã mất 3 tháng để tự triển khai, rồi ngay sau đó AWS phát hành mã hóa tiêu chuẩn chỉ cần bấm một nút. Cuối cùng đó là một sự lãng phí thời gian
Vì vậy điều tôi rút ra là, đôi khi không làm gì mới là lựa chọn tốt nhất
Thời kỳ học pattern như một ngôn ngữ chung kiểu trước đây đã kết thúc, giờ chu kỳ bán rã của pattern AI chỉ khoảng một tuần. Thậm chí nếu hỏi 10 chuyên gia “agent” là gì thì sẽ nhận được 10 câu trả lời khác nhau
Trong 2 năm qua tôi đã dùng nhiều agent SDK, và khi tự xây thì thấy nó phức tạp hơn tưởng tượng rất nhiều
Claude Code SDK (nay là Agent SDK) rất tốt nhưng vẫn chưa tách hoàn toàn khỏi sự gắn kết với Claude Code. Ví dụ skills phải được đặt trực tiếp trên filesystem
SDK của OpenAI cho phép tự động theo dõi và đánh giá trên dashboard nhờ tích hợp chặt với nền tảng, nhưng khó tích hợp model bên thứ ba
Google Agent Kit thì vẫn chưa có SDK cho Typescript, còn Mastra thì phải dựng server nên khá bất tiện
Hiện tôi đang thử SmythOS SDK, vì nó cho phép tự do hơn trong việc chọn nhà cung cấp model và định nghĩa kiến trúc
Tôi tò mò không biết cấu trúc hiện tại đang dùng là Agent → SubAgents → SubSubAgents, hay kiểu Planner-Executor
Lượng code tăng lên nhưng mô hình tinh thần lại đơn giản nên dễ hiểu hơn nhiều. Tôi chạy vòng lặp theo kiểu ReAct, lặp lại reasoning và gọi tool
Cuối cùng thì ngay cả không có SDK bạn vẫn có thể tự triển khai agent handoff hay workflow
Tôi muốn chia sẻ vài nguyên tắc thiết kế agent mà chúng tôi đã học được
Tham khảo thêm, công ty chúng tôi là Definite, một nền tảng dữ liệu được vận hành bởi AI data engineer giống như Heroku
Tôi đã xây agent trong vài năm nay, và điều đúng đắn nhất tôi làm là tự xây framework
Nhiều lớp trừu tượng mã nguồn mở trở nên không thể duy trì khi SDK thay đổi, và cuối cùng sẽ sụp đổ
Tôi đã tạo OpusAgents dựa trên PydanticAI; nó đơn giản hơn MCP server nhưng vẫn là một framework mã nguồn mở có khả năng mở rộng
Dạo này tình hình đang lặp lại sự lạm dụng trừu tượng hóa và độ phức tạp như thời kỳ đầu của LangChain/RAG
Cuối cùng thì cứ xem agent như một cấu trúc REPL đơn giản (Read, Eval, Print, Loop) là được.
Phiên bản nhẹ tôi tự triển khai theo ý tưởng này ổn định hơn nhiều so với các SDK nặng nề
Kiểm thử và đánh giá (evals) của agent là bài toán khó nhất.
Nếu đánh giá bằng hệ thống bên ngoài thì đầu vào quá nhiều, lại còn phải quan sát dữ liệu trong lúc chạy
Tôi vẫn chưa chắc cách tiếp cận nào là hiệu quả
Ngay cả những phần cơ bản trong phát triển agent cũng thiếu guideline rõ ràng
Ví dụ trong xử lý kiểu đầu vào/đầu ra của function tool, khi truyền ID dạng số thì xảy ra lỗi tuần tự hóa hoặc mất độ chính xác
Cuối cùng tôi phải giải quyết bằng cách đổi sang string
Nếu nhìn vào tài liệu của OpenAI (liên kết) và issue của Google ADK (liên kết),
họ nói rằng “kết quả phải là string” nhưng ví dụ thực tế lại trả về dict hoặc số. Sự không nhất quán này gây ra nhầm lẫn
Tôi đang dùng sản phẩm của một công ty làm agentic coding nào đó (không nêu tên)
Họ lo hết mọi thứ như phát hành model, đánh giá, quản lý sub-agent, billing, còn tôi chỉ cần tập trung vào công việc nên rất hài lòng
Trong 2 tháng qua tôi đã triển khai nhiều agent cho các loại tác vụ khác nhau. Ban đầu tôi dùng Claude Code nhưng vì phụ thuộc vendor và giới hạn sử dụng nên đã tự tạo runtime
Hiện tại chỉ hỗ trợ OpenAI, nhưng được thiết kế để có thể thêm Claude hay Gemini sau này
Tôi đã open source nên có thể tham khảo tại đây → agent-composer
Mẹo của tôi rất đơn giản: đừng dùng SDK, hãy tự viết vòng lặp while và xử lý JSON
Chỉ khi tự kiểm soát context size và lỗi thì bạn mới tạo được agent thật sự linh hoạt