FEATURED · 精选文章

企业级AI Agent记忆架构设计:从上下文到长期记忆

发布时间 / 2026/9/9 11:33:09
来源 / 创域科博编辑部
栏目 / 资讯中心
企业级AI Agent记忆架构设计:从上下文到长期记忆 1. 这篇文章真正要解决的问题如果你已经在做 AI Agent 开发大概率遇到过这样一个尴尬场景用户昨天刚问过“我喜欢喝美式咖啡不加糖”今天再问“帮我推荐一款咖啡豆”Agent 完全不记得昨天说过什么。你检查了代码Prompt 里确实把历史消息传给了大模型但窗口一长Token 爆掉或者模型开始“忘记”前面的话。于是你开始怀疑大模型的上下文窗口不是越来越大吗为什么记忆还是这么难这里真正要区分的是两件事Context上下文和Memory记忆。很多人把这两个概念混为一谈认为只要把历史消息拼进 PromptAgent 就有记忆了。这是当前 Agent 开发里最常见的误区。上下文只是“这次对话临时放进窗口里的信息”它会随请求结束而消失而记忆是“跨会话、跨请求仍然能被检索和复用的信息”它有独立的存储、更新和召回机制。ChatGPT、Claude 这类产品看起来“记得你”本质上不是大模型自己有记忆而是产品层在会话 ID 维度做了消息存档并在每次请求时把相关历史重新注入上下文。这套机制放到企业级场景里问题会成倍放大多用户隔离、数据权限、记忆更新冲突、检索召回质量、成本控制、持久化存储选型……任何一个环节不到位Agent 都会变成“金鱼脑”。这篇文章要解决的问题就是如何设计一套企业级 Agent Memory 架构从最基础的 Context 管理走向真正的 Long-term Memory。你会看到Context 和 Memory 的本质区别以及各自的适用边界。为什么 Redis、向量数据库、图数据库会同时出现在一套记忆架构里。一个可落地的分层 Memory 架构长什么样。为什么 RAG 和 MCP 不是 Memory 的替代品而是 Memory 的上下游基础设施。实际项目中怎么落地、怎么验证、怎么排错。这不是一篇概念科普而是可以直接指导你画架构图、写代码、做技术选型的实战文章。2. 基础概念Context、Long-term Memory、RAG 与 MCP2.1 Context临时工作区Context 是指大模型一次推理时“看得见”的全部信息。它由系统提示词、用户输入、工具返回结果、历史消息摘要等组成全部拼接进模型的输入窗口。Context 的特点是“一次性”的。请求结束窗口清空。下次请求如果要让模型“记得”就必须重新把这些信息组装进来。# 伪代码Context 的本质就是把信息塞进 Prompt def build_context(user_id, query): history load_history_from_redis(user_id) # 从记忆层读取 profile load_user_profile(user_id) # 从画像服务读取 docs vector_search(query) # 从知识库召回 prompt f 用户画像{profile} 历史对话{history} 相关文档{docs} 用户问题{query} return prompt所有记忆最终都必须通过 Context 才能影响模型输出。这是理解 Memory 架构的起点Memory 是“怎么存、怎么找”Context 是“怎么用”。2.2 Long-term Memory跨会话的持久层Long-term Memory 解决的是 Context 解决不了的问题信息不能无限塞进窗口但信息又必须在需要时能被找回来。企业级 Long-term Memory 至少包含三个层次短期会话记忆当前会话的原始消息通常存在 Redis设置过期时间。长期事实记忆用户偏好、项目背景、业务规则等稳定信息需要结构化存储。语义记忆从历史对话中抽取出来的知识片段通过向量化存入向量数据库按语义相似度召回。维度短期会话记忆长期事实记忆语义记忆存储内容原始对话消息用户偏好、结论、实体关系知识片段、业务经验存储介质RedisMySQL/PostgreSQL向量数据库召回方式按时间顺序按 key 精确读取向量相似度检索更新策略追加覆盖/更新增量写入生命周期小时/天级月/年级长期累积2.3 RAG记忆的外部知识源RAGRetrieval-Augmented Generation检索增强生成解决的是“模型不知道”的问题。企业知识库、产品文档、历史工单都可以切分、向量化、存进知识库在用户提问时召回相关内容注入 Context。很多人问RAG 和 Memory 是不是一回事不是。RAG 的核心是“知识检索”它是最常用的记忆“数据源”之一但它是静态的文档不进不出知识库本身不会因为用户对话而更新。真正让 Agent “记住用户说了什么”的是 Memory 层的写入与更新机制。Granite Code Model 和 GPT-4 这类模型在长上下文上不断进步大家可以去看一些相关的评测和分析但即便上下文窗口从 128K 扩到 1M也不改变一个事实窗口越大成本和时延越高窗口再大也无法覆盖企业级海量知识库。RAG 依然是通过“检索代替遍历”来控制成本的核心手段。2.4 MCP记忆与外部系统的标准化通道MCPModel Context Protocol是最近讨论度极高的协议它解决的是“模型如何调用外部工具和数据”的标准问题。MCP 本身不是记忆但它是 Agent Memory 架构中连接记忆层与推理层的关键协议。你可以通过 MCP Server 暴露记忆读写能力一个memory_read工具让模型在需要时主动查询记忆。一个memory_write工具让模型在对话中自动沉淀用户偏好。一个profile_update工具让模型更新用户画像。这样设计的好处是记忆层与推理层解耦。记忆存储可以在 Redis、向量库、图数据库之间自由切换模型通过统一的 MCP 协议访问不需要关心底层存储细节。MCP 是 Agent 操作 Memory 的标准“接口层”。区块链行业也有类似的技术比如 Web3 生态中的去中心化存储方案但是企业级 AI 应用目前更关注的是中心化可控的存储方案这里不展开。2.5 上下文工程的定位上下文工程Context Engineering是最近出的一个概念它关注的核心问题是如何用最少的 Token 让模型拿到最多有效信息。它把 Context 从“拼字符串”升级为“可管理的系统工程”。在实际的 Agent Memory 项目中上下文工程解决三个问题如何决定哪些信息必须注入 Context。如何压缩和摘要历史信息。如何在 Token 成本、响应速度和答案质量之间取得平衡。Memory 层是上下文工程的地基。没有 Memory 层上下文工程只能做“单次请求的优化”有了 Memory 层上下文工程才能做“跨会话的信息编排”。3. 环境准备与前置条件在开始搭建企业级 Agent Memory 架构之前需要先明确技术栈。本文以一个 Spring AI Alibaba LangChain4j 混合架构为例演示核心思路。实际操作中你可以根据团队情况替换具体组件。3.1 核心依赖参考实现采用 Spring AI Alibaba它提供了一套比较完整的 AI 应用开发抽象底层集成 DashScope、ModelScope 等模型网关。同时搭配 LangChain4j 作为补充因为 LangChain4j 在 Memory 抽象上做得比较成熟自带多种 MemoryStore 实现。!-- pom.xml -- dependency groupIdcom.alibaba.cloud.ai/groupId artifactIdspring-ai-alibaba-starter/artifactId version2.0.0/version /dependency dependency groupIddev.langchain4j/groupId artifactIdlangchain4j/artifactId version0.35.0/version /dependency dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-redis/artifactId version0.35.0/version /dependency dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-embeddings/artifactId version0.35.0/version /dependency版本号请以实际项目为准本文重点演示通用架构思路。如果团队已经使用 Spring Boot 3.x可以直接集成 Spring AI Alibaba如果团队更偏好 Python 生态LangChain 的对应组件也可以实现同等效果。3.2 中间件准备企业级 Memory 架构一般需要以下中间件中间件用途最低要求Redis 7.x短期会话记忆、缓存主从模式AOF 开启PostgreSQL 15用户事实数据、对话归档独立实例定期备份向量数据库Milvus/Elasticsearch语义记忆、知识库向量支持 HNSW 索引对象存储或文件服务原始文档存储私有网络如果团队还没有搭建全套中间件可以先从 Redis 开始打通最小闭环短期会话记忆的存取。向量数据库可以先用本地模式或 Docker 跑一个测试实例。3.3 目录结构建议agent-memory-demo/ ├── pom.xml ├── src/main/java/com/example/memory/ │ ├── controller/ # HTTP 接口层 │ ├── service/ # 业务逻辑层 │ ├── memory/ # 记忆存储与检索 │ │ ├── RedisMemoryStore.java │ │ ├── VectorMemoryStore.java │ │ ├── ProfileMemoryStore.java │ │ └── MemoryService.java │ ├── mcp/ # MCP Server 实现 │ │ ├── MemoryMcpServer.java │ │ └── MemoryTools.java │ ├── rag/ # 知识库检索 │ │ ├── KnowledgeBaseService.java │ │ └── DocumentProcessor.java │ └── AgentDemoApplication.java └── src/main/resources/ └── application.yml这个目录结构遵循“分而治之”原则记忆读写逻辑、知识库检索逻辑、MCP 接口逻辑各自独立方便后续替换和扩展。4. 核心流程拆解从请求到响应的记忆链路一个带 Long-term Memory 的 Agent 请求完整链路可以拆成七个步骤。4.1 请求进入与用户识别用户请求进来后第一件事是识别用户身份。企业级场景下用户 ID 通常来自登录态或 API Token绝对不能信任用户传来的任意 ID。// 文件路径MemoryService.java public ChatResponse chat(String userId, String query) { // 校验用户权限确保用户只能访问自己的记忆 validateUser(userId); // ... }4.2 记忆检索根据用户 ID 和当前输入从三个记忆层同时检索Redis拉取最近 N 条会话消息。ProfileStore读取用户画像 key-value。VectorStore将当前 query 向量化检索相关语义记忆。MemoryContext memoryContext MemoryContext.builder() .sessionMessages(redisMemoryStore.loadRecentMessages(userId, 10)) .userProfile(profileMemoryStore.loadProfile(userId)) .semanticMemories(vectorMemoryStore.searchSimilar(query, 5)) .build();这里的关键是“多路召回”短期记忆按时间取长期事实按 key 取语义记忆按向量相似度取。三条路径互相补充。4.3 RAG 知识库检索如果用户问题涉及企业知识库内容需要并行执行 RAG 检索ListDocument relevantDocs knowledgeBaseService.search(query, 3);在实际项目中RAG 检索往往和记忆检索异步并行执行全部拿到后再组装 Prompt。4.4 上下文组装将所有检索结果按优先级排序组装成 Prompt。这一步骤的效率直接决定 Token 成本和回答质量。String prompt buildPrompt(memoryContext, relevantDocs, query);核心原则当前用户问题相关的信息优先、结构化信息放在前面、原始长文本放在后面。4.5 模型调用组装完 Prompt 后调用大模型。生产环境建议配置超时时间和重试策略。ChatResponse response chatClient.call(prompt);4.6 记忆写入与更新这是 Long-term Memory 和 Context 最核心的区别响应返回后必须做记忆写入。如果只读不写Agent 永远不会“记住”任何新信息。// 同步写入短期记忆 redisMemoryStore.saveMessage(userId, user, query); redisMemoryStore.saveMessage(userId, assistant, response.getContent()); // 异步抽取长期记忆 memoryExtractor.extractAndSave(userId, query, response.getContent());长期记忆抽取在异步线程池中执行避免阻塞主链路。4.7 返回响应最后将响应返回给用户同时可以返回元数据如命中的记忆片段用于排查问题。这七步链路是多数企业级 Agent Memory 项目的基础骨架。无论你最终选择哪种技术栈链路本身是通用的。5. 完整示例代码实现这一节给出可以跑通的最小实现。为控制篇幅每一步只展示核心代码。5.1 配置 application.yml# 文件路径src/main/resources/application.yml spring: ai: dashscope: api-key: ${DASHSCOPE_API_KEY} model: qwen-plus data: redis: host: localhost port: 6379 password: ${REDIS_PASSWORD:} vector-store: type: memory # 演示阶段使用内存向量库生产环境替换为 Milvus top-k: 5 memory: redis-ttl-hours: 24 # 短期记忆过期时间 profile-namespace: app:profile session-namespace: app:session生产环境一定不要硬编码 API Key建议使用环境变量或配置中心。5.2 Redis 短期会话记忆实现// 文件路径src/main/java/com/example/memory/memory/RedisMemoryStore.java Component public class RedisMemoryStore { private final StringRedisTemplate redisTemplate; private final ObjectMapper objectMapper; public RedisMemoryStore(StringRedisTemplate redisTemplate) { this.redisTemplate redisTemplate; this.objectMapper new ObjectMapper(); } public void saveMessage(String userId, String role, String content) { String key buildSessionKey(userId); Message message new Message(role, content, System.currentTimeMillis()); try { redisTemplate.opsForList().rightPush(key, objectMapper.writeValueAsString(message)); // 只保留最近 50 条防止列表无限增长 Long size redisTemplate.opsForList().size(key); if (size ! null size 50) { redisTemplate.opsForList().leftPop(key); } } catch (JsonProcessingException e) { throw new MemoryStoreException(Failed to save message, e); } } public ListMessage loadRecentMessages(String userId, int limit) { String key buildSessionKey(userId); ListString rawMessages redisTemplate.opsForList().range(key, -limit, -1); if (rawMessages null || rawMessages.isEmpty()) { return List.of(); } return rawMessages.stream() .map(raw - { try { return objectMapper.readValue(raw, Message.class); } catch (JsonProcessingException e) { return null; } }) .filter(Objects::nonNull) .toList(); } private String buildSessionKey(String userId) { return memory:session: userId; } Data NoArgsConstructor AllArgsConstructor public static class Message { private String role; private String content; private long timestamp; } }这里有一个容易踩坑的地方Redis List 的range(key, -limit, -1)取的是最后 N 条。如果并发写入较高可能出现消息顺序问题。生产环境建议用 Stream 类型替代 List配合 Consumer Group 实现有序写入。5.3 向量语义记忆实现这一层是 Long-term Memory 的核心。演示阶段先使用内存向量库生产环境替换为 Milvus。// 文件路径src/main/java/com/example/memory/memory/VectorMemoryStore.java Component public class VectorMemoryStore { private final EmbeddingModel embeddingModel; private final ListSemanticMemory memoryList new CopyOnWriteArrayList(); private final int topK; public VectorMemoryStore(EmbeddingModel embeddingModel, Value(${vector-store.top-k}) int topK) { this.embeddingModel embeddingModel; this.topK topK; } public void saveMemory(String userId, String content, String source) { ResponseEmbedding embedding embeddingModel.embed(content); memoryList.add(new SemanticMemory( UUID.randomUUID().toString(), userId, content, embedding.getContent().getEmbedding(), source, System.currentTimeMillis() )); } public ListSemanticMemory searchSimilar(String query, int limit) { ResponseEmbedding queryEmbedding embeddingModel.embed(query); return memoryList.stream() .filter(m - m.userId.equals(currentUser())) // 简化实际应从上下文取 .map(m - new ScoredMemory(m, cosineSimilarity( queryEmbedding.getContent().getEmbedding(), m.embedding))) .sorted(Comparator.comparingDouble(ScoredMemory::score).reversed()) .limit(limit) .map(ScoredMemory::memory) .toList(); } private double cosineSimilarity(ListDouble v1, ListDouble v2) { // 余弦相似度计算此处省略 return 0.0; } Data public static class SemanticMemory { private final String id; private final String userId; private final String content; private final ListDouble embedding; private final String source; private final long createdAt; } }实际项目中使用 Milvus 时关键是设计好 collection schema字段类型说明idVARCHAR记忆 IDuser_idVARCHAR用户 ID必须建索引contentVARCHAR记忆内容embeddingFLOAT_VECTOR向量字段sourceVARCHAR来源对话/文档/表单created_atINT64创建时间5.4 MCP Memory Server 实现通过 MCP 暴露记忆读写能力让 Agent 具备“主动记忆”的自由度。// 文件路径src/main/java/com/example/memory/mcp/MemoryTools.java Component public class MemoryTools { private final MemoryService memoryService; Tool(description 保存一条长期记忆例如用户偏好、事实信息) public void saveMemory(String userId, String content) { memoryService.saveSemanticMemory(userId, content, agent); } Tool(description 查询用户长期记忆按相关度排序) public ListSemanticMemory searchMemory(String userId, String query) { return memoryService.searchSemanticMemory(userId, query); } Tool(description 更新用户画像字段) public void updateProfile(String userId, String key, String value) { memoryService.updateUserProfile(userId, key, value); } }Spring AI Alibaba 对 MCP 有原生支持。配置好 MCP Server 后模型在回答过程中可以根据需要主动调用记忆存取工具不再只是“被动接收拼接好的 Prompt”。这种设计的好处是当用户说“帮我记住我不吃香菜”时模型可以调用saveMemory工具主动沉淀这条信息当用户问“上次我说的那个餐厅叫什么”时模型可以调用searchMemory去查。记忆不再是开发者预设的固定模式而是模型具备的一种能力。5.5 长期记忆抽取与写入为了让 Agent 自动沉淀知识需要一套抽取逻辑。这里使用一个专门的抽取器。// 文件路径src/main/java/com/example/memory/service/MemoryExtractor.java Component public class MemoryExtractor { private final ChatClient chatClient; private final MemoryService memoryService; private final ExecutorService executor Executors.newFixedThreadPool(4); Async public void extractAndSave(String userId, String userQuery, String assistantResponse) { executor.submit(() - { try { String extractionPrompt 请从以下对话中抽取值得长期记住的事实信息例如用户偏好、身份信息、业务决策等。 只输出 JSON 数组没有就不输出[事实1, 事实2] 用户%s 助手%s .formatted(userQuery, assistantResponse); String result chatClient.call(extractionPrompt); ListString facts parseExtractionResult(result); facts.forEach(fact - memoryService.saveSemanticMemory(userId, fact, conversation)); } catch (Exception e) { log.warn(Memory extraction failed: {}, e.getMessage()); } }); } }这里要注意抽取本身需要调用模型会产生额外成本。生产环境建议只对“信息密度高”的对话做抽取可以使用简单的启发式规则比如用户句长度超过阈值、包含“我喜欢”“我记得”“我们决定”等关键词判断是否需要抽取。5.6 接口层统一对外暴露// 文件路径src/main/java/com/example/memory/controller/ChatController.java RestController RequestMapping(/api/agent) public class ChatController { private final MemoryService memoryService; public ChatController(MemoryService memoryService) { this.memoryService memoryService; } PostMapping(/chat) public ChatResponse chat(RequestBody ChatRequest request) { return memoryService.chat( SecurityUtils.getCurrentUserId(), request.getQuery() ); } }演示代码中通过SecurityUtils.getCurrentUserId()从安全上下文获取用户 ID这是企业级应用的标准做法避免用户越权访问。6. 运行结果与效果验证6.1 启动服务mvn spring-boot:run确保 Redis 已启动向量库若未启动则使用内存模式。6.2 验证链路 1短期会话记忆连续发送两次请求curl -X POST http://localhost:8080/api/agent/chat \ -H Content-Type: application/json \ -d {query: 我喜欢喝美式咖啡不加糖} curl -X POST http://localhost:8080/api/agent/chat \ -H Content-Type: application/json \ -d {query: 帮我推荐一杯咖啡}预期第二次请求的响应中模型应该提到“不加糖的美式”证明短期记忆生效。6.3 验证链路 2长期事实记忆调用 MCP 工具保存用户偏好然后新建一个会话再提问curl -X POST http://localhost:8080/api/agent/chat \ -H Content-Type: application/json \ -d {query: 记住了我喜欢拿铁加一份浓缩}等待几秒异步抽取需要时间然后清空会话历史或用新会话提问curl -X POST http://localhost:8080/api/agent/chat \ -H Content-Type: application/json \ -d {query: 我平时喝什么咖啡}预期模型能从语义记忆库中检索到“喜欢拿铁加一份浓缩”这条长期记忆。6.4 验证链路 3RAG 知识库覆盖如果配置了企业知识库可以提问一个只在知识库中出现的问题。预期模型回答内容应来自知识库而不是凭空生成。可以检查检索日志确认命中的文档 ID。6.5 验证失败时的排查顺序如果以上验证不通过按以下顺序排查查 Redisredis-cli keys memory:session:*确认是否有历史消息写入。查日志看记忆抽取是否报错。查向量库确认是否存在对应记忆数据。查 Prompt将最终组装出来的 Prompt 打印出来确认记忆是否真的放进了 Context。很多记忆“不生效”的问题最后都出在同一个地方记忆确实存了但没有被组装进最终 Prompt。排查时一定要先看 Prompt再看存储。7. 常见问题与排查思路问题现象可能原因排查方式解决方案模型完全记不住上次对话会话 ID 拼接错误检查请求中用户 ID 是否传递一致统一从登录态获取用户 ID禁止客户端传入短期记忆有但长期记忆不生效异步抽取失败或抽取结果为空查抽取日志手动测试抽取模型返回增加抽取重试机制检查模型输出格式解析回答变得越来越慢、Token 暴涨历史消息无限制拼接打印实际发送的 Prompt 长度限制历史消息条数或 Token 数引入摘要机制向量检索召回内容不相关Embedding 模型选择不当对不同 query 手动测相似度更换 Embedding 模型或引入 rerank 精排用户 A 查到用户 B 的记忆向量检索未按 user_id 过滤检查检索条件是否带上用户隔离向量库 collection 必须建 user_id 索引强制过滤记忆写入重复内容无限增长同一事实被多次抽取检查数据库重复记录引入记忆去重相似度阈值去重或 key 去重MCP 工具调用失败工具参数类型不匹配查看 MCP 调用日志检查工具参数 JSON Schema 与实际类型Redis 记忆丢失未开启持久化检查 Redis 配置生产环境开启 AOF配置主从其中用户数据隔离是最常见也是最严重的问题。向量数据库的相似度检索是全局的如果检索时忘了加用户过滤条件用户 A 就能查到用户 B 的记忆。这不仅是功能问题更是数据安全问题。8. 最佳实践与工程建议8.1 架构分级不要把所有记忆塞进同一个存储做 Agent Memory 时最常犯的错误是把所有记忆都存进向量数据库。这会导致短期高频访问占用了向量库的查询资源而长期稳定事实又被淹没在大量临时信息里。推荐按数据特性分三个存储Redis适合高速读写的短期会话记录设置 TTL。PostgreSQL适合结构化事实如用户画像、业务数据支持事务更新。向量数据库适合语义检索的长期记忆按相关度召回。8.2 记忆更新策略覆盖 vs 追加用户偏好会变化。今天喜欢美式明天可能喜欢拿铁。如果只追加不更新语义记忆库里会出现两条自相矛盾的记录。建议采用以下策略事实型记忆按 key 覆盖更新保留 last_update 时间。语义型记忆写入时先做相似度检索如果与已有记录相似度超过阈值覆盖更新。历史对话记录只追加不更新作为原始事实保存。8.3 上下文组装优先级组装 Prompt 时信息优先级建议系统指令和功能指令。用户当前问题。用户结构化画像key-value 形式Token 成本低。相关的语义记忆最多 5 条。相关的 RAG 知识文档。最近 N 条会话历史。结构化信息放前长文本放后。原因是模型对 Prompt 开头和结尾的内容注意力更集中把当前问题和结构化画像放前面能提高关键信息的利用率。8.4 安全与权限企业级 Memory 架构中数据安全是不可省略的部分所有记忆检索必须带上组织 ID 和用户 ID 双重过滤。记忆写入接口需要鉴权不能让模型随意写入任意用户的数据。敏感信息身份证、手机号、企业商业机密建议做脱敏处理再入库。提供记忆删除接口满足用户“遗忘权”诉求。企业级产品必须让用户能主动清空自己的记忆数据。日志中禁止打印完整记忆内容防止信息泄露。8.5 成本控制记忆架构的隐性成本往往被低估向量化成本每条记忆都要调用 Embedding 模型高频写入场景会累积不少费用。记忆抽取成本抽取长期记忆需要调用模型建议只对部分对话做抽取。上下文注入成本每次请求注入的记忆越多Token 成本越高。上线前要测算平均 Prompt 大小。8.6 可观测性生产环境必须能回答三个问题这次请求命中了哪些记忆记忆的召回相关度是多少如果回答质量下降是记忆缺失还是模型问题建议在响应结果中附带记忆元信息并记录到链路追踪系统。{ response: 我推荐这款耶加雪菲因为它有柑橘风味符合你之前提到的偏好。, memory_trace: { session_messages: 10, semantic_memories: [ {content: 偏好柑橘风味咖啡, score: 0.87}, {content: 喜欢浅中度烘焙, score: 0.72} ], rag_docs: [] } }9. 总结与后续学习方向这篇文章把 Agent Memory 从“把历史消息拼进 Prompt”的初级认知推进到了分层架构的工程实践。核心想表达三个判断第一Context 和 Memory 是两个层。Context 是临时工作区Memory 是持久化存储层不能混为一谈。任何记忆最终都必须通过 Context 才能影响模型但如果不做持久化Agent 永远只是“金鱼脑”。第二一套完整的企业级 Agent Memory 架构需要 Redis短期会话、结构化数据库用户事实、向量数据库语义记忆三个层次配合再加上 RAG 提供外部知识、MCP 统一工具接口、上下文工程控制 Token 成本。RAG 和 MCP 都不是 Memory 的替代品而是上下游基础设施。第三真正的 Long-term Memory 难点不在“存”而在“取”。怎么在合适的时机召回合适的记忆怎么在记忆更新时处理冲突怎么在保障隐私的前提下让记忆发挥价值才是工程上最花时间的部分。如果你准备在项目中落地建议这样规划第一周先用 Redis 做好短期会话记忆跑通“历史消息存取 Prompt 组装”的最小闭环。第二周引入向量库加入语义记忆的写入与召回。第三周打通 RAG 知识库和 MCP 工具层补齐异步抽取逻辑。后续持续做召回质量评估、成本优化和权限加固。这个领域值得继续深入的方向包括Graph RAG用图结构保存实体关系记忆、Agent Memory 的评测方案如何量化记忆召回质量和最终回答质量、以及多 Agent 场景下的记忆共享与隔离。每一步都足够写一篇独立的实战文章建议收藏备用。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻