Mem0 本地服务调试笔记

rollo 1小时前 ⋅ 1 阅读

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,没有 venvpip

处理方式:改用 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_PROVIDEREMBEDDER_PROVIDEROLLAMA_BASE_URL 等参数。

PostgreSQL 空配置覆盖默认值

.env.examplePOSTGRES_USER=POSTGRES_PASSWORD= 为空字符串时,会覆盖代码默认值并导致 pgvector 配置校验失败。

处理方式:修改 server/db.pyserver/main.py,空字符串按默认值处理;实际外部 PG 调试时仍建议明确填写真实用户名、密码和库名。

数据库旧配置污染 provider

settings.config_overrides 里可能保存了旧的 provider 配置,导致例如 openai provider 混入 ollama_base_url

处理方式:修改 server/server_state.py,让 .env 中显式设置的 LLM_PROVIDEREMBEDDER_PROVIDER 优先于数据库旧配置。

必要时可清理旧配置:

DELETE FROM settings WHERE key = 'config_overrides';

Ollama 请求走 Tinyproxy

Ollama 请求被系统代理转发到 Tinyproxy,出现 500 Unable to connect

处理方式:启动服务前设置 NO_PROXYno_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 和搜索链路。


全部评论: 0

    我有话说:

    目录