docs/en/s04-prompt-builder.mdXem bản gốc 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.
s04: Trình tạo nhắc nhở
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
Dấu nhắc hệ thống không phải là một chuỗi mã hóa cứng. Nó được tập hợp từng lớp từ sáu hoặc bảy nguồn khác nhau.
Chương này giải quyết vấn đề gì
Bởi s03 agent có một hệ thống công cụ và tính bền bỉ của phiên.
Nhưng có một câu hỏi đã bị hoãn lại: lời nhắc hệ thống đến từ đâu?
Trong vòng lặp tối thiểu s01, dấu nhắc hệ thống là một chuỗi được mã hóa cứng. Trong một hệ thống thực, agent cần biết:
- Đó là ai (nhân cách)
- Sở thích của người dùng là gì (bộ nhớ)
- Dự án hiện tại có những quy định gì (cấu hình dự án)
- Những kỹ năng có sẵn (chỉ số kỹ năng)
- Bây giờ là mấy giờ (dấu thời gian)
- Cách sử dụng công cụ (hướng dẫn hành vi)
Thông tin này đến từ các tệp và trạng thái runtime khác nhau. Nếu tất cả đều được mã hóa cứng cùng nhau thì mọi thay đổi sẽ yêu cầu thay đổi mã.
Vì vậy, agent Hermes chia lời nhắc hệ thống thành một tập hợp lớp: mỗi nguồn được duy trì độc lập và chúng được nối theo thứ tự khi khởi động.
Điều khoản chính
SOUL.md là gì
Tệp cá nhân. Sống ở ~/.hermes/ thư mục. Xác định danh tính và phong cách hành vi của agent.
Ví dụ:
You are a concise, direct programming assistant.
Keep answers as short as possible.
Do not add a summary at the end of every reply.
HERMES.md / agent.md là gì
Các tập tin cấu hình cấp dự án. Được đặt trong thư mục dự án, chúng cho agent biết các quy tắc cho dự án này.
Ví dụ:
This is a Python project.
Testing framework: pytest.
Code style follows PEP 8.
Do not modify the migrations/ directory.
Bộ nhớ đệm nhanh chóng là gì
Sau khi được lắp ráp, lời nhắc hệ thống sẽ được lưu vào bộ đệm. Tất cả lệnh gọi API trong cùng một phiên đều sử dụng lại cùng một bản sao.
Tại sao phải lưu vào bộ nhớ đệm? Hai lý do:
- Không cần phải đọc lại file và nối chuỗi mỗi lần
- Bộ nhớ đệm nhanh của Anthropic yêu cầu lời nhắc hệ thống không thay đổi qua các lượt. Nếu nó thay đổi, bộ đệm sẽ bị vô hiệu và chi phí sẽ tăng lên

Mô hình tinh thần tối thiểu
_build_system_prompt()
|
v
Layer 1: Persona (SOUL.md, or a default identity)
|
v
Layer 2: Behavioral guidance (tool usage conventions, model-specific guidance)
|
v
Layer 3: Memory (MEMORY.md + USER.md snapshot)
|
v
Layer 4: Skill index (index of installed skills)
|
v
Layer 5: Project configuration (HERMES.md / AGENTS.md / CLAUDE.md / .cursorrules)
|
v
Layer 6: Timestamp + model information
|
v
Concatenated into a single string, cached
Điểm quan trọng: các lớp này có mức độ ưu tiên. Nếu cả HERMES.md và AGENTS.md đều tồn tại thì chỉ HERMES.md được sử dụng (mức độ ưu tiên cao hơn). Điều này ngăn chặn việc tiêm trùng lặp.
Cấu trúc dữ liệu chính
nhắc_parts
Trong quá trình lắp ráp, nội dung từ mỗi nguồn được thu thập thành một danh sách:
prompt_parts = [
"You are a programming assistant...", # Layer 1: Persona
"When you need to take action...", # Layer 2: Behavioral guidance
"# Memory\nUser preferences...", # Layer 3: Memory
"# Skills\nAvailable skills...", # Layer 4: Skills
"# Project Context\nProject rules...", # Layer 5: Project configuration
"Conversation started: ...", # Layer 6: Timestamp
]
Cuối cùng đã tham gia với "\n\n".join(prompt_parts) thành một chuỗi duy nhất.
Ưu tiên cấu hình dự án
.hermes.md / HERMES.md (highest -- searched upward from cwd to git root)
AGENTS.md / agents.md (current directory only)
CLAUDE.md / claude.md (current directory only)
.cursorrules (current directory only)
Chỉ cái đầu tiên được tìm thấy mới được sử dụng. Tất cả chúng đều không được tải.
Mục đích của thiết kế này là khả năng tương thích: các dự án di chuyển từ các khung agent khác có thể đã có CLAUDE.md hoặc .cursorrules. agent Hermes sử dụng chúng trực tiếp; người dùng không cần phải viết lại bất cứ điều gì.
Cắt ngắn theo nguồn
Mỗi tệp được giới hạn ở 20.000 ký tự. Bất cứ điều gì ngoài đó đều bị cắt ngắn.
Điều này ngăn chặn một AGENTS.md lớn sử dụng toàn bộ cửa sổ ngữ cảnh.
Thực hiện tối thiểu
Bước 1: Tải Persona
def load_soul():
soul_path = HERMES_HOME / "SOUL.md"
if soul_path.exists():
return soul_path.read_text()[:20000]
return "You are a helpful assistant."
Bước 2: Tải cấu hình dự án (Chuỗi ưu tiên)
def load_project_context(cwd):
for name in [".hermes.md", "HERMES.md"]:
# Search upward from cwd to git root
path = find_up(cwd, name)
if path:
return path.read_text()[:20000]
for name in ["AGENTS.md", "CLAUDE.md", ".cursorrules"]:
path = Path(cwd) / name
if path.exists():
return path.read_text()[:20000]
return ""
Bước 3: Lắp ráp
def build_system_prompt(soul, memory, skills, project_context):
parts = [soul]
if memory:
parts.append(f"# Memory\n{memory}")
if skills:
parts.append(f"# Skills\n{skills}")
if project_context:
parts.append(f"# Project Context\n{project_context}")
parts.append(f"Current time: {datetime.now().strftime('%Y-%m-%d %H:%M')}")
return "\n\n".join(parts)
Bước 4: Bộ nhớ đệm
class AIAgent:
def __init__(self):
self._cached_system_prompt = None
def run_conversation(self, user_message, ...):
if self._cached_system_prompt is None:
self._cached_system_prompt = build_system_prompt(...)
# Every API call uses the same copy
api_messages = [
{"role": "system", "content": self._cached_system_prompt}
] + messages
Lắp ráp một lần, sau đó không bao giờ được xây dựng lại. Chỉ một sự kiện nén ngữ cảnh mới xóa bộ đệm và kích hoạt quá trình xây dựng lại.

Những thiết kế độc đáo ở agent Hermes
1. Gateway đọc lời nhắc từ SQLite khi tiếp tục phiên
Gateway tạo một phiên bản AIAgent mới cho mỗi tin nhắn. Nếu lời nhắc hệ thống được tập hợp lại mỗi lần:
- MEMORY.md có thể đã được agent sửa đổi ở lượt trước
- Lời nhắc mới được lắp ráp sẽ khác với lời nhắc trước đó
- Tiền tố bộ đệm nhắc nhở của Anthropic sẽ bị vô hiệu
Vì vậy, agent Hermes lưu trữ lời nhắc hệ thống trong SQLite sau lần lắp ráp đầu tiên (xem s03). Các phiên bản tiếp theo sẽ đọc từ bộ đệm thay vì tập hợp lại.
2. ephemeral_system_prompt Không vào bộ đệm
Một số hướng dẫn cấp hệ thống chỉ được đưa vào tạm thời tại thời điểm gọi API (ví dụ: cấu hình tạm thời của Cổng). Chúng không được lưu trữ trong SQLite và không được lưu vào bộ đệm.
Chúng được thêm vào lời nhắc được lưu trong bộ nhớ đệm ở mỗi lệnh gọi API:
effective_system = cached_prompt + "\n\n" + ephemeral_prompt
3. Chèn bộ nhớ có hai con đường
- Bộ nhớ trong (MEMORY.md / USER.md) -> đi vào dấu nhắc hệ thống
- Nhà cung cấp bộ nhớ ngoài (plugin) -> được đưa vào thông báo người dùng, không phải lời nhắc hệ thống
Tại sao bộ nhớ ngoài không vào dấu nhắc hệ thống? Vì nội dung của nó có thể thay đổi theo từng lượt (tùy theo câu hỏi của người dùng). Đặt nó vào dấu nhắc hệ thống sẽ phá vỡ bộ đệm.
Những sai lầm phổ biến nhất của người mới bắt đầu
1. Ghép tất cả các nguồn thành một chuỗi mã hóa cứng khổng lồ
Thay đổi bất cứ điều gì đòi hỏi phải thay đổi mã. Mỗi nguồn nên được duy trì độc lập và lắp ráp theo thứ tự.
2. Tập hợp lại mỗi lệnh gọi API
Lãng phí thời gian và phá vỡ bộ đệm nhắc nhở. Lắp ráp một lần, lưu trữ và tái sử dụng.
3. Không cắt bớt nội dung tập tin
AGENTS.md 50 KB sẽ ngốn một lượng lớn cửa sổ ngữ cảnh, để lại ít chỗ hơn cho cuộc trò chuyện.
4. Tải tất cả các tệp cấu hình dự án thay vì chỉ tệp có mức độ ưu tiên cao nhất
Đang tải HERMES.md, AGENTS.md và .cursorrules cùng một lúc -- nội dung của chúng có thể xung đột hoặc chồng chéo.
5. Đưa lời nhắc hệ thống vào danh sách tin nhắn
Lời nhắc hệ thống phải được thêm vào trước mỗi lệnh gọi API, không được lưu trữ như một phần của danh sách thông báo trong SQLite. Nếu không, nó sẽ bị nén, sao chép và tồn tại như một thông điệp lịch sử.
Ranh giới giảng dạy
Chương này bao gồm những gì:
Lời nhắc hệ thống được tập hợp từ nhiều nguồn theo lớp. Nó được tập hợp một lần, được lưu vào bộ nhớ đệm và sử dụng lại.
Cố tình bỏ đi:
- Thiết kế đầy đủ của hệ thống bộ nhớ ->
s07 - Logic xây dựng chỉ số kỹ năng ->
s08 - Quy trình hoàn chỉnh để nối lại phiên Cổng ->
s12 - Nhắc nhở xây dựng lại sau khi kích hoạt nén ngữ cảnh ->
s05
Nếu bạn có thể đạt được "dấu nhắc hệ thống được tập hợp từ nhiều tệp -- việc thay đổi cá nhân chỉ yêu cầu chỉnh sửa SOUL.md, việc thay đổi quy tắc dự án chỉ yêu cầu chỉnh sửa HERMES.md," thì bạn đã hoàn thành chương này.
Một câu để nhớ
Lời nhắc của hệ thống agent Hermes được tập hợp từ sáu hoặc bảy nguồn -- SOUL.md, bộ nhớ, kỹ năng, cấu hình dự án, v.v. -- theo thứ tự ưu tiên. Nó được tập hợp một lần, được lưu vào bộ nhớ đệm để sử dụng lại và khi Gateway tiếp tục phiên, nó sẽ đọc từ SQLite thay vì tập hợp lại.