Mem0 是一个给 AI 应用和 Agent 使用的长期记忆层。它可以把用户偏好、历史上下文、事实信息等存入向量数据库,后续通过语义搜索取回相关记忆,让 AI 在多轮、多会话中具备可持续的上下文。
这个 Mem0 仓库是一个 monorepo,包含 Python SDK、TypeScript SDK、CLI、自托管 FastAPI Server、Dashboard、OpenMemory、插件和文档。当前调试的是 server/ 下的自托管 REST API 服务,主要提供 /memories、/search 等接口,底层使用 PostgreSQL/pgvector 存储向量记忆。
当前本地调试目标
本地调试目标不是 Docker 部署,而是:
- Windows PowerShell 启动 FastAPI 服务
- 使用已有 PostgreSQL 数据库
- 使用 pgvector 存储记忆向量
- 使用 Ollama 的
nomic-embed-text做 embedding - 默认不调用 LLM 抽取,采用 embedding-only 调试模式
推荐 .env 配置
MEM0_DEFAULT_INFER=false
EMBEDDER_PROVIDER=ollama
EMBEDDER_MODEL=nomic-embed-text
EMBEDDER_DIMS=768
OLLAMA_BASE_URL=http://localhost:11434
LLM_PROVIDER=ollama
LLM_MODEL=llama3.1:8b
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_USER=your_pg_user
POSTGRES_PASSWORD=your_pg_password
POSTGRES_DB=your_vector_db
APP_DB_NAME=your_app_db
POSTGRES_COLLECTION_NAME=memories_ollama
AUTH_DISABLED=true
JWT_SECRET=local-dev-secret-at-least-long-enough
MEM0_TELEMETRY=false
HISTORY_DB_PATH=./history/history.db
MEM0_DEFAULT_INFER=false 表示新增记忆默认不调用大模型抽取,只将消息原文生成 embedding 后写入向量库。如果某次请求需要恢复 LLM 抽取,可以在请求体里显式传 infer: true。
启动命令
cd D:\cody_by_py\mem0\server
python -m dotenv run -- alembic upgrade head
python -m dotenv run -- uvicorn main:app --host 0.0.0.0 --port 8888 --reload
访问:
http://localhost:8888/docs
调试过程中遇到的问题和处理
Python 环境不完整
默认 python 指向 D:\software\python-3.10.0\python.exe,没有 venv 和 pip。
处理方式:改用 D:\software\conda\python.exe 创建 .venv,该解释器为 Python 3.12.7,包含 pip 和 venv。
PowerShell 禁止激活虚拟环境
激活 .venv 时报执行策略错误。
处理方式:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
pip 配置文件编码错误
C:\Users\ragna\AppData\Roaming\pip\pip.ini 含有非法 UTF-8 字符,导致 pip 无法运行。
处理方式:
$env:PIP_CONFIG_FILE="NUL"
$env:PYTHONUTF8="1"
默认要求 OpenAI API Key
原始 server 默认使用 OpenAI 作为 LLM 和 embedding provider。
处理方式:修改 server/main.py,支持通过 .env 配置 LLM_PROVIDER、EMBEDDER_PROVIDER、OLLAMA_BASE_URL 等参数。
PostgreSQL 空配置覆盖默认值
.env.example 中 POSTGRES_USER=、POSTGRES_PASSWORD= 为空字符串时,会覆盖代码默认值并导致 pgvector 配置校验失败。
处理方式:修改 server/db.py 和 server/main.py,空字符串按默认值处理;实际外部 PG 调试时仍建议明确填写真实用户名、密码和库名。
数据库旧配置污染 provider
settings.config_overrides 里可能保存了旧的 provider 配置,导致例如 openai provider 混入 ollama_base_url。
处理方式:修改 server/server_state.py,让 .env 中显式设置的 LLM_PROVIDER 和 EMBEDDER_PROVIDER 优先于数据库旧配置。
必要时可清理旧配置:
DELETE FROM settings WHERE key = 'config_overrides';
Ollama 请求走 Tinyproxy
Ollama 请求被系统代理转发到 Tinyproxy,出现 500 Unable to connect。
处理方式:启动服务前设置 NO_PROXY 和 no_proxy,让本地或局域网 Ollama 地址直连。
SQLite history 路径是 Docker 路径
默认 HISTORY_DB_PATH 是 /app/history/history.db,这是 Docker 容器路径,Windows 本地不存在。
处理方式:修改 server/main.py,默认使用 server/history/history.db;修改 mem0/memory/storage.py,自动创建 SQLite 父目录并避免初始化失败后的析构报错。
memory_type=core 被 SDK 拒绝
SDK 当前只接受 memory_type="procedural_memory",普通记忆不应该传 memory_type。
处理方式:修改 server/main.py,REST 层将 memory_type="core" 当作普通记忆处理并移除该参数;其他非法类型返回 400。
DeepSeek 不能替代 embedding
DeepSeek 可以作为 LLM provider,但当前链路仍需要 embedding provider 写入向量库。没有 OpenAI/Gemini embedding key 时,仍需使用 Ollama 的 nomic-embed-text。
最终选择 embedding-only
为了降低本地调试复杂度,最终采用:
MEM0_DEFAULT_INFER=false
EMBEDDER_PROVIDER=ollama
EMBEDDER_MODEL=nomic-embed-text
EMBEDDER_DIMS=768
这样 /memories 默认只做原文入库和向量化,不调用任何大模型抽取。
LLM 抽取和 embedding-only 的区别
LLM 抽取会将用户消息提炼成长期有用的事实、偏好或关系。例如原始消息:
我最近在做 Mem0 本地调试,PG 在 localhost,不想用 Docker,偏向 PowerShell。
可能被抽取成:
用户正在本地调试 Mem0。
用户的 PostgreSQL 服务地址是 localhost。
用户不想用 Docker 部署。
用户偏好使用 PowerShell。
优点是记忆更干净、搜索更准、噪声更少;缺点是需要额外调用 LLM,增加成本、延迟和配置复杂度。
embedding-only 则直接保存消息原文,只调用 embedding 模型,适合本地调试、验证 API、PGVector 和搜索链路。
注意:本文归作者所有,未经作者允许,不得转载