我给 AI Agent 加了本地记忆,中文搜索快了 10 倍

GitHub: https://github.com/P1M0U/SinoMem | Gitee: https://gitee.com/P1M0U/SinoMem | v0.7.0

每次对话都要重新介绍自己,我受够了

你有没有遇到过这种情况:

早上跟 AI Agent 聊了半小时,交代了项目背景、技术选型、个人偏好。下午再开一个新对话,它什么都不记得了。你又得从头讲一遍。

这不是 Bug,是 LLM 的本质限制 —— 它是无状态的。每次对话都是一张白纸。

“那就用记忆功能啊”——市面上的方案要么依赖云 API(按 token 收费),要么中文搜索烂得一塌糊涂(把"分布式系统"切成"分布式"+“系统”,搜"分布式"反而搜不到),要么部署复杂得像搭一个微服务。

我折腾了一圈,最后选了一个全本地、零费用、中文搜索 10ms 内返回的方案。下面把选型逻辑、接入方式、实际效果都讲清楚。

现有方案,为什么都不太行

方案 中文支持 离线可用 部署复杂度 搜索速度 费用
Mem0(官方云) 一般 ❌ 需联网 看网络 按 token 计费
Mem0(自部署) 一般 中(需 Docker)
ChromaDB + 自己封装 需手动配分词
向量数据库云服务 看供应商 看网络 按量计费
SinoMem ✅ jieba 定制 低(pip install) 10ms 级

核心问题就三个:

  1. 中文分词:大多数方案用默认分词器,中文切词质量差,搜"自然语言处理"可能命中不了"中文 NLP 处理"
  2. 部署成本:要么依赖云 API 有费用,要么需要 Docker + 向量数据库,对个人开发者太重
  3. 搜索速度:调外部 API 做语义搜索,网络延迟 + API 处理,一次搜索几百毫秒起步

我选的方案:SinoMem

SinoMem 是一个轻量级中文记忆系统,核心卖点就三个:全本地、中文好、零费用

技术栈:

存储层:SQLite(单文件,可复制备份)
搜索层:FTS5 全文索引(BM25 排序)
分词层:jieba 精确模式 + bigram 扩展 + 自定义技术词典
嵌入层:ONNX 本地推理(bge-small-zh-v1.5,~24MB)
融合层:RRF(倒数排名融合)自动平衡关键词和语义两路结果

为什么选它而不是其他方案:

  • 中文分词是第一优先级:jieba 是目前最成熟的中文分词库,SinoMem 在此基础上加了 bigram 扩展(“分布式系统"→ 同时索引"分布式"和"式系”),召回率比纯 jieba 高不少
  • FTS5 是 SQLite 自带的:不需要额外装 Elasticsearch 或向量数据库,一个 .db 文件搞定
  • ONNX 嵌入模型可选安装:不装也能用关键词搜索,装了之后支持语义搜索和混合搜索,模型才 24MB

5 分钟跑通

安装

# 一键安装(国内推荐 Gitee)
curl -fsSL https://gitee.com/P1M0U/SinoMem/raw/main/install.sh | bash

# 安装后刷新环境变量
source ~/.bashrc

或者手动:

git clone --depth 1 https://gitee.com/P1M0U/SinoMem.git ~/.local/share/sinomem
cd ~/.local/share/sinomem
python3 -m venv .venv
.venv/bin/pip install -e .

存一条记忆

sinomem store "用户偏好用 Docker 部署服务" -c user_pref -t "docker,偏好"
sinomem store "项目使用 FastAPI + Vue3 技术栈" -c project -t "fastapi,vue3"
sinomem store "服务器内网 IP 是 192.168.0.31" -c infra -t "网络,服务器"

搜索

# 关键词搜索(BM25)
sinomem search "Docker"
# 输出:
# #1  user_pref  [docker,偏好]  score=0.28
#    用户偏好用 Docker 部署服务

# 混合搜索(关键词 + 语义,RRF 融合)
sinomem search "容器部署方案" -m hybrid
# 输出:
# #1  user_pref  [docker,偏好]  score=0.42
#    用户偏好用 Docker 部署服务

注意看:搜"容器部署方案"能命中"用 Docker 部署服务"——这就是 jieba 分词 + bigram 扩展 + RRF 融合的效果。纯关键词搜索可能搜不到,但混合搜索通过语义向量补充了关联。

查看统计

sinomem stats
# 输出:
# total: 3
#   user_pref: 1
#   project: 1
#   infra: 1
# vectors: disabled

中文搜索为什么难,SinoMem 怎么解决的

中文搜索和英文完全不同。英文天然有空格分词(“distributed system” 直接按空格切),中文没有。

问题 1:切词质量

“分布式系统监控” 用 jieba 精确模式切出来是 ["分布式", "系统", "监控"]

如果你搜"分布式监控",用 AND 模式匹配,三个 token 都要命中。但"分布式监控"切出来是 ["分布式", "监控"],少了"系统",匹配不上。

SinoMem 的方案:对 3 字以上的中文 token 做内部 bigram 扩展。“分布式系统” → 同时生成 “分布式” + “布式系” + “式系统”。这样搜"分布式"或搜"系统"都能命中。

问题 2:写入和查询的分词一致性

很多方案写入时用一种分词器,查询时用另一种,导致 token 对不上。

SinoMem 的 FTS5 tokenizer 是自定义的:写入和查询走同一套 jieba 分词逻辑,token 完全对齐。

问题 3:语义搜索的中文模型

英文 embedding 模型(如 all-MiniLM-L6-v2)处理中文效果很差。

SinoMem 默认用 bge-small-zh-v1.5(BAAI 出品,专门针对中文优化的 embedding 模型),512 维,CLS 池化,ONNX 量化后只有 ~24MB,CPU 推理足够快。

搜索延迟实测

在我的服务器上(Intel Xeon,无 GPU),1 万条中文记忆:

搜索模式 平均延迟
keyword(BM25) ~8ms
semantic(ONNX) ~45ms
hybrid(RRF 融合) ~50ms

对比调 OpenAI embedding API 做一次语义搜索:网络往返 + API 处理,通常 200-500ms。本地 ONNX 推理快了一个数量级。

接入 Claude Code / Hermes

SinoMem 提供三种接入方式:钩子插件、MCP Server、Hermes 插件。

方式一:Claude Code 钩子插件(推荐,自动同步)

SinoMem 内置了三个 Claude Code 钩子脚本,安装后完全无感:

bash ~/.local/share/sinomem/installers/install_claude_code.sh

三个钩子各司其职:

钩子 触发时机 作用
inject_memory.py UserPromptSubmit 对话前自动注入相关记忆上下文
capture_write.py PostToolUse 工具调用后自动捕获值得记忆的信息
persist_session.py Stop 会话结束时自动持久化到 SQLite

安装后 Claude Code 会自动在每次对话前检索相关记忆注入 prompt,对话后自动存储新记忆。不需要手动调用任何命令,完全无感。

--global 参数可全局安装(所有项目生效):

bash ~/.local/share/sinomem/installers/install_claude_code.sh --global

方式二:MCP Server(备选,适用于其他 MCP 兼容 Agent)

如果你用的 Agent 不支持钩子但支持 MCP(如 Cursor、Cline),可以走 MCP:

{
  "mcpServers": {
    "sinomem": {
      "command": "~/.local/share/sinomem/.venv/bin/python",
      "args": ["-m", "sinomem.entrypoints.mcp_server"]
    }
  }
}

MCP 方式提供 14 个记忆工具,Agent 需要主动调用,不如钩子方式自动化。

方式三:Hermes Memory Provider 插件(推荐 Hermes 用户)

ln -s ~/.local/share/sinomem/hermes_plugin/ ~/.hermes/plugins/sinomem

一行命令。Hermes 自动用 SinoMem 替换内置 memory 工具,对话中自动存取,跨会话不丢。

多 Agent 共享同一份记忆

三种方式共享同一个 SQLite 文件(默认 ~/.sinomem/memory.db)。Claude Code 钩子存的记忆,Hermes 能搜到;反之亦然。一份记忆,多个 Agent 共用,不需要同步逻辑。

适用场景判断

推荐使用

  • 个人开发者,用 Claude Code / Cursor / Hermes 等 AI 编程助手
  • 中文场景为主,对分词质量有要求
  • 不想为 Embedding API 付费
  • 数据不能上云(合规要求)
  • 多个 AI 工具之间需要共享长期记忆

不推荐

  • 需要百万级数据量的场景(SQLite 单文件有上限,但对个人记忆绰绰有余)
  • 团队协作场景(单文件不适合多写者并发)
  • 已有成熟向量数据库基础设施的团队

快速参考

项目 信息
GitHub https://github.com/P1M0U/SinoMem
Gitee https://gitee.com/P1M0U/SinoMem
版本 v0.7.0
Python ≥ 3.11
CLI 命令 15 个
MCP 工具 14 个
插件 Claude Code ✅ / Hermes ✅ / LangChain ✅
中文分词 jieba 精确模式 + bigram 扩展 + 自定义技术词典
嵌入模型 bge-small-zh-v1.5(512维,~24MB ONNX)
搜索模式 keyword(BM25) / semantic(ONNX) / hybrid(RRF)
License Apache 2.0
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐