<?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/%e9%95%bf%e6%9c%9f%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>Sun, 10 May 2026 02:26:45 +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/2026/02/ai-agent-long-term-memory/</link>
		<comments>https://www.phppan.com/2026/02/ai-agent-long-term-memory/#comments</comments>
		<pubDate>Sun, 08 Feb 2026 03:03:36 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[AIAgent]]></category>
		<category><![CDATA[RAG]]></category>
		<category><![CDATA[长期记忆]]></category>

		<guid isPermaLink="false">https://www.phppan.com/?p=2466</guid>
		<description><![CDATA[长期记忆不是「把历史对话存起来」。在生产环境里，它更像一套数据管道和检索系统，目标很具体： 让 Agent 在 [&#8230;]]]></description>
				<content:encoded><![CDATA[<section id="nice" style="color: #000000;" data-tool="mdnice编辑器" data-website="https://www.mdnice.com">
<p data-tool="mdnice编辑器"><strong style="color: #0e88eb;">长期记忆不是「把历史对话存起来」</strong>。在生产环境里，它更像一套数据管道和检索系统，目标很具体：</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">让 Agent 在跨天、跨周的任务里保持一致性</strong>（用户偏好、项目背景、关键决策不丢）。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">让上下文成本可控</strong>（Token、TTFT、吞吐量别炸）。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">让错误可被纠正、记忆可被编辑、可被遗忘</strong>（不然就是事故制造机）。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">三个主要逻辑——<strong style="color: #0e88eb;">记忆捕获、AI 压缩、智能检索</strong>。</p>
<p data-tool="mdnice编辑器">说人话就是：数据结构怎么定、写入怎么做、分层怎么做、检索怎么做、什么时候该忘。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">1. 先把「长期记忆」拆成三类</span></h1>
<p data-tool="mdnice编辑器">在很多团队里，长期记忆失败不是模型问题，是定义问题：<strong style="color: #0e88eb;">同一个「memory」里混了用户画像、任务状态、项目知识、工具日志</strong>，最后检索噪声大到不可用。</p>
<p data-tool="mdnice编辑器">我更愿意按「用途」拆，而不是按「存储介质」拆：</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">1.1 用户长期记忆</span></h2>
<p data-tool="mdnice编辑器">用户长期记忆每次都要注入的「稳定事实」。</p>
<p data-tool="mdnice编辑器">长期记忆的定义：<strong style="color: #0e88eb;">长期、可编辑的核心记忆</strong>，记录稳定属性（姓名、目标、经历、偏好等），并且「每次对话都会强制注入」。</p>
<p data-tool="mdnice编辑器">这里我会很强硬地加两条工程规则：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">必须可审计</strong>：能回答「这条记忆从哪轮对话来的」「谁写入的」「什么时候写入的」。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">必须可逆</strong>：用户一句「从记忆中删除」要能删干净；内部也要支持 GDPR/合规那种 purge。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">更新方式有两种，但<strong style="color: #0e88eb;">优先级不同</strong>：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">显式更新</strong>：用户说「记住这个」「删掉这个」这种，优先级最高，直接写。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">隐式更新</strong>：模型检测到符合标准的事实（如 OpenAI 的标准），默认同意自动添加。<br />
对于隐式更新，我的态度偏保守：<strong style="color: #0e88eb;">宁可少记，不要乱记</strong>。乱记比不记更致命，后面纠错成本很高。</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">1.2 任务记忆</span></h2>
<p data-tool="mdnice编辑器">任务记忆是会过期的「状态」</p>
<p data-tool="mdnice编辑器">它属于长期记忆系统，但不属于「永久」。例如：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">一个多天的排障进度（已验证什么、下一步计划）</section>
</li>
<li>
<section style="color: #010101;">某个 PR 的讨论结论（直到 merge 前都重要，merge 后可降温）</section>
</li>
</ul>
<p data-tool="mdnice编辑器">这类记忆如果不做 TTL，很快就把检索污染掉。<strong style="color: #0e88eb;">任务记忆一定要有生命周期</strong>。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">1.3 事件/操作记忆</span></h2>
<p data-tool="mdnice编辑器">这也可以叫做过程记忆，这是为检索服务的「轨迹」。</p>
<p data-tool="mdnice编辑器">这类通常来自工具调用、文件读写、运行日志。它的价值是：当用户问「你刚才改了哪几个文件」「上周我们为什么选了 A」时，Agent 能把证据拿出来。</p>
<p data-tool="mdnice编辑器">它的问题也最大：<strong style="color: #0e88eb;">写入频率极高、噪声极多</strong>。这类我默认做分层：热层保最近、冷层做压缩归档，别全塞进同一个向量索引里。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">2. 记忆系统的三段式管道</span></h1>
<p data-tool="mdnice编辑器">捕获 → 压缩 → 检索（注入）</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">2.1 记忆捕获</span></h2>
<p data-tool="mdnice编辑器">简单来说就是谁来写、写什么、写到哪。</p>
<p data-tool="mdnice编辑器">捕获层我建议按「事件源」拆：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">对话事件</strong>：用户输入、模型输出（或关键片段）、会话元信息（时间、会话 ID、主题）。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">工具事件</strong>：工具名、参数、返回、影响面（写了哪些文件、改了哪些配置、跑了哪些命令）。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">用户显式指令</strong>：强制写/删/改的指令，这条要走单独通道，避免被摘要吞掉。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">以 Claude-Mem「五大生命周期钩子」为例，是一个比较实用的策略，原因是它把捕获点固化在生命周期上，不靠「模型想起来了」这种玄学。</p>
<section class="table-container" data-tool="mdnice编辑器">
<table>
<thead>
<tr>
<th style="color: #000000;">钩子名称</th>
<th style="color: #000000;">触发时机</th>
<th style="color: #000000;">核心作用</th>
</tr>
</thead>
<tbody>
<tr style="color: #000000;">
<td>context-hook</td>
<td>会话启动时</td>
<td>注入最近记忆作为上下文</td>
</tr>
<tr style="color: #000000;">
<td>new-hook</td>
<td>用户提问时</td>
<td>创建新会话并保存提示词</td>
</tr>
<tr style="color: #000000;">
<td>save-hook</td>
<td>工具执行后</td>
<td>捕获文件读写等操作记录</td>
</tr>
<tr style="color: #000000;">
<td>summary-hook</td>
<td>会话结束时</td>
<td>生成 AI 摘要并持久化存储</td>
</tr>
<tr style="color: #000000;">
<td>cleanup-hook</td>
<td>停止指令时</td>
<td>清理临时数据</td>
</tr>
</tbody>
</table>
</section>
<p data-tool="mdnice编辑器">我自己的经验：<strong style="color: #0e88eb;">save-hook 和 summary-hook 之间一定要有边界</strong>。<br />
save-hook 捕获「事实与证据」（做过什么、改过什么）。summary-hook 产出「压缩后的可读结论」（为什么这么做、后续计划）。混在一起，后面做检索融合会很痛。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">2.2 AI 压缩</span></h2>
<p data-tool="mdnice编辑器">简单来说就是压什么、怎么压、压到什么粒度</p>
<p data-tool="mdnice编辑器">压缩不是「把 10 轮对话变 200 字」这么简单。压缩的核心目标只有两个：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">降低注入成本</strong>：上下文窗口里留给推理的空间要足够。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">提高检索可控性</strong>：检索返回的 chunk 必须信息密度高、噪声低。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">比较典型的做法：每隔 10 轮触发 summary agent，把前 10 轮压成 200 字摘要并替换历史。这里可能会有一个坑：<strong style="color: #0e88eb;">摘要如果不带结构，后面无法做检索约束</strong>。</p>
<p data-tool="mdnice编辑器">我更偏好把摘要拆成固定字段（即使最终还是自然语言）：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">「目标/约束」</section>
</li>
<li>
<section style="color: #010101;">「关键决策 + 理由」</section>
</li>
<li>
<section style="color: #010101;">「未决问题」</section>
</li>
<li>
<section style="color: #010101;">「下一步」</section>
</li>
<li>
<section style="color: #010101;">「证据索引」（指向原始事件/日志的 ID）</section>
</li>
</ul>
<p data-tool="mdnice编辑器">这样检索返回摘要时，Agent 能快速判断「这段能不能用」，也能在需要时回溯证据。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">2.3 智能检索</span></h2>
<p data-tool="mdnice编辑器">别把「能搜到」当成「能用」，这是两回事。</p>
<p data-tool="mdnice编辑器">很多记忆系统上线后表现很差，根因是：<strong style="color: #0e88eb;">检索返回了一堆「看似相关」但没有操作价值的片段</strong>。工程上我会把检索拆成三段：</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">候选召回</strong>：向量相似度 / 关键词 / 结构化过滤（用户、项目、时间窗、标签）。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">重排（rerank）</strong>：结合时间衰减、来源可信度、记忆类型优先级。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">注入策略</strong>：怎么塞进 prompt，塞多少，塞哪一层。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">「渐进式披露策略」是当前比较流行的注入策略，这比「Top-k 全塞」靠谱太多了：</p>
<pre class="custom" data-tool="mdnice编辑器"><code class="hljs" style="color: #abb2bf;">Level <span class="hljs-number" style="color: #d19a66;">1</span>: 最近 <span class="hljs-number" style="color: #d19a66;">3</span> 条会话摘要（约 <span class="hljs-number" style="color: #d19a66;">500</span> tokens）
Level <span class="hljs-number" style="color: #d19a66;">2</span>: 相关观察记录（用户主动查询）
Level <span class="hljs-number" style="color: #d19a66;">3</span>: 完整历史检索（mem-search 技能）
</code></pre>
<p data-tool="mdnice编辑器">Level 1 覆盖 80% 的连续对话场景；Level 2 把「更多细节」交给用户意图；Level 3 才动用重检索，避免每轮都把成本打满。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">3. 存储介质怎么选</span></h1>
<p data-tool="mdnice编辑器">文件、知识库、数据库都是可以选的。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">3.1 文件</span></h2>
<p data-tool="mdnice编辑器">最强的可控性，最差的并发与检索体验</p>
<p data-tool="mdnice编辑器">文件的优势是「简单到不会出错」：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">人可以直接打开改</section>
</li>
<li>
<section style="color: #010101;">Git 可以审计、回滚</section>
</li>
<li>
<section style="color: #010101;">灾备简单</section>
</li>
</ul>
<p data-tool="mdnice编辑器">缺点也有：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">并发写很麻烦（锁、冲突、合并）</section>
</li>
<li>
<section style="color: #010101;">检索靠你自己做索引，否则就是 grep</section>
</li>
<li>
<section style="color: #010101;">很难做多租户隔离、权限控制（你当然可以做，但成本会涨）</section>
</li>
</ul>
<p data-tool="mdnice编辑器">如 OpenClaw 的设计：<strong style="color: #0e88eb;">每日日志 + <code style="color: #0e8aeb;">MEMORY.md</code> 精选长期存储</strong>。它这个方案我很喜欢，原因是它把「噪声」和「精选事实」隔离开了。</p>
<p data-tool="mdnice编辑器">一个「看起来保守，但极其工程」的方案：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">第一层：<strong style="color: #0e88eb;">每日日志</strong>，按日期整理，记录会话发生的事情、决策结果、未来可能相关的信息。</section>
</li>
<li>
<section style="color: #010101;">第二层：**<code style="color: #0e8aeb;">MEMORY.md</code> 本身**，作为精选长期存储库，保存应永久保留的信息；也记录对代理错误的修正。</section>
</li>
</ul>
<p data-tool="mdnice编辑器"><strong style="color: #0e88eb;">如果捕捉对话每个细节，代理每次加载上下文会消耗更多 Token，杂音会降低响应质量</strong>。</p>
<p data-tool="mdnice编辑器"><code style="color: #0e8aeb;">MEMORY.md</code> 这种「精选」必须有准入机制。靠人手维护能跑，但团队一大就维护不过来。可以整一个「重要性评分系统」，先打分，再决定进不进精选层。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">3.2 知识库</span></h2>
<p data-tool="mdnice编辑器">适合「稳定知识」，不适合「高频写入」</p>
<p data-tool="mdnice编辑器">知识库适合 SOP、产品手册、FAQ、架构决策记录这种相对稳定的内容。它的问题是写入链路通常偏离线：采集、清洗、切分、建索引。你要它承接「每次工具调用写一条」这种场景，很快会把 ingestion 管道压垮。</p>
<p data-tool="mdnice编辑器"><strong style="color: #0e88eb;">KB 承接 semantic memory（语义知识）</strong>，别拿它硬扛 episodic/event memory。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">3.3 数据库</span></h2>
<p data-tool="mdnice编辑器">能抗并发、能做权限、能做检索，但我们要付出工程代价</p>
<p data-tool="mdnice编辑器">数据库我会再分两类：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">结构化数据库</strong>（关系型/文档型）：适合 user memory（key-value、可编辑、可审计）、任务状态、权限控制。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">向量数据库</strong>：适合 episodic memory 的语义检索，但会带来你参考内容里提到的三个工程问题。</section>
</li>
</ul>
<p data-tool="mdnice编辑器"><strong style="color: #0e88eb;">user memory 这种「必须可控」的内容，优先放结构化 DB；event/episode 的检索层再用向量 DB 或混合检索</strong>。把所有东西都向量化，后面治理成本会很高。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">4. 向量数据库的使用逻辑</span></h1>
<p data-tool="mdnice编辑器">向量数据库把记忆从只读变可写后，需要考虑三个具体的工程问题。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">4.1 问题一：需要记住什么？</span></h2>
<p data-tool="mdnice编辑器">这里最容易走偏。很多团队一开始恨不得「全量记录」，结果两周后发现：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">索引膨胀</section>
</li>
<li>
<section style="color: #010101;">检索噪声上升</section>
</li>
<li>
<section style="color: #010101;">成本上涨</section>
</li>
<li>
<section style="color: #010101;">用户抱怨「你记错了」的次数增加</section>
</li>
</ul>
<p data-tool="mdnice编辑器">我的判断维度是：时间、频率、类型，这三者会冲突。我会在应用层做一个更硬的分层打分：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">硬规则拦截</strong>：明显不该记的直接丢<br />
例如临时文件、一次性下载缓存、明显含敏感信息的内容（看合规策略）。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">重要性打分</strong>：符合候选条件的打分<br />
分数来自：任务相关性、用户显式标记、重复出现次数、工具影响面（改了配置文件通常比分割日志重要）。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">落层策略</strong>：分数决定写入热/冷、决定是否进入精选层（例如 <code style="color: #0e8aeb;">MEMORY.md</code>）。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">Milvus 的 TTL 和时间衰减，可以用用，不是核心策略。原因很简单：<strong style="color: #0e88eb;">TTL 只能删时间，删不了噪声</strong>。噪声是「内容不该进来」，不是「该不该过期」。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">4.2 问题二：怎么分层存储？</span></h2>
<p data-tool="mdnice编辑器">按时间切、按访问频率、按用户标注来降冷。「分层」可以，但是：<strong style="color: #0e88eb;">分层的单位别用「向量库的 collection」随便拍脑袋</strong>，要用有我们自己的「记忆类型」。</p>
<p data-tool="mdnice编辑器">我通常会至少拆三层：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">热层</strong>：最近 N 天的事件 + 最近几条摘要<br />
目标是低延迟、写入快、检索稳定。热层可以索引轻一些，宁可召回多一点，再靠重排过滤。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">温层</strong>：近期项目周期内的关键摘要、关键决策、纠错记录<br />
读多写少，索引可以更重，提升精度。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">冷层</strong>：长历史归档<br />
主要用于追溯，默认不参与每轮检索，只在用户明确追问或系统置信度不足时启用。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">这个结构配合「渐进式披露」很顺：默认只碰热层，必要时升级到温层/冷层。成本曲线能压得住。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">4.3 问题三：写入频率与速度怎么定？</span></h2>
<p data-tool="mdnice编辑器">关键矛盾：agent memory 要实时写入，但向量索引构建需要时间；每条写都重建索引太贵，批量建索引又导致新数据搜不到。</p>
<p data-tool="mdnice编辑器">在工程上解这个矛盾的思路：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">把「可立即检索」和「可长期高精检索」拆开</strong><br />
新写入先进入一个轻量的「增量区」（delta store），可以是：</p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;">内存缓存 + 简单向量结构（甚至先不建复杂索引）</section>
</li>
<li>
<section style="color: #010101;">或者一个专门的「实时 collection」，索引参数偏向写入吞吐</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">后台异步合并（Compaction）</strong><br />
到一定量再合并进主索引（main store），这时构建更重的索引结构。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">检索时双查</strong><br />
先查 delta，再查 main，最后融合去重。这样用户刚执行的操作，下一轮一定能搜到，不靠运气。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">如果只用一个 collection 硬扛实时写入 + 高精检索，基本会卡在「要么写不动，要么搜不准」之间来回摆。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">5. 非向量数据库怎么做长期记忆</span></h1>
<p data-tool="mdnice编辑器">我倾向于「结构化事实 + 混合检索」</p>
<p data-tool="mdnice编辑器"><strong style="color: #0e88eb;">user memory 和一部分 task memory，用结构化存储更稳</strong>，理由：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">可编辑（update/delete）是常态操作</section>
</li>
<li>
<section style="color: #010101;">需要强一致（至少单用户维度）</section>
</li>
<li>
<section style="color: #010101;">需要权限、审计、脱敏、导出、合规删除</section>
</li>
</ul>
<p data-tool="mdnice编辑器">向量化适合「相似性召回」，不适合「事实的最终真相」。</p>
<p data-tool="mdnice编辑器">这样拆：</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">5.1 User Memory</span></h2>
<p data-tool="mdnice编辑器">KV + 版本 + 来源，每条 user memory 至少需要：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">key（例如 <code style="color: #0e8aeb;">coding_lang</code>）</section>
</li>
<li>
<section style="color: #010101;">value（例如 <code style="color: #0e8aeb;">Python</code>）</section>
</li>
<li>
<section style="color: #010101;">source（显式指令 / 隐式提取 / 管理后台）</section>
</li>
<li>
<section style="color: #010101;">updated_at</section>
</li>
<li>
<section style="color: #010101;">version（解决「多次修改」与「回滚」）</section>
</li>
<li>
<section style="color: #010101;">confidence / policy tag（是否允许自动注入、是否敏感）</section>
</li>
</ul>
<p data-tool="mdnice编辑器">然后注入策略是：<strong style="color: #0e88eb;">每轮只注入白名单 key</strong>。别把整个用户画像 dump 进 prompt。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">5.2 Event/Log</span></h2>
<p data-tool="mdnice编辑器">文档型存证 + 可选向量索引</p>
<p data-tool="mdnice编辑器">工具调用日志、文件变更记录，我更愿意先当「证据」存好（文档型或日志系统），向量索引只是加速检索的手段。这样即使向量库挂了，还有可追溯的事实来源。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">5.3 混合检索</span></h2>
<p data-tool="mdnice编辑器">先过滤，再相似度，再重排</p>
<p data-tool="mdnice编辑器">非向量方案想要「像向量检索一样好用」，别上来就全文检索硬搜。最有效的顺序通常是：</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">结构化过滤（用户、项目、时间窗、标签、来源可信度）</section>
</li>
<li>
<section style="color: #010101;">再做相似度/全文检索召回</section>
</li>
<li>
<section style="color: #010101;">最后重排（时间衰减 + 类型权重 + 去重）</section>
</li>
</ol>
<p data-tool="mdnice编辑器">这套顺序能把噪声压下去，查询也更可解释。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">6. 长期记忆的「可用性」核心</span></h1>
<p data-tool="mdnice编辑器">注入策略比检索算法更重要</p>
<p data-tool="mdnice编辑器">很多人把精力都花在「embedding 模型选哪个」「Top-k 设多少」，上线后发现效果波动很大。</p>
<p data-tool="mdnice编辑器">实际可能是：<strong style="color: #0e88eb;">注入策略决定了下限</strong>。</p>
<p data-tool="mdnice编辑器">「渐进式披露」已经是很好的骨架。我补两条我认为必须做的工程约束：</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">6.1 注入预算必须固定</span></h2>
<p data-tool="mdnice编辑器">每轮对话给记忆注入多少 token，要有硬预算。例如：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">用户长期记忆：固定 100～300 tokens（只放稳定事实）</section>
</li>
<li>
<section style="color: #010101;">最近摘要：固定 300～800 tokens</section>
</li>
<li>
<section style="color: #010101;">检索片段：固定 500～1500 tokens（按任务重要性动态）</section>
</li>
</ul>
<p data-tool="mdnice编辑器">预算不固定，线上成本就不可控；更糟的是上下文挤压推理空间，模型会「看起来记住了」，实际输出质量下降。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">6.2 记忆冲突处理</span></h2>
<p data-tool="mdnice编辑器">宁可不注入，也别注入矛盾</p>
<p data-tool="mdnice编辑器">最常见的事故是：用户改了偏好（比如语言、格式、技术栈），旧记忆还在注入，Agent 开始精神分裂。</p>
<p data-tool="mdnice编辑器">工程上必须有冲突策略：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">同一 key 的多版本：只注入最新版</section>
</li>
<li>
<section style="color: #010101;">多来源冲突：显式指令 &gt; 管理后台 &gt; 隐式提取</section>
</li>
<li>
<section style="color: #010101;">低置信度记忆：默认不注入，只在用户问到时提供候选并求确认</section>
</li>
</ul>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">7. 小结</span></h1>
<p data-tool="mdnice编辑器">AI Agent 的长期记忆不是「把历史对话都存起来」，而是一套以<strong style="color: #0e88eb;">可控、可维护、可纠错</strong>为目标的数据管道与检索系统——先明确记忆类型（用户稳定事实、任务状态、事件证据）并分层治理，再用“<strong style="color: #0e88eb;">捕获 → AI 压缩 → 智能检索/注入</strong>”三段式把信息从高频噪声提炼成可用上下文；存储上用结构化数据库承载可编辑的用户/任务事实，用日志/文档留存证据，并按需用向量索引做语义召回与冷热分层，避免写入与索引、噪声与成本之间的失控；</p>
<p data-tool="mdnice编辑器">效果上不要迷信 Top‑k，把<strong style="color: #0e88eb;">注入预算、渐进式披露、冲突处理</strong>当作系统下限；</p>
<p data-tool="mdnice编辑器">运维上把缓存、摘要、显式记忆工具、TTL/衰减与合规删除做成一等能力，并用成本、质量与安全指标持续观测迭代。</p>
<p data-tool="mdnice编辑器">最终目标不是「记得更多」，而是让 Agent 在长期任务中<strong style="color: #0e88eb;">更一致、更便宜、更可靠</strong>。</p>
<p data-tool="mdnice编辑器">以上。</p>
</section>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2026/02/ai-agent-long-term-memory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
