diff --git a/README.md b/README.md index 3f91696..c24ec1e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,17 @@ -# knowledge-base +# Mem0 Self-Host 知识库 +本仓库用于整理 Mem0 部署、架构和运维相关的知识。 + +## 目录 + +- [基础概念](./01-basics.md) - Mem0 是什么、self-host 是什么意思 +- [架构详解](./02-architecture.md) - TEI、Qdrant、PostgreSQL、Neo4j、LLM 的关系 +- [部署方案](./03-deployment.md) - K8s 部署方案、所需环境变量 +- [你的基础设施](./04-your-infra.md) - TEI namespace 下的已有服务 +- [常见问题](./05-faq.md) - FAQ 和已知问题 + +--- + +## 来源 + +本知识库由 AI Agent (Hermes) 根据 2025-05-29 的对话整理。 \ No newline at end of file diff --git a/mem0/01-basics.md b/mem0/01-basics.md new file mode 100644 index 0000000..c56428f --- /dev/null +++ b/mem0/01-basics.md @@ -0,0 +1,44 @@ +# Mem0 基础概念 + +## 什么是 Mem0 + +Mem0 是一个 **AI 记忆层**(Memory Layer),为大语言模型提供持久化记忆能力。 + +核心功能: +- 存储 AI 与用户的对话记忆 +- 语义搜索相关记忆 +- 记忆关联推理 + +## Self-Host 是什么 + +Self-host(自托管)= 把 Mem0 部署在自己服务器上,而不是使用官方云服务。 + +| 方式 | 说明 | 数据位置 | +|------|------|----------| +| **官方云服务** | 调用 mem0.ai 的 API | 数据在第三方服务器 | +| **Self-host** | 自己部署 mem0 代码 | 数据完全在自己控制 | + +### Self-host 的优势 + +1. **数据隐私** - 所有数据不经过第三方 +2. **网络可控** - 可运行在私有网络/内网 +3. **成本可控** - 无 API 调用费用,适合大规模使用 +4. **定制灵活** - 可修改源码,切换向量数据库 + +## Mem0 官方仓库 + +- GitHub: `mem0ai/mem0` +- 主要分支/目录: + - `server/` - FastAPI 服务,完整功能(需 PostgreSQL + pgvector + Neo4j) + - `openmemory/` - 轻量版本(已 sunset,建议用 server/) + +## OpenMemory 和 Mem0 的关系 + +`openmemory/` 是 `mem0ai/mem0` 仓库下的一个**子目录/组件**,不是独立项目。 + +| 目录 | 存储后端 | 架构复杂度 | 状态 | +|------|---------|-----------|------| +| `server/` | PostgreSQL + pgvector + Neo4j | 高 | ✅ 维护中 | +| `openmemory/` | Qdrant only | 低 | ⚠️ 已 sunset | + +> ⚠️ 官方建议新部署使用 `server/` 目录 \ No newline at end of file diff --git a/mem0/02-architecture.md b/mem0/02-architecture.md new file mode 100644 index 0000000..fdd9205 --- /dev/null +++ b/mem0/02-architecture.md @@ -0,0 +1,100 @@ +# Mem0 架构详解 + +## 整体架构 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Mem0 Server │ +│ (总控,协调所有组件) │ +└─────────────────────────────────────────────────────────────┘ + │ │ │ │ + ▼ ▼ ▼ ▼ + ┌────────┐ ┌─────────┐ ┌──────────┐ ┌────────┐ + │ TEI │ │ Qdrant │ │PostgreSQL│ │ LLM │ + │(向量) │ │(向量库) │ │ (关系数据)│ │(回答) │ + └────────┘ └─────────┘ └──────────┘ └────────┘ + 生成向量 存/搜向量 存元数据/关系 生成自然语言 +``` + +## 各组件职责 + +| 组件 | 类型 | 职责 | 你的环境 | +|------|------|------|----------| +| **TEI** | Text Embeddings Inference | 把文本转换成向量(embeddings) | BGE-M3 模型 | +| **Qdrant** | 向量数据库 | 存储向量 + 原始文本,搜索相似向量 | tei namespace | +| **PostgreSQL** | 关系数据库 | 存储用户数据、记忆元数据、关系链 | tei namespace | +| **LLM** | 大语言模型 | 把向量检索结果组织成自然语言回答 | 待确认 | +| **Neo4j** | 图数据库 | 存储记忆之间的关联关系(可选) | 可选,暂不需要 | + +## 读写流程 + +### 写入记忆(2次请求) + +``` +用户 → Mem0: "今天吃了火锅" + │ + ├→ TEI: 生成向量 [0.123, -0.456, ...] + │ │ + ├→ Qdrant: 存储向量 + 原始文本 + │ │ + └→ PostgreSQL: 存储元数据/关系 +``` + +### 搜索记忆(3次请求) + +``` +用户 → Mem0: "最近吃了什么" + │ + ├→ TEI: 生成查询向量 [0.456, ...] + │ │ + ├→ Qdrant: 搜索相似向量 → 返回 "今天吃了火锅" + │ │ + ├→ PostgreSQL: 查询关联元数据 + │ │ + └→ LLM: 组织自然语言回答 + │ + ▼ + 用户得到回答 +``` + +## TEI 和 Qdrant 的关系 + +**TEI 和 Qdrant 完全独立,不知道对方存在**,全靠 Mem0 Server 在中间协调。 + +| 比喻 | 说明 | +|------|------| +| **TEI** | 翻译软件,把中文翻译成密码(向量) | +| **Qdrant** | 图书馆,把密码对应的书存起来、搜出来 | + +### 数据流 + +``` +Mem0 Server + │ + ├── 调用 TEI ────────→ TEI(只吐向量) + │ + └── 调用 Qdrant ──── → Qdrant(只存/搜向量) +``` + +## 为什么需要两者 + +- **TEI**:把文字变成数字,才能做语义计算 +- **Qdrant**:高效存储和搜索海量向量 + +两者缺一不可,分工不同。 + +## Neo4j(可选) + +Neo4j 是图数据库,存储**记忆之间的关系**,用于复杂推理。 + +### 何时需要 +- 多跳问答("我老婆的表哥的同事") +- 知识图谱构建 +- 社交网络分析 + +### 何时不需要 +- 普通语义搜索 +- 个人记忆库 +- RAG 增强 + +**建议:先不加 Neo4j,只用 Qdrant + PostgreSQL,跑起来后再按需扩展。** \ No newline at end of file diff --git a/mem0/03-deployment.md b/mem0/03-deployment.md new file mode 100644 index 0000000..1deacb7 --- /dev/null +++ b/mem0/03-deployment.md @@ -0,0 +1,120 @@ +# Mem0 部署方案 + +## 部署选项 + +### 选项 A:server/(完整功能) + +| 组件 | 说明 | +|------|------| +| **Mem0 Server** | FastAPI 服务 | +| **PostgreSQL + pgvector** | 关系数据 + 向量存储 | +| **Neo4j** | 图数据库(可选) | + +### 选项 B:openmemory/(轻量,已 sunset) + +仅需 Qdrant,但官方已停止维护,不建议使用。 + +--- + +## K8s 部署(server/ 方案) + +### 你已有的基础设施 + +``` +tei namespace 下已有: +├── Qdrant ← 向量数据库 +├── PostgreSQL ← 关系数据库 +├── Dify ← 编排平台(LLM 能力?) +├── TEI ← Text Embeddings Inference +└── BGM ← BGE-M3 嵌入模型服务 +``` + +### 部署架构 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Mem0 Pod │ +│ ├── mem0-server (main container) │ +│ │ - Port: 8000 │ +│ │ - 连接 TEI、Qdrant、PostgreSQL、LLM │ +│ └── git-sync (sidecar, 可选) │ +│ - 从 Gitea 拉取配置/知识库 │ +└─────────────────────────────────────────────────────────────┘ + │ + ├─ TEI: http://tei-server:8080 + ├─ Qdrant: http://qdrant:6333 + ├─ PostgreSQL: postgres:5432 + └─ LLM: 待确认(Dify / OpenAI 代理 / Ollama) +``` + +### 核心环境变量 + +```bash +# PostgreSQL(已有) +POSTGRES_HOST=postgres +POSTGRES_PORT=5432 +POSTGRES_DB=mem0 +POSTGRES_USER=postgres +POSTGRES_PASSWORD=xxx +APP_DB_NAME=mem0_app + +# Qdrant(已有) +QDRANT_HOST=qdrant +QDRANT_PORT=6333 + +# TEI Embedder(已有) +EMBEDDER_PROVIDER=tei +TEI_ENDPOINT=http://tei-server:8080 + +# LLM(待确认) +LLM_PROVIDER=openai # 或 dify / ollama / anthropic +OPENAI_API_KEY=xxx # 或通过 Dify + +# Auth +JWT_SECRET=xxx +ADMIN_API_KEY=xxx +AUTH_DISABLED=false + +# Telemetry(国内建议关闭) +MEM0_TELEMETRY=false +``` + +### 你需要准备的内容 + +1. [ ] 确认 LLM 来源(Dify / OpenAI 代理 / Ollama) +2. [ ] 确认 PostgreSQL 数据库已创建(`mem0` 数据库) +3. [ ] 确认 Qdrant collection 已创建(或让 mem0 自动创建) +4. [ ] 配置环境变量 +5. [ ] 编译/获取 mem0 镜像 + +--- + +## 国内网络问题 + +### 问题 + +- 无法访问 Docker Hub +- 无法访问 GitHub raw content + +### 解决方式 + +1. **镜像提前导入**:在有网环境 `docker pull` 后 `docker save`,导入到 K8s 节点 +2. **内网镜像仓库**:配置私有的 Harbor 或 registry +3. **代码构建**:下载代码后 `docker build` 本地镜像 + +### 建议的镜像来源 + +| 镜像 | 国内可用的 registry | +|------|-------------------| +| pgvector | `registry.cn-hangzhou.aliyuncs.com` 搜索 | +| neo4j | `docker.m.daocloud.io/neo4j` (DaoCloud) | +| mem0 | 需自行 build 或找社区镜像 | + +--- + +## 待完成 + +- [ ] 确认 mem0 代码可下载 +- [ ] 确认 LLM 来源 +- [ ] 生成 K8s YAML 文件 +- [ ] 测试部署 \ No newline at end of file diff --git a/mem0/04-your-infra.md b/mem0/04-your-infra.md new file mode 100644 index 0000000..4179c80 --- /dev/null +++ b/mem0/04-your-infra.md @@ -0,0 +1,62 @@ +# 你的基础设施 + +## K8s 集群 + +- **Namespace**: `tei` +- **已有组件**: Qdrant, PostgreSQL, Dify, TEI, BGE-M3 + +## 服务列表 + +### TEI (Text Embeddings Inference) +- **服务名**: `tei` (在 tei namespace) +- **模型**: BGE-M3 (BGM-M3) +- **用途**: 生成文本向量(embeddings) +- **特点**: 中文支持好,比 OpenAI embedder 更适合中文 + +### Qdrant +- **服务名**: `qdrant` +- **端口**: 6333 (HTTP), 6334 (gRPC) +- **用途**: 向量数据库,存储和搜索向量 +- **注意**: Mem0 Server 通过 Qdrant 的 HTTP API 连接 + +### PostgreSQL +- **服务名**: `postgres` +- **端口**: 5432 +- **扩展**: pgvector(用于向量支持) +- **用途**: 存储用户数据、记忆元数据、关系数据 + +### Dify +- **服务名**: `dify` +- **用途**: 编排平台,可能提供 LLM 能力 +- **注意**: 需确认 Dify 是否作为 LLM Provider 接入 Mem0 + +### BGE-M3 / BGM-M3 +- **模型**: BAAI General Embedding Model - M3 +- **部署方式**: 通过 TEI 推理服务 +- **特点**: 支持 100+ 语言,中文效果优秀 + +## 网络架构 + +``` +Mem0 Pod(在 tei namespace) + │ + ├── TEI: http://tei-server:8080 + │ └── 模型: BGE-M3 + │ + ├── Qdrant: http://qdrant:6333 + │ + ├── PostgreSQL: postgres:5432 + │ + └── LLM: 待确认 + ├── 选项 1: Dify + ├── 选项 2: OpenAI 代理 + └── 选项 3: Ollama (本地模型) +``` + +## 待确认事项 + +1. [ ] TEI 服务的具体地址和端口 +2. [ ] Qdrant 是否需要手动创建 collection +3. [ ] PostgreSQL 是否已创建 `mem0` 数据库 +4. [ ] Dify 的 LLM API 是否可用 +5. [ ] LLM 最终选择(Dify / OpenAI 代理 / Ollama) \ No newline at end of file diff --git a/mem0/05-faq.md b/mem0/05-faq.md new file mode 100644 index 0000000..bdc161e --- /dev/null +++ b/mem0/05-faq.md @@ -0,0 +1,77 @@ +# Mem0 常见问题 + +## Q: Mem0 和 OpenMemory 是什么关系? + +A: OpenMemory 是 `mem0ai/mem0` 仓库下的一个子目录,不是独立项目。OpenMemory 使用 Qdrant 作为唯一存储后端,已被官方废弃(sunset),建议使用 `server/` 目录。 + +## Q: 为什么需要 TEI 和 Qdrant 两个东西? + +A: 它们是完全不同的组件,分工合作: +- **TEI**:把文本转换成向量(理解语义) +- **Qdrant**:存储向量 + 搜索相似向量 + +类比:TEI 是翻译软件,Qdrant 是图书馆。两者缺一不可,但互相不知道对方存在,全靠 Mem0 Server 协调。 + +## Q: Neo4j 是必须的吗? + +A: 不是。大部分场景不需要 Neo4j: +- 普通语义搜索:Qdrant 足够 +- 关系推理(如"我老婆的表哥的同事"):需要 Neo4j + +建议先不加,只部署 Qdrant + PostgreSQL,跑起来后再按需扩展。 + +## Q: 写入和读取记忆需要多少次请求? + +A: +- **写入**:2次(TEI生成向量 → Qdrant存储) +- **读取/搜索**:3次(TEI生成查询向量 → Qdrant搜索 → LLM生成回答) + +## Q: 中国网络环境下如何部署? + +A: 主要问题: +1. 无法从 Docker Hub 拉镜像 → 提前下载导入或使用国内镜像 +2. 无法访问 GitHub → 使用 gitea 托管代码 + +## Q: Self-host 需要哪些环境变量? + +A: 核心变量: +```bash +# 数据库 +POSTGRES_HOST= +POSTGRES_PORT=5432 +POSTGRES_DB= +POSTGRES_USER= +POSTGRES_PASSWORD= + +# 向量库 +QDRANT_HOST= +QDRANT_PORT=6333 + +# Embedder +EMBEDDER_PROVIDER=tei +TEI_ENDPOINT= + +# LLM +LLM_PROVIDER= +OPENAI_API_KEY= + +# Auth +JWT_SECRET= +ADMIN_API_KEY= +AUTH_DISABLED=false +``` + +## Q: Mem0 有官方 K8s 部署吗? + +A: 没有官方 Helm Chart 或 K8s YAML。需要自行转换 docker-compose.yaml 为 K8s 资源,或使用社区方案。 + +## Q: TEI 是否需要知道 Qdrant? + +A: 不需要。TEI 只做向量生成(文本→向量),不存储任何数据,不与 Qdrant 通信。 + +## Q: 为什么你的 mem0 代码 clone 这么慢? + +A: 可能网络问题。可以尝试: +- 使用断点续传:`curl -C - -L -o file.tar.gz URL` +- 使用国内镜像或代理 +- 通过 Gitea 等国内 Git 服务托管 \ No newline at end of file diff --git a/test.md b/test.md deleted file mode 100644 index ba7064d..0000000 --- a/test.md +++ /dev/null @@ -1,3 +0,0 @@ -# Test - -This is a test from hermes-bot.