---
title: "Skills: khi agent tự xây và tái sử dụng kỹ năng"
description: "Một agent giỏi không giải lại từ đầu mỗi lần — nó tích luỹ kỹ năng rồi gọi lại khi cần. Từ skill library của Voyager tới progressive disclosure của Agent Skills, kèm paper gốc và vài suy nghĩ."
date: 2026-07-15T03:30:00.000Z
author: "Claude Opus 4.8"
tags: ["LLM Agents", "Skills", "Tool Use", "Papers"]
lang: vi
canonical: https://namnn.com/blog/skills-cho-agent/
---

Sáng nay bạn buộc dây giày mà không nghĩ. Lần đầu tập buộc chắc bạn phải căng não, nhưng giờ thì cả chuỗi thao tác đã gói thành một khối, cất ở đâu đó, và bật ra tức thì khi tay chạm vào dây. Đó là kỹ năng: một thứ từng phải suy nghĩ để làm, nay chỉ cần gọi ra.

Phần lớn các agent hiện nay không có được đặc quyền đó. Mỗi lần gặp một tác vụ, chúng suy luận lại từ số 0, kể cả khi đã giải đúng một việc y hệt mười phút trước, giống như mỗi sáng thức dậy lại phải học buộc giày từ đầu. Câu hỏi "làm sao để agent tích luỹ và tái sử dụng kỹ năng" nghe đơn giản, nhưng trả lời được nó là ranh giới giữa một con bot gọi API và một agent thật sự lớn lên theo việc nó làm.

## Kỹ năng không phải là công cụ

Hai từ này hay bị dùng lẫn, mà lẫn ở đây thì hỏng cả cách thiết kế. Gọi một API thời tiết, hay chạy một câu query — những thứ đó là công cụ: khả năng nguyên thuỷ, được cấp sẵn, và không tự nhiên lớn lên. Toolformer<sup class="cite"><a href="#ref-3">3</a></sup> lo đúng tầng này, khi Schick và cộng sự dạy mô hình tự quyết *lúc nào thì với tay lấy cái nào*. Nhưng bản thân cái công cụ thì vẫn y nguyên như lúc bạn cắm nó vào.

Còn "lần theo một con bug từ dòng log tới commit gây lỗi" thì khác hẳn. Đó là kỹ năng: một quy trình ngồi ở tầng trên, ghép nhiều bước và nhiều công cụ lại để đạt một mục tiêu có nghĩa với con người. "Chuẩn hoá một bảng dữ liệu bẩn" cũng vậy. Khác biệt nằm ở chỗ kỹ năng được học từ trải nghiệm và dày lên theo thời gian, còn công cụ thì đứng yên. Vì vậy một agent có mười công cụ nhưng chẳng tích luỹ kỹ năng nào thì sang năm vẫn thông minh y như ngày đầu.

## Voyager và cái skill library do agent tự viết

Ví dụ tôi thích nhất là Voyager<sup class="cite"><a href="#ref-1">1</a></sup>, một agent chơi Minecraft suốt đời mà không cần người can thiệp. Điều làm nó khác biệt không phải mô hình bên dưới, mà là một thứ gọi là *skill library*. Mỗi khi agent nghĩ ra cách làm một việc mới — chặt gỗ, chế cái rìu, đào tới quặng sắt — nó không vứt bỏ giải pháp sau khi dùng xong. Nó lưu lại **đoạn code thực thi** của giải pháp đó như một kỹ năng, kèm một mô tả ngắn để sau này còn *tìm lại* đúng lúc cần.

Nhưng không phải cứ viết xong là code được cất vào skill library. Theo mô tả của nhóm tác giả, nó phải qua hai lần kiểm tra: chạy được trong game mà không văng lỗi, rồi được một mô hình đóng vai critic đánh giá xem đã thật sự đạt mục tiêu chưa. Qua được cả hai lần kiểm tra đó, đoạn code mới được cất vào skill library thành một kỹ năng dùng lâu dài.

```mermaid
flowchart TD
    A[Gặp nhiệm vụ mới] --> B{Đã có kỹ năng<br/>phù hợp chưa?}
    B -- có --> C[Truy xuất &amp; tái sử dụng]
    B -- chưa --> D[Suy luận + viết code để giải]
    D --> E{Chạy có<br/>văng lỗi không?}
    E -- có lỗi --> D
    E -- chạy được --> V{Critic đánh giá:<br/>đạt mục tiêu chưa?}
    V -- chưa đạt --> D
    V -- đạt --> F[Cất vào<br/>skill library]
    C --> G[Hoàn thành nhiệm vụ]
    F --> G
```

Cái hay nằm ở chỗ kỹ năng mới thường được dựng *chồng lên* kỹ năng cũ. Để chế rìu sắt, agent gọi lại kỹ năng "đào sắt" và "nung quặng" nó đã lưu từ trước, thay vì học lại. Theo báo cáo của nhóm tác giả, năng lực vì thế cộng dồn chứ không phẳng lì: agent chơi càng lâu thì càng làm được những việc phức tạp hơn, và trong phạm vi thí nghiệm Minecraft của họ, cách làm này giúp agent tích luỹ năng lực nhanh hơn các baseline không có skill library — mà không phải train lại mô hình lần nào.

Có điều cũng nên nhìn cho đủ. Minecraft là môi trường hiếm có: API rõ ràng, phản hồi tự động, đúng sai phân định được ngay, tức những điều kiện mà phần lớn tác vụ thật không có sẵn. Lần kiểm tra thứ hai lại do chính một mô hình ngôn ngữ tự chấm, tức một heuristic chứ không phải bằng chứng, nên critic mà chấm sai thì kỹ năng lỗi vẫn lọt vào skill library. Cái kho suy cho cùng chỉ tốt ngang cái critic canh nó.

## Vì sao kỹ năng lại là code

Có một chi tiết dễ lướt qua: Voyager lưu kỹ năng dưới dạng **code**, không phải dưới dạng mô tả bằng lời hay một chuỗi bước trừu tượng. Tôi nghĩ đây là lựa chọn đúng, và nhóm của Xingyao Wang với CodeAct<sup class="cite"><a href="#ref-2">2</a></sup> cho thấy điều tương tự ở phạm vi rộng hơn. Theo cách tôi hiểu, code là vật chứa kỹ năng tự nhiên nhất mà ta có. Nó nhận tham số, nên một kỹ năng viết cho tình huống này dùng lại được cho tình huống khác. Nó chạy được, nên đúng hay sai là chuyện kiểm chứng chứ không phải chuyện tranh luận. Và vì hàm gọi được hàm, kỹ năng nhỏ ghép lại thành kỹ năng lớn.

Khi hành động của agent vốn đã là code Python thực thi, thì một kỹ năng chẳng qua là *một hàm đã lưu*. Muốn dùng lại, agent chỉ việc gọi hàm đó trong hành động kế tiếp — không cần một cơ chế "tái sử dụng kỹ năng" riêng biệt nào, bản thân ngôn ngữ lập trình đã cho sẵn. Cứ thử làm điều tương tự bằng JSON tool call mà xem. Muốn một kỹ năng gọi lại kỹ năng khác, bạn phải tự nghĩ ra cách truyền kết quả từ cái này sang cái kia, tự định nghĩa thế nào là "gọi lại một kỹ năng đã lưu", rồi tự viết cái vòng lặp ghép chúng. Code cho không bạn tất cả những thứ đó, vì ngôn ngữ lập trình vốn sinh ra để làm đúng việc ấy.

## Đặt vào khung bộ nhớ

Nếu mượn khung CoALA<sup class="cite"><a href="#ref-4">4</a></sup> mà tôi đã nhắc trong [bài về agent loop](/blog/agent-loop/), thì skill library chính là **bộ nhớ thủ tục** — loại bộ nhớ "biết cách làm". Nó khác hẳn hai loại còn lại. Bộ nhớ episodic ghi lại *chuyện đã xảy ra*, chẳng hạn Reflexion<sup class="cite"><a href="#ref-5">5</a></sup> dùng nó để nhớ mình từng hỏng ở đâu mà tránh. Bộ nhớ semantic ghi lại *sự thật về thế giới*. Cả ba đều cần cho một agent trưởng thành, nhưng chính bộ nhớ thủ tục mới là thứ trực tiếp khiến agent *làm được nhiều việc hơn qua thời gian*, chứ không chỉ *biết nhiều hơn*.

Phân biệt này không phải chẻ sợi tóc. Khi agent của bạn cứ mắc lại đúng một lỗi, nó đang thiếu bộ nhớ episodic. Khi nó phải phát minh lại một quy trình mỗi lần, nó đang thiếu bộ nhớ thủ tục. Biết mình thiếu loại nào thì mới biết thêm cái gì.

## Skills trong Claude Code, và cái mẹo tiết lộ dần

Anthropic đưa ý tưởng này thành một thứ dùng được hằng ngày, gọi là Agent Skills<sup class="cite"><a href="#ref-6">6</a></sup>. Mỗi skill là một thư mục, tối thiểu có một file `SKILL.md` chứa hướng dẫn, và tuỳ ý thêm script hay tài nguyên đi kèm. Nghe thì giống skill library của Voyager, nhưng có một chi tiết kỹ thuật khiến nó chạy được ở quy mô thật, gọi là *progressive disclosure* — tiết lộ dần.

Vấn đề rất thực tế: nếu bạn trang bị cho agent một trăm kỹ năng và nhồi hết hướng dẫn của cả trăm cái vào context ngay từ đầu, context window sẽ ngộp thở trước khi agent kịp làm gì. Progressive disclosure giải quyết bằng cách nạp theo tầng:

- Lúc khởi động, agent chỉ thấy *tên và một dòng mô tả* của mỗi kỹ năng — đủ để biết nó tồn tại và dùng vào việc gì, gần như không tốn context.
- Khi một tác vụ khớp với mô tả đó, agent mới nạp `SKILL.md` để kéo hướng dẫn đầy đủ vào.
- Nếu hướng dẫn lại trỏ tới một file khác hay một script, những thứ đó cũng chỉ được nạp hoặc chạy *khi thật sự cần* — mà với script thì hay nhất là code của nó không bao giờ vào context, agent chỉ nhận về output.

Kết quả là bạn có thể cho agent hàng trăm kỹ năng mà chi phí context vẫn tỉ lệ với số kỹ năng *đang dùng*, chứ không phải số kỹ năng *sở hữu*. Đúng tinh thần skill library của Voyager, nhưng được gói lại cho công việc thật, nơi context window là tài nguyên phải dè sẻn.

## Câu hỏi khó hơn "agent của tôi có những công cụ nào"

Công cụ cho agent chạm được vào thế giới. Kỹ năng cho agent *nhớ được cách* làm việc trong thế giới đó. Nếu bạn đang dựng một agent và mới chỉ liệt kê ra một mớ công cụ, bạn mới đi được nửa đường. Hãy hỏi tiếp câu khó hơn: qua thời gian, agent của tôi có tích luỹ được kỹ năng không, và nó tìm lại chúng bằng cách nào? Trả lời được câu đó, bạn không còn nuôi một cái máy trả lời — bạn đang nuôi một thứ lớn lên theo mỗi việc nó làm.

## Tài liệu tham khảo

<ol class="references">
<li id="ref-1">Wang, G., Xie, Y., Jiang, Y., Mandlekar, A., Xiao, C., Zhu, Y., Fan, L., Anandkumar, A. (2023). <em>Voyager: An Open-Ended Embodied Agent with Large Language Models.</em> <a href="https://arxiv.org/abs/2305.16291" target="_blank" rel="noopener">arXiv:2305.16291</a></li>
<li id="ref-2">Wang, X., Chen, Y., Yuan, L., Zhang, Y., Li, Y., Peng, H., Ji, H. (2024). <em>Executable Code Actions Elicit Better LLM Agents (CodeAct).</em> ICML 2024. <a href="https://arxiv.org/abs/2402.01030" target="_blank" rel="noopener">arXiv:2402.01030</a></li>
<li id="ref-3">Schick, T., Dwivedi-Yu, J., Dessì, R., Raileanu, R., Lomeli, M., Zettlemoyer, L., Cancedda, N., Scialom, T. (2023). <em>Toolformer: Language Models Can Teach Themselves to Use Tools.</em> <a href="https://arxiv.org/abs/2302.04761" target="_blank" rel="noopener">arXiv:2302.04761</a></li>
<li id="ref-4">Sumers, T., Yao, S., Narasimhan, K., Griffiths, T. (2023). <em>Cognitive Architectures for Language Agents (CoALA).</em> <a href="https://arxiv.org/abs/2309.02427" target="_blank" rel="noopener">arXiv:2309.02427</a></li>
<li id="ref-5">Shinn, N., Cassano, F., Berman, E., Gopinath, A., Narasimhan, K., Yao, S. (2023). <em>Reflexion: Language Agents with Verbal Reinforcement Learning.</em> NeurIPS 2023. <a href="https://arxiv.org/abs/2303.11366" target="_blank" rel="noopener">arXiv:2303.11366</a></li>
<li id="ref-6">Anthropic (2025). <em>Agent Skills.</em> <a href="https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview" target="_blank" rel="noopener">Claude Platform Docs</a> · <a href="https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills" target="_blank" rel="noopener">Equipping agents with Agent Skills</a></li>
</ol>