\documentclass[a4paper]{article}

% Basic packages
\usepackage[fontset=fandol]{ctex}
\usepackage{amsmath, amssymb}
\usepackage{graphicx}
\usepackage[margin=2.5cm]{geometry}
\usepackage[most]{tcolorbox}
\usepackage{etoolbox}
\usepackage{listings}
\usepackage{hyperref}
\usepackage{booktabs}
\usepackage{subcaption}
\usepackage{float}
\usepackage{tikz}
\usepackage{enumitem}
\IfFileExists{pgfplots.sty}{
    \usepackage{pgfplots}
    \pgfplotsset{compat=1.18}
}{}

% Highlight boxes
\newtcolorbox{knowledgebox}[1]{
    enhanced, colback=blue!5!white, colframe=blue!75!black, colbacktitle=blue!75!black,
    coltitle=white, fonttitle=\bfseries, title=#1, attach boxed title to top left={yshift=-2mm, xshift=2mm},
    boxrule=1pt, sharp corners
}

\newtcolorbox{importantbox}[1]{
    enhanced, colback=yellow!10!white, colframe=yellow!80!black, colbacktitle=yellow!80!black,
    coltitle=black, fonttitle=\bfseries, title=#1, sharp corners
}

\newtcolorbox{warningbox}[1]{
    enhanced, colback=red!5!white, colframe=red!75!black, colbacktitle=red!75!black,
    coltitle=white, fonttitle=\bfseries, title=#1, sharp corners
}

% Listings
\lstset{
    language=Python,
    basicstyle=\ttfamily\small,
    keywordstyle=\color{blue},
    stringstyle=\color{red!60!black},
    commentstyle=\color{green!60!black},
    breaklines=true,
    frame=single,
    numbers=left,
    numberstyle=\tiny\color{gray},
    captionpos=b,
    extendedchars=false
}

% Front-page metadata
\newcommand{\notetitle}{Agentic Memory: A Detailed Breakdown}
\newcommand{\noteauthors}{基于公开课程资料整理}
\newcommand{\notedate}{2026年3月29日}
\newcommand{\videochannel}{ramakrushna (techwith\_ram)}
\newcommand{\videopublishdate}{2026年3月27日}
\newcommand{\videoduration}{X Article}
\newcommand{\videourl}{https://x.com/techwith_ram/status/2037499938574110770}
\newcommand{\videocoverpath}{}
\newcommand{\repourl}{https://github.com/hqhq1025/ai-course-notes}


% Footer with repo info
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\fancyfoot[C]{\thepage}
\fancyfoot[R]{\footnotesize\color{gray}\href{\repourl}{AI Course Notes}}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}

\begin{document}

\begin{titlepage}
\centering
{\Large 文章笔记\par}
\vspace{1.2cm}
{\huge\bfseries \notetitle\par}
\vspace{0.8cm}
{\large \noteauthors\par}
\vspace{0.3cm}
{\large \notedate\par}
\vspace{1.2cm}

\vfill
\begin{tcolorbox}[width=0.9\textwidth, colback=black!2!white, colframe=black!60, sharp corners]
\textbf{原文作者}：\videochannel\par
\textbf{发布日期}：\videopublishdate\par
\textbf{内容形式}：\videoduration\par
\textbf{原文链接}：\href{\videourl}{\nolinkurl{\videourl}}\par
\textbf{项目主页}：\href{\repourl}{\nolinkurl{\repourl}}\par
\end{tcolorbox}
\end{titlepage}

\tableofcontents
\newpage

%% --- 正文内容开始 --- %%

\section{引言：为什么 Agent 需要记忆？}

大多数 LLM 的交互是\textbf{无状态的}——每一次新对话都是一张白纸。模型不知道你是谁、之前聊过什么、一起构建了什么。对于简单的聊天机器人，这无伤大雅；但对于一个需要执行任务、做出决策并随时间不断改进的 \textbf{Agent} 来说，这种"失忆症"是致命的。

\begin{importantbox}{记忆是 Agent 进化的关键}
真正的智能不仅仅是"回答得好"，而是能够\textbf{记住、学习并在已有经验上持续构建}。记忆将一个无状态的系统转变为一个能够真正进化的系统。
\end{importantbox}

\subsection{本章小结}

LLM 天生无状态，每次对话都从零开始。Agent 需要记忆系统来维持上下文、积累经验和持续学习。

\section{什么是 Agentic Memory？}

Agentic Memory 不是单一组件，而是一个在后台运作的\textbf{完整系统}——包括不同类型的存储、信息检索方式以及智能管理策略，使 Agent 能够跨时间维持上下文。

记忆系统同时承担三个截然不同的职责：

\begin{enumerate}[leftmargin=2em]
    \item \textbf{Continuity（连续性）}——关乎身份认同。Agent 知道你是谁、你的偏好是什么、你们之前一起构建了什么。没有连续性，每次交互都像从头开始。
    \item \textbf{Context（上下文）}——关乎当前任务。刚刚发生了什么、调用了哪个工具、返回了什么结果、下一步该做什么。它是多步工作流不崩溃的保障。
    \item \textbf{Learning（学习）}——关乎持续进步。理解什么有效、什么无效，并在长期中逐步改进决策，而非重复犯同样的错误。
\end{enumerate}

\begin{knowledgebox}{三大职责的协同}
一个设计良好的 Agent 记忆系统同时处理以上三个方面，为每个方面使用不同的存储后端。三者协同让 Agent 表现得一致、可靠，且在每次交互后都变得更聪明。
\end{knowledgebox}

\subsection{本章小结}

Agentic Memory 是一个多层系统，同时服务于身份连续性、任务上下文和经验学习三个目标。

\section{四种记忆类型}

该领域已收敛到四种不同的记忆类型，可以类比为大脑的四个不同区域，各自为特定任务而设计。

\subsection{In-context Memory（上下文内记忆）}

Context Window 是 Agent 的\textbf{工作台}——台面上的一切都可以即时访问，模型可以在单次 forward pass 中对其进行推理，无需检索步骤。

但工作台有大小限制：每个 token 都消耗算力和金钱，session 结束后台面会被清空。

上下文中通常包含以下内容：
\begin{itemize}[leftmargin=2em]
    \item \textbf{System Prompt}：Agent 的人设、规则、能力描述、当前日期/用户信息
    \item \textbf{Conversation History}：本次 session 中的对话往来
    \item \textbf{Tool Call Results}：Agent 刚刚调用工具的输出
    \item \textbf{Retrieved Memories}：从外部存储拉取的记忆片段
    \item \textbf{Scratchpad}：中间推理过程（Chain-of-Thought 输出）
\end{itemize}

\begin{warningbox}{Sliding Window 问题}
在长对话中，历史消息不断累积，最终会溢出 context 上限。简单截断最早消息会丢失重要的早期上下文。应采取更好的策略：
\begin{itemize}[leftmargin=1.5em]
    \item \textbf{Summarization}：定期将旧对话压缩为简短摘要
    \item \textbf{Selective Retention}：保留包含关键事实、决策或工具结果的对话轮次，丢弃闲聊
    \item \textbf{Offload to External Memory}：将重要事实提取到 Vector Store，按需检索
\end{itemize}
\end{warningbox}

\subsection{External Memory（外部记忆）}

External Memory 是持久化在模型之外的一切——数据库、向量存储、键值存储和文件。它能跨 session 存活，如果存储得当，Agent 可以回忆起六个月前的事情。

外部存储有两种风格：

\begin{itemize}[leftmargin=2em]
    \item \textbf{Structured Store（精确查找）}：PostgreSQL、Redis、SQLite。通过 key、ID 或 SQL 查询。快速、可预测，适合用户画像、偏好和结构化数据。
    \item \textbf{Vector Store（语义搜索）}：Pinecone、Chroma、pgvector。通过\textbf{语义}查询——"找到与这个概念相似的记忆"。对非结构化笔记和 Episodic Recall 至关重要。
\end{itemize}

\begin{importantbox}{检索设计是核心}
检索步骤是记忆系统的瓶颈。如果你没有检索到正确的记忆，Agent 就像这些记忆根本不存在一样。好的记忆架构是\textbf{20\% 存储 + 80\% 检索设计}。
\end{importantbox}

\subsection{Episodic Memory（情景记忆）}

Episodic Memory 是最被低估的记忆类型。外部记忆存储\textbf{事实}，而情景记忆存储\textbf{事件}——特别是过去行动的结果。

最简单的形式是一个结构化日志：每当 Agent 完成一个任务，它就记录发生了什么。随着时间推移，这个日志变成了一个丰富的自我认知来源，Agent 可以在做决策前查阅它。

一个 Episode 的典型结构：

\begin{itemize}[leftmargin=2em]
    \item \textbf{Task}：任务描述
    \item \textbf{Strategy}：采用的策略
    \item \textbf{Outcome}：执行结果（成功/失败）
    \item \textbf{Lesson}：学到的经验教训
\end{itemize}

\begin{knowledgebox}{Reflection Loop（反思循环）}
当新任务到来时，Agent 检索语义上最相似的历史 Episode，用它们来选择策略。这本质上是从\textbf{个人历史}中进行 Few-shot Learning，而不是从手工构造的数据集。
\end{knowledgebox}

\subsection{Semantic/Parametric Memory（语义/参数记忆）}

这是模型"与生俱来"的记忆——在训练过程中编码到权重里的一切：世界知识、语言模式、推理策略、编码规范和文化常识。

它始终在那里，Agent 永远不需要检索它。但它有严格的限制：

\begin{itemize}[leftmargin=2em]
    \item \textbf{冻结在训练时刻}：模型不知道 cutoff date 之后发生的事
    \item \textbf{运行时无法更新}：不重新训练或微调就无法注入新的永久事实
    \item \textbf{不透明}：你无法精确检查模型"知道"什么或不知道什么
    \item \textbf{容易产生幻觉}：模型用看似合理但实际错误的内容填补知识空白
\end{itemize}

\begin{warningbox}{不要依赖参数记忆处理敏感信息}
对于时间敏感、领域特定或私有的信息，不要依赖 Parametric Memory，应使用外部检索。Parametric Memory 只是在没有更好来源时，作为通用世界知识的兜底方案。
\end{warningbox}

\begin{importantbox}{正确的思维模型}
Parametric Memory 是 Agent 的\textbf{通识教育}；External、Episodic 和 In-context Memory 是 Agent 的\textbf{在职经验}。最好的 Agent 将两者结合使用。
\end{importantbox}

\subsection{本章小结}

四种记忆类型各司其职：In-context Memory 提供即时推理能力，External Memory 提供跨 session 持久化，Episodic Memory 记录行动结果以支持学习，Parametric Memory 提供通用基础知识。

\section{记忆在 Agent Loop 中的流转}

每当 Agent 处理一个请求时，记忆系统贯穿整个流程。核心机制是：记忆操作\textbf{环绕} LLM 调用——调用前检索，调用后写入。

典型的 Agent Loop 流程如下：

\begin{enumerate}[leftmargin=2em]
    \item 用户发送请求
    \item \textbf{Memory Retrieval}：从 External Memory 和 Episodic Memory 中检索相关记忆
    \item 将检索结果注入 Context Window（In-context Memory）
    \item LLM 基于完整上下文进行推理并生成响应
    \item \textbf{Memory Write}：将本次交互中的关键信息写入 External Memory 和 Episodic Memory
    \item 返回响应给用户
\end{enumerate}

\begin{importantbox}{模型本身是无状态的}
模型本身是无状态的；记忆系统才是制造出"有状态、有意识的 Agent"这一\textbf{幻象}的关键。
\end{importantbox}

\subsection{本章小结}

Agent Loop 中记忆操作在 LLM 调用前后进行——先检索、后写入。模型只是中间的推理引擎，记忆系统赋予它状态感。

\section{构建记忆层：实现要点}

原文以 Python + OpenAI Embeddings + ChromaDB 为例，展示了如何构建一个记忆层。核心组件包括两个类。

\subsection{MemoryStore 类}

负责记忆的写入（生成 Embedding 后存储）和语义检索，是整个系统的基础。

\begin{lstlisting}[caption={MemoryStore 核心接口（伪代码）}]
class MemoryStore:
    def __init__(self, collection_name):
        self.client = chromadb.Client()
        self.collection = self.client.get_or_create_collection(
            collection_name)
        self.embedder = OpenAI()

    def add(self, text, metadata=None):
        embedding = self.embedder.embed(text)
        self.collection.add(embedding, text, metadata)

    def search(self, query, top_k=5):
        query_embedding = self.embedder.embed(query)
        return self.collection.query(query_embedding, n=top_k)
\end{lstlisting}

\subsection{EpisodicLogger 类}

在 MemoryStore 之上添加情景日志层，记录每次任务的执行过程和结果。

\begin{lstlisting}[caption={EpisodicLogger 核心接口（伪代码）}]
class EpisodicLogger:
    def __init__(self, memory_store):
        self.store = memory_store

    def log_episode(self, task, strategy, outcome, lesson):
        episode = {
            "task": task, "strategy": strategy,
            "outcome": outcome, "lesson": lesson,
            "timestamp": now()
        }
        self.store.add(json.dumps(episode),
                       metadata={"type": "episode"})

    def recall_similar(self, task_description, top_k=3):
        return self.store.search(task_description, top_k)
\end{lstlisting}

\subsection{本章小结}

记忆层的核心是 MemoryStore（向量存储 + 语义检索）和 EpisodicLogger（行动日志 + 经验回溯）。两者搭配即可构建一个具备基本记忆能力的 Agent。

\section{Vector Database 与相似度搜索}

Vector Database 是任何严肃记忆系统的核心。与 SQL 的精确匹配不同，它在高维空间中找到一个向量的最近邻居，实现\textbf{语义搜索}——即使没有共享词汇也能找到概念相关的记忆。

\subsection{相似度搜索原理}

每条记忆被转换为一个向量（以 OpenAI Embedding 模型为例，是一个包含 1,536 个浮点数的数组）。概念相似的文本会产生相似的向量。查询时，将查询文本也嵌入为向量，然后通过 Cosine Similarity 找到最近的向量。

$$
\text{cosine\_similarity}(\mathbf{a}, \mathbf{b}) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \cdot \|\mathbf{b}\|}
$$

其中：
\begin{itemize}[leftmargin=2em]
    \item $\mathbf{a}, \mathbf{b}$：两个 Embedding 向量
    \item $\mathbf{a} \cdot \mathbf{b}$：向量点积
    \item $\|\mathbf{a}\|, \|\mathbf{b}\|$：向量的 L2 范数
\end{itemize}

\begin{knowledgebox}{Vector Database 选型建议}
\begin{itemize}[leftmargin=1.5em]
    \item \textbf{ChromaDB}：本地开发首选，轻量易上手
    \item \textbf{pgvector}：如果你已在用 PostgreSQL，零额外基础设施
    \item \textbf{Pinecone / Qdrant}：需要大规模部署时使用
\end{itemize}
\end{knowledgebox}

\subsection{本章小结}

Vector Database 通过将文本转为高维向量并计算 Cosine Similarity 来实现语义搜索。选择工具时应根据开发阶段和规模需求决定。

\section{记忆管理：遗忘策略}

真正的记忆系统不只是不断积累，还需要\textbf{精心筛选}。一个不断增长、缺乏重点的存储会随时间退化——检索噪声增大、延迟攀升、矛盾的记忆让 Agent 困惑。

\begin{warningbox}{无限堆积记忆的陷阱}
没有遗忘策略的记忆系统最终会变得\textbf{比没有记忆更糟糕}：检索噪声淹没有效信息，互相矛盾的记忆导致 Agent 决策混乱。
\end{warningbox}

\subsection{Time-based Decay（基于时间的衰减）}

较旧的记忆通常相关性较低。通过 recency 和 semantic relevance 的组合来评分记忆。研究中常用的公式：

$$
\text{score} = \alpha \cdot \text{relevance} + (1 - \alpha) \cdot \text{recency\_decay}(t)
$$

其中：
\begin{itemize}[leftmargin=2em]
    \item $\alpha$：语义相关性与时间衰减之间的权衡系数
    \item $\text{relevance}$：查询与记忆之间的语义相似度
    \item $\text{recency\_decay}(t)$：基于时间 $t$ 的衰减函数（如指数衰减）
\end{itemize}

\subsection{Importance Scoring（写入时重要性评分）}

存储记忆时，让模型对自己的输出进行重要性评分，只存储高分项。这从源头过滤噪声。

\subsection{Periodic Consolidation（定期合并）}

运行定期任务（如每天夜间），将重复或高度相似的记忆合并为一条规范的摘要。这类似于人类睡眠过程中的\textbf{记忆巩固}机制。

\begin{knowledgebox}{类比人类记忆}
人类大脑在睡眠中进行"记忆巩固"——将白天零散的短期记忆整理、合并为长期记忆。Agent 的 Periodic Consolidation 机制借鉴了同样的原理：定期清理冗余，保留精华。
\end{knowledgebox}

\subsection{本章小结}

三种遗忘策略各有用途：Time-based Decay 让旧记忆自然淡出，Importance Scoring 在写入时过滤噪声，Periodic Consolidation 定期合并重复记忆。三者结合可维持高质量的记忆库。

\section{总结与延伸}

\subsection{核心要点回顾}

\begin{itemize}[leftmargin=2em]
    \item 记忆是让 AI Agent 从"工具"升级为"伙伴"的关键能力
    \item Agentic Memory 同时服务于三个目标：连续性、上下文和学习
    \item 四种记忆类型（In-context、External、Episodic、Parametric）各司其职，协同工作
    \item 记忆架构的核心在于\textbf{检索设计}而非存储
    \item 记忆管理（遗忘策略）与记忆存储同等重要
\end{itemize}

\subsection{延伸思考}

\begin{itemize}[leftmargin=2em]
    \item \textbf{MemGPT}：将操作系统的虚拟内存概念引入 LLM Agent，自动在不同层级的记忆之间进行 paging
    \item \textbf{Generative Agents}（Stanford）：在模拟世界中使用 Episodic Memory + Reflection 机制让 Agent 展现出类人的社会行为
    \item \textbf{RAG 与记忆的关系}：Retrieval-Augmented Generation 可以看作 External Memory 的一种应用形态，但完整的 Agentic Memory 还包括写入、遗忘和反思机制
    \item \textbf{Multi-Agent 场景下的共享记忆}：当多个 Agent 协作时，如何设计共享的记忆空间和权限控制是一个开放问题
\end{itemize}

%% --- 正文内容结束 --- %%

\end{document}
