经常有朋友问我:“你那 套 OpenClaw 到底强在哪?我用网页版 ChatGPT 不也一样吗?”

我通常只问一个问题:“你的 AI,记得你去年这个时候在发愁什么吗?”

这就是普通用户和深度玩家的分水岭。网页版 AI 是个“流浪汉”,聊完就忘;而我们要打造的是一个 “数字孪生” ,它得有记忆,而且是长期记忆。这需要给它配一个称职的“图书馆管理员”——Embedding 模型

今天,我们介绍这个“AI 长期记忆”的灵魂组件,并教你如何在自家的 NAS 或破电脑上,低成本搭建一个私有化的、超强悍的记忆中心。


一、 到底什么是 Embedding?它怎么管记忆?

你有没有发现,AI 变笨往往是从“健忘”开始的?你告诉它你喜欢简洁的代码风格,结果三轮对话后,它又给你吐出一大堆注释。这其实是因为 AI 找记忆的逻辑太死板了。

你可以把 AI 的大脑想象成一个巨大的、乱糟糟的图书馆,里面塞满了你和它的聊天记录、你的文档和各种偏好设置。

1. 传统搜索:死板的“对暗号”

如果没有 Embedding,AI 找东西只能靠“搜关键词”。 比如你搜“如何强身健体”,AI 能找到包含这六个字的文件。但如果你的笔记里写的是“锻炼身体的几种方法”,AI 就卡住了。因为它不理解这两个说法其实是一个意思。这就是为什么 AI 总是显得“记性不好”。

2. Embedding 搜索:聪明的“地图定位”

有了 Embedding 之后,AI 会在后台把每一段文字变成一串“坐标”。 它不是在查字,而是在“地图”上找位置。它知道“强身健体”和“锻炼身体”在语义地图上的坐标离得非常近。

当你提问时,AI 会先计算你问题的坐标,然后在地图上瞬间定位到离你最近的记忆。这种语义联想能力,才是让 AI “真正懂你”的核心。

3. OpenClaw的长期记忆

OpenClaw的长期记忆功能是一种 Embedding(向量搜索) + BM25(关键字搜索) 的混合搜索。但是如果你不提供Embedding功能,它只能退化为单纯BM25,也就是关键词搜索。如果你对当时讨论内容只有一个模糊印象,却记不住精准的关键字,只有Embedding记忆才能帮助你。


二、 为什么非要私有化部署?

你可以花钱用 OpenAI 提供的 Embedding API,这是最方便的。但对于咱们“折腾党”来说,私有化部署有三个不可替代的理由:

  1. 隐私保护:你的日记、密码、甚至私密笔记,不需要发往云端进行向量化处理。所有数据都在你自己的硬盘上,这才是真正的安全。

  2. 速度与额度:API 经常抽风,还有次数限制。私有化部署后,你哪怕一秒钟存一万条笔记,也不用花一分钱。

  3. 中文灵魂:我们要用的 BAAI/bge-m3 模型,是真正的“中文大拿”,它能懂那些复杂的中文语境和双关语,这是洋模型比不了的。


三、 实战:在 CPU 环境下高性能部署

很多人的电脑/服务器(比如 NAS)并没有显卡(GPU),只能在 CPU 上硬扛。别担心,只要配置得当,CPU 也能飞快。

我们将使用 Infinity 作为服务框架。它轻量、极速,而且完全兼容 OpenAI 的接口格式。

1. 核心配置清单

建议在你的服务器里建一个目录,比如(以Unraid为例) /mnt/user/appdata/embeddings-bge-m3,创建以下 docker-compose.yml 文件。

下面配置包含:CPU 线程优化、OpenAI 兼容 /v1 路由前缀、bge-m3、torch 引擎、int8、端口映射、API key。

线程数量取决于你的电脑配置。这里默认是 6。如果以后想更高吞吐,可以再把这些 6 改成 8 去对比测试。int8 量化通常会明显降低 CPU 推理成本,适合 NAS 这种长期常驻服务。

services:  
  embeddings:  
    image: michaelf34/infinity:latest  
    container_name: embeddings-bge-m3  
    restart: unless-stopped  
    ports:  
      - "7997:7997"  
    volumes:  
      - /mnt/user/appdata/embeddings-bge-m3:/data  

    env_file:  
      - .env  

    environment:  
      - OMP_NUM_THREADS=6  
      - MKL_NUM_THREADS=6  
      - OPENBLAS_NUM_THREADS=6  
      - NUMEXPR_NUM_THREADS=6  
      - KMP_AFFINITY=granularity=fine,compact,1,0  

    command: >  
      v2  
      --port 7997  
      --url-prefix /v1  
      --model-id BAAI/bge-m3  
      --engine torch  
      --dtype int8  
      --api-key ${INFINITY_API_KEY}

2. 避坑指南:.env 文件的“玄学”

我们使用.env存储api-key,不要把它明文放在 docker-compose.yml 里。不过千万记住:它不是 YAML 格式

  • ❌ 错误:- KEY: value

  • ✅ 正确:KEY=value(不加引号,不加空格,不缩进)。 这个小坑曾困扰了我们好几个小时,请务必留意。

3. 启动与测试

在当前目录(/mnt/user/appdata/embeddings-bge-m3)下启动:

docker compose up -d

如果你改了 commandenvironmentenv_file 这类配置,不要只做 restart。更好的做法是 down 再 up(重建容器),否则很容易出现“你以为改了,但容器还在用旧参数”。

你可以用下面命令确认容器真实启动参数是否已经包含 --url-prefix /v1--api-key

docker inspect embeddings-bge-m3 --format '{{json .Config.Cmd}}'

4. 验证接口:本机与局域网两层验证

先在 Unraid 宿主机上验证服务:

curl -s http://127.0.0.1:7997/health  
curl -s http://127.0.0.1:7997/v1/models

再在局域网 Windows 机器验证:

curl -v --max-time 5 http://你的服务器IP:7997/health  
curl -s http://你的服务器IP:7997/v1/models

最后测试 embeddings。Windows cmd 不能用单引号包 JSON,所以用双引号并转义:

curl -s http://你的服务器IP:7997/v1/embeddings -H "Content-Type: application/json" -H "Authorization: Bearer 你的API-Key" -d "{\"model\":\"BAAI/bge-m3\",\"input\":\"你好呀,吃了没?\"}"

如果你用的是 PowerShell,单引号也可以用。

5. 最终你应该得到的结果

你最终应当能稳定得到:

  • GET http://你的服务器IP:7997/health 返回时间戳 JSON

  • GET http://你的服务器IP:7997/v1/models 返回模型列表 JSON

  • POST http://你的服务器IP:7997/v1/embeddings 能返回 OpenAIEmbeddingResult 结构

  • 不带 Authorization 时返回 401/403(鉴权开启)

  • Authorization: Bearer ... 时返回 200(鉴权通过)


四、 最终一步:接通 OpenClaw 的“神经元”

当你的服务跑起来后(可以通过 http://你的服务器IP:7997/v1/models 验证),只需要在 OpenClaw 里执行一条命令,就能让 AI 瞬间获得“过目不忘”的能力:

"agents": {
  "defaults": {
    "memorySearch": {
      "provider": "openai",
      "model": "BAAI/bge-m3",
      "remote": {
        "baseUrl": "https://你的IP或者域名/v1",
        "apiKey": "你的API-Key"
      },
      "query": {
        "hybrid": {
          "enabled": true,
          "vectorWeight": 0.75,
          "textWeight": 0.25
        }
      }
    }
  }
}

五、 结语:让 AI 从“玩具”变成“助理”

配好 Embedding 后的 AI,才真正具备了“长期协作”的基础。它能记住你的偏好,能从成千上万条旧回忆里精准地翻出你想要的那一页。

不仅OpenClaw的长期记忆需要这个Embedding服务。我们后面介绍的运行在OpenClaw上的Micro-RAG,一个精练的个人知识系统也需要到它。

安全、私密、过目不忘,这才是我们折腾 OpenClaw 的真正乐趣。


Ernest 的碎碎念: 如果你发现你的 Agent 总是在同一个坑里摔倒,或者每次聊天都要从头介绍自己,那别犹豫了,赶紧去把 Embedding 给配上。这是 AI 真正产生“智感”的关键。

参考引用:

  • 本项目参考了 OpenClaw 官方文档及 BAAI 社区的 bge-m3 模型规范。

  • 部署环境:Unraid (Docker).