Về Field Notes
Series: OpenClaw

Hệ thống trí nhớ 3 tầng của OpenClaw:
Giúp agent nhớ mọi thứ

Vấn đề cốt lõi: agent quên sạch sau mỗi phiên

Bạn dành 30 phút đầu phiên giải thích cho agent về dự án: naming convention, quyết định kiến trúc, những thứ đã thử và thất bại. Agent hiểu, làm tốt suốt buổi. Sáng hôm sau mở lại? Quên sạch. Phải bắt đầu lại từ đầu.

Đây là giới hạn cơ bản của LLM — mỗi phiên chat là một cuộc hội thoại mới, hoàn toàn biệt lập. Context window của model chỉ tồn tại trong phiên đó; khi phiên kết thúc, mọi thứ biến mất.

OpenClaw giải quyết vấn đề này bằng hệ thống trí nhớ 3 tầng, mô phỏng cách bộ não con người hoạt động: có thứ luôn sẵn trong đầu, có thứ nhớ từ hôm qua, và có thứ phải "lục lại" mới ra.

Ba tầng trí nhớ

1
Tầng 1
MEMORY.md — Trí nhớ dài hạn
Load tự động mỗi phiên

MEMORY.md là file được đọc vào context mỗi lần agent khởi động một phiên riêng tư. Bất cứ thứ gì nằm trong file này, agent sẽ "nhớ" ngay khi bắt đầu chat — không cần nhắc lại.

Nên đưa vào MEMORY.md những gì quan trọng, dùng thường xuyên, và ít thay đổi:

MEMORY.md
# Memory

## Quyết định kiến trúc
- 2026-03-15: Chuyển từ REST sang GraphQL cho internal API
- 2026-04-01: Dùng Resend thay SendGrid (giá tốt hơn, DX sạch hơn)
- 2026-04-10: Chọn VietinBank qua SePay cho payment gateway

## Convention đã thống nhất
- Commit message: conventional commits (feat:, fix:, docs:)
- Branch naming: feature/TASK-xxx-mo-ta-ngan
- API response: { success: true, data: {} }

## Bài học rút ra
- Không mock database trong integration test → đã gây lỗi production
- Luôn test email template trước khi deploy
- VPS provisioning cần timeout 120s, không phải 30s mặc định
Quy tắc vàng: giữ MEMORY.md dưới 100 dòng. File này được load mỗi phiên — mỗi dòng thừa đều tiêu tốn token. Chỉ giữ những gì thực sự cần thiết. Thông tin ít dùng hơn để ở tầng 2 hoặc tầng 3.
Bảo mật: MEMORY.md chỉ được load trong phiên riêng tư (chat trực tiếp với bạn). Nó không bao giờ xuất hiện trong group chat hay phiên chia sẻ — bảo vệ thông tin nhạy cảm của bạn tự động.
2
Tầng 2
Daily Notes — Ngữ cảnh gần đây
Load tự động hôm nay + hôm qua

Tầng 2 là các file ghi chú theo ngày trong thư mục memory/, format YYYY-MM-DD.md. OpenClaw tự động load file hôm nay và hôm qua vào context — không cần cấu hình gì thêm.

memory/
├── 2026-04-10.md
├── 2026-04-11.md auto-load: hôm qua
└── 2026-04-12.md auto-load: hôm nay

Khi bạn nói "nhớ cái này nhé", agent sẽ ghi vào file daily note của ngày hôm nay. Đây là cuốn sổ tay công việc tự động — agent ghi lại những quyết định, bug đã fix, và ngữ cảnh quan trọng theo thời gian thực.

memory/2026-04-12.md
# 2026-04-12

## Buổi sáng
- Deploy thành công v2.3.1 lên production (10:15)
- Phát hiện bug pagination ở /admin/users — chưa fix, ưu tiên thấp
- Khách hàng @minh_dev hỏi về API rate limit → đã giải thích qua Telegram

## Buổi chiều
- Fix bug pagination: nguyên nhân offset = page * limit thay vì (page-1) * limit
- Commit: fix: correct pagination offset for admin user list
- Team lead: tuần sau làm tính năng auto-deploy theo branch
Tại sao chỉ load 2 ngày? Context window có giới hạn. Load nhiều hơn sẽ tốn token và làm chậm phản hồi. Hai ngày gần nhất thường đủ cho phần lớn ngữ cảnh cần thiết. Thông tin cũ hơn sẽ được tìm khi cần — đó là việc của tầng 3.
3
Tầng 3
Semantic Search — Kho kiến thức sâu
Tìm khi cần, không giới hạn thời gian

Đây là tầng mạnh nhất và khác biệt nhất. Khi agent cần thông tin không có trong MEMORY.md hay daily notes gần đây, nó tự động tìm kiếm trong toàn bộ thư mục memory/ bằng semantic search — không cần bạn chỉ đường.

Cách hoạt động bên dưới

1
Tất cả file markdown trong workspace được chia thành các đoạn nhỏ (~400 token mỗi đoạn)
2
Mỗi đoạn được chuyển thành vector embedding bởi embedding provider
3
Vector được lưu vào SQLite cục bộ — không có server bên ngoài, không tốn thêm phí
4
Khi cần tìm: câu hỏi → vector → so sánh cosine similarity → trả về đoạn liên quan nhất
Ví dụ thực tế: Bạn hỏi "lần trước fix lỗi SSL certificate thế nào?" — agent tìm trong tất cả daily notes và trả về đúng đoạn ghi chú từ 3 tuần trước, dù file đó hoàn toàn không có trong context hiện tại.

Cấu hình semantic search

openclaw.json
{
  "agents": {
    "defaults": {
      "memorySearch": {
        "backend":    "qmd",
        "maxResults": 6,
        "paths": [
          "memory/",
          "MEMORY.md",
          "AGENTS.md"
        ]
      }
    }
  }
}
Hybrid search: OpenClaw dùng kết hợp vector search (70%) + keyword search (30%). Nghĩa là nó vừa hiểu ngữ nghĩa — "lỗi chứng chỉ bảo mật" khớp với "SSL certificate error" — vừa tìm chính xác từ khoá, rất hữu ích cho tên biến, ID, mã lỗi cụ thể.

Tổ chức thư mục memory nâng cao

Ngoài daily notes, bạn có thể tổ chức memory theo chủ đề. Semantic search tìm trong tất cả file — không phân biệt cấu trúc thư mục.

memory/
├── people/
│   ├── khach-hang-a.md # Lịch sử và yêu cầu
│   └── doi-tac-b.md # Ghi chú hợp tác
├── projects/
│   ├── onmay.md # Ngữ cảnh dự án chính
│   └── side-project.md # Dự án phụ
├── decisions/
│   └── payment-gateway.md # Tại sao chọn SePay thay Stripe
├── topics/
│   ├── devops-notes.md
│   └── nextjs-tips.md
├── 2026-04-11.md
└── 2026-04-12.md

Khi bạn hỏi "khách hàng A muốn gì?", agent tìm đúng people/khach-hang-a.md mà không cần bạn nhắc tới đường dẫn. Khi hỏi "tại sao không dùng Stripe?", nó tìm ra decisions/payment-gateway.md.

Embedding Provider

Semantic search cần embedding provider để chuyển text thành vector. OpenClaw tự động phát hiện provider từ API key bạn đã cấu hình — không cần khai báo thêm.

OpenAI
text-embedding-3-small
Khuyến nghị
Google Gemini
embedding model
Hỗ trợ
Voyage AI
voyage-3
Hỗ trợ
Mistral
mistral-embed
Hỗ trợ

Nếu bạn đã có API key của bất kỳ provider nào ở trên, semantic search tự bật — không cần cấu hình thêm. Trên VPS OnMay, chỉ cần thêm API key vào .env và memory search sẵn sàng hoạt động.

Mẹo tối ưu hệ thống trí nhớ

Viết ghi chú có cấu trúc, ngữ cảnh đủ trong một chunk

Semantic search chia text theo chunk ~400 token. Nếu một đoạn ghi chú thiếu ngữ cảnh, agent tìm thấy nhưng không hiểu. Dùng heading rõ ràng và viết mỗi đoạn như một unit độc lập:

memory/2026-04-12.md — Ví dụ ghi chú tốt
## Bug fix: Pagination offset sai ở admin users
- Ngày: 2026-04-12
- File: app/admin/users/page.tsx
- Nguyên nhân: offset = page * limit → phải là (page - 1) * limit
- Fix: commit abc123
- Đã test với page 1, 5, 10, 100 — pass hết

Đoạn trên có đủ ngữ cảnh trong một chunk: vấn đề là gì, ở đâu, nguyên nhân, và cách fix. Agent tìm thấy sẽ hiểu ngay — không cần đọc thêm file khác.

Cross-reference khi một concept liên quan nhiều nơi

memory/decisions/payment-gateway.md
## Quyết định dùng SePay (2026-04-10)
Xem chi tiết tại: decisions/payment-gateway.md
Liên quan: yêu cầu bank transfer từ khách hàng (people/khach-hang-a.md)

Dọn dẹp memory định kỳ

  • Mỗi tháng: chuyển thông tin quan trọng từ daily notes vào MEMORY.md hoặc file chuyên đề
  • Xóa daily notes cũ hơn 30 ngày (đã được index, xóa file không mất vector đã build)
  • Review MEMORY.md — loại bỏ những gì không còn đúng, thêm bài học mới
  • Không nhồi nhét MEMORY.md — 100 dòng curated tốt hơn 500 dòng lộn xộn

Kiểm tra và debug memory

Muốn biết agent đang "nhớ" đúng không? Thử ba câu hỏi kiểm tra:

Câu hỏi kiểm tra từng tầng
"Bạn nhớ gì về dự án hiện tại?"
→ Test Tầng 1: MEMORY.md
"Hôm qua mình làm gì?"
→ Test Tầng 2: Daily Notes
"Lần trước fix bug X như thế nào?"
→ Test Tầng 3: Semantic Search

Nếu agent không nhớ thứ bạn mong đợi, kiểm tra theo thứ tự:

  • Thông tin đã được ghi vào file markdown chưa? (Agent chỉ nhớ những gì đã được ghi ra file)
  • File có nằm trong path được cấu hình cho memorySearch.paths không?
  • Embedding provider đã được thiết lập chưa? Kiểm tra API key trong .env
Series: Làm chủ OpenClaw