当前位置: 首页
AI教程
AI智能体Memory记忆模块功能原理与实现方式详解

AI智能体Memory记忆模块功能原理与实现方式详解

热心网友 时间:2026-06-07
转载

先亮明核心判断:AI智能体想要真正"记住你",不能只靠LLM自身。这个话题,值得展开聊聊。

为何需要记忆?

LLM 本身是无状态的——每次调用都是全新的开始。Agent 要想维持连贯的对话、记住用户的偏好,甚至在跨会话的场景中积累知识,就必须在外部管理记忆。说白了,记忆模块就是在回答一个核心问题:"哪些信息应该被放进下一次 LLM 调用的 context 里?"

注意,这里必须区分两个概念:memory 和 data。它们是两码事。memory 不是数据库里存储的所有聊天记录,这个边界一定要拎清。

短期记忆(Short-term Memory)

短期记忆其实就是当前 session 的对话历史,直接拼进 prompt 的 messages 数组里。

核心挑战在哪儿?Context Window 有限,通常是 8k~128k tokens,必须做管理。常用的方法有这么几种:

  • Sliding Window(滑动窗口):每次只保留最后 x 条数据,简单粗暴,但早期信息会丢失。
  • Token 精确裁剪:按照模型限制的 token 数量直接裁切,同样会丢失早期信息。
  • Summarization(摘要压缩):当对话太长时,不是粗暴丢弃,而是把老消息压缩成摘要、保留语义。这是更智能的做法。

下面是一个典型的 SummaryMemory 实现,代码本身不难理解:

class SummaryMemory {
  constructor(client, summaryThreshold = 10) {
    this.client = client; // Anthropic client
    this.summaryThreshold = summaryThreshold;
    this.summary = ""; // 历史摘要
    this.recentMessages = []; // 近期完整消息
  }
  async add(role, content) {
    this.recentMessages.push({ role, content });
    if (this.recentMessages.length >= this.summaryThreshold) {
      await this._compress();
    }
  }
  async _compress() {
    const historyText = this.recentMessages.map((m) => `${m.role}: ${m.content}`).join("\n");
    const prompt = this.summary
      ? `已有摘要:${this.summary}\n\n新增对话:\n${historyText}\n\n请更新并合并为一段新摘要,保留关键信息。`
      : `请将以下对话压缩为简洁摘要,保留关键事实和用户意图:\n\n${historyText}`;
    const res = await this.client.messages.create({
      model: "claude-opus-4-6",
      max_tokens: 500,
      messages: [{ role: "user", content: prompt }],
    });
    this.summary = res.content[0].text;
    this.recentMessages = []; // 清空,等待新消息积累
  }
  getMessages() {
    const messages = [];
    // 把摘要作为 system-level 的上下文注入
    if (this.summary) {
      messages.push({
        role: "user",
        content: `[对话历史摘要]: ${this.summary}`,
      });
      messages.push({
        role: "assistant",
        content: "好的,我已了解之前的对话背景。",
      });
    }
    return [...messages, ...this.recentMessages];
  }
}

长期记忆(Long-term Memory)

长期记忆是跨越会话存在的,需要持久化存储。它主要分为两个层次:用户画像(结构化)和语义记忆(向量化)。

用户画像

把用户的偏好、基本信息等结构化数据存进数据库,PostgreSQL 或 MongoDB 都行。每次对话开始时,读取并注入 system prompt:

// 用 PostgreSQL / MongoDB 均可,这里示意结构
class UserProfileMemory {
  constructor(db) {
    this.db = db;
  }
  async updateProfile(userId, newFacts) {
    // newFacts 来自 LLM 对对话的信息抽取
    await this.db.collection("profiles").updateOne(
      { userId },
      { $set: { ...newFacts, updatedAt: new Date() } },
      { upsert: true }
    );
  }
  async getSystemPrompt(userId) {
    const profile = await this.db.collection("profiles").findOne({ userId });
    if (!profile) return "";
    return `用户基本信息:
- 姓名:${profile.name || "未知"}
- 职业:${profile.occupation || "未知"}
- 偏好语言:${profile.preferredLang || "中文"}
- 已知背景:${profile.background || "无"}`.trim();
  }
  // 让 LLM 从对话中自动抽取用户信息
  async extractAndSa ve(userId, conversation, client) {
    const res = await client.messages.create({
      model: "claude-opus-4-6",
      max_tokens: 300,
      messages: [{
        role: "user",
        content: `从以下对话中抽取用户的个人信息和偏好,以 JSON 格式返回(只返回 JSON):
对话:${conversation}
可抽取字段:name, occupation, background, preferredLang, interests 等`
      }]
    });
    try {
      const facts = JSON.parse(res.content[0].text);
      await this.updateProfile(userId, facts);
    } catch (e) {
      console.log("抽取失败,跳过");
    }
  }
}

语义记忆

这是长期记忆的核心。把历史对话、知识片段 embedding 成向量存储,对话时用当前 query 做相似度检索,把最相关的记忆片段注入 context。

写入流程:文本 → Embedding API → 向量 → 存入 VectorDB(附带原文 metadata)
读取流程:当前 query → Embedding → 相似度搜索 → 取 Top-K 原文 → 注入 prompt

这里有一个很现实的问题:需要存储的并不是所有的对话记录,而是"值得被记住"的信息。但这个概念本身就很模糊,怎么判断哪些值得被记忆?

实际执行时,有一种比较好实现的解决方案:在每轮对话结束时,让 LLM 总结本轮对话的概述,然后记录在 Vector DB 里。每轮结束就是这样:直接存(或先压缩成摘要再存),检索时用相似度阈值过滤,只有真正相关的才会被召回。

另外,如何识别一轮对话结束?并不是浏览器关闭了就是对话结束——浏览器不关闭,对话也可能自动终止(比如用户长久无响应)。实际更常用的触发时机有两种:

方式一:Redis TTL 过期时触发。 会话 30 分钟无活动自动过期,在 key 过期的回调里执行总结和存储。Redis 有 keyspace notification 机制可以监听过期事件。缺点是需要额外配置,稍复杂。

方式二:每隔 N 轮自动触发(更常用)。 不依赖退出事件,每累积 10 轮对话就自动总结一次存入 Vector DB,滚动进行:第 10 轮结束 → 总结前 10 轮 → 存 Vector DB;第 20 轮结束 → 总结 11-20 轮 → 存 Vector DB……

这样,即使用户直接关掉页面,已经发生的对话也不会丢失,最多丢最近不足 N 轮的部分。

短期记忆 + 长期记忆 结合

生产环境里,两者是结合使用的:

每次对话请求,走这样一条链路:

  • 1. 读取用户画像 → 注入 system prompt 头部
  • 2. 向量召回相关历史记忆 → 注入 system prompt 中部
  • 3. 取近期对话窗口 → 作为 messages 数组
  • 然后调用 LLM → 返回结果
  • 之后:存入向量DB(长期记忆写入) + 更新对话窗口(短期记忆更新)

组装示例:

async function buildContext(userId, currentMessage) {
  const [profile, recalled, recentMsgs] = await Promise.all([
    profileMemory.getSystemPrompt(userId),
    recallMemory(userId, currentMessage, 3),
    shortTermMemory.getMessages(),
  ]);
  const recalledText = recalled.map(r => `[记忆] ${r.content}`).join("\n");
  const system = [profile, recalledText].filter(Boolean).join("\n\n");
  return { system, messages: recentMsgs };
}

详细流程图

LLM 永远是无状态的。你感觉它"记得你",其实完全是每次请求前,你在外部把记忆拼进 payload 造成的。流程图里的③构建 Context 就是这个核心步骤。

读取是并行的,写入是异步的。三路读取用 Promise.all 同时发起,压缩到约 30ms;写回不阻塞用户响应,在 setImmediate 或消息队列里处理。

Redis 的 TTL 是短期记忆的"自然死亡"机制——每次用户发消息都 RESET TTL,30 分钟无活动自动销毁,不需要写任何清理代码。

最后提一个容易被忽略的点:摘要压缩是有损的,它牺牲细节换取空间。所以重要的信息(用户偏好、关键事实)应该在写回时单独抽取存进 PostgreSQL,而不是只靠摘要保留。

根据流程图提取的时序图:

记忆,从来不是"存下来"那么简单。怎么存、存什么、什么时候丢,才是真正考验架构设计的地方。

来源:https://juejin.cn/post/7617677528958959651

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Sentieon DNAscope Hybrid长短读长混合分析流程详解评测

Sentieon DNAscope Hybrid长短读长混合分析流程详解评测

一、前言 基因组学研究已进入下半场,精度与全面性成为临床诊断及群体研究的核心需求。然而,单一测序技术常常让人陷入选择困境:短读长测序(如 Illumina)准确性高、成本低廉,但在面对结构变异、重复序列和复杂区域时显得力不从心;长读长测序(如 Oxford Nanopore)虽能轻松跨越这些障碍,超

时间:2026-06-07 17:05
腾讯混元Hy3 preview 295B/21B MoE架构与上下文详解

腾讯混元Hy3 preview 295B/21B MoE架构与上下文详解

摘要: 295B 21B MoE 是腾讯 2026 年 4 月发布的混元 Hy3 preview 的核心架构标识。本文解释参数总量与激活参数的含义、MoE 的工作机制、为什么 Hy3 preview 能原生支持 256K 上下文,并说明它在 TokenHub 上的完整能力支持与价格档位。 一、读懂

时间:2026-06-07 17:05
腾讯云AI业务流架构师训练营重塑编程与业务的新范式

腾讯云AI业务流架构师训练营重塑编程与业务的新范式

AI业务流架构师训练营:在腾讯云上重塑编程与业务的新范式 到2026年,企业AI竞争的核心已不再是“拥有AI”,而是“谁的AI业务流架构更为高效”。这一转变彻底颠覆了传统编程模式。对于技术从业者而言,AI业务流架构师已成为舞台中央的关键角色——他们不再仅仅编写代码,而是将业务需求转化为自主运行的数字

时间:2026-06-07 17:05
推荐一款免费使用谷歌最新NanoBanana 2插件

推荐一款免费使用谷歌最新NanoBanana 2插件

谷歌近期推出了重磅更新——NanoBanana2模型正式登场。无论是在知识储备、图像生成质量、推理能力还是主体一致性方面,这一版本都实现了全面升级,堪称当前地表最强的AI生图模型之一。 生成速度直接减半,价格也同步腰斩,性价比表现极为突出。不过,国内用户想直接访问官方渠道依然困难重重,大部分路径都绕

时间:2026-06-07 17:04
企业生产管理系统选型排行榜

企业生产管理系统选型排行榜

企业在进行生产管理系统选型时,往往容易陷入一个常见的思维误区:首先问“哪家功能更全面”。但从实际部署与落地效果来看,真正决定系统价值的,往往不是模块数量的简单堆叠,而是它是否真正贴合实际生产流程、能否支撑高效的跨部门协作、以及是否具备随业务变化持续迭代升级的能力。迈入2026年,制造企业对生产管理系

时间:2026-06-07 17:04
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜