<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>潘锦的空间 &#187; 上下文记忆</title>
	<atom:link href="https://www.phppan.com/tag/%e4%b8%8a%e4%b8%8b%e6%96%87%e8%ae%b0%e5%bf%86/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.phppan.com</link>
	<description>SaaS SaaS架构 团队管理 技术管理 技术架构 PHP 内核 扩展 项目管理</description>
	<lastBuildDate>Sat, 04 Apr 2026 01:19:58 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>聊下 AI Agent 的上下文记忆和遗忘</title>
		<link>https://www.phppan.com/2025/11/lets-talk-about-contextual-memory-and-forgetting-in-ai-agents/</link>
		<comments>https://www.phppan.com/2025/11/lets-talk-about-contextual-memory-and-forgetting-in-ai-agents/#comments</comments>
		<pubDate>Sat, 15 Nov 2025 02:25:07 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[AIAgent]]></category>
		<category><![CDATA[AIAgent架构]]></category>
		<category><![CDATA[上下文记忆]]></category>

		<guid isPermaLink="false">https://www.phppan.com/?p=2434</guid>
		<description><![CDATA[最近 DeepSeek 的 OCR 论文里有个有趣的想法：用光学压缩来模拟人类的记忆遗忘机制。 这个思路很巧妙 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="color: #191b1f;" data-first-child="" data-pid="u00d0loh">最近 DeepSeek 的 OCR 论文里有个有趣的想法：用光学压缩来模拟人类的记忆遗忘机制。</p>
<p style="color: #191b1f;" data-pid="QOuNvueu">这个思路很巧妙。他们注意到人类记忆和视觉感知都有个共同特点：距离越远，信息越模糊。一小时前的事记得清楚，一年前的事几乎忘光；10 厘米的东西看得清楚，20 米外的东西就模糊了。</p>
<p style="color: #191b1f;" data-pid="riVmc3q3">DeepSeek 把这个生物学现象转化成了工程实现：近期对话用高分辨率保存，一周前的对话降到中等分辨率，久远的记忆压缩到最小。信息随时间自然衰减，就像人类遗忘一样。</p>
<p style="color: #191b1f;" data-pid="ogJTPiZZ">这让我想到 Agent 记忆系统设计的本质问题。</p>
<h2 style="font-weight: 500; color: #191b1f;">1. 为什么 Agent 需要记忆</h2>
<p style="color: #191b1f;" data-pid="jRK3ktha">上下文窗口和记忆是两码事。</p>
<p style="color: #191b1f;" data-pid="n0tKneb1">上下文窗口只是让模型一次看到更多对话，像是扩大了工作台。但记忆不同，它让 Agent 能保存、更新和选择性回忆信息。没有记忆，Agent 就像得了失忆症，每次对话都从零开始。</p>
<p style="color: #191b1f;" data-pid="wXSCrXWK">现在大家都在追求更大的上下文窗口，从 8K 到 32K，再到 128K、1M。但这种暴力扩张有个问题：计算成本呈二次方增长。处理 100K tokens 的成本是 10K tokens 的百倍。而且，把所有信息一股脑塞给模型，反而可能让它迷失在细节中。</p>
<p style="color: #191b1f;" data-pid="bxcB64D4">记忆系统的价值在于选择性保留。</p>
<p style="color: #191b1f;" data-pid="UlkFlGpZ">不是所有信息都值得记住，也不是所有信息都需要同样的精度。</p>
<h2 style="font-weight: 500; color: #191b1f;">2. Agent 记忆的层次结构</h2>
<p style="color: #191b1f;" data-pid="UcRsqT0R">AI Agent 的记忆系统可以分成几个层次：</p>
<p style="color: #191b1f;" data-pid="VaHkBmao">短期记忆（工作记忆）<br />
这是 Agent 的记事本，保存当前对话和正在处理的任务。典型容量在几千到几万 tokens。没有它，Agent 会在对话中途失去思路，问你刚才说了什么。</p>
<p style="color: #191b1f;" data-pid="R1r4R33n">长期记忆<br />
这是跨会话的持久化存储。用户下次回来，Agent 还记得之前的交互。长期记忆又可以细分：</p>
<ul style="color: #191b1f;">
<li data-pid="pWfCIpV6">事实记忆：保存确定的信息，比如用户姓名、偏好、角色定义。这些信息需要随情况更新，保持&#8221;当前真实状况&#8221;。</li>
<li data-pid="x8dcm6tS">情景记忆：记录具体经历，什么时候发生了什么，结果如何。这给 Agent 一种时间连续感，能回顾过去的决策。</li>
<li data-pid="5Lmtpprj">语义记忆：组织概念和关系的知识网络。让 Agent 理解&#8221;数据库慢&#8221;和&#8221;查询延迟高&#8221;是相关问题。</li>
</ul>
<h2 style="font-weight: 500; color: #191b1f;">3. 遗忘机制是有用的</h2>
<p style="color: #191b1f;" data-pid="Pw4VLok7">人类会遗忘，不是大脑容量不够，而是遗忘让我们更高效。</p>
<p style="color: #191b1f;" data-pid="MEkGAmIy">想象一下，如果你记得生活中的每个细节：每顿饭的味道、每次呼吸的感觉、路过的每个行人的脸。这些信息会淹没真正重要的记忆。遗忘是一种过滤机制，帮我们保留有价值的信息。</p>
<p style="color: #191b1f;" data-pid="c-uThKRT">Agent 也需要这种机制。随着交互增加，历史数据会无限增长。如果不加选择地保存所有内容，会面临几个问题：</p>
<ol style="color: #191b1f;">
<li data-pid="EqrQNumh">存储成本：每个用户的历史数据都完整保存，存储需求会爆炸式增长。</li>
<li data-pid="ssUReG3P">检索效率：在海量历史中找到相关信息越来越慢。</li>
<li data-pid="Jzi8Z0mx">注意力分散：太多无关信息会干扰 Agent 的决策。</li>
<li data-pid="Ygd6VZ9v">隐私风险：永久保存所有对话增加了数据泄露的风险。</li>
</ol>
<h2 style="font-weight: 500; color: #191b1f;">4. 用分辨率模拟时间衰减</h2>
<p style="color: #191b1f;" data-pid="8WVhAFQ-">DeepSeek 的做法是：把历史对话渲染成图像，然后用不同的分辨率来编码。</p>
<p style="color: #191b1f;" data-pid="GsUItZaE">近期对话用高分辨率（Gundam 模式，800+ tokens），保留完整细节。</p>
<p style="color: #191b1f;" data-pid="fqLGqc3K">一周前的对话用中等分辨率（Base 模式，256 tokens），保留主要内容。</p>
<p style="color: #191b1f;" data-pid="QHBxCZJS">久远的历史用低分辨率（Tiny 模式，64 tokens），只留个大概印象。</p>
<p style="color: #191b1f;" data-pid="BsGJFhmO">这样做的好处是：</p>
<ol style="color: #191b1f;">
<li data-pid="OAGanprf">不需要丢弃历史信息，所有对话都保留着</li>
<li data-pid="L50K3Ezp">但远期信息自然&#8221;淡化&#8221;，占用的 token 越来越少</li>
<li data-pid="nuTqIlbG">模拟了人类记忆的衰减曲线</li>
</ol>
<p style="color: #191b1f;" data-pid="jFDvbEnY">具体实现上，他们会：</p>
<ol style="color: #191b1f;">
<li data-pid="QOMZH5QU">把超过一定长度的历史对话渲染成图像</li>
<li data-pid="chE3OPLI">第一次压缩，让 token 减少 10 倍</li>
<li data-pid="RPJMV84G">上下文再次超长时，进一步降低分辨率，再压缩 10 倍</li>
<li data-pid="vSFIfKGQ">随着时间推移，图像越来越小，内容越来越模糊，模型也就逐渐&#8221;读不清&#8221;了</li>
</ol>
<p style="color: #191b1f;" data-pid="_UMt-KwT">这种方式不是简单的截断或删除，而是让信息随时间衰减——就像人类记忆一样。</p>
<h2 style="font-weight: 500; color: #191b1f;">5. 理论上无限的上下文</h2>
<p style="color: #191b1f;" data-pid="vO9Twytd">如果这个思路走通了，就能实现&#8221;理论上无限的 context window&#8221;。</p>
<p style="color: #191b1f;" data-pid="VXMy8zsx">这里的无限不是真的无限，而是通过分层压缩，让历史信息的存储成本趋近于常数。</p>
<p style="color: #191b1f;" data-pid="NCW4sALK">我们不需要保持所有信息的高保真度，只需要让信息按重要性和时效性衰减。</p>
<p style="color: #191b1f;" data-pid="IihWFbLT">最近的对话，全保留。<br />
一周前的，压缩一次。<br />
一个月前的，再压缩一次。<br />
半年前的，只留个印象。</p>
<p style="color: #191b1f;" data-pid="1z8cHXBO">这样，计算资源始终聚焦在最重要的&#8221;近期&#8221;信息上，而久远的历史虽然还在，但只占用很少的 token。</p>
<p style="color: #191b1f;" data-pid="qBK5cF-z">从成本角度看，这比无脑扩大上下文窗口要合理得多。</p>
<h2 style="font-weight: 500; color: #191b1f;">6. 记忆管理的工程实践</h2>
<p style="color: #191b1f;" data-pid="CiqGjxiM">在实际的 Agent 系统里，记忆管理通常分几个层次：</p>
<p style="color: #191b1f;" data-pid="0X438tLj">会话级记忆——当前对话的上下文，存在内存里，对话结束就清空。这部分可以直接用模型的上下文窗口。</p>
<p style="color: #191b1f;" data-pid="kZaux06v">用户级记忆——持久化存储，用向量数据库或 KV 存储。每次对话时，根据当前问题检索相关的历史记忆，注入到 prompt 里。</p>
<p style="color: #191b1f;" data-pid="kbCsIgDS">全局知识库——所有用户共享的知识，比如产品文档、技术规范、FAQ。这部分通常用 RAG（检索增强生成）来处理。</p>
<p style="color: #191b1f;" data-pid="PKyVHQCI">关键是如何在这些层次之间做好信息流转和优先级管理。</p>
<p style="color: #191b1f;" data-pid="_nxWrF5Z">比如，用户刚说过的话，优先级最高，直接放在 prompt 前面。一周前的对话，需要检索后才注入。一个月前的，可能只保留摘要。</p>
<p style="color: #191b1f;" data-pid="eeq47zLI">这种分层策略，和 DeepSeek 的分辨率衰减思路是一致的——让资源消耗和信息重要性成正比。</p>
<h2 style="font-weight: 500; color: #191b1f;">7. 遗忘不是丢失</h2>
<p style="color: #191b1f;" data-pid="dGO2cp7d">这里需要明确的是，遗忘不等于删除。</p>
<p style="color: #191b1f;" data-pid="72dnsTXc">人类的遗忘，是提取变难了，不是信息消失了。在特定的提示下，很多&#8221;遗忘&#8221;的记忆还能被唤起。</p>
<p style="color: #191b1f;" data-pid="lA0RygwG">Agent 的记忆也应该这样设计。</p>
<p style="color: #191b1f;" data-pid="dJ8i71r7">低分辨率的历史对话，在大部分场景下不会被激活，但如果用户明确提到某个时间点的事情，系统可以重新加载那段历史的高分辨率版本。</p>
<p style="color: #191b1f;" data-pid="oWhShj9g">这需要一个索引机制，能根据时间、主题、关键词快速定位到历史片段。</p>
<p style="color: #191b1f;" data-pid="csWdnT0r">像 Manus 所使用的文件系统就是这样一种索引机制。</p>
<p style="color: #191b1f;" data-pid="A_Mqb_wt">遗忘是常态，召回是特例。这样才能在效率和完整性之间找到平衡。</p>
<h2 style="font-weight: 500; color: #191b1f;">8. 什么值得记住</h2>
<p style="color: #191b1f;" data-pid="h-LDbtHu">并不是所有对话都需要长期保存。</p>
<p style="color: #191b1f;" data-pid="7Fgknp3O">大量的对话是重复的、临时的、没有上下文依赖的。比如简单的问候、重复的确认、无关紧要的闲聊。</p>
<p style="color: #191b1f;" data-pid="KhOdxCl6">这些内容可以在会话结束后直接丢弃，不需要进入长期记忆。</p>
<p style="color: #191b1f;" data-pid="UhEqZ3F3">真正值得记住的，是那些包含决策、偏好、关键信息的交互。</p>
<p style="color: #191b1f;" data-pid="Cg3sCecM">比如：</p>
<ul style="color: #191b1f;">
<li data-pid="vB5xr1kZ">用户明确表达的需求和偏好</li>
<li data-pid="EJIYi7Kw">重要的决策节点和原因</li>
<li data-pid="dfk2wiPE">反复出现的问题和解决方案</li>
<li data-pid="69ys2HaX">用户的角色、职责、技术栈等基础信息</li>
</ul>
<p style="color: #191b1f;" data-pid="AjLfd5b5">这需要在记忆写入时做判断和过滤。可以用一个小模型或规则引擎，评估每轮对话的重要性，决定是否持久化。 Gemini Code 就是这么干的。</p>
<p style="color: #191b1f;" data-pid="KZTZUMg_">不是所有东西都值得记住，筛选本身就是一种优化。</p>
<h2 style="font-weight: 500; color: #191b1f;">9. 记忆的更新和冲突</h2>
<p style="color: #191b1f;" data-pid="KrQUed0l">长期记忆不是只写不改的日志，它需要能更新。</p>
<p style="color: #191b1f;" data-pid="Y98n9_cn">用户的偏好会变，角色会变，之前的信息可能过时或错误。</p>
<p style="color: #191b1f;" data-pid="2zxdEDua">比如用户之前说喜欢中古风的家具，后来又说喜欢北欧风，这个信息需要更新，而不是简单地追加一条新记录。</p>
<p style="color: #191b1f;" data-pid="y2c7QVej">如果只追加不更新，记忆会越来越冗余，甚至出现矛盾。</p>
<p style="color: #191b1f;" data-pid="MFQ_awuo">一个好的记忆系统，需要能识别冲突，做合并和覆盖。</p>
<p style="color: #191b1f;" data-pid="3w2Tg9pE">这可以通过实体识别和关系抽取来实现。把对话内容结构化成三元组（主体-关系-客体），然后在写入时检查是否和已有记忆冲突。</p>
<p style="color: #191b1f;" data-pid="r_5eCQ77">如果冲突，可以根据时间戳、置信度等因素决定是更新还是保留多个版本。</p>
<p style="color: #191b1f;" data-pid="Z2ORyLAr">记忆管理的复杂度，不亚于写一个小型数据库。</p>
<h2 style="font-weight: 500; color: #191b1f;">10. 压缩不只是技术问题</h2>
<p style="color: #191b1f;" data-pid="Ppkpw7PO">回到 DeepSeek 的光学压缩思路，它的价值不只是技术实现，更重要的是提供了一个思维框架。</p>
<p style="color: #191b1f;" data-pid="N9ODEfnI">我们习惯于把上下文长度当作硬指标——越长越好。但这个论文提醒我们，长度和质量不是一回事。</p>
<p style="color: #191b1f;" data-pid="RkOknuOs">有时候，适度的遗忘反而能提升系统的整体表现。</p>
<p style="color: #191b1f;" data-pid="rqbDyD4A">有如下的好处：</p>
<ol style="color: #191b1f;">
<li data-pid="_b5Rs0Zi">减少了无关信息的干扰</li>
<li data-pid="aO8Oy66n">降低了计算成本</li>
<li data-pid="4MfHIzg0">让模型专注于最相关的内容</li>
</ol>
<p style="color: #191b1f;" data-pid="E3UrY7Cj">这和人类的认知机制是一致的。我们不会带着所有历史记忆去做每一个决策，而是根据当前情境激活最相关的那部分。</p>
<p style="color: #191b1f;" data-pid="81PjpU1t">Agent 应该学会做同样的事。</p>
<h2 style="font-weight: 500; color: #191b1f;">11. 成本和效果的平衡</h2>
<p style="color: #191b1f;" data-pid="JxU8lxbF">从成本角度看，无限扩展上下文是不可持续的。</p>
<p style="color: #191b1f;" data-pid="1YPxlmhP">假设一个 Agent 系统，每天处理 1000 次对话，每次对话平均 10 轮，每轮 500 tokens。</p>
<p style="color: #191b1f;" data-pid="VSljv2CT">如果所有历史对话都全量保留，一个月下来，单个用户的上下文就会达到 1500k tokens。</p>
<p style="color: #191b1f;" data-pid="4lIEHGgs">如果有 1000 个活跃用户，每次推理都带上完整上下文，token 消耗会是天文数字。</p>
<p style="color: #191b1f;" data-pid="Asr3TVL4">但如果用分层记忆 + 遗忘机制：</p>
<ul style="color: #191b1f;">
<li data-pid="VMpWGZI9">最近 3 天的对话，全保留</li>
<li data-pid="cawoi0TR">一周到一个月的，压缩 50%</li>
<li data-pid="aVGYMOY4">一个月以上的，压缩 90%</li>
</ul>
<p style="color: #191b1f;" data-pid="TXkSFo_G">token 消耗可能降低到原来的 10%-20%，而对实际效果的影响很小。</p>
<p style="color: #191b1f;" data-pid="A5zrk6V0">因为大部分场景下，用户关心的就是最近的对话。</p>
<h2 style="font-weight: 500; color: #191b1f;">12. 记忆应该是系统能力</h2>
<p style="color: #191b1f;" data-pid="FAW4VhYu">很多团队把记忆功能当作一个独立的我来开发——加个数据库，存一下历史，检索一下注入。</p>
<p style="color: #191b1f;" data-pid="pzIjtVgG">但这样做的效果往往不好。</p>
<p style="color: #191b1f;" data-pid="fxXPVf9Q">因为记忆不是一个功能模块，而是整个 Agent 系统的底层能力。</p>
<p style="color: #191b1f;" data-pid="yzyCeN8O">它需要和 prompt 设计、工具调用、推理链路、错误处理深度集成。</p>
<p style="color: #191b1f;" data-pid="nQzyaxMn">比如：</p>
<ul style="color: #191b1f;">
<li data-pid="FgQ9vzAd">Prompt 需要为记忆预留位置和格式</li>
<li data-pid="00L7kiWm">工具调用的结果需要写回记忆</li>
<li data-pid="zsSVGTcT">推理过程中需要动态检索记忆</li>
<li data-pid="WwK5zaFb">错误发生时需要回溯历史上下文</li>
</ul>
<p style="color: #191b1f;" data-pid="PsFwai70">记忆管理做得好，Agent 的整体表现会有质的提升。做得不好，就只是一个会话机器人。</p>
<h2 style="font-weight: 500; color: #191b1f;">13. 一些建议</h2>
<p style="color: #191b1f;" data-pid="9rwowwI1">以下是一些可以尝试落地的建议：</p>
<p style="color: #191b1f;" data-pid="08L0UMcc">1. 不要把所有历史都塞进 prompt</p>
<p style="color: #191b1f;" data-pid="mE00j86B">很多团队的做法是，每次调用都把所有历史对话拼接到 prompt 里。这在对话轮数少的时候没问题，但规模上去后会成为瓶颈。</p>
<p style="color: #191b1f;" data-pid="HDRGwYEp">改成检索式注入——根据当前问题，从历史记忆里检索最相关的几条，而不是全量加载。（这里就会考量检索的能力了）</p>
<p style="color: #191b1f;" data-pid="P_nwUSYf">2. 区分会话记忆和持久记忆</p>
<p style="color: #191b1f;" data-pid="IpE_vgFQ">当前对话的上下文，存在内存里就行，不需要持久化。</p>
<p style="color: #191b1f;" data-pid="J8ZOQuk6">只有那些需要跨会话保留的信息，才写入数据库。</p>
<p style="color: #191b1f;" data-pid="vplWuSdM">这样可以大幅减少存储和检索的开销。</p>
<p style="color: #191b1f;" data-pid="JTa7SOrW">3. 给记忆加上过期时间</p>
<p style="color: #191b1f;" data-pid="2vDD0xTB">就像缓存一样，记忆也可以有 TTL（Time To Live）。</p>
<p style="color: #191b1f;" data-pid="hGN7yJMj">一般性的对话，可以设置 7 天或 30 天过期。重要的信息，可以标记为永久保留。</p>
<p style="color: #191b1f;" data-pid="eR_v-PBi">定期清理过期记忆，防止数据无限膨胀。</p>
<p style="color: #191b1f;" data-pid="1k_mZPiQ">4. 用好向量数据库</p>
<p style="color: #191b1f;" data-pid="tEn2dkQ3">向量检索是目前最适合做语义记忆的技术。</p>
<p style="color: #191b1f;" data-pid="ZReSF8qQ">把历史对话做 embedding，存到向量数据库里，每次根据当前问题做相似度检索。</p>
<p style="color: #191b1f;" data-pid="IBg9Jm0T">但要注意，向量检索的召回率不是 100%，需要结合关键词索引和时间过滤。</p>
<p style="color: #191b1f;" data-pid="NjE8tUhG">5. 记忆要能解释</p>
<p style="color: #191b1f;" data-pid="ReMEceMJ">用户问&#8221;你为什么这么回答&#8221;，Agent 应该能说清楚是基于哪段历史记忆做的判断。</p>
<p style="color: #191b1f;" data-pid="HTKGIFXB">这需要在记忆检索时保留溯源信息——这条记忆来自什么时间、什么对话、可信度如何。</p>
<p style="color: #191b1f;" data-pid="_Ll_j0Yw">可解释性不仅是用户体验问题，也是调试和优化的基础。</p>
<h2 style="font-weight: 500; color: #191b1f;">14. 最后</h2>
<p style="color: #191b1f;" data-pid="URQ1_uGb">上下文记忆和遗忘，本质上是资源分配问题。</p>
<p style="color: #191b1f;" data-pid="WnFutE2r">我们只有有限的 token 预算，有限的计算资源，有限的响应时间，需要在这些约束下做出最优决策。</p>
<p style="color: #191b1f;" data-pid="q9zRTn-r">无限扩展上下文听起来很美好,但实际上不可行。</p>
<p style="color: #191b1f;" data-pid="oTII06hl">真正的解决方案，是学习人类的记忆机制——让重要的信息留下来，让次要的信息自然衰减。</p>
<p style="color: #191b1f;" data-pid="legcPq1b">DeepSeek 的光学压缩思路提供了一个很好的启发：遗忘不是缺陷，而是一种优化策略。</p>
<p style="color: #191b1f;" data-pid="sgC64Ie-">如果能把这个思路落地到 Agent 系统里，不仅能降低成本，还能提升整体的智能水平。</p>
<p style="color: #191b1f;" data-pid="mAgwzjgO">因为真正的智能，不是记住所有东西，而是知道什么值得记住，什么可以忘记。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2025/11/lets-talk-about-contextual-memory-and-forgetting-in-ai-agents/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
