← Back to Plugins
Tools

Semantic Memory

zuiho-kai By zuiho-kai 👁 55 views ▲ 0 votes

OpenClaw semantic memory plugin with local embeddings and vector search

GitHub

Install

npm install
```

Configuration Example

{
  "plugins": {
    "semantic-memory": {
      "enabled": true,
      "autoCapture": false,  // 默认关闭,需要时手动开启
      "autoRecall": true,
      "captureMaxChars": 500
    }
  }
}

README

# openclaw-semantic-memory

OpenClaw 本地语义记忆插件,基于向量搜索和 Transformers.js 实现零配置的语义搜索。

**📦 ClawHub**: https://clawhub.ai/skills/semantic-memory

## 特性

- 🧠 **本地语义搜索** - 使用 Transformers.js 在本地生成 embeddings
- 💾 **磁盘持久化** - 默认保存到磁盘,重启后数据不丢失
- 🔄 **自动捕获** - 通过 lifecycle hooks 自动记录重要信息
- 🎯 **智能召回** - 根据上下文自动检索相关记忆

## 安装

### 通过 ClawHub(推荐)

```bash
clawhub install semantic-memory
```

### 手动安装

```bash
cd ~/.openclaw/plugins
git clone https://github.com/zuiho-kai/openclaw-semantic-memory.git semantic-memory
cd semantic-memory
npm install
```

### 安装要求

**首次运行准备:**

1. **Node.js 版本**: 需要 Node.js ≥18.17
   ```bash
   node --version  # 检查版本
   ```

2. **构建工具**(用于编译原生依赖):
   - **Windows**: Visual Studio Build Tools
     ```powershell
     npm install --global windows-build-tools
     ```
   - **macOS**: Xcode Command Line Tools
     ```bash
     xcode-select --install
     ```
   - **Linux**: build-essential
     ```bash
     sudo apt-get install build-essential  # Debian/Ubuntu
     sudo yum groupinstall "Development Tools"  # RHEL/CentOS
     ```

3. **网络访问**:
   - 安装时需要访问 npmjs.com 下载依赖包
   - 首次运行时会从 huggingface.co 下载 embedding 模型(约 25MB)
   - 如果配置了外部 Qdrant 服务器,需要能访问该服务器

4. **原生依赖**:
   - `sharp`: 图像处理库(可能需要编译)
   - `onnxruntime`: ML 推理引擎(可能需要编译)
   - `undici`: HTTP 客户端(通过 @qdrant/js-client-rest 引入)

### 推荐安装方式

```bash
# 使用 npm ci 确保可重现的安装(推荐用于生产环境)
npm ci

# 或者分步安装(用于调试)
npm install --ignore-scripts  # 跳过 post-install 脚本
npm rebuild                    # 然后重新构建原生模块
```

### 故障排除

**问题: 原生模块编译失败**
- 确保已安装对应平台的构建工具
- 尝试清理缓存: `npm cache clean --force`
- 删除 node_modules 重新安装: `rm -rf node_modules && npm install`

**问题: 模型下载失败**
- 检查网络连接和防火墙设置
- 确保能访问 huggingface.co
- 模型会缓存在 `~/.cache/huggingface/` 目录

**问题: Node 版本不兼容**
- 升级到 Node.js 18.17 或更高版本
- 使用 nvm 管理多个 Node 版本: `nvm install 18 && nvm use 18`

## 配置

在 OpenClaw 配置文件中启用插件:

```json
{
  "plugins": {
    "semantic-memory": {
      "enabled": true,
      "autoCapture": false,  // 默认关闭,需要时手动开启
      "autoRecall": true,
      "captureMaxChars": 500
    }
  }
}
```

### 配置选项

- **qdrantUrl** (可选): 外部 Qdrant 服务地址,留空使用内存模式
- **persistToDisk** (默认 true): 在内存模式下将记忆保存到磁盘
  - 数据存储在 `~/.openclaw-memory/` 目录(或自定义路径)
  - 重启后数据不会丢失
  - 设置为 false 使用纯内存模式(重启后清空)
  - 仅在内存模式下生效(未配置 qdrantUrl 时)
- **storagePath** (可选): 自定义存储目录
  - 留空使用默认路径 `~/.openclaw-memory/`
  - 支持 `~` 符号表示用户主目录
  - 仅在 `persistToDisk: true` 时生效
- **autoCapture** (默认 false): 自动记录对话内容
  - ⚠️ **隐私保护**: 默认会跳过包含 PII(邮箱、电话号码)的文本
  - 需要配合 `allowPIICapture` 才能捕获 PII
- **allowPIICapture** (默认 false): 允许捕获包含 PII 的文本
  - ⚠️ **隐私风险**: 仅在理解隐私影响后启用
  - 需要 `autoCapture` 同时启用才生效
- **autoRecall** (默认 true): 自动注入相关记忆到对话
- **captureMaxChars** (默认 500): 单条记忆最大字符数
- **maxMemorySize** (默认 1000): 内存模式下的最大记忆条数
  - 仅在内存模式下生效(未配置 qdrantUrl 时)
  - 达到上限时自动删除最旧的记忆(LRU 淘汰策略)
  - 范围:100-1000000 条
  - 设置为 999999 表示无限制(不会自动删除旧记忆)
  - ⚠️ 无限制模式可能导致内存耗尽,请谨慎使用
  - 外部 Qdrant 模式不受此限制

## 隐私与安全

### 数据存储

- **磁盘持久化**(默认): 数据保存到 `~/.openclaw-memory/` 并在重启后恢复
  - 设置 `persistToDisk: false` 可切换到纯内存模式(重启后清空)
- **Qdrant 模式**: 如果配置了 `qdrantUrl`,数据会发送到该服务器
  - ⚠️ 仅配置受信任的 Qdrant 服务器
  - 建议使用本地 Qdrant 实例或专用服务账户

### 网络访问

- **首次运行**: Transformers.js 会从 Hugging Face 下载模型文件(约 25MB)
- **运行时**: 内存模式无网络请求;Qdrant 模式会连接配置的服务器

### 自动捕获

- **autoCapture** 默认关闭,需要手动开启
- **PII 保护**: 默认情况下,即使启用 autoCapture,包含邮箱或电话号码的文本也会被自动跳过
- **allowPIICapture**: 设置为 true 才能捕获包含 PII 的文本
  - ⚠️ **仅在理解隐私风险后启用**
  - 适用场景:个人笔记、测试环境
  - 不适用场景:共享环境、生产环境、处理他人数据
- 建议仅在个人环境使用,避免在共享或生产环境开启

### 建议

1. 首次使用时在隔离环境测试
2. 审查 `index.js` 了解数据处理逻辑
3. 敏感环境建议锁定依赖版本(`npm ci`)
4. 定期检查存储的记忆内容

## 使用

插件提供三个工具:

### memory_store
保存重要信息到长期记忆:

```javascript
memory_store({
  text: "用户喜欢用 Opus 处理复杂任务",
  category: "preference",
  importance: 0.8
})
```

### memory_search
搜索相关记忆:

```javascript
memory_search({
  query: "工作流程",
  limit: 5
})
```

### memory_forget
删除特定记忆:

```javascript
memory_forget({
  memoryId: "uuid-here"
})
// 或通过搜索删除
memory_forget({
  query: "要删除的内容"
})
```

## 技术细节

### 架构

- **向量数据库**: Qdrant (内存模式)
- **Embedding 模型**: Xenova/all-MiniLM-L6-v2 (本地运行)
- **模块系统**: ES6 modules

### 关键实现

插件使用**工厂函数模式**导出工具,确保与 OpenClaw 的工具系统兼容:

```javascript
export default {
  name: 'semantic-memory',
  version: '1.0.0',
  tools: [
    () => ({
      name: 'memory_search',
      description: '...',
      parameters: { ... },
      execute: async (params) => { ... }
    })
  ]
}
```

### 常见问题

**Q: 为什么要用工厂函数?**

A: OpenClaw 的工具系统会调用 `tool.execute()`,直接导出对象会导致 `tool.execute is not a function` 错误。工厂函数确保每次调用都返回新的工具实例。

**Q: 为什么要用 ES6 modules?**

A: OpenClaw 的插件加载器期望 ES6 模块格式。需要在 `package.json` 中设置 `"type": "module"`。

**Q: 数据存储在哪里?**

A: 内存模式下数据仅在进程运行期间保存。重启后需要重新索引。未来版本会支持持久化存储。

## 开发

```bash
# 安装依赖
npm install

# 测试(需要 OpenClaw 环境)
openclaw gateway restart
```

## 许可证

MIT

## 致谢

- [Qdrant](https://qdrant.tech/) - 向量数据库
- [Transformers.js](https://huggingface.co/docs/transformers.js) - 本地 ML 推理
- [OpenClaw](https://openclaw.ai/) - AI 助手框架
tools

Comments

Sign in to leave a comment

Loading comments...