一、什么是Agent Memory?
前面学习的Agent基本流程是:
用户
↓
Agent
↓
LLM
↓
回答
Agent每次处理问题时,如果没有额外的记忆机制,就无法真正记住之前的对话。
例如:
用户:我是Python开发者。
AI:好的。
---
用户:推荐一个适合我的项目。
如果没有Memory,第二次对话中Agent可能不知道用户是Python开发者。
因此:
Memory的作用,就是让Agent能够保存、检索和利用历史信息。
二、为什么Agent需要Memory?
Agent Memory主要解决三个问题。
1. 保存上下文
例如:
用户:我想学习AI Agent。
AI:可以从Python、LLM API、RAG开始。
用户:那下一步呢?
Agent需要知道前面的讨论内容。
2. 保存用户信息
例如:
用户是Python开发者
正在学习AI Agent
希望成为AI工程师
这些信息可以长期保存。
3. 支持长期任务
例如一个AI学习助手:
Day1:Python基础
Day7:RAG
Day15:Multi-Agent
Day17:Memory
Agent需要知道用户已经学习到什么阶段。
三、Memory的主要类型
Agent Memory可以分成几个重要类型:
Memory
│
├── Short-term Memory
│
├── Long-term Memory
│
└── Vector Memory
四、Short-term Memory------短期记忆
短期记忆主要保存:
当前对话上下文。
最简单的实现就是:
messages = [
{
"role": "user",
"content": "学习RAG"
},
{
"role": "assistant",
"content": "RAG是一种检索增强生成技术。"
}
]
下一次请求时:
历史消息
+
当前问题
↓
LLM
↓
回答
短期记忆的问题
如果聊天越来越长:
10轮
↓
100轮
↓
1000轮
messages会不断增长。
最终可能出现:
-
Token消耗增加
-
API成本增加
-
响应速度下降
-
超出模型上下文限制
因此需要长期记忆。
五、Long-term Memory------长期记忆
长期记忆不是保存所有聊天内容。
而是保存:
值得长期使用的信息。
例如:
用户是一名Python开发者
用户正在学习AI Agent
用户希望成为AI工程师
而下面这些信息通常没有长期保存价值:
你好
好的
谢谢
继续
因此Memory系统需要判断:
用户输入
↓
是否值得保存?
↓
是 → 保存
否 → 丢弃
六、最简单的SQLite Memory
首先可以使用SQLite实现最基础的Memory。
database.py
import sqlite3
conn = sqlite3.connect("memory.db")
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS memories(
id INTEGER PRIMARY KEY,
content TEXT
)
""")
conn.commit()
这里创建了一个:
memories
表。
保存:
id
content
七、保存Memory
memory.py
from database import conn
def save_memory(content):
cursor = conn.cursor()
cursor.execute(
"""
INSERT INTO memories(content)
VALUES(?)
""",
(content,)
)
conn.commit()
使用:
save_memory(
"我是Python开发者"
)
数据库中就会保存:
我是Python开发者
八、读取Memory
def get_memory():
cursor = conn.cursor()
cursor.execute(
"""
SELECT content
FROM memories
"""
)
result = cursor.fetchall()
return result
这样就可以读取历史记忆。
九、SQLite Memory的问题
假设保存了:
我是Python开发者。
我正在学习AI Agent。
我希望成为AI工程师。
我喜欢通过代码学习。
我正在做RAG项目。
用户现在问:
推荐一个适合我的项目。
如果使用SQLite:
SELECT * FROM memories;
会把所有Memory全部读取出来。
但是我们真正需要的是:
找到与当前问题最相关的Memory。
这就进入了今天非常重要的内容:
Vector Memory
十、Vector Memory------向量记忆
你在之前的RAG学习中已经接触过:
文本
↓
Embedding
↓
向量
↓
Vector Database
↓
相似度搜索
Memory实际上也可以使用完全类似的方法。
流程:
用户信息
↓
Embedding
↓
向量数据库
↓
保存
当用户再次提问:
当前问题
↓
Embedding
↓
向量数据库
↓
相似度搜索
↓
相关Memory
十一、Memory与RAG的关系
这一点非常重要。
RAG:
问题
↓
Embedding
↓
知识库
↓
相关知识
↓
LLM
Memory:
问题
↓
Embedding
↓
记忆库
↓
相关记忆
↓
LLM
两者技术路线非常相似。
区别:
| RAG | Memory |
|---|---|
| 外部知识 | 用户历史 |
| 企业文档 | 用户信息 |
| 技术资料 | 用户偏好 |
| 产品文档 | 用户经历 |
| Knowledge Base | Memory Base |
十二、实现Vector Memory
项目结构:
day17
│
├── memory.py
├── embedding.py
├── vector_store.py
├── agent.py
└── main.py
十三、Embedding模块
embedding.py
from sentence_transformers import SentenceTransformer
class EmbeddingModel:
def __init__(self):
print("加载Embedding模型...")
self.model = SentenceTransformer(
"sentence-transformers/all-MiniLM-L6-v2"
)
print("Embedding模型加载完成")
def encode(self, text):
vector = self.model.encode(text)
return vector.tolist()
这里使用Embedding模型:
sentence-transformers/all-MiniLM-L6-v2
作用:
文本
↓
向量
十四、Vector Store
vector_store.py
import chromadb
class VectorStore:
def __init__(self):
self.client = chromadb.PersistentClient(
path="./memory_db"
)
self.collection = (
self.client.get_or_create_collection(
name="agent_memory"
)
)
def add_memory(
self,
memory_id,
content,
embedding
):
self.collection.add(
ids=[memory_id],
documents=[content],
embeddings=[embedding]
)
def search(
self,
embedding,
top_k=3
):
result = self.collection.query(
query_embeddings=[embedding],
n_results=top_k
)
return result["documents"][0]
这里使用:
Chroma
作为向量数据库。
十五、Memory Manager
memory.py
from embedding import EmbeddingModel
from vector_store import VectorStore
class MemoryManager:
def __init__(self):
self.embedding_model = (
EmbeddingModel()
)
self.vector_store = (
VectorStore()
)
self.counter = 0
def save(self, content):
embedding = (
self.embedding_model.encode(
content
)
)
memory_id = str(
self.counter
)
self.vector_store.add_memory(
memory_id,
content,
embedding
)
self.counter += 1
def search(
self,
query,
top_k=3
):
embedding = (
self.embedding_model.encode(
query
)
)
return self.vector_store.search(
embedding,
top_k
)
现在Memory有两个核心功能:
save()
search()
十六、测试Vector Memory
main.py
from memory import MemoryManager
memory = MemoryManager()
memory.save(
"我是Python开发者"
)
memory.save(
"我正在学习AI Agent"
)
memory.save(
"我希望以后从事AI工程师相关工作"
)
results = memory.search(
"推荐适合我的学习方向"
)
print("\n相关记忆:")
for item in results:
print("----------------")
print(item)
执行后,系统会根据:
推荐适合我的学习方向
寻找语义相关的历史Memory。
十七、为什么Embedding能够做到语义检索?
例如Memory:
我是一名Python开发者。
用户:
推荐一个适合我的编程方向。
两个句子的文字并不完全相同。
但是语义上存在联系。
Embedding会把文本转换成向量:
Python开发者
↓
[0.12, 0.42, 0.88...]
另一个文本:
编程方向
↓
[0.14, 0.40, 0.84...]
向量之间比较接近。
因此:
语义相似
↓
向量距离较近
↓
检索成功
这就是:
Semantic Memory
十八、把Memory接入Agent
现在Memory还是独立模块。
下一步:
User
↓
Agent
↓
Memory Search
↓
相关历史
↓
Prompt
↓
LLM
↓
Answer
agent.py
from memory import MemoryManager
class Agent:
def __init__(self):
self.memory = MemoryManager()
def chat(self, user_input):
memories = self.memory.search(
user_input,
top_k=3
)
memory_text = "\n".join(
memories
)
prompt = f"""
你是一个AI学习助手。
用户历史记忆:
{memory_text}
当前问题:
{user_input}
请结合用户历史信息回答。
"""
print(
"\n========== Prompt =========="
)
print(prompt)
self.memory.save(
user_input
)
return prompt
十九、测试Agent
main.py
from agent import Agent
agent = Agent()
agent.chat(
"我是Python开发者"
)
agent.chat(
"我正在学习AI Agent"
)
agent.chat(
"推荐一个适合我的项目"
)
当第三次提问时:
推荐一个适合我的项目
Memory会尝试检索:
我是Python开发者
我正在学习AI Agent
然后把相关Memory加入Prompt。
二十、Memory Extraction
这里还有一个非常重要的问题:
是不是用户说的每一句话都应该保存?
答案:
不是。
例如:
你好
没有必要保存。
好的
没有必要保存。
谢谢
没有必要保存。
但是:
我是Python开发者。
值得保存。
因此需要:
Memory Extraction
Memory Extraction流程
用户输入
↓
Memory Extractor
↓
判断是否值得保存
↓
提取重要信息
↓
保存
例如:
用户:
我是一名Python开发者,目前正在学习AI Agent。
Extractor:
用户是一名Python开发者。
用户正在学习AI Agent。
保存这些信息。
二十一、为什么Memory Extraction很重要?
Memory的核心不是:
保存越多越好。
而是:
保存真正有价值的信息。
如果保存大量无意义内容:
你好
好的
继续
谢谢
哈哈
...
最终会造成:
-
Memory数据库膨胀
-
检索结果质量下降
-
Token消耗增加
-
Agent获得大量无关信息
所以:
高质量Memory
>
大量Memory
二十二、Memory + RAG
真正的Agent通常不会只有Memory。
还会结合RAG。
架构:
User
↓
Current Question
↓
┌──────────┴──────────┐
↓ ↓
Memory Search RAG Search
↓ ↓
用户历史信息 外部知识
↓ ↓
└──────────┬──────────┘
↓
LLM
↓
Answer
二十三、举一个完整例子
Memory中:
用户是一名Java开发者。
用户正在学习AI Agent。
RAG知识库中:
AI Agent学习路线
Python Agent开发教程
RAG开发教程
LangGraph教程
用户问:
推荐一个适合我的学习方向。
Memory负责:
用户是谁?
得到:
Java开发者
RAG负责:
有哪些相关知识?
得到:
Agent学习路线
LangGraph
RAG
最终:
Memory
+
RAG
+
LLM
生成个性化答案。
二十四、Day17完整架构
经过今天的学习,Agent已经从:
用户
↓
LLM
↓
回答
升级为:
User
↓
Agent
↓
┌─────────────┴─────────────┐
↓ ↓
Memory RAG
↓ ↓
Vector Database Vector Database
↓ ↓
└─────────────┬─────────────┘
↓
LLM
↓
Answer
这已经是一个真正具有:
-
知识检索
-
用户记忆
-
语义搜索
能力的Agent基础架构。
二十五、Day17核心知识总结
今天主要学习了六个内容。
1. Short-term Memory
保存:
当前对话上下文
2. Long-term Memory
保存:
用户长期重要信息
3. Vector Memory
通过:
Embedding
+
Vector Database
+
Similarity Search
实现语义记忆。
4. Memory Extraction
从大量聊天中提取:
真正值得长期保存的信息
5. Memory + RAG
Memory = 用户历史
RAG = 外部知识
两者结合可以实现:
个性化Agent
6. Memory Agent
最终形成:
用户
↓
Agent
↓
Memory
↓
RAG
↓
LLM
↓
回答
二十六、Day17实践任务
今天不要只看代码,需要完成一个小项目:
AI学习助手Memory
实现:
第一次输入
我是Python开发者。
第二次输入
我正在学习AI Agent。
第三次输入
我希望以后成为AI工程师。
第四次输入
推荐一个适合我的项目。
要求:
Agent能够检索前面保存的相关Memory,并将Memory加入Prompt。
最终实现:
用户输入
↓
Memory保存
↓
Embedding
↓
Chroma
↓
语义检索
↓
相关Memory
↓
Prompt
↓
LLM
↓
回答
二十七、Day17完成标准
完成下面这些内容,才算真正完成Day17:
☑ 理解Short-term Memory
☑ 理解Long-term Memory
☑ 理解Vector Memory
☑ 理解Memory与RAG的区别
☑ 使用SQLite实现基础Memory
☑ 使用Embedding实现语义Memory
☑ 使用Chroma保存Memory
☑ 实现Memory Search
☑ 理解Memory Extraction
☑ 理解Memory + RAG架构
☑ 完成一个Memory Agent
Day17的核心一句话:
RAG让Agent记住"外部知识",Memory让Agent记住"用户历史"。
这两个能力结合起来,才开始真正接近一个能够长期工作的智能Agent。