这是一个面向单用户助手的本地记忆服务 旨在让记忆可随处引用
服务通过本地 HTTP/OpenAPI 对外提供接口,底层使用 SQLite 持久化记忆数据,使用 sqlite-vec 做向量检索,使用 FTS5 做全文检索与回退召回。
- 面向单个用户
- 本机部署、本机服务调用
- 以长期记忆为核心
- 优先接入云端大模型
- 只暴露本地 HTTP/OpenAPI 接口
work:工作personal:个人family:家庭
fact:事实preference:偏好event:事件task:任务 / 计划 / 待办
- 外部服务调用
POST /agent/memorize - 服务接收对话消息
- 记忆提取器将消息提取成候选记忆
- 过滤敏感信息和疑似乱码
- 从现有记忆中检索相关内容
- 记忆决策器判断应当:
insertupsertupdatemergeskip
- 将最终结果写入
SQLite - 同步全文索引和向量索引
- 写入审计日志,记录提取、跳过、更新、合并、召回等行为
- 外部服务调用
POST /agent/recall - 服务根据查询语句做向量召回 + 关键词召回
- 融合以下因素打分排序:
- 向量相似度
- 关键词命中
- 主领域优先
- 重要度
- 新近性
- 置信度
- 返回最终候选记忆列表
当以下配置存在时:
API_KEY=...
BASE_URL=...
MODEL=...系统会优先使用大模型完成:
- 记忆提取
- 冲突判断
- 插入 / 合并 / 更新 / 跳过 决策
如果模型调用失败,或者模型没有提取出任何候选记忆,系统会自动回退到本地启发式规则。
当前已增强的中文规则包括:
- 家庭安排
- 个人健康计划
- 工作任务清单
- 中文时间表达识别
- 中文任务计划识别
向量配置单独管理:
EMBEDDING_API_KEY=
EMBEDDING_BASE_URL=
EMBEDDING_MODEL=
EMBEDDING_DIMENSIONS=1536它们的作用分别是:
EMBEDDING_API_KEY:向量模型调用密钥EMBEDDING_BASE_URL:向量模型接口地址EMBEDDING_MODEL:向量模型名称EMBEDDING_DIMENSIONS:向量维度
如果未配置 EMBEDDING_MODEL,系统会自动回退到本地哈希向量。
这意味着你现在即使没有单独的 embedding 模型,系统也可以正常工作,只是向量质量会低于真实 embedding 模型。
在项目根目录创建 .env,示例:
API_KEY=sk-...
BASE_URL=
MODEL=gpt-5.3-codex
EMBEDDING_API_KEY=
EMBEDDING_BASE_URL=
EMBEDDING_MODEL=
EMBEDDING_DIMENSIONS=1536
SQLITE_DB_PATH=data/memory.db
APP_HOST=127.0.0.1
APP_PORT=8765同时也兼容以下别名:
OPENAI_API_KEYOPENAI_BASE_URLOPENAI_MEMORY_MODELOPENAI_EMBEDDING_API_KEYOPENAI_EMBEDDING_BASE_URLOPENAI_EMBEDDING_MODEL
pip install -e .uvicorn app.main:app --host 127.0.0.1 --port 8765启动后可访问:
- Swagger 文档:
http://127.0.0.1:8765/docs - OpenAPI JSON:
http://127.0.0.1:8765/openapi.json - 健康检查:
http://127.0.0.1:8765/health
POST /memoriesPOST /memories/upsertPOST /memories/searchPOST /memories/consolidateGET /memoriesGET /memories/audit/recentGET /memories/{memory_id}PATCH /memories/{memory_id}DELETE /memories/{memory_id}POST /memories/mergePOST /agent/memorizePOST /agent/recall
import httpx
payload = {
"preferred_domain": "family",
"auto_commit": True,
"conversation": [
{
"role": "user",
"content": "这周六上午十点带孩子去口腔复查,结束后顺路买学习用品。"
}
],
}
resp = httpx.post("http://127.0.0.1:8765/agent/memorize", json=payload, timeout=60.0)
print(resp.json())import httpx
payload = {
"query": "回顾这周六孩子口腔复查的安排",
"primary_domain": "family",
"allow_cross_domain": True,
"top_k": 5,
}
resp = httpx.post("http://127.0.0.1:8765/agent/recall", json=payload, timeout=60.0)
print(resp.json())import httpx
payload = {
"dry_run": False,
"delete_sensitive": True,
"delete_garbled": True,
"dedupe_exact": True,
"resolve_entity_conflicts": True,
}
resp = httpx.post("http://127.0.0.1:8765/memories/consolidate", json=payload, timeout=60.0)
print(resp.json())SQLite + sqlite-vec + FTS5work / personal / family三大领域fact / preference / event / task四类记忆- OpenAI 兼容
responses风格模型调用 - 模型优先的记忆提取
- 模型优先的记忆决策
- 提取为空时自动回退本地规则
- 稳定偏好/事实的
upsert - 重复记忆跳过
- 敏感信息过滤
- 乱码内容过滤
- 合并/更新/删除/归档/覆盖
- 审计日志
- 本地回归测试脚本
- 修正了中文内容被误判为乱码的问题
- 加强了中文任务和计划类提取
- 增加了提取阶段审计日志
- 增加了跳过原因审计日志
- 增加了乱码判定信号输出
- 新增回归测试脚本 simulate_memory_flow.py
在 2026-03-27 已完成以下验证:
- 服务成功启动
/health正常/agent/memorize正常/agent/recall正常/memories/audit/recent正常- 中文家庭安排记忆可写入
- 中文个人健康计划可写入
- 工作记忆可补充并
merge - 敏感信息不会写入
- 测试数据可自动清理
测试日志文件:
- memory_flow_test_log_20260326.md
- memory_flow_test_log_20260326_round2.md
- memory_flow_test_log_20260327_230545_round3.md
- 模型在带有“测试标记”这类输入时,偶尔会多抽取一条噪声事件记忆
- 历史数据里仍存在部分
entity_key命名不统一的问题,例如:user.preference.languageresponse_language
- 如果后续接入真实 embedding 模型,召回质量还有进一步提升空间
- 统一历史
entity_key - 为真实使用场景构建一小批评测样本
- 给低置信度事件记忆增加 TTL / 复核机制
- 给测试标记类输入增加更严格的降噪策略