Mem0私有化部署
一、简单介绍
尽管LLM能力强大,但它们本质上是无状态的。你可以把LLM理解为一次性的计算:每次给它一个输入,它产生一个输出,任务完成。它不会自动记住任何之前的对话或信息。为了解决这个问题,一种直观的方法是给模型“塞”更多历史信息(即增大上下文窗口),但这条路有明确的瓶颈:
- 成本激增:每次对话都携带完整历史,会消耗大量处理时间与费用。
- 性能退化:大量无关信息会稀释模型的注意力,导致回答质量下降,即“上下文腐烂”。
- 容量有限:即使是上百万token的窗口,也难以承载一个长期运行、持续学习的Agent所积累的完整状态。
Agent Memory系统正是为突破这些限制而设计的外置、可管理的记忆层。
Mem0 是一款记忆引擎,它能确保对话上下文连贯,避免用户重复发言,并保证客服人员的响应始终保持一致,以采用双重存储机制(向量数据库、图数据库)、双重搜索机制为特点。
Mem0 平台以完全托管服务的形式提供这种体验——无需进行任何基础设施建设,即可扩展、保护和丰富记忆,但是平台版的图服务需要付费使用。因此, 本文将详细介绍如何私有化部署Mem0实现向量存储和图存储。
二、版本选择
目前Mem0稳定的版本为v1.0.11,在部署的时候一定要选择稳定版本,目前官方正在开发V3版本,想要删掉图数据库采用更轻量的方式来存储实体关系。稳定的Mem0的图存储采用的是图数据库如neo4j等(本文以稳定版为例)。
千万不要选择中间版本比如v2.0.0,这个版本删除了图数据库相关代码,会导致图功能无法使用!!!
三、docker-compose部署流程
首先在服务器上创建文件夹,并且使用git命令拉取代码,进入到server目录下
1、创建.env文件
配置必要的环境变量,主要是llm和embedding模型。
# LLM 配置 OPENAI_API_KEY=your-volcano-api-key OPENAI_BASE_URL=your-base-url OPENAI_MODEL=your-model # Embedding 配置 EMBEDDER_PROVIDER=openai EMBEDDER_MODEL=your-model EMBEDDER_BASE_URL=your-base-url EMBEDDER_API_KEY=your-volcano-api-key # 向量维度(关键!) EMBEDDING_MODEL_DIMS=2048 # API 安全认证 ADMIN_API_KEY=your-admin-api-key # pgvector 同理 # Neo4j 连接信息(此处与官方一致) NEO4J_URI=bolt://neo4j:7687 NEO4J_USERNAME=neo4j NEO4J_PASSWORD=mem0graph # 图匹配阈值(降低门槛,更容易触发图谱写入) GRAPH_STORE_THRESHOLD=0.62、Mem0镜像
目前有一些公共镜像源,但是再拉取的过程中全失败了,有些是因为镜像已经过期无法使用,如果可以自己拉取可以直接拉取公共镜像。
如果拉取失败,可以自行构建镜像。
(1)创建DockerFile文件
FROM python:3.12-slim WORKDIR /app # 国内镜像加速 ENV PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple ENV PIP_DEFAULT_TIMEOUT=100 COPY requirements.txt . # 安装核心依赖,不安装 mem0ai[graph] 避免 psycopg2 编译问题 RUN pip install --no-cache-dir -r requirements.txt && \ pip install --no-cache-dir mem0ai==1.0.11 langchain-neo4j psycopg2-binary rank-bm25 COPY . . EXPOSE 8000 ENV PYTHONUNBUFFERED=1 CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"](2)修改main.py文件
DEFAULT_CONFIG = { "version": "v1.1", "vector_store": { "provider": "pgvector", "config": { "host": POSTGRES_HOST, "port": int(POSTGRES_PORT), "dbname": POSTGRES_DB, "user": POSTGRES_USER, "password": POSTGRES_PASSWORD, "collection_name": POSTGRES_COLLECTION_NAME, "embedding_model_dims": int(os.environ.get("EMBEDDING_MODEL_DIMS")), }, }, "graph_store": { "provider": "neo4j", "config": { "url": os.environ.get("NEO4J_URI", "bolt://neo4j:7687"), "username": os.environ.get("NEO4J_USERNAME", "neo4j"), "password": os.environ.get("NEO4J_PASSWORD", "mem0graph"), "database": "neo4j" }, "threshold": float(os.environ.get("GRAPH_STORE_THRESHOLD", "0.7")), }, "llm": { "provider": "openai", "config": { "model": os.environ.get("OPENAI_MODEL"), "api_key": os.environ.get("OPENAI_API_KEY"), "openai_base_url": os.environ.get("OPENAI_BASE_URL"), "temperature": 0.2 } }, "embedder": { "provider": "openai", "config": { "model": os.environ.get("EMBEDDER_MODEL), "api_key": os.environ.get("EMBEDDER_API_KEY", os.environ.get("OPENAI_API_KEY")), "openai_base_url": os.environ.get("EMBEDDER_BASE_URL") } }, "history_db_path": HISTORY_DB_PATH, }3、编写docker-compose文件
cat > docker-compose.yaml << 'EOF' version: '3.8' services: mem0: build: . container_name: mem0-mem0-1 ports: - "8041:8000" env_file: - .env environment: - GRAPH_STORE_THRESHOLD=${GRAPH_STORE_THRESHOLD:-0.6} - EMBEDDING_MODEL_DIMS=${EMBEDDING_MODEL_DIMS:-2048} volumes: - ./history:/app/history depends_on: postgres: condition: service_healthy neo4j: condition: service_healthy networks: - mem0-network postgres: image: pgvector/pgvector:0.8.0-pg16 container_name: mem0-postgres-1 environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_DB=postgres ports: - "5434:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 networks: - mem0-network neo4j: image: neo4j:5.26.4 container_name: mem0-neo4j-1 environment: - NEO4J_AUTH=neo4j/mem0graph - NEO4J_PLUGINS=["apoc"] # 必须启用 APOC 插件 ports: - "7474:7474" - "7687:7687" volumes: - neo4j_data:/data healthcheck: test: ["CMD-SHELL", "wget -q http://localhost:7474 || exit 1"] interval: 5s timeout: 5s retries: 5 networks: - mem0-network pgadmin: image: dpage/pgadmin4:8.12 container_name: mem0-pgadmin environment: - PGADMIN_DEFAULT_EMAIL=admin@admin.com - PGADMIN_DEFAULT_PASSWORD=admin ports: - "5050:80" depends_on: - postgres networks: - mem0-network volumes: postgres_data: neo4j_data: networks: mem0-network: driver: bridge EOF4、构建并启动
最开始使用v2.0.0版本的出现了向量维度问题,索引只支持2000以内维度,所以需要手动修改索引列类型,如果embedding模型满足维度限制可以直接构建并启动,无需修改列类型并刷新。
# 构建并启动 docker compose up -d --build # 等待数据库就绪 sleep 20 # 修改向量列类型为 halfvec(2048)(支持 2048 维) docker exec -i mem0-postgres-1 psql -U postgres -d postgres <<'EOF' ALTER TABLE memories ALTER COLUMN vector TYPE halfvec(2048); DROP INDEX IF EXISTS memories_vector_idx; CREATE INDEX ON memories USING hnsw (vector halfvec_l2_ops); EOF # 重启 Mem0 刷新连接 docker compose restart mem0四、使用示例
1、运行命令
curl -X POST http://更换为你的服务地址/memories \ -H "Content-Type: application/json" \ -H "X-API-Key: 可选" \ -d '{"messages":[{"role":"user","content":"赵四是王五的导师,王五正在研究人工智能"}],"user_id":"zhaosi"}'2、运行结果
{"results":[{"id":"6384538f-e9ee-461b-bfd2-15be8d2812ad","memory":"赵四是王五的导师","event":"ADD"} ,{"id":"d37dc388-d737-4016-b439-1d88d29fef07","memory":"王五正在研究人工智能","event":"ADD"}], "relations":{"deleted_entities":[],"added_entities":[[{"source":"赵四","relationship":"导师","target":"王五"}], [{"source":"王五","relationship":"研究","target":"人工智能"}]]}}