Harness Academy
Tài liệu gốc 24 15 phútTiếng Việt + English
docs/en/s21-skill-creation-loop.mdXem bản gốc
Ngôn ngữ bài đọc
Bản dịch tiếng Việt

Bản dịch đầy đủ theo đúng cấu trúc tài liệu; code, liên kết và định danh kỹ thuật được giữ nguyên.

s21: Vòng sáng tạo kỹ năng

s00 > s01 > s02 > s03 > s04 > s05 > s06 > s07 > s08 > s09 > s10 > s11 > s12 > s13 > s14 > s15 > s16 > s17 > s18 > s19 > s20 > [ s21 ] > s22 > s23 > s24 > s25 > s26 > s27

agent không chỉ thực hiện các nhiệm vụ -- nó trích xuất các mẫu từ kinh nghiệm, biến "các giải pháp dùng một lần" thành "các kỹ năng có thể sử dụng lại cho lần sau". Đây là cơ chế đặc biệt nhất khiến agent Hermes khác biệt so với các hệ thống agent khác.

Vòng sáng tạo kỹ năng

Chương này giải quyết vấn đề gì

s08 đã giới thiệu những điều cơ bản về hệ thống kỹ năng - agent có thể đọc và sử dụng các tệp kỹ năng. Nhưng những kỹ năng đó đã được con người viết ra từ trước.

Bây giờ hãy xem xét một tình huống: agent giúp bạn đặt cấu hình quy trình CI phức tạp, gặp phải ba cạm bẫy trong quá trình thực hiện, thay đổi cách tiếp cận hai lần và cuối cùng khiến nó hoạt động. Tuần tới, bạn yêu cầu người đại diện của đồng nghiệp làm điều tương tự -- nó sẽ lại gặp phải ba cạm bẫy tương tự.

Kinh nghiệm không được giữ lại. Mỗi khi cùng một vấn đề xảy ra, nhân viên phải tìm hiểu lại từ đầu.

Điều gì sẽ xảy ra nếu agent có thể tự động nhìn lại sau khi hoàn thành một nhiệm vụ: "Lần này tôi đã gặp phải những cạm bẫy nào? Những bước nào có thể khái quát hóa?" -- và sau đó viết câu trả lời vào một tệp kỹ năng được sử dụng trực tiếp vào lần tiếp theo khi có một nhiệm vụ tương tự.

Đây là vấn đề mà vòng tạo kỹ năng giải quyết: cho phép nhân viên học hỏi kinh nghiệm bằng cách biến các giải pháp một lần thành các kỹ năng có thể sử dụng lại.

Đề xuất đọc

Các khái niệm chính

Đánh giá cơ bản là gì

Sau khi tổng đài viên kết thúc cuộc trò chuyện, nó sẽ tạo một bản sao để đánh giá cuộc trò chuyện ở chế độ nền. Bản sao chạy độc lập mà không chặn câu hỏi tiếp theo của người dùng. Nó phân tích xem cuộc trò chuyện có chứa đựng trải nghiệm nào đáng lưu lại hay không -- nếu có, nó sẽ gọi skill_manage để tạo hoặc cập nhật một kỹ năng.

Vòng lặp sáng tạo kỹ năng là gì

Một chu kỳ hoàn chỉnh:

Use -> encounter a problem, figure out a solution -> background review extracts patterns -> create skill
  -> next time a similar task comes up -> load skill, use it directly -> skip the fumbling

Điều quan trọng là "lần sau" - những cạm bẫy xảy ra hôm nay sẽ không xảy ra vào ngày mai.

Skill_manage là gì

Công cụ mà agent sử dụng để tạo, chỉnh sửa và xóa các kỹ năng. Nó được đăng ký trong sổ đăng ký giống như terminal và read_filevà agent có thể gọi nó bất kỳ lúc nào trong cuộc trò chuyện.

Bắt đầu từ cách tiếp cận đơn giản nhất

Yêu cầu người dùng yêu cầu tổng đài viên "lưu giải pháp này dưới dạng kỹ năng":

User: Set up GitHub Actions CI for me
Agent: [after considerable effort, succeeds]
User: Save what you just did as a skill
Agent: Sure -> calls skill_manage(action="create", name="github-actions-ci", content="...")

Nó hoạt động. Nhưng có hai vấn đề:

Vấn đề 1: Người dùng phải nhớ nói "Save as a Skill"

Hầu hết thời gian, người dùng hoàn thành nhiệm vụ và đi tiếp mà không nhắc nhân viên tóm tắt trải nghiệm. Những kiến ​​thức quý giá bị mất đi.

Vấn đề 2: Người đại diện không biết cái gì đáng để tiết kiệm

Khi người dùng nói "lưu dưới dạng kỹ năng", nhân viên hỗ trợ sẽ loại bỏ mọi bước trong toàn bộ cuộc trò chuyện -- bao gồm cả những lượt rẽ sai và thử và sai không liên quan. Tệp kỹ năng thu được dài và lộn xộn, và thực sự gây hiểu lầm cho agent vào lần sử dụng tiếp theo.

Điều cần thiết là một cơ chế tự động: một cơ chế không phụ thuộc vào lời nhắc của người dùng và có thể xác định "trải nghiệm không tầm thường đáng được lưu giữ".

Mô hình tinh thần tối thiểu

Agent working normally...
    |
    |  Every 10 tool calls, check once
    |
    v
Trigger condition met?
    |
    Yes
    |
    v
Fork a copy (background review agent)
    |  Input: full message history from this conversation
    |  Prompt: analyze the conversation, find non-trivial, reusable patterns
    |  Limit: at most 8 tool call iterations
    |
    v
Background review agent decides:
    |
    |-- Discovers a new pattern -> skill_manage(action="create", ...)
    |-- Existing skill needs updating -> skill_manage(action="patch", ...)
    '-- Nothing worth saving -> "Nothing to save." -> exit
    |
    v
User sees notification: "Skill 'github-ci-setup' created"
    |
    v
Next conversation: the new skill appears in the available list

agent đánh giá lý lịch và agent chính hoàn toàn độc lập. Nó chạy trong một chuỗi nền mà không chặn câu hỏi tiếp theo của người dùng. Nó có thể gọi Skill_manage để viết kỹ năng nhưng không thể sửa đổi lịch sử tin nhắn của cuộc trò chuyện chính.

Logic kích hoạt đánh giá cơ bản

Không phải mọi lượt trò chuyện đều dẫn đến đánh giá. agent Hermes sử dụng bộ đếm cuộc gọi công cụ để kiểm soát việc này:

# After each tool call
self._iters_since_skill += 1

# Check when conversation ends
if self._iters_since_skill >= 10:  # Default: trigger every 10 tool calls
    spawn_background_review(messages_snapshot, review_skills=True)
    self._iters_since_skill = 0

Tại sao nên sử dụng công cụ đếm cuộc gọi thay vì lượt trò chuyện? Bởi vì các cuộc gọi công cụ đại diện cho tổng đài viên "đang thực hiện công việc" -- một cuộc trò chuyện hoàn toàn là trò chuyện thông thường không cần xem xét. Mười lệnh gọi công cụ liên tiếp cho thấy agent đang xử lý một nhiệm vụ phức tạp nào đó, đáng để xem lại.

Tần số có thể được điều chỉnh hoặc tắt trong config.yaml:

skills:
  creation_nudge_interval: 10  # Trigger every 10 tool calls. Set to 0 to disable.

Lời nhắc được gửi tới agent đánh giá lý lịch

"Review the conversation above and consider saving or updating a skill 
if appropriate.

Focus on: was a non-trivial approach used to complete a task that required 
trial and error, or changing course due to experiential findings along 
the way, or did the user expect or desire a different method or outcome?

If a relevant skill already exists, update it with what you learned. 
Otherwise, create a new skill if the approach is reusable.
If nothing is worth saving, just say 'Nothing to save.' and stop."

Thuật ngữ chính: không tầm thường, thử và sai, thay đổi hướng đi. Các điều kiện lọc này loại trừ các tác vụ đơn giản ("dịch câu này cho tôi" sẽ không kích hoạt việc tạo kỹ năng). Chỉ những kinh nghiệm liên quan đến việc chạm vào cạm bẫy và thay đổi cách tiếp cận mới đáng được lưu giữ.

Tệp kỹ năng trông như thế nào

Một tệp kỹ năng được tạo thông qua skill_manage(action="create"):

---
name: github-actions-python-ci
description: Set up GitHub Actions CI for Python projects with pytest and coverage
version: 1.0.0
---

# GitHub Actions Python CI Setup

## Steps

1. Create `.github/workflows/ci.yml`
2. Use `actions/setup-python@v5` with matrix for Python 3.10-3.12
3. Install dependencies with `pip install -e ".[dev]"` (NOT pip install -r requirements.txt)
4. Run tests: `pytest --cov --cov-report=xml`
5. Upload coverage to Codecov with `codecov/codecov-action@v4`

## Pitfalls

- **Don't use `pip install -r requirements.txt` for library projects** — it doesn't install the
  project itself. Use `pip install -e ".[dev]"` so `import mypackage` works in tests.
- **Matrix strategy needs `fail-fast: false`** — otherwise one Python version failing
  cancels all other versions' runs.
- **Codecov token is required since 2024** — add `CODECOV_TOKEN` to repo secrets.

Hãy lưu ý phần Cạm bẫy -- đây là "trải nghiệm khó có được" được nhân viên đánh giá lý lịch trích xuất từ cuộc trò chuyện. Lần tiếp theo khi một nhiệm vụ tương tự xuất hiện, nhân viên sẽ tải kỹ năng này và bỏ qua ngay những cạm bẫy đó.

Kỹ năng được sử dụng như thế nào trong cuộc trò chuyện tiếp theo

Sau khi một kỹ năng được tạo ra, lần tiếp theo cuộc trò chuyện sẽ bắt đầu:

Cấu trúc thư mục của kỹ năng không chỉ là một SKILL.md -- nó có thể bao gồm các tệp tham chiếu:

~/.hermes/skills/github-actions-python-ci/
├── SKILL.md                       <- Main file: steps + pitfalls
├── references/
│   ├── codecov-setup.md           <- Reference: detailed Codecov configuration
│   └── matrix-strategy.md         <- Reference: matrix strategy best practices
└── templates/
    └── ci.yml.template            <- Template: YAML ready to copy

Quá trình tải tiến bộ ba cấp, trong đó mô hình chủ động quyết định ở mỗi cấp xem có nên đi sâu hơn hay không:

Layer 1: Index in system prompt (all skill names + one-line descriptions)
  ┌─────────────────────────────────────────────────────────┐
  │ <available_skills>                                       │
  │   github:                                                │
  │     - github-actions-python-ci: Set up GitHub Actions CI │
  │ </available_skills>                                      │
  └─────────────────────────────────────────────────────────┘
  -> Model sees the index, decides "github-actions-python-ci is relevant to the current task"

Layer 2: skill_view("github-actions-python-ci")
  -> Loads the full content of SKILL.md
  -> SKILL.md says "See references/codecov-setup.md for detailed Codecov configuration"

Layer 3: skill_view("github-actions-python-ci", file_path="references/codecov-setup.md")
  -> Model reads the reference in SKILL.md, decides it needs detailed configuration
  -> Loads the reference file on demand

Mỗi bước từ Lớp 1 đến Lớp 2 đến Lớp 3 là quyết định riêng của mô hình -- cơ chế tương tự như khi mô hình nhìn thấy đường dẫn hình ảnh trong s18 và quyết định gọi Vision_analyze. Không cần logic đặc biệt; skill_view nằm trong danh sách công cụ và mô hình sẽ tự quyết định khi nào cần thêm thông tin.

Hành động tải sau tùy thuộc vào loại tệp

Cơ chế tải thống nhất trên cả ba tầng -- luôn luôn skill_view(name, file_path=...). Nhưng điều gì xảy ra sau khi đọc phụ thuộc vào loại tệp:

Loại tệpNó được tải như thế nàoĐiều gì xảy ra sau khi tải
references/*.mdskill_view(name, file_path="references/...")Hiểu nội dung, hướng dẫn thao tác
templates/*.ymlskill_view(name, file_path="templates/...")Sao chép nội dung vào file đích
scripts/*.shskill_view(name, file_path="scripts/...")Thực hiện thông qua terminal công cụ

Luồng đầy đủ cho các tập lệnh:

SKILL.md says:
  "Step 3: Run scripts/setup.sh to configure the environment"

Model's behavior:
  1. skill_view("my-skill", file_path="scripts/setup.sh")  <- read the script first
  2. Understand what the script does (is it safe? does it need parameter changes?)
  3. terminal("bash ~/.hermes/skills/my-skill/scripts/setup.sh")  <- execute via terminal

Không có cơ chế "tự động thực thi". Model đọc nội dung script trước, đánh giá độ an toàn rồi mới thực thi thông qua terminal tool. Hệ thống cấp phép từ s09 hoạt động như bình thường - các lệnh nguy hiểm trong tập lệnh sẽ bị chặn.

Tại sao không có Lớp 4 hoặc Lớp 5

Bởi vì bắt đầu từ Lớp 3, nó phẳng -- luôn giống nhau skill_view(name, file_path="...") gọi. Nếu như references/api-guide.md đề cập đến "xem tài liệu tham khảo/nâng cao/deep-dive.md để biết chi tiết", mô hình này chỉ đơn giản tạo một mô hình khác skill_view gọi. Không cần cơ chế mới.

Layer 1: Index         -> Fixed mechanism (auto-injected in prompt)
Layer 2: SKILL.md      -> skill_view(name)
Layer 3+: Any file     -> skill_view(name, file_path="...")  <- same call from here on

Tuy nhiên, trong thực tế, nếu một kỹ năng yêu cầu các lớp tham chiếu lồng nhau để giải thích chính nó thì điều đó thường có nghĩa là nên chia kỹ năng đó thành nhiều kỹ năng:

Bad (one giant skill with nested references):
  mega-deploy/
    SKILL.md -> references/docker.md -> references/docker/advanced.md -> ...
    Model needs 5 skill_view calls to get all the information

Good (split into independent skills, each needing only 2-3 layers):
  deploy-docker/SKILL.md
  deploy-kubernetes/SKILL.md
  deploy-ci-pipeline/SKILL.md  <- says "if using Docker, load deploy-docker first"

Tham chiếu chéo giữa các kỹ năng dựa vào hướng dẫn bằng văn bản trong SKILL.md. Khi mô hình đọc "tải triển khai-docker trước", nó sẽ gọi skill_view("deploy-docker") tự nó -- cơ chế quyết định tương tự như việc tải tài liệu tham khảo.

Tại sao không tải mọi thứ cùng một lúc? Tiết kiệm token. Nếu có 100 kỹ năng, mỗi kỹ năng có 3 tệp tham chiếu và tập lệnh, việc đưa tất cả chúng vào lời nhắc sẽ tiêu tốn hàng trăm nghìn token. Tải lũy tiến cho phép mô hình chỉ tải những phần thực sự cần thiết cho tác vụ hiện tại.

Hướng dẫn kịch bản đầy đủ

=== Day 1 ===

User: Set up GitHub Actions CI for this project
Agent: Sure, I'll configure it...
  -> First version used pip install -r requirements.txt -> tests failed
  -> Discovered need for pip install -e ".[dev]" -> fixed
  -> Codecov upload failed -> discovered CODECOV_TOKEN is required -> fixed
  -> Finally passing
Agent: CI is set up.
User: Thanks

  [When conversation ends, tool call count >= 10 -> background review triggered]

Background review agent:
  "In this conversation the agent hit two pitfalls (requirements install method,
  Codecov token) and ultimately succeeded. This is a non-trivial, reusable pattern."
  -> skill_manage(action="create", name="github-actions-python-ci", content="...")

User sees: "Skill 'github-actions-python-ci' created"

=== Day 2 ===

Colleague: Set up CI for another project too
Agent: [system prompt contains github-actions-python-ci]
  -> skill_view("github-actions-python-ci") -> loads full content
  -> Uses pip install -e ".[dev]" directly (won't make the requirements.txt mistake again)
  -> Proactively reminds user to add CODECOV_TOKEN
  -> Passes on the first try

Những cạm bẫy xảy ra vào Ngày 1 sẽ không xảy ra nữa vào Ngày 2. Đó là giá trị của vòng tạo kỹ năng.

Cách nó cắm vào vòng lặp chính

Quá trình xem xét nền sẽ được kích hoạt sau khi cuộc trò chuyện kết thúc chứ không phải bên trong vòng lặp cốt lõi.

Core loop runs normally
  |  Each tool call -> _iters_since_skill += 1
  v
Conversation ends (model returns final reply)
  |
  |  _iters_since_skill >= 10?
  |
  Yes -> fork background review agent (daemon thread)
  |    '- analyze message snapshot -> skill_manage -> create/update skill
  |
  v
Return reply to user (don't wait for background review to finish)

Những lỗi thường gặp của người mới bắt đầu

1. Kích hoạt đánh giá mỗi lượt

Nếu nudge_interval được đặt quá thấp (ví dụ: 1), mọi lệnh gọi công cụ sẽ kích hoạt quá trình xem xét cơ bản, lãng phí lệnh gọi API. Những nhiệm vụ đơn giản cũng được xem xét lại - tạo ra rất nhiều kỹ năng vô dụng.

Khắc phục: Mặc định kích hoạt cứ sau 10 lệnh gọi công cụ. Các tác vụ đơn giản thường hoàn thành sau ít hơn 10 lần gọi công cụ.

2. Giả sử agent đánh giá lý lịch có thể sửa đổi cuộc trò chuyện chính

agent đánh giá lý lịch nhận được thông báo ảnh chụp nhanh (bản sao), không phải tài liệu tham khảo. Các hoạt động của nó (tạo kỹ năng, cập nhật bộ nhớ) ghi vào các thư mục dùng chung trên đĩa, nhưng nó không thể sửa đổi danh sách tin nhắn của cuộc trò chuyện chính.

3. Hồ sơ kỹ năng chỉ liệt kê các bước mà không có cạm bẫy

Phần có giá trị nhất không phải là "cách thực hiện" (người dùng có thể tự tìm kiếm phần đó), mà là "có sai sót ở đâu." Lời nhắc đánh giá cơ bản đặc biệt nhấn mạnh "thử và sai" và "thay đổi hướng đi" -- phần này được thiết kế để hướng dẫn rút ra các bài học khó đạt được.

4. Nhồi tất cả nội dung kỹ năng vào dấu nhắc hệ thống

100 kỹ năng x 2.000 từ mỗi kỹ năng = 200.000 từ trong lời nhắc. Mô hình không thể xử lý được và chi phí token bùng nổ.

Khắc phục: Chỉ nhập chỉ số kỹ năng (tên + mô tả) vào lời nhắc. Sau khi mô hình xác định được mức độ liên quan, nó sẽ sử dụng skill_view để tải nội dung theo yêu cầu.

Ranh giới giảng dạy

Chương này trình bày cơ chế hoàn chỉnh của vòng lặp tạo kỹ năng.

Ba điều được đề cập:

  1. Cách kích hoạt quá trình xem xét lý lịch -- Công cụ đếm cuộc gọi + kiểm tra khi kết thúc cuộc trò chuyện
  2. Cách agent đánh giá quyết định tạo/cập nhật/bỏ qua -- Hướng dẫn nhanh chóng + bộ lọc "không tầm thường"
  3. Cách sử dụng các kỹ năng mới vào lần tới -- Tải lũy tiến ba tầng (chỉ mục -> SKILL.md -> tệp tham khảo)

Không được bảo hiểm:

  • Quy định cụ thể về quét bảo mật kỹ năng -> cơ chế bảo mật
  • Chia sẻ kỹ năng cộng đồng (Skills Hub) -> tính năng sản phẩm
  • Quản lý và khôi phục phiên bản kỹ năng -> phiên bản hiện tại ghi đè trực tiếp, không có lịch sử
  • Đồng bộ hóa kỹ năng giữa các máy -> các kỹ năng được lưu trữ cục bộ tại ~/.hermes/skills

Chương này liên quan đến chương khác như thế nào

  • s08 đã xác định định dạng và cách sử dụng kỹ năng cơ bản -> chương này thêm tính năng tạo tự động lên trên
  • Cơ chế subagent của s10 -> việc xem xét lý lịch được thực hiện bằng cách sử dụng subagent
  • Hệ thống bộ nhớ của s07 -> xem lại lý lịch cập nhật đồng thời cả bộ nhớ và kỹ năng (bổ sung: bộ nhớ lưu trữ sự kiện, phương pháp lưu trữ kỹ năng)
  • Đánh giá cơ bản của s20 -> cung cấp cơ sở hạ tầng cho chương này; chương này là ứng dụng "sáng tạo kỹ năng" của nó

Sau chương này, bạn sẽ có thể trả lời

  • Khi nào việc xem xét lý lịch được kích hoạt? Nó có chạy ở mọi lượt trò chuyện không?
  • agent xét lý lịch và agent chính có cùng một quy trình không? Người đại diện đánh giá có thể sửa đổi cuộc trò chuyện chính không?
  • Phần giá trị nhất của hồ sơ kỹ năng là gì? Các bước thực hiện hay những bài học khó đạt được?
  • Tại sao tất cả các kỹ năng không được tải vào dấu nhắc hệ thống mà không được tải theo yêu cầu?
  • Kỹ năng do người dùng này tạo hôm nay có thể được người dùng khác sử dụng vào ngày mai không?

Một dòng: Sau khi nhân viên hoàn thành một nhiệm vụ, một bản sao nền sẽ tự động xem lại cuộc trò chuyện, rút ra kinh nghiệm không hề tầm thường và tạo ra một kỹ năng. Lần tiếp theo khi một nhiệm vụ tương tự xuất hiện, kỹ năng sẽ được tải trực tiếp, bỏ qua giai đoạn thử và sai.

Mục lục nguồn