Dual-rate 长记忆断裂方向开源中间件—— 给 Agent 装上“快/慢记忆齿轮”

Dual-rate 长记忆断裂方向开源中间件—— 给 Agent 装上“快/慢记忆齿轮”

最近针对许多agent项目的长信息断裂问题,我做了一个“双速递归记忆”中间件:让 Agent 不再长对话就失忆(Topical-Chat 全量 10,784 对话 avg_recall +10.0%,d4 +21.7%)

 

做长对话智能体(Agent)的时候,你一定遇到过一个很真实的痛:

对话一旦变长,Agent 开始“断片”。

不是完全忘光,而是关键点突然断流:

记得最近几轮,却把早期的重要信息丢了。

更难受的是:

你明明已经做了“长期记忆”(向量库、摘要、存档…),它还是会在长距离上掉链子。

 

我最近围绕这个问题做了一些研究与工程尝试,最后落地成一个双速递归记忆中间件(Dual-rate Agent Memory Middleware),核心是:

✅ Fast Memory(快记忆):高频更新,紧贴当前语境

✅ Slow Memory(慢记忆):低频沉淀,只保存稳定关键事实

✅ Consistency Check(一致性校验):防止“快记忆噪声”污染长期记忆

最终在 Topical-Chat 全量 10,784 条对话上验证:

avg_recall +10.0%

d4(长距离段)+21.7%
同时 线上 token 成本保持可控(基本不显著增加)。

 

1. 为什么“长期记忆”会断流?

很多人的长期记忆方案看起来是完整的:

存历史 → 向量化 → 检索 → 塞回 prompt

但长对话里会出现两个典型问题:

(1)记忆被噪声淹没

你越记越多,越检索越“杂”。

模型拿到的不是“最关键的旧信息”,而是一堆“看起来相关但不重要”的片段。

(2)记忆发生漂移

早期事实在后续被多轮“改写/重述”,如果你把这些都存进去,慢慢就会出现:

新的说法覆盖旧事实

片段之间互相矛盾

关键设定被稀释
最后表现就是:Agent 明明有记忆库,但关键时刻检索不到该检索的东西——断流。

 

2. 我的思路:给 Agent 装两套“记忆齿轮”⚙️

我把记忆系统拆成两层,像人一样:

快记忆:像随手记的便签,更新很快,但不保证长期可靠

慢记忆:像“永久笔记”,更新谨慎,但足够稳定

✅ Fast Memory:实时贴着对话走

它的目标不是“存得久”,而是“跟得上”。

任何新信息、临时意图、当下约束,都先进入 Fast Memory,保证短期决策不掉线。

✅ Slow Memory:只收“沉淀后的结论”

Slow Memory 不追求全量,而追求少而准。

只把真正稳定、可复用、对未来有价值的信息写进去,比如:

用户长期偏好

任务关键设定

可复用的经验结论

✅ Consistency Check:防止快记忆把慢记忆带偏

最关键的一步是“一致性校验”:

不是 Fast Memory 有啥就同步到 Slow Memory,

而是先判断:它是否稳定?是否重要?是否与已有慢记忆冲突?

可以把它理解成:

快记忆负责“记录”,慢记忆负责“定稿”,一致性校验就是“审核编辑”。


from typing import List, Dict
from dataclasses import dataclass
import numpy as np


# ========== 基础结构定义 ==========

@dataclass
class MemoryItem:
    content: str
    embedding: np.ndarray
    importance: float
    timestamp: float


class DualRateMemory:

    def __init__(self, embed_fn, consistency_threshold=0.75):
        self.embed_fn = embed_fn

        # 快记忆(高频更新)
        self.fast_memory: List[MemoryItem] = []

        # 慢记忆(低频沉淀)
        self.slow_memory: List[MemoryItem] = []

        self.consistency_threshold = consistency_threshold


    # ========== Fast Memory 更新 ==========
    def update_fast_memory(self, content: str, timestamp: float):
        embedding = self.embed_fn(content)

        item = MemoryItem(
            content=content,
            embedding=embedding,
            importance=self.compute_importance(content),
            timestamp=timestamp
        )

        self.fast_memory.append(item)


    # ========== 一致性校验 ==========
    def consistency_check(self, new_item: MemoryItem) -> bool:
        """
        判断是否应该写入 Slow Memory:
        1. 重要性是否达标
        2. 是否与已有 slow memory 冲突
        """
        if new_item.importance < 0.6:
            return False

        for old_item in self.slow_memory:
            similarity = self.cosine_similarity(
                new_item.embedding, old_item.embedding
            )
            if similarity > self.consistency_threshold:
                # 已存在相似长期记忆,不重复写入
                return False

        return True


    # ========== Slow Memory 更新 ==========
    def promote_to_slow_memory(self):
        """
        从 fast memory 中筛选稳定内容沉淀到 slow memory
        """
        for item in self.fast_memory:
            if self.consistency_check(item):
                self.slow_memory.append(item)

        # 可选:清理旧的 fast memory
        self.fast_memory = self.fast_memory[-20:]


    # ========== 检索 ==========
    def retrieve(self, query: str, top_k=5):
        query_emb = self.embed_fn(query)

        all_memory = self.slow_memory + self.fast_memory

        scored = [
            (item, self.cosine_similarity(query_emb, item.embedding))
            for item in all_memory
        ]

        scored.sort(key=lambda x: x[1], reverse=True)

        return [item.content for item, _ in scored[:top_k]]


    # ========== 工具函数 ==========
    def cosine_similarity(self, v1, v2):
        return np.dot(v1, v2) / (
            np.linalg.norm(v1) * np.linalg.norm(v2) + 1e-8
        )


    def compute_importance(self, content: str) -> float:
        """
        可替换为:
        - LLM 评分
        - 规则评分
        - 关键词加权
        """
        if len(content) > 80:
            return 0.8
        return 0.4


3. 这个中间件在系统里怎么插?

我把它做成一个“可插拔中间件”,放在 Agent 的执行链路中间:

用户输入

→ Agent 推理 / 工具调用

→ Fast Memory 更新(高频)

→ 必要时触发一致性校验

→ Slow Memory 低频沉淀

→ 检索(优先慢记忆,再补快记忆)

→ 拼回上下文 → 下一步推理

这样做的好处是:

Agent 仍然是 Agent,LLM 仍然是 LLM。

我只是换了一种方式,让“记忆进出”更像一个工程系统,而不是堆向量库。

 

4. 实验:Topical-Chat 全量 10,784 条对话

为了验证“长对话断流”是否真的改善,我在 Topical-Chat 全量 10,784 条对话上做了评估。

结果(我这里给最关键的两项):

avg_recall +10.0%

d4(更长距离段)+21.7%

这两个数字对我来说意义非常明确:

短距离提升是正常的,

真正的价值是 d4 这种长距离段显著抬起来了——说明确实在缓解“长期记忆断流”。

同时在工程侧我也很关注成本问题:

这个中间件的设计目标之一就是别把 token 成本搞炸。

实际线上/推理链路里,整体 token 开销 保持可控、基本不显著增加(主要因为慢记忆更精简,减少了无效召回和无效上下文堆叠)。

 

5. 我认为它解决的不是“能不能记”,而是“怎么记才不乱”

很多人做记忆,第一反应是“加容量”。

但长对话的问题往往不是容量,而是:

记得太多导致噪声

更新太快导致漂移

没筛选导致冲突
最后检索质量下降,等价于失忆。

双速 + 一致性校验的核心价值就是:

把“记忆系统”从存储问题,升级为信息治理问题。

 

6. 总结

我在研究中引入了双速递归记忆中间件,通过 fast/slow 两级记忆和一致性校验机制,缓解长对话场景下的长期记忆断流问题;在 Topical-Chat 全量 10,784 对话上实现 avg_recall +10.0%、d4 +21.7%,同时线上 token 成本保持可控。

目前这个中间件已开源:开源中间件链接

Read more

Git Push 失败?手把手教你配置 SSH Key,实现无痛推送代码

前言 你是否还在为github无法执行git push而苦恼,就算输入了用户密码,仍然显示Error in the HTTP2 framing layer,将你打回原型,今天给大家分享一些基本操作,如何生成配置SSH key,让自己的服务器可以无痛推送代码 动手解决 ### 第一步:在服务器上生成 SSH 密钥 复制并执行这条命令: ssh-keygen -t ed25519 -C"[email protected]" 显然,邮箱要替换成你自己的邮箱,这是一个注释信息,你的这个邮箱会作为公钥的一部分以明文的方式放到公钥里,所以如果你这里以服务器的用户名加ip命名,将是非常不安全的,社区里一般提倡“用户@邮箱” 这种,你看你喜欢,我这里直接放邮箱了。 执行过程中的提示和你的操作 提示 1:保存位置 Generating public/private ed25519

By Ne0inhk

小白必看:5分钟搞定GIT国内镜像配置

快速体验 1. 打开 InsCode(快马)平台 https://www.inscode.net 2. 输入框内输入如下内容: 创建一个交互式GIT镜像配置向导,要求:1.图形化界面选择操作系统2.自动检测现有git配置3.提供阿里云/腾讯云等镜像选项4.生成修改命令一键执行5.验证配置是否生效。使用Electron开发跨平台桌面应用。 1. 点击'项目生成'按钮,等待项目生成完整后预览效果 最近在团队协作时,经常遇到从GitHub克隆仓库速度慢到让人抓狂的情况。作为刚接触Git的新手,我发现配置国内镜像源是最直接的提速方案。下面记录下我开发这个GIT镜像配置工具的全过程,希望能帮到同样被网速困扰的小伙伴。 1. 为什么需要国内镜像 国内访问GitHub原始服务器时,经常会遇到连接超时或下载速度只有几KB/s的情况。通过将远程仓库地址替换为国内镜像源,克隆和拉取操作的速度可以提升10倍以上。常见的镜像服务包括阿里云、腾讯云、中科大等提供的Git镜像服务。 2. 工具设计思路 我决定用Electron开发一个跨平台的桌面应用,主要解决以下几个痛点: 3.

By Ne0inhk
【AI大模型前沿】昆仑万维开源Skywork-R1V3:38B多模态推理模型,高考数学142分刷新开源SOTA

【AI大模型前沿】昆仑万维开源Skywork-R1V3:38B多模态推理模型,高考数学142分刷新开源SOTA

系列篇章💥 No.文章1【AI大模型前沿】深度剖析瑞智病理大模型 RuiPath:如何革新癌症病理诊断技术2【AI大模型前沿】清华大学 CLAMP-3:多模态技术引领音乐检索新潮流3【AI大模型前沿】浙大携手阿里推出HealthGPT:医学视觉语言大模型助力智能医疗新突破4【AI大模型前沿】阿里 QwQ-32B:320 亿参数推理大模型,性能比肩 DeepSeek-R1,免费开源5【AI大模型前沿】TRELLIS:微软、清华、中科大联合推出的高质量3D生成模型6【AI大模型前沿】Migician:清华、北大、华科联手打造的多图像定位大模型,一键解决安防监控与自动驾驶难题7【AI大模型前沿】DeepSeek-V3-0324:AI 模型的全面升级与技术突破8【AI大模型前沿】BioMedGPT-R1:清华联合水木分子打造的多模态生物医药大模型,开启智能研发新纪元9【AI大模型前沿】DiffRhythm:西北工业大学打造的10秒铸就完整歌曲的AI歌曲生成模型10【AI大模型前沿】R1-Omni:阿里开源全模态情感识别与强化学习的创新结合11【AI大模型前沿】Qwen2.5-Omni:

By Ne0inhk
告别文件上传限制!Gemini读取GitHub仓库开发大型项目教程(超详细图文版)

告别文件上传限制!Gemini读取GitHub仓库开发大型项目教程(超详细图文版)

在大型项目开发中,用Gemini辅助开发时,不少开发者都会陷入文件上传的困境——单次上传数量、大小受限,无法完整提交全部代码,导致AI缺失项目上下文,难以识别模块依赖,代码调整低效且易出错。本文针对性解决这一痛点,核心方案的是通过GitHub托管项目全量代码,让Gemini直接读取仓库内容,获取完整开发上下文。全文全程实操、零门槛,覆盖仓库准备、关联授权、读取开发全流程,新手也能轻松上手,高效用Gemini助力大型项目开发。 一、GitHub仓库准备+代码上传 1.1 GitHub端:注册/登录账号,新建仓库 这一步之前已经介绍过了,此处不再详细说明,详情可参考PyCharm通过Git指令上传代码到GitHub仓库 1.2 Gemini端:登录账号 网上有很多如何注册学生优惠的Gemini账号,当然不想麻烦市面上页有很多成品号出售,但是切记科学上网的节点要始终保持一致,笔者因为频繁切换节点已经被封了2个Gemini账号了。 二、关键步骤:让Gemini读取GitHub仓库(核心实操) 2.1 Gemini直接输入GitHub仓库链接,自动解析读取 【注】:这种方式导

By Ne0inhk