任车行
79.11M · 2026-04-13
把 OpenClaw 升级到最新版本后,跑一遍 openclaw doctor 是个好习惯。然而有时你会发现输出里出现了让人不安的错误:
local embeddings unavailable
Cannot find package `node-llama-cpp`
第一反应可能是:升级破坏了什么?主程序挂了?Gateway 还能用吗?
冷静下来,这个问题其实没那么严重——但它背后隐藏的配置逻辑值得彻底搞清楚,否则同样的问题会反复出现。
OpenClaw 支持一套语义内存检索机制(memory search),它允许 agent 在海量历史上下文中快速找到相关记忆片段,而不是简单地把所有内容塞进 context window。
这套机制的核心是 embedding:将文本转化为高维向量,再通过向量相似度来检索语义接近的内容。
关键在于——embedding 在哪里生成? OpenClaw 提供了两种模式:
local):在本机运行 embedding 模型,推理完全离线openai / gemini / voyage / mistral 等):调用外部 API 生成 embedding两种模式在配置文件中通过 memorySearch.provider 字段切换。
当 memorySearch.provider = "local" 时,OpenClaw 需要在本机执行模型推理。它使用的是 GGUF 格式的量化 embedding 模型,例如:
~/.node-llama-cpp/models/hf_ggml-org_embeddinggemma-300m-qat-Q8_0.gguf
这类模型的加载和推理,依赖的正是 node-llama-cpp——一个将 llama.cpp 封装为 Node.js 原生绑定的库。
所以依赖链条非常清晰:
local memory search
└── 需要本地 embedding 推理
└── 需要加载 GGUF 模型
└── 需要 node-llama-cpp
OpenClaw 本身的核心 CLI 功能、Gateway 服务,都不依赖 node-llama-cpp。 只有当你启用了本地 embedding 功能时,它才成为必要依赖。
出现 Cannot find package node-llama-cpp 的场景,几乎都是以下这种组合:
| 条件 | 状态 |
|---|---|
memorySearch.provider | "local"(已启用本地模式) |
node-llama-cpp 包 | 未安装(或升级后失效) |
两个条件同时满足,诊断工具就会报告 embedding 不可用。
这种情况常见于:
node-llama-cpp 未被一起保留诊断输出会是:
local embeddings unavailable
Cannot find package `node-llama-cpp`
注意:此时 OpenClaw 可以正常启动,Gateway 可以正常运行,只是本地内存检索的 embedding 能力缺失。这是功能降级,不是系统崩溃。
确认根因之后,修复非常直接——全局安装 node-llama-cpp:
npm install -g node-llama-cpp
安装完成后,重新运行诊断:
openclaw doctor
openclaw memory status --deep
如果一切正常,输出应该显示:
Embeddings: ready
Provider: local
Vector: ready
FTS: ready
当前环境(OpenClaw 2026.4.11,Linux x64)在完成上述步骤后已恢复正常。
修复之后,你可能还会在日志里看到这样一行:
The prebuilt binary for platform "linux" "x64" with Vulkan support is not compatible
with the current system, falling back to using no GPU
这不是错误,也不影响功能。它的含义是:
node-llama-cpp 提供了一个带 Vulkan GPU 加速的预编译二进制CPU 模式下,embedding 推理会慢一些(对于 300M 参数的小模型,实际感知差异通常不大),但功能完全可用。如果你希望消除这条警告并启用 GPU 加速,需要确保系统安装了兼容的 Vulkan 运行时,或者从源码编译 node-llama-cpp。
如果你不想依赖 node-llama-cpp,或者正在评估哪种方案最适合自己的场景,下面是三种主要选择的对比:
| 方案 | 配置方式 | 优点 | 代价 |
|---|---|---|---|
| 本地 embedding(推荐给隐私敏感场景) | memorySearch.provider = "local" | 数据完全本地处理,无网络依赖,无 API 费用 | 需要安装 node-llama-cpp,受 CPU/GPU 兼容性约束 |
| 远端 embedding API | provider = "openai" / "gemini" / "voyage" / "mistral" | 无本地依赖,环境更简洁,模型质量通常更高 | 需要有效的 API Key,产生网络请求,可能有费用 |
| 关闭 memory search | 禁用 memorySearch | 彻底移除 embedding 相关依赖,最轻量 | 失去语义记忆检索能力,agent 上下文召回能力下降 |
选择建议:
node-llama-cpp 这个依赖即可。这个问题的本质非常简单,用一句话概括:
厘清这一点,排查和修复就变得直接:确认配置意图,安装对应依赖,验证状态输出。
更重要的是,理解配置项背后的架构逻辑,才能在未来做出主动的选择——而不是每次遇到报错都手忙脚乱。无论是坚持本地推理、切换远端 API,还是彻底简化配置,选择权始终在自己手里。
酷狗网页版登录-酷狗音乐在线登录
《前端周刊》尤大开源 Vite+ 全家桶,前端工业革命启动;尤大爆料 Void 云服务新产品,Vite 进军全栈开发;ECMA 源码映射规范......
2026-04-13
2026-04-13