第 7 章 · AI会话中的窗口记忆与长期记忆

短期记忆 vs 长期记忆:AI系统中的记忆管理最佳实践 想象一位经验丰富的厨师在厨房里:眼前的食材是他正在处理的"短期记忆",而脑海中多年积累的 recipes 和烹饪技巧则是他的"长期记忆"。厨师需要巧妙协调这两种记忆——既不能忘记当前锅里正在烹饪的菜肴,又要能随时调用毕生积累的烹饪智慧。AI系统也面临着类似挑战。从聊天机器人到自动驾驶汽车,从推荐系统到复杂的决策支持工具,所有智能系统都需要管理信息的"现在"与"过去"。理解AI如何处理短期和长期记忆,不仅能帮助我们构建更智能的系统,也能揭示人类认知的奥秘。 阅读详情

版本:Spring AI 2.0.1

目标:弄清对话为什么要「记住」、记忆分几类,以及窗口、向量长期记忆、用户偏好表怎么接。

ChatClient 不存会话。多轮能接上,是 Advisor 在调用前后帮你读写记忆——窗口记最近原文,向量捞相关旧片段,偏好表放过敏原这类硬字段。


7.1 为什么需要记忆

没有记忆时,每一轮对模型都是新开场:

用户:我叫 Tom,请记住。
助手:好的。
​
用户:我叫什么名字?
助手:……(Prompt 里没有上一轮,它答不上来)

要把第二轮接上,得在发给模型的内容里带上历史,或带上相关的旧片段。Spring AI 用记忆类 Advisor 做这件事,而不是塞进 ChatClient 内部。

接下来要选的是:记最近几轮原文,还是按语义捞旧话;落进程内还是 JDBC / Redis / 向量库;过敏原这类硬字段要不要和闲聊分开存。先分清类型,再谈装配。


7.2 记忆的分类

层典型实现记住什么
本轮当前 Prompt / ToolContext这一次请求里的东西
短期窗口MessageChatMemoryAdvisor + MessageWindowChatMemory最近若干轮原文
长期语义VectorStoreChatMemoryAdvisor + VectorStore按相似度召回的历史片段
用户偏好表业务表(或专用集合)过敏原、默认地址等硬字段

窗口和向量是日常最常碰到的两条路:

客服追问、强顺序多轮,窗口就够。会话很长、窗口裁掉了但仍要「想起相关旧话」,再叠向量记忆。过敏原、默认地址这类不能猜错的,单独落一张用户偏好表。公司手册是 RAG;相似问直接短路是语义缓存;图执行断点恢复是另一套状态——都别跟对话记忆搅在一起。

本轮上下文就是当前请求,下面只展开窗口、向量长期记忆和用户偏好表。


7.3 窗口记忆

窗口路径记的是 Message 原文,按条数裁剪。结构是三层:

层职责
MessageChatMemoryAdvisor调用前读历史、调用后写本轮
ChatMemoryadd / get / clear
ChatMemoryRepository按会话 id 真正落库

MessageWindowChatMemory 是常用的 ChatMemory 实现:在 Repository 上限制 maxMessages。

契约与会话键

public interface ChatMemory {
    String CONVERSATION_ID = "chat_memory_conversation_id";
​
    void add(String conversationId, List<Message> messages);
    List<Message> get(String conversationId);
    void clear(String conversationId);
}

单条 add(conversationId, message) 只是转成 List.of(message)。仓库侧是整表替换:

public interface ChatMemoryRepository {
    List<String> findConversationIds();
    List<Message> findByConversationId(String conversationId);
    void saveAll(String conversationId, List<Message> messages);
    void deleteByConversationId(String conversationId);
}

2.0 起会话键必填:缺键或 null,Advisor 取键会失败;空串在 ChatMemory 里也会被拒。常量字符串是 chat_memory_conversation_id,自定义 Advisor 要兼容官方记忆就用这个,别自创拼写。

chatClient.prompt()
        .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, conversationId))
        .user(userText)
        .call()
        .content();

同一次还要挂别的 Advisor,可以写在同一个块里:

.advisors(a -> a
        .advisors(extraAdvisor)
        .param(ChatMemory.CONVERSATION_ID, conversationId))

一次调用怎么读写

before
  1. 按 conversationId 取历史
  2. Prompt 里还没有这段历史时,拼进去
  3. 尽量把 SystemMessage 挪到最前
  4. 把本轮末条 User / ToolResponse 写入记忆
     (getLastUserOrToolResponseMessage())
​
ChatModel.call / stream
​
after
  5. 写回本轮 AssistantMessage

多轮能接上,靠的是同一把键上的这两次读写。第 2 步有去重:Prompt 里已经带了同一段 memory,就不会再拼一遍;你自己又塞半截历史,再挂记忆 Advisor,仍然可能乱,两边都要查。

流式也走这条路径:before 先执行,帧聚完再 after。中途断开时,常见情况是 user 写进去了、assistant 不完整。

ChatMemory chatMemory = MessageWindowChatMemory.builder()
        .chatMemoryRepository(new InMemoryChatMemoryRepository())
        .maxMessages(20) // 默认 20
        .build();

裁剪时 SystemMessage 会尽量留下;来了新的 system,旧的会被换掉。切窗口会尽量对齐到完整 USER 轮次,避免只剩半截 assistant / tool。工具循环、长 system、多图很容易把 20 条吃光——窗口只管近期原文,再往前的相关内容交给向量记忆。

默认 order 是 Advisor.DEFAULT_CHAT_MEMORY_PRECEDENCE_ORDER(大约 HIGHEST_PRECEDENCE + 200),比 ToolCallingAdvisor(约 +300)靠外,所以记忆包住整次工具循环。

装配

ChatMemoryRepository
  → MessageWindowChatMemory
  → MessageChatMemoryAdvisor
  → ChatClient.defaultAdvisors(...)
  → 每次请求传 CONVERSATION_ID

加了 spring-ai-starter-model-chat-memory 之后,Boot 在缺少 Bean 时会提供 InMemoryChatMemoryRepository 和默认 MessageWindowChatMemory(maxMessages = 20)。Advisor 还是要自己挂:

@Configuration
class ChatMemoryConfig {
​
    @Bean
    MessageChatMemoryAdvisor messageChatMemoryAdvisor(ChatMemory chatMemory) {
        return MessageChatMemoryAdvisor.builder(chatMemory).build();
    }
​
    @Bean
    ChatClient chatClient(ChatClient.Builder builder,
                          MessageChatMemoryAdvisor memoryAdvisor) {
        return builder
                .defaultAdvisors(memoryAdvisor, new SimpleLoggerAdvisor())
                .defaultSystem("你是简洁的技术助手。")
                .build();
    }
}
<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-starter-model-chat-memory</artifactId>
</dependency>

要改窗口大小,声明自己的 ChatMemory Bean 即可(自动配置带 @ConditionalOnMissingBean):

@Bean
ChatMemory chatMemory() {
    return MessageWindowChatMemory.builder()
            .maxMessages(20)
            .build();
}

同一会话两轮:

String conversationId = "user-42-session-1";
​
String r1 = chatClient.prompt()
        .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, conversationId))
        .user("我叫 Tom,请记住。")
        .call()
        .content();
​
String r2 = chatClient.prompt()
        .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, conversationId))
        .user("我叫什么名字?")
        .call()
        .content();

第二轮换了 id 或漏传键,看起来就像模型「失忆」——先查键,别先怪模型。

仓库

仓库适合
InMemory单测、原型;starter 默认
JDBC已有关系库,要审计 / 备份
Redis低延迟、多实例共享
Mongo / Cassandra / Neo4j已有对应集群

传 CONVERSATION_ID 的方式不变,换的是 Repository。

Redis(2.0.1 前缀):

spring:
  ai:
    chat:
      memory:
        repository:
          redis:
            host: localhost
            port: 6379

JDBC 再加:

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-starter-model-chat-memory-repository-jdbc</artifactId>
</dependency>

配好 DataSource。既换仓库又改窗口:

@Bean
ChatMemory chatMemory(ChatMemoryRepository repository) {
    return MessageWindowChatMemory.builder()
            .chatMemoryRepository(repository)
            .maxMessages(20)
            .build();
}

接入时开一下 DEBUG,确认建表 / schema 是否正常。

产品上这把键怎么用

做法效果
同一 conversationId接上历史
换新 id新会话
chatMemory.clear(id)清空该键;键还能继续用
多实例还用 InMemory请求打到不同节点就会偶发失忆
String newId = UUID.randomUUID().toString();
// 或
chatMemory.clear(oldId);

键可以前端生成,也可以后端按用户 + 会话拼。服务端要认同一把键;别拿未鉴权的客户端自称身份做隔离。


7.4 向量长期记忆

窗口裁掉的内容,如果还想按「和当前问题像不像」捞回来,用 VectorStoreChatMemoryAdvisor。

读写

它把对话写成向量库里的 Document,调用前用当前用户问题做相似检索,把命中结果写进 System 里的 LONG_TERM_MEMORY 段——不是往 Message 列表里塞一整段历史。

before
  1. 取 CONVERSATION_ID 和当前 user 文本
  2. similaritySearch(filter: metadata.conversationId == 该键)
  3. 命中内容包成 <memory-entry>,XML 转义后填进 system 模板
  4. 本轮 UserMessage 写入向量库
​
ChatModel.call / stream
​
after
  5. 本轮 AssistantMessage 写入向量库

默认 defaultTopK 是 20;单次可以用 VectorStoreChatMemoryAdvisor.TOP_K(chat_memory_vector_store_top_k)改小。只走文本;图片等 media 不会按这条官方路径进向量记忆。模板里会写明:LONG_TERM_MEMORY 当历史数据看,不当指令。

装配

需要 Embedding、具体 VectorStore,以及:

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-vector-store-advisor</artifactId>
</dependency>
@Configuration
class LongTermMemoryConfig {
​
    @Bean
    VectorStoreChatMemoryAdvisor vectorStoreChatMemoryAdvisor(VectorStore vectorStore) {
        return VectorStoreChatMemoryAdvisor.builder(vectorStore)
                .defaultTopK(5)
                .build();
    }
​
    @Bean
    ChatClient chatClient(
            ChatClient.Builder builder,
            MessageChatMemoryAdvisor windowMemory,
            VectorStoreChatMemoryAdvisor longTermMemory) {
        return builder
                .defaultAdvisors(windowMemory, longTermMemory)
                .defaultSystem("你是简洁的技术助手。")
                .build();
    }
}
chatClient.prompt()
        .advisors(a -> a
                .param(ChatMemory.CONVERSATION_ID, conversationId)
                .param(VectorStoreChatMemoryAdvisor.TOP_K, 3))
        .user(userText)
        .call()
        .content();

键怎么过滤

Document metadata 里有 conversationId 和 messageType,检索带等值 filter。所以:

  • 不会跨用户乱搜,先按键隔开,再在键内做相似检索。

  • 和窗口共用 ChatMemory.CONVERSATION_ID,一次请求里两把 Advisor 吃同一键。

  • 换 conversationId,向量侧旧片段也进不来,和窗口换键一样。

  • 真要跨多个会话记用户偏好,要么用稳定的用户级 id 当这把键(窗口也会跟着变语义,或拆两个 Client / 自写 Advisor),要么会话结束把摘要写到带 userId 的自建集合再 filter——这已经超出官方 Advisor 的默认能力。

删除用户时要能按键清向量数据。

和窗口一起用

最近几轮靠窗口连贯,更早的相关片段靠向量补。两边都占 token,maxMessages 和 topK 别一起开很大。排障时看最终 Prompt:窗口动的是 Message 列表,向量动的是 System。默认 order 同档,要固定先后就给其中一个设 .order(...)。同类记忆 Advisor 别挂两份。

官方路径每轮 user / assistant 都会 vectorStore.write,长对话成本不低。生产里常见改成会话结束再写摘要,或模型显式调「保存偏好」类工具才写入偏好表——这是产品策略,不是改个配置就有的开关。


7.5 用户偏好表

「说过什么相关的话」交给窗口或向量记忆;「花生过敏」「默认寄上海」这类字段,更适合写成你们业务里的一张偏好表(或用户画像字段),查出来再塞进 Prompt:

public record UserPreference(String key, String value, String source) {}
​
userPreferenceRepository.upsert(userId, new UserPreference("allergy", "花生", "user_said"));
​
String profile = userPreferenceRepository.renderForPrompt(userId);
chatClient.prompt()
        .system("已知用户偏好:\n" + profile)
        .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, conversationId))
        .user(userText)
        .call()
        .content();

可以用结构化输出或 @Tool 从对话里抽出来再 upsert。这不是 Spring AI 自带的组件,就是普通业务表;别指望模型每次都能从杂乱聊天记录里把这类字段猜对。


7.6 别跟这几样搞混

三类都讲完了,剩下最容易拿错的是「看起来都像记住了点什么」。按场景对一下刀:

用户说过什么 vs 公司文档里写了什么 聊天原文、相关旧片段走窗口或向量对话记忆;制度、手册、产品说明走 RAG。别把用户闲聊当知识库文档灌进检索,也别指望知识库问答去「记住这个用户叫 Tom」。

向量长期记忆 vs 语义缓存 向量记忆是把相关历史喂进 Prompt,让模型接着聊。语义缓存是相似问题命中后直接短路,少调一次模型。一个补上下文,一个省钱加速,不是同一件事。

用户偏好表 vs 向量记忆 「花生过敏」「默认寄上海」这种必须准的字段,写偏好表再注入。向量适合「好像以前聊过类似的事」——召回相关,但不保证字段级正确。

对话记忆 vs 工作流断点 说过什么、偏好是什么,是 ChatClient 侧的账。图执行到哪一步、中断后怎么恢复,是另一套状态(checkpoint)。两本账不要假设会自动同步。


7.7 常见坑

现象先看什么
第二轮不记得第一轮CONVERSATION_ID 是否相同、有没有漏传、有没有 clear
空 id 直接失败2.0 起不能传 null / 空串
挂了 Advisor 仍无历史有没有进 defaultAdvisors;是不是同一个 ChatMemory;窗口是不是太小
多实例偶发失忆是不是还在用 InMemory
Redis 不生效前缀是不是 spring.ai.chat.memory.repository.redis.*
历史重复 / 错乱是否挂了两份记忆;窗口和向量是否叠太猛
工具轮次后上下文怪窗口是否切在半截 tool;order 是否还包住 ToolCalling
流式记忆不完整有没有等到流结束再写回
换会话向量全空官方按 conversationId 过滤,换键就是新分区
向量噪声大topK、Embedding 与 dimensions
跨会话「长期记忆」没用是不是每会话新 UUID;要不要用户级键或自建 filter
多模态向量侧空白官方只写文本 user / assistant

7.8 小结

记忆不是 ChatClient 内置能力,而是 Advisor + 存储。先分清窗口、向量、用户偏好表各记什么,再按场景装配;会话键传对,比纠结模型「聪不聪明」更要紧。和 RAG、缓存、工作流状态分开记账,排障会省事很多。

长期记忆在内容生成AI中的关键作用与技术实现 想象你和一个朋友聊天:第一句:“我昨天去了迪士尼,玩了七个小矮人矿车!第二句:“那个项目排队排了2小时,但超刺激!第三句:“对了,你之前说你最怕过山车,这次敢不敢试试?朋友如果能接住第三句的“之前说怕过山车”,说明他记住了三天前的对话——这就是人类的长期记忆能力。但如果是现在的AI聊天机器人呢?假设它的“短期记忆”只能记住最近5000字的对话(类似GPT-3.5的上下文窗口),当对话超过这个长度时,它会逐渐“遗忘”早期信息。比如你聊到第100轮时问:“我第一天说的迪士尼项目叫什么名字? 阅读详情

相关推荐

4篇4章1节:认识 AI 中的短期记忆与长期记忆

本文先从大模型无状态底层原理切入,对比短期记忆与长期持久记忆在生命周期、存储方式、适用场景上的核心差异,拆解短期上下文记忆自动收录的六类信息,给出四项实操优化技巧;再以 TRAE IDE 为实例,详解「规则与记忆」面板全部功能,完整梳理了从基础原理到软件实操的全流程操作指南。

MD Code 207

AI伴侣长期记忆的三种方案对比:滑动窗口摘要、向量检索与图谱化存储

近期/中期/远期记忆需要不同的技术方案:滑动窗口(近期,延迟80ms)、向量检索(中期,延迟320ms)、图谱存储(远期+关系,延迟520ms)。路由层是组合方案的枢纽:查询先走最快方案,置信度不足时升级到下一个方案。存储成本按消息重要性分档控制:重要消息全量嵌入,普通消息30天后降级为摘要。向量检索的全局语义覆盖能力是中间方案的基石:74%的远期召回率+320ms延迟,在没有关系推理需求的场景中可作为独立方案。图谱存储的关系推理能力是长期记忆的差异化能力。

specter__的博客 5010

halcon 深度学习标注_Halcon deep learning之目标检测笔记(一)

设置输入输出的路径输入路径有两个,一个是图像路径HalconImageDir,一个是Json文件路径PillBagJsonFile。这两个参数用于后续在图像路径中读取coco文件。输出路径首先定义一个新的文件夹路径,用于存放样本和模型文件等数据。设置基于深度学习的目标检测模型的路径,该模型文件以.hdl结尾。设置样本数据文件夹ExampleDataDir:'detect_pills_data'数据...

weixin_27885313的博客 2699

从“金鱼脑”到“大象记忆”:AI Agent 短期记忆与长期记忆的存储与检索全解

短期记忆和长期记忆,是 Agent 认知架构的两大支柱。短期记忆保证了 Agent 在当前任务中的流畅与专注;长期记忆则赋予了它跨越时间的连续性与学习能力。理解它们的区别,不是学术探讨,而是工程落地的必修课。在此基础上,OpenClaw 的 Dreaming 机制为我们展示了一个更前沿的方向——让 Agent 不只是“存储”和“检索”,而是像人类一样,在“睡眠”中主动对记忆进行巩固、提炼和升华,最终实现从“记住”到“理解”的跨越。底部锚点⬆ ⬆ 顶部 ⬆ ⬆⬇ ⬇ 底部 ⬇ ⬇。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1491

进阶数据结构——链式前向星

链式前向星是一种进阶的数据结构,主要用于图的存储。我希望大家先看这个视频(蓝色字体点进去) 不然你很难理解的。在图论中,图的存储方式主要有邻接矩阵和邻接表两种。邻接矩阵虽然建图简单方便,但占内存较大,节点数量稍微大点的题目就难以使用(适合稠密图);而邻接表虽然节省空间,但其指针形式难写易错,且vector形式的读取速度较慢,易导致大数据下的超时(TLE)。针对上述问题,链式前向星作为一种折中的方式应运而生。链式前向星本质上是一种静态链表,它将数据以链表形式连接在一起。

ycs66的博客 2137

从ARCore到AICore:揭秘Google如何通过系统级服务推动Android生态创新

本文深入探讨了Google如何通过AICore等系统级服务推动Android生态创新。从ARCore到AICore,Google通过分层解耦策略将AI能力下沉至系统层,实现端侧大模型推理,如Gemini Nano在Pixel 8 Pro中的应用。文章剖析了AICore的技术架构、开发者赋能路径及场景化实践,展示了其在通信、内容创作和生产力工具中的卓越表现。

rust6ferris的博客 545

AI智能体的“记忆系统”怎么设计?一文讲透短期记忆、长期存储与语义搜索

想象一下和一个忘记你说过的所有话的朋友交谈。每一次对话都要从零开始,没有记忆、没有上下文、没有进展。这会让人感到尴尬、疲惫且缺乏人情味。不幸的是,当今大多数人工智能系统的行为正是如此。它们确实很聪明,但缺少一些关键的东西:记忆。

2401_85325726的博客 1358

Cisco Packet Tracer 9.0 工业网络模拟:3步配置OT协议与Purdue模型实战

本文详细介绍了如何使用Cisco Packet Tracer 9.0进行工业网络模拟,包括Purdue模型构建、三大OT协议(Modbus TCP/IP、CIP、PROFINET IO)配置及工业网络安全防护。通过实战演练,读者可掌握工业网络设计、配置与安全防护的核心技能,适用于智能制造和能源管理等场景。

weixin_28691741的博客 352

当AI开始记住你:小智如何接入长期记忆

本文分享了 `小智 AI 如何接入长期记忆` 的两种方案,并给出优劣分析。

u010522887的专栏 3038

CELF(Cost-Effective Lazy Forward selection)具有成本效益的惰性前向选择算法

CELF(Cost-Effective Lazy Forward selection)算法解析      引言:在社交网络影响力最大化问题的求解过程中,我们往往需要去选择一些目标种子结点作为信息初始传播的源头。贪婪算法在传播效果上的解决可以达到影响的最大化,但是在时间复杂度上面显得确十分糟糕。为此CELF算法应势而生,CELF算法利用了函数次模性的特点,在第一轮选择种子结点时,计算网络中所有节点的边际收益,但将在之后的过程中,不再做网络节点边际收益的重复计算,这相对于传统的贪婪算法,将在时间上得到非常明显的

hahaxq的博客 2477

WSL2下用QEMU模拟ARM开发板:从编译uboot到调试全流程(附常见错误解决)

本文详细介绍了在WSL2环境下使用QEMU模拟ARM开发板的完整流程,包括uboot编译、内核调试等关键步骤。通过QEMU模拟vexpress-a9开发板,开发者可以高效搭建嵌入式开发环境,解决常见错误并提升开发效率。

solidity8miner的博客 286

AI agent里的长期记忆和短期记忆

AI Agent 是时下热门的一个方向,在 OpenAI 应用研究主管 LilianWeng 写的万字长文中[1],她提出 Agent = LLM+ 记忆 + 规划技能 + 工具使用。图1 Overview of a LLM-powered autonomous agent system组件二:记忆我们可以将上下文学习(...

weixin_36185970的博客 2127

团结引擎+OpenHarmony 记录 (持续更新中)

获取不到的原因是因为二者不在同一个线程中,所以数据没有同步。而 globalThis.context 数据进行了同步。(TuanjieMainWorkerHandler.ts中可以看到)在进行绘制 UI 的时候 ,如果组件有 Native API 就可能不会显示出来,例如 web 控件就不能展示出来,刚加上权限的时候 会报错 因为缺少 reason ,添加上就不会报错了。只有纯 UI 控件是可以展示出来的,注释掉 web控件后就可以。

m_cainiaokuaifei的博客 1491

AI Agent 记忆系统设计:短期记忆与长期记忆

本文探讨了将无状态的大语言模型(LLM)进化为具备记忆能力的智能代理(Agent)的关键技术。文章指出,记忆系统是AI智能积累和复利效应的基础,并将其分为短期记忆(类似内存)和长期记忆(类似硬盘)。短期记忆受限于上下文窗口容量,可通过滑动窗口或摘要压缩优化;长期记忆则依赖向量数据库和RAG机制实现语义检索。文章强调,真正的智能在于短期与长期记忆的协同流动,提出了记忆巩固流程,并指出有效记忆的核心在于选择性保留有价值信息。最后,作者提供了大模型学习的资源路径和商业化应用方案。

2401_85390073的博客 919

10、X射线聚焦与光学元件技术解析

本文深入解析了X射线聚焦与光学元件技术,重点讨论了椭圆镜的聚焦原理及局限性,多层镜的设计优化及其突破性应用,以及X射线波导的基础理论和模式求解方法。文章还总结了这些技术的优势、局限及其在材料科学、生物学和医学等领域的广泛应用前景。通过理论推导与技术改进,这些光学元件为X射线成像技术的发展提供了重要支撑。

pz890123的博客 121

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

深入理解AI Agent记忆模块:短期记忆与长期记忆的完美结合!

AI Agent的记忆模块分为短期记忆(对话历史)和长期记忆(RAG检索增强生成)。短期记忆维持当前对话连贯性,长期记忆通过向量数据库存储和检索历史经验。两者协作使AI具有状态,能够跨越多次交互保留信息。文章详细介绍了记忆模块的架构、实现技术和优化方案,包括记忆摘要、合并和淘汰机制等,确保系统在高频使用场景下长期稳定运行。

m0_65555479的博客 1690

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

AI应用记忆设计:窗口记忆与长期记忆的协同实战

大语言模型本身并不具备真正的记忆能力,上下文窗口只是模型单次能看到的临时便签,而长期记忆则像档案柜,负责沉淀用户画像与领域知识。在构建智能问答、AI Agent和客服机器人时,记忆设计直接决定体验上限:窗口记忆维持当前会话连贯,长期记忆则让系统在用户再次回来时依然“懂你”。通过RAG检索增强生成、向量数据库、会话摘要与记忆存储压缩等技术,开发者可以将两种记忆有机结合,实现从“能聊”到“记得住”的跨越。本文从工作原理出发,结合工程实践,探讨窗口记忆与长期记忆的分工协作、记忆冲突更新策略,以及Token预算、重

weixin_29054245的博客 220

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Agent的长期记忆

如果什么时候,可以不断流式的接受外界的输入token,KV Cache一直在GPU内存或者临时换出到CPU内存,这样KV Cache就是AI Agent的工作记忆,或者说AI Agent的状态,这是的Agent或许就是不断进行的“半神”存在。大模型的输入:包括角色设定(system prompt)、最近对话、全局记忆概要(即角色对用户的核心记忆 b.2)、经过RAG的聊天记录分段总结(a.)和分类总结(b.1)。,每次API调用还是无状态的,需要带上前面所有的聊天记录,重复计算所有的KV Cache。

谁怕平生太急 3486

AI Agent记忆系统实现:从短期记忆到长期记忆的完整指南!

本文详细介绍了AI Agent记忆系统的重要性与实现方法,区分了上下文窗口与记忆的本质差异,解析了短期记忆与长期记忆(程序性、情节性、语义性)的架构与应用。通过代码示例展示了如何使用LangGraph实现记忆功能,并提供了生产环境部署方案,最终通过电子邮件智能体案例展示了记忆系统如何提升AI的个性化和适应能力。

qingkahui24689的博客 1227

AI会话记忆:窗口记忆与长期记忆的工程实践

人工智能应用中的交互体验,很大程度上取决于模型能否准确理解并记住对话的上下文。这背后的核心技术是上下文窗口管理与记忆机制,它们决定了AI是像老熟人般贴心,还是如陌生人般健忘。窗口记忆通过管理token配额,控制模型每次请求可见的近期对话;长期记忆则借助结构化档案、滚动摘要与向量召回,实现跨会话的信息持久化。合理设计记忆体系,不仅能提升AI客服、个人知识库等高交互场景的用户体验,还能显著降低API成本与检索噪音。从消息窗口管理器到长期记忆的写入与召回,再到记忆评测与调优,本文系统梳理了一套可落地的工程方案,帮

weixin_29061509的博客 85

为什么大模型的记忆力像外婆:谈上下文窗口与长期记忆的区别

很多非技术的朋友在使用 AI 时,总会产生一种矛盾的直觉:一方面,AI 好像上知天文下知地理,能背出几百年前的古诗、能解释深奥的量子物理;但另一方面,当你在一个很长的对话窗口里跟它聊了两个小时后,它却突然忘记了你半小时前跟它说过的"我妹妹叫小梅",甚至在回答时把你妹妹的名字叫错了。朋友不解地问我:"它既然能背下整部百科全书,为什么连我半小时前说的一句话都记不住?这种奇特的记忆机制,其实跟上了年纪的外婆非常像。外婆能把几十年前老家院子里的果树、当年的老邻居如数家珍地讲给你听;

specter__的博客 2213

AI Agent记忆系统全解析:短期与长期记忆如何协同打造智能应用!

本文详细介绍了AI Agent的短期记忆与长期记忆系统。短期记忆具有时效性、容量有限和易失性等特点,依赖于Transformer的上下文窗口;长期记忆则具有持久性、容量大和非易失性等特点,通过向量和数据库实现。二者通过RAG等技术协同工作,使Agent能够进行情境化交互并积累经验。理解这两种记忆机制是开发智能Agent的关键。

Trb701012的博客 1080

第 7 章:记忆与上下文管理 —— 让 AI 拥有“长期记忆”与“超级大脑”

对于长对话历史,使用 AI 自身的能力进行压缩。指令“我们之前的对话太长了。请将过去 50 轮对话的核心决策、代码变更和遗留问题,压缩成 200 字的摘要。我将用这个摘要开启新会话。应用:将生成的摘要作为新会话的开场白,瞬间恢复上下文,同时释放 90% 的 Token 空间。

AI浩 774

大模型智能体记忆机制详解:短期记忆与长期记忆如何实现

文章详细解释了大模型智能体的短期记忆和长期记忆机制。短期记忆依赖上下文窗口,通过传递对话历史维持,但受窗口大小限制;长期记忆采用RAG技术,将信息向量化存储,可跨对话持久化。文章通过Cherry Studio实例说明两种记忆的实现方式、优缺点及应用场景,帮助读者理解智能体如何维持"记忆"。

2401_85327249的博客 962
上一篇: 第 6 章 · Spring AI中的Advisors
下一篇: 第 8 章 · Tool Calling 与 Tool Search
AI深栈
博客等级 码龄14年 1粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值