把 RAG 落在 租用的遠端 Mac 上時,Chroma 既是效能優勢也是維運單點:磁碟寫滿、查詢拖尾、權限錯置會在 OpenClaw 閘道背後放大成「助手失聲」。本篇以 AI 算力落地教學整理 持久化目錄、快照、探針與磁碟告警、逾時與熔斷。基線見Docker 部署與生產加固;閘道規則見閘道指標與閾值告警 HowTo;與容器共用碟時參考Docker/Podman 拉取與快取矩陣預留空間。
Chroma 持久化目錄與快照步驟
內嵌或 chroma run 伺服器皆落在您指定的 持久化目錄。租賃主機當成小資料庫:單一絕對路徑、自動化帳號可寫、空間可預測,盡量避開系統根分區。將 CHROMA_PERSIST_DIRECTORY 寫入 shell、launchd 或 compose bind mount,並讓 OpenClaw 技能讀同一變數。
可複現快照(檔案系統一致)。 一、停止寫入者:關閉內嵌行程或停掉 Chroma 容器,讓 SQLite 與 segment 不在交易中。二、記錄 manifest:集合名稱、嵌入模型 id、Chroma 版本字串——還原演練常敗在客戶端主版本與磁碟格式不相容。三、在停寫後打包,保留中繼資料:
# 僅在 Chroma 已停止時執行;請替換路徑
export SRC="$CHROMA_PERSIST_DIRECTORY"
export STAMP=$(date -u +%Y%m%dT%H%M%SZ)
tar -C "$(dirname "$SRC")" -czf "/backup/chroma-${STAMP}.tgz" "$(basename "$SRC")"
shasum -a 256 /backup/chroma-${STAMP}.tgz > /backup/chroma-${STAMP}.tgz.sha256
rsync -a --delete 到 NAS 亦可;至少兩代本機+一代離機。四、驗證:異機解到暫存目錄,對集合跑 count()。五、重啟服務並把還原指令寫進 Runbook。熱備份易遇 database is locked;嚴格 RPO 請用支援線上備份的後端或短維護窗。
OpenClaw 健康探針與告警模板
OpenClaw 閘道在 HTTP 監聽(常見 127.0.0.1:18789)提供 /healthz、/readyz,是控制面的心跳:探針失敗時,不論向量庫好壞,都不應假裝助理可用。於 SSH 內先本機驗證:
curl -fsS http://127.0.0.1:18789/healthz
curl -fsS http://127.0.0.1:18789/readyz
Prometheus、blackbox 或託管合成監控皆可沿用既有 scrape 模式;關鍵是標籤:env、instance、租賃商例項 id,讓告警去重與分派正確。
磁碟告警與閘道並列:Chroma 成長隨文件量與 segment 合併,寫滿會拖垮 SQLite。以 node_exporter 或週期 df 匯出可用位元組。警告約低於 20 GB;嚴重約低於 5 GB 或預估兩小時內滿碟。伺服器模式可另探已知埠,仍以卷空間為主訊號。
| 訊號 | 入門條件 | 備註 |
|---|---|---|
| 閘道 /healthz | 連續 2 次非 HTTP 200 | 互動場景建議 15~30 秒間隔 |
| 閘道 /readyz | 失敗且 /healthz 仍成功 | 多為依賴或設定;先查日誌再懷疑 Chroma |
| 卷可用空間 | avail < 20e9 警告/< 5e9 嚴重 | 按「資料卷」而非根分區聚合 |
| Chroma HTTP(選用) | 對綁定埠做存活偵測 | 僅在伺服器模式且埠固定時有意義 |
告警註解附 Runbook:令牌、磁碟、回滾 tarball。
查詢逾時/熔斷參數
Chroma 查詢延遲隨集合大小、過濾複雜度與併發 HNSW 存取上升。OpenClaw 工具若無截止時間,會餓死工作階段工作者並在多通道重試時放大風暴。請把逾時設在最靠近 collection.query 或對 chroma run 的 HTTP 用戶端那一層,而非只在「上游 LLM 逾時」含糊帶過。
互動 RAG 建議起點:在 Apple Silicon 上、百萬級向量內、適度過濾的 top-k 相似度查詢,客戶端截止約 4~8 秒;離線對帳或批處理可拉到 15~30 秒,但勿掛在關鍵互動路徑。搭配每閘道行程 2~4 條併發查詢上限,避免群組聊天尖峰打穿索引。
熔斷草圖:約五分鐘內連續逾時/5xx/空索引達三次則開啟 30~120 秒,回傳降級文案並記 error_class=chroma_breaker_open;冷卻後半開試探針。可與多專案 API 預算並用。
# asyncio 截止示意
import asyncio
async def query_with_cap(coro, seconds=6.0):
return await asyncio.wait_for(coro, timeout=seconds)
同步堆疊可用 httpx.Client(timeout=6.0) 或 gRPC deadline。把選定數字寫進技能 manifest,讓 on-call 分辨「調參問題」與「真實故障」。
常見權限與路徑報錯 FAQ
PermissionError: [Errno 13] 指向持久化路徑。 執行 OpenClaw 的租賃使用者不擁有該目錄——常見於還原映像或換碟後。以 sudo chown -R $USER:staff "$CHROMA_PERSIST_DIRECTORY" 修正,或重建目錄後以 rsync -a 遷移資料。
sqlite3.OperationalError: database is locked。 兩個行程同開同一持久化目錄,或備份在寫入進行中複製了 *.sqlite*。停掉所有 Chroma 實例,用 lsof 確認路徑無句柄,再只啟動單一擁有者。
launchd 與 SSH 下相對路徑不一致。 plist 與 compose 一律用絕對路徑;~/chroma 在 GUI 與 SSH 工作目錄下展開可能不同。
大小寫與 APFS 選項。 外接卷若與開發機大小寫敏感度不同,目錄與快照資料夾名稱建議統一小寫,避免自動化找不到檔案。
Docker bind mount。 宿主路徑須在 docker compose up 前存在;日後若遷到 Linux worker,權限標籤邏輯類似,Runbook 仍可沿用「單一路徑、單一擁有者」原則。