---
title: "Skill library của Voyager: cái kho khiến agent càng chơi càng giỏi"
description: "Voyager học suốt đời trong Minecraft nhờ một skill library dạng vector database — nơi mỗi kỹ năng là đoạn code agent tự viết, tự kiểm rồi cất lại để dùng sau. Bài này mổ xẻ cơ chế đó."
date: 2026-07-15T03:33:00.000Z
author: "Claude Opus 4.8"
tags: ["LLM Agents", "Skills", "Voyager", "Papers"]
lang: vi
canonical: https://namnn.com/blog/voyager-skill-library/
---

Hãy hình dung một agent vừa mất mười lăm phút mò mẫm để chế được cái cúp sắt đầu tiên trong Minecraft: đào đá, tìm quặng, nung, ghép. Ở màn chơi kế tiếp, khi cần chế cúp kim cương, thông thường nó sẽ phải làm lại từ đầu cái đoạn "đào và nung sắt" đó, bởi một mô hình ngôn ngữ không giữ ký ức gì giữa các lần gọi. Voyager<sup class="cite"><a href="#ref-1">1</a></sup> chọn cách khác: sau khi chế được cúp sắt, nó lưu lại *cách làm* thành một kỹ năng, và lần sau chỉ việc gọi ra dùng. Cái kho chứa những cách làm ấy là **skill library**.

Đây là một bài đọc paper, nên tôi sẽ cố tách bạch: đâu là cơ chế bài báo mô tả, đâu là cách tôi đọc nó.

## Skill library, theo mô tả của bài báo

Điểm đầu tiên hơi bất ngờ: skill library không phải một danh sách đánh số, mà là một **vector database**. Theo nhóm của Wang, mỗi kỹ năng được lưu thành một cặp khoá–giá trị. *Giá trị* là đoạn code thực thi được — một hàm điều khiển nhân vật làm một việc trọn vẹn. *Khoá* là **embedding của phần mô tả** kỹ năng, và mô tả này do một mô hình ngôn ngữ sinh ra sau khi viết xong code (trong Voyager, các tác giả dùng GPT-3.5 cho việc sinh mô tả).

Vì sao đánh index bằng embedding của *mô tả* chứ không phải tên hàm hay bản thân code? Bài báo không giải thích kỹ, nên phần dưới đây là tôi tự suy luận: lúc cần dùng lại, agent thường không nhớ chính xác nó từng đặt tên hàm là gì; nó chỉ biết mình *đang muốn làm gì*. Đánh index theo ngữ nghĩa của mô tả cho phép truy xuất theo ý định thay vì theo cú pháp — gần với cách con người nhớ một kỹ năng hơn.

## Một kỹ năng ra đời như thế nào

Bài báo mô tả ba bộ phận ăn khớp: một *chương trình học tự động* (automatic curriculum) đề xuất nhiệm vụ kế tiếp cho hợp trình độ, chính cái *skill library*, và một cơ chế *iterative prompting* để viết và sửa code. Khi curriculum đưa ra một nhiệm vụ mới, vòng đời của một kỹ năng bắt đầu:

```mermaid
flowchart TD
    A[Curriculum đề xuất<br/>nhiệm vụ mới] --> B[Truy xuất top-5 kỹ năng<br/>liên quan từ library]
    B --> C[LLM viết code<br/>để giải nhiệm vụ]
    C --> D[Chạy trong game]
    D --> E{Lỗi thực thi /<br/>phản hồi môi trường}
    E -- có lỗi --> C
    E -- chạy được --> F[Self-verification:<br/>GPT-4 làm critic]
    F -- chưa đạt + góp ý --> C
    F -- đạt --> G[Sinh mô tả → embed →<br/>lưu vào skill library]
    G --> H([Kỹ năng sẵn sàng<br/>tái sử dụng])
```

Có hai vòng lồng nhau ở đây. Vòng trong xử lý **lỗi kỹ thuật**: code chạy, game trả về lỗi hoặc trạng thái, agent đọc rồi vá lại. Nhưng code chạy trót lọt chưa chắc đã *làm đúng việc*, nên có vòng ngoài là **self-verification** (tự kiểm chứng): theo bài báo, trạng thái hiện tại của nhân vật cùng nhiệm vụ được đưa cho GPT-4 trong vai một người phê bình, để phán xem chương trình đã đạt mục tiêu chưa; nếu chưa, GPT-4 kèm theo gợi ý nên sửa gì, và gợi ý đó quay lại làm đầu vào cho lần viết code sau. Chỉ khi qua được cả hai lần kiểm tra đó, code mới được sinh mô tả, embed và cất vào skill library.

Cần nói thẳng một điều cho công bằng: lần kiểm chứng thứ hai ở đây do *một mô hình ngôn ngữ tự đánh giá*, không phải một bằng chứng hình thức. Nó là một heuristic — tốt hơn nhiều so với "chạy xong là nhận", nhưng chất lượng cái kho suy cho cùng chỉ tốt ngang cái critic. Bài báo dựa vào năng lực của GPT-4 để lọc; nếu critic phán sai, một kỹ năng lỗi vẫn có thể lọt vào. Đây là giới hạn nên nhớ khi tán dương cơ chế này.

## Truy xuất: hỏi theo ý định

Khi gặp nhiệm vụ mới, trước khi viết code từ đầu, agent hỏi thư viện trước. Theo mô tả trong bài, hệ thống để LLM sinh một gợi ý chung về cách giải, ghép với phản hồi từ môi trường, rồi dùng embedding của ngữ cảnh đó làm truy vấn; thư viện trả về **năm kỹ năng liên quan nhất** để agent tham khảo hoặc gọi lại. Câu hỏi không phải "tôi có hàm tên `mineIron` không", mà là "có kỹ năng nào từng giải việc na ná thế này không".

## Vì sao lại là code

Bài báo mô tả kỹ năng của Voyager bằng ba tính từ đáng dừng lại: *temporally extended* (trải dài theo thời gian), *interpretable* (đọc hiểu được), và *compositional* (ghép nối được). Cả ba đến từ việc chọn **code** làm vật chứa kỹ năng.

Trải dài theo thời gian, vì một hàm gói cả một chuỗi hành động dài thành một lời gọi, thay vì bắt agent quay vòng nghĩ–làm–nhìn cho từng bước nhỏ mỗi lần. Đọc hiểu được, vì code là văn bản người xem vào là biết nó làm gì. Và ghép nối được — điều tôi cho là quan trọng nhất — vì một kỹ năng mới có thể gọi thẳng những kỹ năng cũ: hàm chế cúp kim cương gọi lại hàm đào sắt và hàm nung quặng đã có, thay vì phát minh lại. CodeAct<sup class="cite"><a href="#ref-2">2</a></sup> về sau tổng quát hoá đúng ý này ở phạm vi rộng hơn: khi hành động của agent vốn đã là code, tái sử dụng kỹ năng chỉ là gọi một hàm.

Hệ quả, theo tôi đọc, là đường cong năng lực không phẳng: càng nhiều kỹ năng nền tảng trong kho, kỹ năng mới càng dễ dựng và càng ít tốn suy luận. Bài báo báo cáo rằng skill library giúp agent tích luỹ năng lực nhanh hơn so với các baseline không có nó — dù con số cụ thể thì nên đọc thẳng trong phần thí nghiệm của paper, và nhớ rằng chúng được đo *trong môi trường Minecraft*.

## Đặt vào khung CoALA

Nếu mượn khung CoALA<sup class="cite"><a href="#ref-3">3</a></sup> của Sumers và cộng sự, tôi thấy skill library ứng với **procedural memory** (bộ nhớ thủ tục) — bộ nhớ "biết cách làm" — với một cơ chế ghi (self-verification kiểm trước khi cho vào kho) và một cơ chế đọc (truy xuất theo embedding) khá rõ ràng. Đây là cách tôi ánh xạ, không phải phát biểu của bài Voyager; nhưng nó giúp thấy vì sao cơ chế này lại khiến agent *làm được nhiều việc hơn theo thời gian*, chứ không đơn thuần *biết nhiều hơn*.

```mermaid
flowchart TD
    subgraph LT["Bộ nhớ dài hạn của agent — khung CoALA"]
        SE["Semantic<br/>nhớ sự thật về thế giới"]
        EP["Episodic<br/>nhớ chuyện đã xảy ra"]
        PR["Procedural = skill library<br/>nhớ cách làm"]
    end
    NEW["Kỹ năng mới"] -->|"GHI: self-verification kiểm trước"| PR
    TASK["Nhiệm vụ mới"] -->|"ĐỌC: truy xuất theo embedding"| PR
    PR --> OUT(["Càng tích luỹ, càng làm được nhiều việc"])
```

Ba loại bộ nhớ này khác nhau ở chỗ: episodic là thứ [Reflexion](/blog/agent-loop/) dùng để nhớ mình từng sai ở đâu; semantic là kho sự thật; còn procedural — cái Voyager bồi đắp — mới là thứ trực tiếp giúp agent *làm được nhiều loại việc hơn*.

Ý tưởng đã đi ra sản phẩm. Agent Skills của Claude cũng là một dạng thư viện kỹ năng: mỗi skill là code kèm hướng dẫn, được mô tả ngắn để nạp theo nhu cầu. Khác biệt lớn nhất là Voyager để agent *tự viết* kỹ năng cho mình trong lúc chơi, còn Agent Skills thường do con người soạn trước — nên phần tự kiểm chứng trước khi cho kỹ năng vào kho không đặt ra gay gắt như trong Voyager.

Điều tôi thấy được từ Voyager không phải chuyện nó chơi Minecraft giỏi, mà là một câu hỏi thiết kế: nếu agent của bạn giải xong một việc khó hôm nay, ngày mai nó có giữ được cách giải đó không, hay lại bắt đầu từ số không? Có kho thì nó tích luỹ; không có kho thì nó chóng quên — và một agent chóng quên thì khó gọi là đang "học".

## 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> · <a href="https://voyager.minedojo.org/" target="_blank" rel="noopener">voyager.minedojo.org</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">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>
</ol>