一、简单介绍尽管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_KEYyour-volcano-api-key OPENAI_BASE_URLyour-base-url OPENAI_MODELyour-model # Embedding 配置 EMBEDDER_PROVIDERopenai EMBEDDER_MODELyour-model EMBEDDER_BASE_URLyour-base-url EMBEDDER_API_KEYyour-volcano-api-key # 向量维度关键 EMBEDDING_MODEL_DIMS2048 # API 安全认证 ADMIN_API_KEYyour-admin-api-key # pgvector 同理 # Neo4j 连接信息此处与官方一致 NEO4J_URIbolt://neo4j:7687 NEO4J_USERNAMEneo4j NEO4J_PASSWORDmem0graph # 图匹配阈值降低门槛更容易触发图谱写入 GRAPH_STORE_THRESHOLD0.62、Mem0镜像目前有一些公共镜像源但是再拉取的过程中全失败了有些是因为镜像已经过期无法使用如果可以自己拉取可以直接拉取公共镜像。如果拉取失败可以自行构建镜像。(1)创建DockerFile文件FROM python:3.12-slim WORKDIR /app # 国内镜像加速 ENV PIP_INDEX_URLhttps://pypi.tuna.tsinghua.edu.cn/simple ENV PIP_DEFAULT_TIMEOUT100 COPY requirements.txt . # 安装核心依赖不安装 mem0ai[graph] 避免 psycopg2 编译问题 RUN pip install --no-cache-dir -r requirements.txt \ pip install --no-cache-dir mem0ai1.0.11 langchain-neo4j psycopg2-binary rank-bm25 COPY . . EXPOSE 8000 ENV PYTHONUNBUFFERED1 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_USERpostgres - POSTGRES_PASSWORDpostgres - POSTGRES_DBpostgres 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_AUTHneo4j/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_EMAILadminadmin.com - PGADMIN_DEFAULT_PASSWORDadmin 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:人工智能}]]}}