Memory
- Bộ nhớ OpenClaw là Markdown thuần trong workspace của agent. The files are the source of truth; the model only “remembers” what gets written to disk.
-
Công cụ tìm kiếm bộ nhớ được cung cấp bởi plugin bộ nhớ đang hoạt động (mặc định:
memory-core). 16. Tắt plugin bộ nhớ bằngplugins.slots.memory = "none".
Memory files (Markdown)
Bố cục workspace mặc định dùng hai lớp bộ nhớ:memory/YYYY-MM-DD.md- Nhật ký hằng ngày (chỉ ghi thêm).
- Đọc hôm nay + hôm qua khi bắt đầu phiên.
MEMORY.md(tùy chọn)- Bộ nhớ dài hạn đã được tuyển chọn.
- Chỉ tải trong phiên chính, riêng tư (không bao giờ trong ngữ cảnh nhóm).
- Các tệp này nằm dưới workspace (
agents.defaults.workspace, mặc định~/.openclaw/workspace). 18. Xem Agent workspace để biết bố cục đầy đủ.
Khi nào ghi bộ nhớ
- Quyết định, sở thích và sự thật bền vững ghi vào
MEMORY.md. - Ghi chú hằng ngày và ngữ cảnh đang chạy ghi vào
memory/YYYY-MM-DD.md. - Nếu ai đó nói “hãy nhớ điều này”, hãy ghi lại (đừng giữ trong RAM).
-
- Khu vực này vẫn đang phát triển. 20. Việc nhắc mô hình lưu bộ nhớ là hữu ích; nó sẽ biết phải làm gì.
- Nếu bạn muốn điều gì đó được ghi nhớ, hãy yêu cầu bot ghi vào bộ nhớ.
Automatic memory flush (pre-compaction ping)
- Khi một phiên gần đến auto-compaction, OpenClaw kích hoạt một lượt tác tử im lặng để nhắc mô hình ghi bộ nhớ bền vững trước khi context bị nén gọn. 22. Các prompt mặc định nói rõ mô hình có thể trả lời, nhưng thường thì
NO_REPLYlà phản hồi đúng để người dùng không bao giờ thấy lượt này.
agents.defaults.compaction.memoryFlush:
- Ngưỡng mềm: xả bộ nhớ được kích hoạt khi ước lượng token của phiên vượt
contextWindow - reserveTokensFloor - softThresholdTokens. - Im lặng theo mặc định: lời nhắc bao gồm
NO_REPLYnên không có gì được gửi ra. - Hai lời nhắc: một lời nhắc người dùng cộng với một lời nhắc hệ thống để thêm nhắc nhở.
- Một lần xả cho mỗi chu kỳ nén (theo dõi trong
sessions.json). - Workspace phải ghi được: nếu phiên chạy trong sandbox với
workspaceAccess: "ro"hoặc"none", việc xả sẽ bị bỏ qua.
Vector memory search
Mặc định: Mặc định:- Bật theo mặc định.
- Theo dõi thay đổi của tệp bộ nhớ (debounce).
- Cấu hình tìm kiếm bộ nhớ trong
agents.defaults.memorySearch(không phảimemorySearchcấp cao nhất). -
- Sử dụng embeddings từ xa theo mặc định. 24. Nếu
memorySearch.providerkhông được đặt, OpenClaw tự động chọn: localnếumemorySearch.local.modelPathđược cấu hình và tệp tồn tại.openainếu có thể phân giải khóa OpenAI.gemininếu có thể phân giải khóa Gemini.voyagenếu có thể phân giải khóa Voyage.- Nếu không, tìm kiếm bộ nhớ sẽ bị vô hiệu cho đến khi được cấu hình.
- Sử dụng embeddings từ xa theo mặc định. 24. Nếu
- Chế độ local dùng node-llama-cpp và có thể cần
pnpm approve-builds. - Dùng sqlite-vec (khi có) để tăng tốc tìm kiếm vector trong SQLite.
- Embeddings từ xa yêu cầu API key cho nhà cung cấp embedding. 26. OpenClaw phân giải khóa từ auth profiles,
models.providers.*.apiKey, hoặc biến môi trường. 27. Codex OAuth chỉ bao phủ chat/completions và không đáp ứng embeddings cho tìm kiếm bộ nhớ. For Gemini, useGEMINI_API_KEYormodels.providers.google.apiKey. 29. Với Voyage, sử dụngVOYAGE_API_KEYhoặcmodels.providers.voyage.apiKey. When using a custom OpenAI-compatible endpoint, setmemorySearch.remote.apiKey(and optionalmemorySearch.remote.headers).
QMD backend (experimental)
- Đặt
memory.backend = "qmd"để thay thế indexer SQLite tích hợp bằng QMD: một sidecar tìm kiếm ưu tiên local kết hợp BM25 + vector + reranking. Markdown stays the source of truth; OpenClaw shells out to QMD for retrieval. 33. Các điểm chính:
-
- Bị tắt theo mặc định. 35. Bật theo từng cấu hình (
memory.backend = "qmd").
- Bị tắt theo mặc định. 35. Bật theo từng cấu hình (
- Cài QMD CLI riêng (
bun install -g https://github.com/tobi/qmdhoặc tải bản phát hành) và đảm bảo binaryqmdnằm trongPATHcủa gateway. - QMD cần bản dựng SQLite cho phép extension (
brew install sqlitetrên macOS). - QMD chạy hoàn toàn local qua Bun +
node-llama-cppvà tự động tải model GGUF từ HuggingFace khi dùng lần đầu (không cần daemon Ollama riêng). - Gateway chạy QMD trong một XDG home tự chứa dưới
~/.openclaw/agents/<agentId>/qmd/bằng cách đặtXDG_CONFIG_HOMEvàXDG_CACHE_HOME. -
- Hỗ trợ hệ điều hành: macOS và Linux hoạt động ngay sau khi cài Bun + SQLite. Windows is best supported via WSL2.
- Gateway ghi một QMD home tự chứa dưới
~/.openclaw/agents/<agentId>/qmd/(config + cache + sqlite DB). - Collection được tạo qua
qmd collection addtừmemory.qmd.paths(cộng với các tệp bộ nhớ workspace mặc định), sau đóqmd update+qmd embedchạy khi khởi động và theo khoảng thời gian cấu hình (memory.qmd.update.interval, mặc định 5 phút). - Gateway hiện khởi tạo QMD manager khi khởi động, vì vậy các bộ hẹn giờ cập nhật định kỳ
được kích hoạt ngay cả trước lệnh gọi
memory_searchđầu tiên. - Làm mới khi khởi động hiện chạy nền theo mặc định để không chặn khởi động chat;
đặt
memory.qmd.update.waitForBootSync = trueđể giữ hành vi chặn trước đây. - Tìm kiếm chạy qua
memory.qmd.searchMode(mặc địnhqmd search --json; cũng hỗ trợvsearchvàquery). Nếu chế độ đã chọn từ chối các cờ trên bản dựng QMD của bạn, OpenClaw sẽ thử lại vớiqmd query. Nếu QMD gặp lỗi hoặc thiếu file nhị phân, OpenClaw sẽ tự động chuyển sang sử dụng trình quản lý SQLite tích hợp sẵn để các công cụ bộ nhớ vẫn hoạt động bình thường. - Hiện OpenClaw không phơi bày tinh chỉnh batch-size embedding của QMD; hành vi batch do QMD tự điều khiển.
- Lần tìm đầu tiên có thể chậm: QMD có thể tải model GGUF local (reranker/mở rộng truy vấn)
ở lần chạy
qmd queryđầu tiên.-
OpenClaw tự động đặt
XDG_CONFIG_HOME/XDG_CACHE_HOMEkhi chạy QMD. -
Nếu muốn tải sẵn model thủ công (và làm ấm cùng chỉ mục OpenClaw dùng),
hãy chạy một truy vấn một lần với các XDG dir của tác tử.
- Trạng thái QMD của OpenClaw nằm dưới thư mục state của bạn (mặc định
~/.openclaw). You can pointqmdat the exact same index by exporting the same XDG vars OpenClaw uses:
- Trạng thái QMD của OpenClaw nằm dưới thư mục state của bạn (mặc định
-
OpenClaw tự động đặt
memory.qmd.*)
command(mặc địnhqmd): ghi đè đường dẫn executable.searchMode(mặc địnhsearch): chọn lệnh QMD sẽ dùng làm nền chomemory_search(search,vsearch,query).includeDefaultMemory(mặc địnhtrue): tự động lập chỉ mụcMEMORY.md+memory/**/*.md.paths[]: thêm thư mục/tệp bổ sung (path, tùy chọnpattern, tùy chọn ổn địnhname).sessions: chọn tham gia lập chỉ mục JSONL phiên (enabled,retentionDays,exportDir).update: điều khiển nhịp làm mới và thực thi bảo trì: (interval,debounceMs,onBoot,waitForBootSync,embedInterval,commandTimeoutMs,updateTimeoutMs,embedTimeoutMs).limits: giới hạn payload recall (maxResults,maxSnippetChars,maxInjectedChars,timeoutMs).scope: same schema assession.sendPolicy. 41. Mặc định là chỉ DM (từ chối tất cả, cho phép chat trực tiếp); nới lỏng để hiển thị kết quả QMD trong nhóm/kênh.match.keyPrefixkhớp với khóa phiên đã được chuẩn hóa (chuyển thành chữ thường và loại bỏ tiền tốagent:<id>:nếu có). Ví dụ:discord:channel:.match.rawKeyPrefixkhớp với khóa phiên nguyên bản (chuyển thành chữ thường), bao gồm cảagent:<id>:. Ví dụ:agent:main:discord:.- Legacy:
match.keyPrefix: "agent:..."vẫn được xem như tiền tố raw-key, nhưng nên dùngrawKeyPrefixđể rõ ràng hơn.
- When
scopedenies a search, OpenClaw logs a warning with the derivedchannel/chatTypeso empty results are easier to debug. - Đoạn trích lấy từ ngoài workspace hiển thị là
qmd/<collection>/<relative-path>trong kết quảmemory_search;memory_gethiểu tiền tố đó và đọc từ root collection QMD đã cấu hình. - Khi
memory.qmd.sessions.enabled = true, OpenClaw xuất transcript phiên đã được làm sạch (lượt User/Assistant) vào một collection QMD riêng dưới~/.openclaw/agents/<id>/qmd/sessions/, đểmemory_searchcó thể gọi lại các cuộc hội thoại gần đây mà không chạm vào chỉ mục SQLite tích hợp. - Các snippet
memory_searchgiờ bao gồm footerSource: <path#line>khimemory.citationslàauto/on; đặtmemory.citations = "off"để giữ metadata đường dẫn ở nội bộ (tác tử vẫn nhận đường dẫn chomemory_get, nhưng văn bản snippet bỏ footer và lời nhắc hệ thống cảnh báo tác tử không trích dẫn nó).
memory.citationsáp dụng bất kể backend (auto/on/off).-
- Khi
qmdchạy, chúng tôi gắn thẻstatus().backend = "qmd"để chẩn đoán hiển thị engine nào đã phục vụ kết quả. 42. Nếu subprocess QMD thoát hoặc đầu ra JSON không thể phân tích, trình quản lý tìm kiếm ghi log cảnh báo và trả về nhà cung cấp tích hợp (embeddings Markdown hiện có) cho đến khi QMD phục hồi.
- Khi
Additional memory paths
Nếu bạn muốn lập chỉ mục các tệp Markdown ngoài bố cục workspace mặc định, hãy thêm đường dẫn rõ ràng:- Đường dẫn có thể là tuyệt đối hoặc tương đối theo workspace.
- Thư mục được quét đệ quy cho các tệp
.md. - Chỉ lập chỉ mục tệp Markdown.
- Bỏ qua symlink (tệp hoặc thư mục).
Gemini embeddings (native)
Đặt nhà cung cấp làgemini để dùng trực tiếp API embedding của Gemini:
remote.baseUrllà tùy chọn (mặc định là base URL của Gemini API).remote.headerscho phép thêm header bổ sung nếu cần.- Model mặc định:
gemini-embedding-001.
remote với nhà cung cấp OpenAI:
memorySearch.fallbackcó thể làopenai,gemini,local, hoặcnone.- Nhà cung cấp fallback chỉ được dùng khi nhà cung cấp embedding chính thất bại.
- Bị tắt theo mặc định. Đặt
agents.defaults.memorySearch.remote.batch.enabled = trueđể bật cho việc lập chỉ mục kho dữ liệu lớn (OpenAI, Gemini và Voyage). - Hành vi mặc định chờ hoàn tất batch; tinh chỉnh
remote.batch.wait,remote.batch.pollIntervalMs, vàremote.batch.timeoutMinutesnếu cần. - Đặt
remote.batch.concurrencyđể điều khiển số job batch gửi song song (mặc định: 2). - Chế độ batch áp dụng khi
memorySearch.provider = "openai"hoặc"gemini"và dùng khóa API tương ứng. - Batch Gemini dùng endpoint batch embedding async và yêu cầu Gemini Batch API khả dụng.
- Với backfill lớn, OpenAI thường là lựa chọn nhanh nhất chúng tôi hỗ trợ vì có thể gửi nhiều yêu cầu embedding trong một job batch và để OpenAI xử lý bất đồng bộ.
- OpenAI cung cấp giá ưu đãi cho workload Batch API, nên các đợt lập chỉ mục lớn thường rẻ hơn so với gửi đồng bộ cùng lượng yêu cầu.
- Xem tài liệu và bảng giá OpenAI Batch API để biết chi tiết:
memory_search— trả về snippet kèm tệp + khoảng dòng.memory_get— đọc nội dung tệp bộ nhớ theo đường dẫn.
- Đặt
agents.defaults.memorySearch.provider = "local". - Cung cấp
agents.defaults.memorySearch.local.modelPath(GGUF hoặc URIhf:). - Tùy chọn: đặt
agents.defaults.memorySearch.fallback = "none"để tránh fallback từ xa.
Cách các công cụ bộ nhớ hoạt động
-
memory_searchtìm kiếm ngữ nghĩa các khối Markdown (~400 token mục tiêu, chồng lấp 80 token) từMEMORY.md+memory/**/*.md. 44. Nó trả về đoạn trích văn bản (giới hạn ~700 ký tự), đường dẫn tệp, phạm vi dòng, điểm số, nhà cung cấp/mô hình, và liệu có fallback từ embeddings local → remote hay không. No full file payload is returned.
-
memory_getđọc một tệp Markdown bộ nhớ cụ thể (tương đối workspace), tùy chọn từ một dòng bắt đầu và trong N dòng. 37. Các đường dẫn ngoàiMEMORY.md/memory/sẽ bị từ chối.
- Cả hai công cụ chỉ được bật khi
memorySearch.enabledphân giải true cho tác tử.
Những gì được lập chỉ mục (và khi nào)
- Loại tệp: chỉ Markdown (
MEMORY.md,memory/**/*.md). - Lưu trữ chỉ mục: SQLite theo từng tác tử tại
~/.openclaw/memory/<agentId>.sqlite(cấu hình quaagents.defaults.memorySearch.store.path, hỗ trợ token{agentId}). -
- Độ mới: watcher trên
MEMORY.md+memory/đánh dấu chỉ mục là bẩn (debounce 1,5s). Sync is scheduled on session start, on search, or on an interval and runs asynchronously. Session transcripts use delta thresholds to trigger background sync.
- Độ mới: watcher trên
-
- Kích hoạt lập chỉ mục lại: chỉ mục lưu trữ nhà cung cấp/mô hình embedding + dấu vân tay endpoint + tham số chia khối. 48. Nếu bất kỳ điều nào trong số đó thay đổi, OpenClaw tự động reset và lập chỉ mục lại toàn bộ kho.
Hybrid search (BM25 + vector)
Khi bật, OpenClaw kết hợp:- Độ tương đồng vector (khớp ngữ nghĩa, cách diễn đạt có thể khác)
- Độ liên quan từ khóa BM25 (token chính xác như ID, biến môi trường, ký hiệu code)
Vì sao hybrid?
Tìm kiếm vector rất tốt cho “ý nghĩa tương đương”:- “Mac Studio gateway host” vs “máy chạy gateway”
- “debounce cập nhật tệp” vs “tránh lập chỉ mục mỗi lần ghi”
- ID (
a828e60,b3b9895a…) - ký hiệu code (
memorySearch.query.hybrid) - chuỗi lỗi (“sqlite-vec unavailable”)
Cách chúng tôi gộp kết quả (thiết kế hiện tại)
Phác thảo triển khai:- Vector: top
maxResults * candidateMultipliertheo cosine similarity.
- Chuyển thứ hạng BM25 thành điểm 0..1-ish:
- BM25: top
maxResults * candidateMultipliertheo thứ hạng FTS5 BM25 (thấp hơn là tốt hơn).
- Chuyển thứ hạng BM25 thành điểm 0..1-ish:
textScore = 1 / (1 + max(0, bm25Rank))
- Hợp nhất ứng viên theo id khối và tính điểm có trọng số:
finalScore = vectorWeight * vectorScore + textWeight * textScore
vectorWeight+textWeightđược chuẩn hóa thành 1.0 khi phân giải cấu hình, nên trọng số hoạt động như phần trăm.- Nếu embedding không khả dụng (hoặc nhà cung cấp trả về vector rỗng), chúng tôi vẫn chạy BM25 và trả kết quả khớp từ khóa.
- Nếu không thể tạo FTS5, chúng tôi giữ tìm kiếm chỉ vector (không lỗi cứng).
- Điều này không phải là “hoàn hảo theo lý thuyết IR”, nhưng nó đơn giản, nhanh và thường cải thiện recall/precision trên ghi chú thực tế. If we want to get fancier later, common next steps are Reciprocal Rank Fusion (RRF) or score normalization (min/max or z-score) before mixing.
Embedding cache
Cấu hình: Cấu hình:Session memory search (experimental)
- Bạn có thể tùy chọn lập chỉ mục bản ghi phiên và hiển thị chúng qua
memory_search. This is gated behind an experimental flag.
- Lập chỉ mục phiên là tùy chọn (tắt theo mặc định).
- Cập nhật phiên được debounce và lập chỉ mục bất đồng bộ khi vượt ngưỡng delta (best-effort).
memory_searchkhông bao giờ chặn chờ lập chỉ mục; kết quả có thể hơi cũ cho đến khi đồng bộ nền hoàn tất.- Kết quả vẫn chỉ gồm snippet;
memory_getvẫn giới hạn ở tệp bộ nhớ. - Lập chỉ mục phiên được cô lập theo từng tác tử (chỉ log phiên của tác tử đó được lập chỉ mục).
- Session logs live on disk (
~/.openclaw/agents/<agentId>/sessions/*.jsonl). 50. Bất kỳ tiến trình/người dùng nào có quyền truy cập hệ thống tệp đều có thể đọc chúng, vì vậy hãy coi quyền truy cập đĩa là ranh giới tin cậy. For stricter isolation, run agents under separate OS users or hosts.
SQLite vector acceleration (sqlite-vec)
Khi tiện ích mở rộng sqlite-vec khả dụng, OpenClaw lưu trữ embedding trong một bảng ảo SQLite (vec0) và thực hiện các truy vấn khoảng cách vector ngay trong
cơ sở dữ liệu. This keeps search fast without loading every embedding into JS.
Cấu hình (tùy chọn):
enabledmặc định true; khi tắt, tìm kiếm fallback sang cosine similarity trong tiến trình trên embedding đã lưu.- Nếu extension sqlite-vec thiếu hoặc không tải được, OpenClaw ghi log lỗi và tiếp tục với fallback JS (không có bảng vector).
extensionPathghi đè đường dẫn sqlite-vec đi kèm (hữu ích cho bản dựng tùy chỉnh hoặc vị trí cài đặt không chuẩn).
Local embedding auto-download
- Model embedding cục bộ mặc định:
hf:ggml-org/embeddinggemma-300m-qat-q8_0-GGUF/embeddinggemma-300m-qat-Q8_0.gguf(~0.6 GB). - When
memorySearch.provider = "local",node-llama-cppresolvesmodelPath; if the GGUF is missing it auto-downloads to the cache (orlocal.modelCacheDirif set), then loads it. Downloads resume on retry. - Yêu cầu build native: chạy
pnpm approve-builds, chọnnode-llama-cpp, rồipnpm rebuild node-llama-cpp. - Fallback: nếu thiết lập local thất bại và
memorySearch.fallback = "openai", chúng tôi tự động chuyển sang embedding từ xa (openai/text-embedding-3-smalltrừ khi bị ghi đè) và ghi lại lý do.
Ví dụ endpoint tương thích OpenAI tùy chỉnh
remote.*có ưu tiên cao hơnmodels.providers.openai.*.remote.headersđược hợp nhất với header của OpenAI; remote sẽ thắng khi trùng khóa. Omitremote.headersto use the OpenAI defaults.