语义记忆数据库

基于Qdrant的本地语义记忆数据库,为AI代理提供持久化、私密且免费的语义搜索功能。

  • by rockywuest
  • JavaScript
  • 本地部署
  • 15 星标
  • 更新于
在 GitHub 查看 rockywuest/qdrant-mcp-pi5

使用说明

Raspberry Pi 5上的Qdrant MCP

人工智能代理的持久语义记忆——本地、私有,成本为0美元。

给你的AI代理一个真正的内存,它可以在重启、按意义(而不是关键字)搜索时幸存下来,并且完全在Raspberry Pi 5上运行,不依赖于云。

新 包括 OpenClaw强制执行插件 它在每次响应之前自动注入内存,不需要LLM决策。

注(2026-03-19): 漂移存储器在2026年2月被弃用——所有105个条目都迁移到了Qdrant中。这个回购现在是独立的。从全MiniLM-L6-v2(384d)迁移的嵌入→ 双子座双子座嵌入-001(3072d)通过OpenClaw的memorySearch配置。


问题

AI代理会忘记。在会话之间,上下文压缩会丢失细节,基于文本的内存搜索只会找到精确的关键字匹配。一个典型的代理人可以 第一周出现10+个内存错误 --错误的日期、陈旧的数据、将旧主题呈现为新主题。

解决方案

本地向量数据库(Qdrant)与MCP(模型上下文协议)集成。事实被存储为384维嵌入,并通过以下方式检索 语义相似度 --基于意义,而不是基于关键字。

"What's the wifi password?" → finds "Office wifi: network 'Workspace5G', password is 'correct-horse-battery'"

单词不匹配,但意思匹配。这就是区别。


堆栈

组件 版本 目的
树莓派5 8GB RAM 硬件
Qdrant MCP服务器 v0.8.1 矢量存储+搜索
双子座宝石镶嵌-001 3072-dim 嵌入模型(API,从MiniLM迁移)
麦波特 v0.7.3 MCP客户端/网桥
开爪 2026.3.13 代理框架(可选)

性能(Pi 5,ARM64)

操作 时间 备注
存储(嵌入+写入) ~3s 包括模型加载
搜索(嵌入+余弦) ~3s 包括模型加载
RAM峰值 ~200MB 在推理过程中,然后下降
存储 ~KB/条 SQLite支持,可忽略不计

快速入门(5分钟)

1.安装依赖项

# Qdrant MCP Server
pip3 install mcp-server-qdrant

# mcporter (MCP client)
npm install -g mcporter

2.创建mcporter配置

mkdir -p ~/.mcporter

创建 ~/.mcporter/mcporter.json:

{
  "mcpServers": {
    "qdrant-memory": {
      "command": "mcp-server-qdrant",
      "description": "Persistent vector memory using local Qdrant storage",
      "env": {
        "QDRANT_LOCAL_PATH": "/home/pi/.qdrant-data",
        "COLLECTION_NAME": "agent-memory"
      }
    }
  }
}

注: 使用绝对路径 QDRANT_LOCAL_PATH.Tilde(~)不会在mcporter传递的环境变量中展开。如果 mcporter list 找不到服务器,请尝试使用的完整路径 command (例如。 /home/pi/.local/bin/mcp-server-qdrant).

3.验证其是否正常工作

# Check server is registered
mcporter list

# Store a memory
mcporter call qdrant-memory.qdrant-store \
  information="The project runs on a Raspberry Pi 5 in my office"

# Search by meaning
mcporter call qdrant-memory.qdrant-find \
  query="Where does the project run?"

就是这样。没有Docker,没有云帐户,没有GPU。


运作原理

Agent wants to remember something
  ↓
mcporter call qdrant-memory.qdrant-store information="..."
  ↓
mcp-server-qdrant spawns (STDIO)
  ↓
all-MiniLM-L6-v2 creates 384-dim embedding (ONNX, CPU)
  ↓
Qdrant stores vector + text in local SQLite
  ↓
Process exits cleanly

Agent wants to recall something
  ↓
mcporter call qdrant-memory.qdrant-find query="..."
  ↓
Query embedded with same model
  ↓
Cosine similarity search over stored vectors
  ↓
Top results returned by semantic relevance

关键见解:MCP服务器 无状态 --每次呼叫它都会生成,完成它的工作,然后退出。没有守护进程占用RAM。Qdrant的本地模式使用SQLite,因此数据在没有运行服务器的情况下仍然存在。


种子脚本

使用 seed-memory.sh 要批量加载内存:

./seed-memory.sh

或存储个人事实:

mcporter call qdrant-memory.qdrant-store \
  information="Weekly standup is every Monday at 09:00 in the main conference room" \
  metadata='{"type": "recurring", "day": "monday"}'

可选 metadata 字段接受任何JSON,这对过滤或分类很有用。


用例

AI代理内存

存储决策、更正和事实。在生成响应之前,搜索内存以验证声明。防止闲聊。

个人知识库

“我把备用钥匙放在哪里了?”/“那家餐馆叫什么名字?”——对你的生活笔记进行语义搜索。

共享内存

家庭或团队信息的第二个集合——日程、约会、决定。通过聊天机器人或语音助手查询。

项目背景

存储架构决策、会议记录、需求。新团队成员可以问:“为什么我们选择Postgres而不是MongoDB?”


配置

环境变量

变量 默认值 描述
QDRANT_LOCAL_PATH 必需 本地存储目录的绝对路径
COLLECTION_NAME 必填 Qdrant集合名称
EMBEDDING_MODEL sentence-transformers/all-MiniLM-L6-v2 拥抱脸部模型ID

多个收藏

{
  "mcpServers": {
    "work-memory": {
      "command": "mcp-server-qdrant",
      "env": {
        "QDRANT_LOCAL_PATH": "/home/pi/.qdrant-data",
        "COLLECTION_NAME": "work"
      }
    },
    "personal-memory": {
      "command": "mcp-server-qdrant",
      "env": {
        "QDRANT_LOCAL_PATH": "/home/pi/.qdrant-data",
        "COLLECTION_NAME": "personal"
      }
    }
  }
}

在k3s/Docker上运行

如果您更喜欢容器化Qdrant而不是本地SQLite模式:

# k3s / Kubernetes deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: qdrant
spec:
  replicas: 1
  selector:
    matchLabels:
      app: qdrant
  template:
    metadata:
      labels:
        app: qdrant
    spec:
      containers:
      - name: qdrant
        image: qdrant/qdrant:latest
        ports:
        - containerPort: 6333
        volumeMounts:
        - name: qdrant-storage
          mountPath: /qdrant/storage
      volumes:
      - name: qdrant-storage
        persistentVolumeClaim:
          claimName: qdrant-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: qdrant
spec:
  selector:
    app: qdrant
  ports:
  - port: 6333
    targetPort: 6333

然后将mcporter指向服务器,而不是使用本地模式:

{
  "mcpServers": {
    "qdrant-memory": {
      "command": "mcp-server-qdrant",
      "env": {
        "QDRANT_URL": "http://qdrant:6333",
        "COLLECTION_NAME": "agent-memory"
      }
    }
  }
}

注: 你不能两者都用 QDRANT_URL 和 QDRANT_LOCAL_PATH 同时。使用 QDRANT_URL 对于服务器模式(Docker/k3s), QDRANT_LOCAL_PATH 用于嵌入式本地模式(不需要服务器)。


重要提示

  • OpenClaw v2026.1.30 不支持 mcpServers 在其配置模式中(网关崩溃循环)。使用mcporter作为桥梁——它通过捆绑的mcporter技能无缝工作。
  • 第一次通话速度较慢 (~3-5s),因为ONNX模型加载。后续的快速连续调用重用了该流程。
  • 嵌入模型在CPU上运行 --不需要GPU。全MiniLM-L6-v2型号针对ARM64上的ONNX运行时间进行了优化。
  • 数据是本地的 --没有任何东西离开你的设备。矢量数据库不需要API键。

硬执行插件(OpenClaw)

上述基本设置要求LLM 决定 查询Qdrant。在实践中,代理“忘记”使用内存工具——它们是可选的,LLM在急于回答时会跳过它们。

严厉执法 解决了这个问题:一个OpenClaw插件,在每次响应之前自动查询Qdrant,并将相关内存注入提示中。不需要LLM决定。

运作原理

User message arrives
  ↓
before_agent_start hook fires
  ↓
Plugin extracts user query
  ↓
mcporter calls qdrant-find
  ↓
Top 5 results injected as prependContext
  ↓
LLM sees memories BEFORE generating response

安装

cd openclaw-plugin
npm install
npm run build

# Copy to OpenClaw extensions
sudo cp -r . /usr/lib/node_modules/openclaw/extensions/nox-memory-qdrant/

# Restart OpenClaw
sudo systemctl restart openclaw-gateway

插件结构

openclaw-plugin/
├── package.json              # @nox/memory-qdrant
├── openclaw.plugin.json      # Plugin manifest
├── tsconfig.json
└── src/
    ├── index.ts              # Plugin entry + register()
    ├── qdrant-client.ts      # mcporter CLI wrapper
    └── auto-recall.ts        # before_agent_start hook

注射什么

当用户问“谁是马丁·格里斯?”时,插件:

  1. 呼叫 mcporter run qdrant-memory qdrant-find --query "Wer ist Martin Grieß?"
  2. 从Qdrant(语义搜索)获取结果
  3. 将它们注射为:
## QDRANT MEMORY RECALL (automatisch, Hard Enforcement)

Relevante Informationen aus der Vektordatenbank:

1. [87%] Martin Grieß ist Head of Data bei H. & J. Brüggen KG (Quelle: people.md)
2. [72%] Martin arbeitet eng mit dem CDO Rocky Wüst zusammen (Quelle: org.md)

---
Diese Informationen wurden automatisch abgerufen.

法学硕士看到了这一背景 之前 它开始生成——不需要做出“使用内存”的决定。

配置

该插件具有最小的配置:

{
  "enabled": true
}

跳过模式(如“hi”、“ok”、“danke”等短信)会自动处理,以避免不必要的查询。

演出

度量 值
每次查询的延迟 ~100-500ms
健康检查缓存 30秒
最大结果 5(可配置)

软执法vs硬执法

方法 工作原理 可靠性
柔软 (AGENTS.md规则) LLM指示使用Qdrant ~60-70%
困难 (此插件) Hook自动注入内存 ~99%

两者结合使用以获得最大的覆盖范围:硬执法抓住一切,软执法教会法学硕士正确引用来源。


混合架构:Qdrant+漂移存储器

Qdrant擅长 语义检索 --通过意义发现事实。但它不跟踪 怎么 代理随着时间的推移使用知识。

漂移存储器 与Qdrant相辅相成 共现追踪:

系统 擅长 示例查询
Qdrant 事实、实体、语义相似性 “马丁·格里斯是谁?”
漂移存储器 行为模式、偏好 “哪种沟通方式最有效?”

他们如何协同工作

┌─────────────────────────────────────────────────────────────┐
│                    HYBRID MEMORY STACK                       │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌─────────────────────┐     ┌─────────────────────┐        │
│  │       Qdrant        │     │    drift-memory     │        │
│  │       (WHAT)        │     │       (HOW)         │        │
│  │                     │     │                     │        │
│  │  • 384-dim vectors  │     │  • YAML files       │        │
│  │  • Cosine similarity│     │  • Co-occurrence    │        │
│  │  • Hard enforcement │     │  • Biological decay │        │
│  │  • ~3s latency      │     │  • <100ms latency   │        │
│  └─────────────────────┘     └─────────────────────┘        │
│           ↓                           ↓                      │
│   "What do I know             "How does the user            │
│    about X?"                   prefer to work?"              │
│                                                              │
└─────────────────────────────────────────────────────────────┘

关键洞察

漂移记忆维护者:

“Co-occurrence告诉你代理如何使用它的知识。向量嵌入告诉你什么是语义相似的。它们有不同的用途。”

回忆在一起变得相互联系。在会话过程中,模式会有机地出现——不需要手动关系标记。

整合

  1. 使用Qdrant 事实检索 (此回购)
  2. 使用漂移存储器 行为模式 (漂移存储器仓库)
  3. 两者都可以在Pi 5上运行,资源冲突最小

链接


许可证

麻省理工学院