你有没有遇到过这种抓狂的场景?
昨天你跟 AI Agent 聊了两个小时,把你的项目背景、团队现状、技术栈都说了个遍,它帮你分析得头头是道。
今天你打开新对话,第一句话问它:"上次我们聊的那个方案,你觉得......"
它回你:"您好,我是 AI 助手,请问有什么可以帮到您?"
......
我第一次遇到这个场景的时候,差点把笔记本砸了。
作为一个做了15年移动端、带过几十人团队的 Team Lead,我对"信息同步"这件事的执念不亚于任何人------代码要有 commit history,需求要有 PRD,决策要有记录。
但我的 AI Agent,每次都是一张白纸。
这不是工具的问题,这是架构的问题。今天我就来讲讲,我是怎么系统性地解决这个问题的。
🧠 为什么 AI Agent 需要长期记忆?
先说清楚本质问题。
大语言模型本身是无状态的。每次对话,都是从零开始。它不是在"遗忘",它从来就没有"记住"的机制。这就像你每次重启一个进程,内存自然清空。
那些看起来"记住了"的 AI 产品,背后都有一套持久化机制。
这里有两个核心痛点:
**痛点一:重复解释背景,效率极低。 **
我在做 AI 转型方向的调研,每次新会话都要把"我是移动端背景、目标是深圳 AI 技术负责人、正在系统学习 LLM 工程"这段话重新贴一遍。一天要贴几十次。这不是用 AI 提效,这是在给 AI 做秘书。
**痛点二:把历史塞进 Context,Token 消耗爆炸。 **
有些人的解法是:把所有历史对话都放进 System Prompt。这确实能让 AI "记住",但 Token 费用会让你怀疑人生。GPT-4 的 Context 窗口不是无限的,更不是免费的。
**真正的解法不是堆 Context,而是构建持久化的记忆架构。 **
让 Agent 在需要的时候,从外部存储里召回相关信息,而不是每次把一本书都塞进脑子里。
这个思路,就是今天我要讲的四种方法的底层逻辑。
📂 方法一:结构化 Markdown 文件夹
核心原理
说白了就是:给 AI 配一套"外挂笔记本"。
把你的项目背景、个人偏好、重要决策,全部手动(或半自动)整理成 Markdown 文件。每次 Agent 开始工作前,先把这些文件读一遍------这就是它的"开机记忆"。
听起来很原始?但它解决了 90% 的场景。
适用场景
-
刚开始用 AI Agent,想快速上手
-
对数据隐私有要求,不想用第三方服务
-
需要完全透明、可人工修改的记忆系统
文件结构示例
我自己在 OpenClaw 里用的就是这套结构:
yaml
workspace/
├── MEMORY.md # 长期记忆(核心洞察、重要决策的精华版)
├── USER.md # 我的个人信息(背景、偏好、目标)
├── SOUL.md # Agent 的人设与行为准则
├── AGENTS.md # Agent 工作规范(它该怎么工作)
└── memory/
├── 2026-03-03.md # 每日日志(原始记录,啥都往里写)
├── 2026-03-02.md
└── heartbeat-state.json # 状态追踪(上次检查邮件是几点等)
这里有个关键区别:
-
memory/YYYY-MM-DD.md是原始日志,随手记,不用整理 -
MEMORY.md是精华蒸馏,定期从日志里提炼重要信息进来
就像你写日记和写总结是两回事------日记可以乱,总结要精。
我踩过的坑
刚开始我什么都往 MEMORY.md 里塞,结果文件越来越大,每次读取都消耗大量 Token,得不偿失。后来我定了一个原则:MEMORY.md 只放"改变了我判断的事",日常流水账留在每日文件里。
💡 一句话总结:透明、可控、零依赖,是所有记忆方案的基础层,任何人都应该先建这一层。
🔍 方法二:内置记忆搜索(Memory Search)
核心原理
Markdown 方案的局限是:文件小还好,文件一大,你要么全部读进去(费 Token),要么不读(失去记忆)。
记忆搜索解决的就是这个问题。
它的原理是向量化检索:把每条记忆转成数字向量(一串代表"含义"的数字),当用户提问时,把问题也向量化,然后在记忆库里找最"相似"的几条------只把相关记忆注入 Context,不相关的根本不出现。
用一个不严谨但好理解的比喻:就像书的目录+索引,你要查"第3章",不用把整本书翻一遍。
适用场景
-
记忆量大(超过100条)但每次只需要少量相关记忆
-
需要跨时间线、跨项目的知识检索
-
希望大幅减少 Token 消耗
配置代码示例
以下是在支持 Memory Search 的 Agent 框架里开启此功能的伪代码:
python
# 配置向量化记忆存储
memory_config = {
"backend": "memory_search",
"embedding_model": "text-embedding-ada-002", # OpenAI 嵌入模型
"top_k": 5, # 每次最多召回5条相关记忆
"similarity_threshold": 0.75, # 相似度阈值
"storage": {
"type": "local",
"path": "./memory_store/"
}
}
# 写入记忆
agent.memory.add(
content="用户偏好简洁的技术回答,不喜欢过多废话",
category="preference"
)
# 检索相关记忆(自动在回答前执行)
relevant_memories = agent.memory.search(
query="用户想了解架构设计方案",
top_k=5
)
注意事项
这个方法有一个硬性依赖 :必须有支持 Embedding 的 API,目前主要是 OpenAI 的 text-embedding-ada-002 或 Google Gemini。
如果你用的是国内的 LLM(纯对话型,没有 Embedding 接口),这个方法就用不了。
这也是我目前没有完全依赖这个方案的原因------国内访问 OpenAI 的稳定性问题,让这个链路不够可靠。
💡 一句话总结:记忆量超过100条时的必备方案,但需要 OpenAI/Gemini Embedding API 支撑。
🤖 方法三:Mem0 插件(自动化长期记忆)
核心原理
前两种方法,不管怎么搜索,都需要你主动去写记忆。
Mem0 的思路是:让 AI 自己决定什么值得记。
它在对话过程中,实时分析你们的交流内容,自动识别"这句话可能以后有用"------比如"用户提到他们公司用 Kotlin 做 Android 开发",自动存进记忆库。下次相关话题出现时,自动召回。全程你感知不到它在工作。
这种"无感记忆"的体验,是最接近人类助手的感觉。
适用场景
-
追求零维护成本的全自动记忆
-
需要记住用户的隐式偏好和习惯
-
多 Agent 协作场景,需要共享记忆池
安装与初始化代码
bash
# 安装 Mem0
pip install mem0ai
python
from mem0 import Memory
# 初始化(使用 OpenAI 作为 LLM 和 Embedding 引擎)
config = {
"llm": {
"provider": "openai",
"config": {
"model": "gpt-4o",
"api_key": "your-openai-api-key"
}
},
"embedder": {
"provider": "openai",
"config": {
"model": "text-embedding-3-small",
"api_key": "your-openai-api-key"
}
},
# 本地部署用 Qdrant,保护隐私
"vector_store": {
"provider": "qdrant",
"config": {
"host": "localhost",
"port": 6333
}
}
}
m = Memory.from_config(config)
# 添加记忆(也可以传入整段对话,让 Mem0 自动提取)
m.add(
"我是移动端 Team Lead,正在转型 AI 方向,目标是AI 技术负责人",
user_id="xxxx"
)
# 搜索相关记忆
results = m.search(
query="用户的技术背景是什么",
user_id="xxxx"
)
# 输出示例
# [{"memory": "移动端 Team Lead,音视频+文件背景,转型 AI", "score": 0.92}]
我的判断
Mem0 是技术上最优雅的方案,但它增加了系统复杂度。需要单独部署 Qdrant 向量库,或者购买 Mem0 的云服务。
对于刚开始建记忆系统的人,我的建议是:不要一上来就上 Mem0。先把 Markdown 文件夹建好,等你的记忆量涨到 200 条以上,再考虑迁移。
过度工程是工程师的原罪之一。我以前做音视频 SDK 的时候也踩过这个坑------功能没跑通就开始搞性能优化,最终两头都没做好。
💡 一句话总结:全自动是它最大的优势,适合记忆量大、追求零维护的场景,但不适合作为入门第一步。
🗄️ 方法四:SQLite 数据库
核心原理
前三种方法,本质上存的都是文本型记忆------适合自然语言的内容。
但有些数据,天生就是结构化的:体重、运动记录、学习进度、项目完成率......
这类数据用文本存,查询起来很痛苦。"帮我看看过去30天我的体重趋势"------如果数据在 Markdown 里,AI 得一行一行地扫,还容易出错。
用 SQLite,一条 SQL 搞定。
适用场景
-
健康数据、习惯追踪(体重、运动、睡眠)
-
项目进度管理(精确查询状态)
-
需要聚合统计的数据(完成率、趋势分析)
-
任何有明确字段结构的信息
建表语句与查询示例
sql
-- 记忆主表
CREATE TABLE memories (
id INTEGER PRIMARY KEY AUTOINCREMENT,
category TEXT NOT NULL, -- 分类:project / preference / event
content TEXT NOT NULL, -- 记忆内容
importance INTEGER DEFAULT 5, -- 重要程度 1-10
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
last_accessed TIMESTAMP
);
-- 项目进度追踪表
CREATE TABLE projects (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL, -- 项目名称
status TEXT DEFAULT 'active', -- active / paused / done
progress INTEGER DEFAULT 0, -- 完成进度 0-100
next_action TEXT, -- 下一步行动
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- AI 转型学习进度表(我的实际使用场景)
CREATE TABLE learning_modules (
id INTEGER PRIMARY KEY AUTOINCREMENT,
module_name TEXT NOT NULL, -- 模块名称(如"LLM基础")
total_items INTEGER, -- 总任务数
completed_items INTEGER DEFAULT 0,
completion_rate REAL GENERATED ALWAYS AS
(CAST(completed_items AS REAL) / total_items * 100) STORED,
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 每日健康记录表
CREATE TABLE health_logs (
date TEXT PRIMARY KEY, -- YYYY-MM-DD
weight REAL, -- 体重 kg
exercise TEXT, -- 运动记录
notes TEXT -- 备注
);
sql
-- 查询示例1:获取最近30天体重趋势
SELECT date, weight
FROM health_logs
WHERE date >= date('now', '-30 days')
ORDER BY date;
-- 查询示例2:获取所有进行中的项目
SELECT name, progress, next_action
FROM projects
WHERE status = 'active'
ORDER BY progress DESC;
-- 查询示例3:AI 转型学习完成率汇总
SELECT module_name, completed_items, total_items, completion_rate
FROM learning_modules
ORDER BY completion_rate DESC;
关键优势
SQLite 有一个被很多人忽视的优点:它不需要任何服务端,就是一个本地文件。你可以直接把 .db 文件放在项目目录里,用 Python 的标准库就能读写,零配置,永久持久化。
对我这种音视频背景的人来说,SQLite 就像嵌入式开发里的 RocksDB------轻量、可靠、本地,是工程师最好的朋友。
💡 一句话总结:结构化数据的最佳归宿,查询准、速度快、无依赖,但对自由文本无能为力。
📊 方法对比与选型建议
| 方法 | 上手难度 | 自动化程度 | 语义搜索 | 外部依赖 | 适合场景 |
|------|----------|------------|----------|----------|----------|
| Markdown 文件夹 | ⭐ 极简 | 手动/半自动 | ❌ | 无 | 所有人的起点 |
| Memory Search | ⭐⭐ 中等 | 自动检索 | ✅ | OpenAI/Gemini | 记忆量>100条 |
| Mem0 | ⭐⭐⭐ 较高 | 全自动 | ✅ | Mem0服务+向量库 | 追求零维护 |
| SQLite | ⭐⭐ 中等 | 按需查询 | ❌ | 无 | 结构化数据追踪 |
选型决策树:
sql
你有结构化数据需要追踪?
├── 是 → SQLite(不用纠结)
└── 否 → 记忆量有多大?
├── <100条 → Markdown 文件夹(够用了)
├── 100-500条 → Memory Search(需要 OpenAI Key)
└── >500条 → Mem0(上自动化)
一个原则:不要为了用技术而用技术。 能用 Markdown 解决的,别上 Mem0;能用 SQLite 的,别设计复杂的向量库。复杂度是会咬人的。
🛠️ 我的实践方案:Layer 1 + SQLite 的组合
讲了这么多理论,说说我自己实际在用什么。
我目前跑的是两层架构:
Layer 1(基础层):Markdown 文件夹
bash
/root/clawd/
├── MEMORY.md ← 核心长期记忆(蒸馏版,保持精简)
├── USER.md ← 我的个人背景和目标
├── SOUL.md ← Agent 的行为准则和人设
└── memory/
├── 2026-03-03.md ← 今天发生了什么(原始记录)
└── heartbeat-state.json ← 上次检查邮件/日历的时间戳
这一层的核心价值是:Agent 每次会话开始时,自动读取这些文件。它就知道我是谁、我在做什么、上次的决策是什么------不需要我每次重新解释背景。
Layer 2(结构化层):SQLite
我正在把以下数据迁移到 SQLite:
-
AI 学习进度:7个学习模块,每个模块的完成状态
-
岗位研究记录:看过哪些 JD,哪些公司在招 AI 移动端负责人
-
实践项目追踪:每个 side project 的进展和下一步
为什么要迁移?因为我发现一个问题:在 Markdown 里追踪这些数据,每次问 Agent "我现在哪个模块落后了",它要读一大段文字,有时候还会算错。
换成 SQLite 之后,直接一条 SQL 查询,准确无误,还能生成图表。这是用技术背景反哺 AI 工具使用的一个典型案例。
Layer 3(未来规划):Mem0
当我的记忆量超过200条、或者我开始频繁发现"这段记忆我之前已经提过但 Agent 没记住"的时候,就是引入 Mem0 的时机。
现在还没到那个阶段。过早优化是万恶之源------这句话在 AI Agent 架构设计上同样适用。
结语:AI Agent 的记忆,是工程师给它的第二个大脑
写到这里,我想说一件让我有点感慨的事。
我做移动端这15年,做过音视频的实时传输优化,做过音视频编解码的性能调优设计,做过文件大批量传输需求。每一个技术方案,本质上都是在解决 "信息如何在时间和空间中持久传递" 的问题。
AI Agent 的记忆管理,其实是同一个问题的新形态。
一个没有记忆的 Agent,就像一个每天早晨醒来都失忆的员工------你永远要从头开始,永远没有积累,永远无法成长。
而当你给它装上合适的记忆架构,它才真正开始从"工具"变成"伙伴"。它知道你的背景,记得你的偏好,能接住上次没说完的话题------这种连续性,是 AI 真正融入工作流的前提。
AI Agent 的记忆,是工程师给它的第二个大脑。 这个大脑不是凭空长出来的,是我们亲手设计、一点一点喂养起来的。
这也是我做 AI 转型这段时间最深的体会:AI 工具的上限,很大程度上取决于使用它的工程师,愿意在架构设计上投入多少心思。