Skip to content

Agent 持久记忆

虾饺实现了一套三分类持久记忆系统,让 Agent 越用越懂你。

记忆管理面板 — Agent 的记忆条目在此查看和管理

记忆管理面板 — Agent 的记忆条目在此查看和管理

这是虾饺和大多数 AI 聊天工具最大的区别之一:对话不再是"用完即弃"的一次性交互。Agent 能跨对话记住重要信息。写入与检索通过 Tool Calling 中的 memory_write / memory_search 暴露给模型。

为什么需要持久记忆?

普通的 AI 聊天工具每次对话都是从零开始。你告诉过它的偏好、项目背景、约定的规则——下次全忘了。

没有记忆有持久记忆
每次都要重新说明技术栈"你用 Python + AWS,我记得"
忘了之前的讨论"上次你说想用 Docker 部署"
重复犯同样的错误"你说过回复要简洁,不要啰嗦"
所有人一样的回复风格根据你的偏好个性化回复

三分类记忆体系

虾饺的记忆系统参考认知科学的长期记忆分类:

1. 语义记忆(Semantic Memory)

存储事实和知识——关于你和项目的客观信息。

示例用途
"用户偏好 Python"回答技术问题时优先用 Python
"公司使用阿里云"推荐云服务时考虑阿里云
"项目用 PostgreSQL 数据库"写 SQL 时用 PG 语法
"团队采用 Git Flow 分支策略"推荐分支操作时遵循 Git Flow

2. 情景记忆(Episodic Memory)

存储对话事件和经历——发生过什么。

示例用途
"上次讨论了 Docker 部署方案"延续之前的讨论
"用户提到想做微信接入"记住未完成的需求
"上周五一起调试了登录 Bug"建立连续的协作体验
"用户对上次的翻译质量不满意"改进下次翻译策略

3. 程序性记忆(Procedural Memory)

存储行为模式和偏好——你希望 Agent 怎么做。

示例用途
"回复要简洁"控制输出风格
"代码示例用 TypeScript"选择示例语言
"不要用 emoji"控制输出格式
"生成代码前先确认需求"控制工作流程

技术架构

整体流程

┌──────────────────────────────────────────────────────────────┐
│                                                              │
│  写入                                  检索                   │
│                                                              │
│  Agent 对话中                         Agent 新对话开始         │
│     ↓                                    ↓                   │
│  调用 memory_write                    用户消息做 embedding     │
│     ↓                                    ↓                   │
│  文本 → embedding                    余弦相似度搜索记忆库      │
│     ↓                                    ↓                   │
│  相似度去重                           Top-K 结果                │
│  ├── 相似度 > 0.85 → 更新已有记忆       ↓                     │
│  └── 相似度 ≤ 0.85 → 插入新记忆       注入 System Prompt       │
│     ↓                                    ↓                   │
│  存入 SQLite                          Agent 带着记忆回复       │
│                                                              │
└──────────────────────────────────────────────────────────────┘

存储设计

组件技术说明
数据库SQLite每个 Agent 独立数据库文件
向量存储embedding 存入 SQLite无需外部向量库
embedding 模型跟随 Agent 配置的 LLM Provider默认用 text-embedding-3-small
相似度计算余弦相似度JavaScript 原生计算,无依赖
去重阈值0.85相似度 > 0.85 视为同一条记忆

Embedding 去重机制

当 Agent 写入新记忆时,系统自动检查是否已有高度相似的记忆:

新记忆:"用户喜欢 Python"
已有记忆:"用户偏好 Python 语言"
→ 余弦相似度 = 0.95 > 0.85
→ 更新已有记忆,不重复插入

新记忆:"用户今天想了解 Docker"
已有记忆:"用户偏好 Python 语言"
→ 余弦相似度 = 0.3 < 0.85
→ 插入为新记忆

自动注入记忆

当 Agent 配置了 autoInjectMemory: true 时,无需手动操作,每次对话自动触发:

流程

  1. 用户发送消息
  2. 消息文本做 embedding
  3. 在 Agent 记忆库中余弦相似度搜索
  4. 取 Top-K 最相关的记忆(默认 10 条)
  5. 按三分类格式化拼接
  6. 注入到 System Prompt 的 [MEMORY] 区段

注入后的 System Prompt 结构

markdown
# 代码助手

你是一位全栈开发工程师...

## [MEMORY]
以下是你对这位用户的记忆,请参考:

### 语义记忆
- 用户偏好 Python,公司用 AWS
- 项目使用 PostgreSQL 数据库

### 情景记忆
- 上次讨论了 Docker 部署方案,用户希望用 docker-compose

### 程序性记忆
- 回复要简洁,代码示例优先用 Python

性能影响

自动注入通常增加 200-500 个 token 到 System Prompt,对大多数模型来说可以忽略。如果记忆条数很多,系统只取 Top-K 最相关的,不会无限膨胀。

手动使用 memory 工具

即使不开启自动注入,Agent 也可以通过工具手动管理记忆:

memory_write

Agent:[调用 memory_write]
参数:{
  "type": "semantic",
  "content": "用户是后端开发,主要用 Python"
}
Agent:[调用 memory_search]
参数:{
  "query": "用户的技术栈"
}
返回:[
  { type: "semantic", content: "用户偏好 Python,公司用 AWS", similarity: 0.87 },
  { type: "semantic", content: "项目使用 PostgreSQL", similarity: 0.72 }
]

记忆隔离

每个 Agent 有独立的记忆空间,互不干扰:

代码助手的记忆:用户偏好 Python、回复要简洁
翻译官的记忆:用户需要中英翻译、偏好信达雅风格
小说家的记忆:用户喜欢唐诗宋词风格、偏好七言律诗

这意味着你可以和不同 Agent 建立不同的"默契"——代码助手知道你的技术偏好,翻译官记住你的翻译口味。

与其他平台记忆系统对比

虾饺ChatGPT MemoryClaude Projects
记忆分类三分类(语义/情景/程序)扁平列表Project Knowledge
持久化✅ SQLite 本地存储✅ 云端✅ 云端
embedding 去重❌ 手动管理
自动注入✅ 可配置
多 Agent 隔离✅ 每个 Agent 独立❌ 全局共享❌ 全局共享
数据私有✅ 本地运行❌ 云端❌ 云端

最佳实践

1. 培养 Agent 记忆

前几次对话时主动告诉 Agent 你的偏好:

你:我是一个 Python 后端开发,公司用 AWS,项目用 FastAPI + PostgreSQL。
    回复时优先给 Python 代码,简洁一点,不要啰嗦。

Agent 会主动 memory_write 保存这些偏好。

2. 利用程序性记忆控制行为

你:以后代码示例不要用 var,全部用 const 和 let。
→ 保存为程序性记忆,所有后续代码遵循此规则

3. 定期检查记忆

你:列出你记住的关于我的所有信息
→ Agent 调用 memory_search 展示所有记忆
→ 你可以纠正或补充

4. 在 SOUL.md 中引导记忆行为

在 Agent 的 SOUL.md 里明确告诉它何时记忆:

markdown
## 记忆规则
- 用户提到的技术偏好、工作环境 → memory_write(semantic)
- 重要的决定或讨论结论 → memory_write(episodic)
- 用户反复提到的输出偏好 → memory_write(procedural)
- 不记录临时性的闲聊内容

实际对话演示

以下是一个完整的记忆形成和使用过程:

第一次对话(记忆形成):

你:我是 Python 后端开发,在一家金融公司。项目用 FastAPI + PostgreSQL,部署在 AWS。

代码助手:明白!我记住了你的技术栈偏好。

  🧠 正在写入记忆...
  ├── [semantic] 用户是 Python 后端开发,金融行业
  ├── [semantic] 技术栈:FastAPI + PostgreSQL,部署在 AWS
  └── ✅ 已保存 2 条记忆

以后给你写代码会优先使用 Python + FastAPI,数据库操作用 SQLAlchemy...

一周后的对话(记忆生效):

你:帮我写一个用户注册接口

代码助手:
  🧠 检索相关记忆...
  ├── [semantic] 用户是 Python 后端开发,金融行业 (相似度: 0.82)
  ├── [semantic] 技术栈:FastAPI + PostgreSQL (相似度: 0.91)
  └── 注入到上下文

好的,给你一个 FastAPI + SQLAlchemy 的用户注册接口:

(直接给出 FastAPI 代码,不问"你用什么框架")

如果没有记忆,Agent 会说"你想用什么框架?Flask 还是 Django 还是 FastAPI?"——多了一轮无意义的确认。

手动查看和管理记忆

通过命令行查看

bash
# 查看某个 Agent 的所有记忆
sqlite3 data/workspace-{agentId}/memory.db \
  "SELECT type, content, created_at FROM memories ORDER BY created_at DESC;"

# 按类型统计
sqlite3 data/workspace-{agentId}/memory.db \
  "SELECT type, COUNT(*) as count FROM memories GROUP BY type;"

# 搜索包含特定关键词的记忆
sqlite3 data/workspace-{agentId}/memory.db \
  "SELECT type, content FROM memories WHERE content LIKE '%Python%';"

删除错误的记忆

bash
# 删除某条不准确的记忆
sqlite3 data/workspace-{agentId}/memory.db \
  "DELETE FROM memories WHERE content LIKE '%过时的信息%';"

导出备份

bash
# 备份记忆数据库
cp data/workspace-{agentId}/memory.db memory-backup-$(date +%Y%m%d).db

相关文档

基于 MIT 协议开源 · GitHub · 社区