Day17:Agent Memory高级设计——短期记忆、长期记忆与向量语义记忆

一、什么是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。

相关推荐
40岁资深老架构师尼恩34 分钟前
工业级 AI问数 AST语法 + 知识图谱语义+ 质量规则 三层安全校验 架构设计与实现
人工智能·安全·知识图谱
武子康39 分钟前
旧对话为什么没有恢复代码:Pi Session Tree 与上下文投影
人工智能
武子康40 分钟前
DeepSeek 把 Agent Core 也插件化了:Harness 的真正赌注
人工智能·llm·agent
wu_jing_sheng01 小时前
哨兵卫星数据下载工具:基于CDSE的PySide6桌面应用开发实践
人工智能
小唔w1 小时前
2026年AI培训行业观察:主流学习渠道一览
人工智能·学习
美狐美颜sdk1 小时前
直播APP开发技术架构解析:从音视频流到第三方美颜SDK接入的完整方案
大数据·人工智能·音视频·美颜sdk·美颜api
CIO_Alliance1 小时前
AI认知系列(3)| 数据、算法、算力、场景四要素协同
人工智能·算法·ipaas·系统集成·企业cio联盟·企业级ai化转型
技术传感器1 小时前
让 Hermes 自动完成一个软件需求:从 Issue 到 PR 的 AI 开发流水线
人工智能·架构·aigc·需求分析·issue
啥都想学点的研究生1 小时前
一篇文章讲清楚:机器学习的相关概念
人工智能·机器学习