从 MCP 到 RAG 记忆AI Agent 项目中的三块核心基础最近在学习 Ragent 项目里的 AI 基础内容连续看了三篇文章分别涉及MCP 中的 Tools、Resources、PromptsMCP 官方 Java SDK 的底层架构RAG 多轮对话记忆设计这三篇看似分散但其实可以串成一条主线MCP 负责规范模型如何连接外部能力Java SDK 负责在 Java 里实现这套协议RAG 会话记忆负责让 AI 应用真正具备连续对话能力。本文不展开所有细节只整理最核心、最值得复习和面试表达的内容。一、MCP 不只有 Tools很多人第一次学 MCP会把它简单理解成“大模型调工具”。但 MCP 里真正重要的能力不只有 Tools还包括 Resources 和 Prompts。可以用一句话区分text Tools让模型干活 Resources给模型资料 Prompts给模型操作手册1. Tools模型的“手”Tools 负责执行操作。比如查询订单状态发邮件提交退款申请调用外部接口修改数据库Tools 的特点是text 可能有副作用 通常由模型根据用户意图决定是否调用 适合“让模型做事”比如用户说帮我查一下订单 ORD001 的物流状态。模型判断需要调用工具于是调用 getOrderStatus 这类 Tool。所以 Tools 的核心是模型根据用户意图主动决定是否调用某个外部能力。2. Resources模型的“参考资料”Resources 负责提供只读数据。比如用户资料最近订单系统配置退货政策数据库表结构应用运行状态Resources 的特点是text 只读 无副作用 通常由 Host / Client 主动读取 适合作为上下文提供给模型例如用户刚进入客服页面系统可以提前读取text customer://users/123/profile customer://users/123/recent-orders docs://return-policy然后把这些信息放进上下文里让模型在回答前就知道用户是谁、买过什么、当前退货政策是什么。这和 Tools 的区别很关键text Tools 是模型主动调用 Resources 是应用主动提供。如果只是读取上下文资料用 Resources 比用 Tools 更合适。3. Prompts模型的“操作手册”Prompts 负责提供标准化提示词模板。比如知识库问答模板文档摘要模板代码审查模板SQL 优化模板面试模拟模板Prompts 解决的不是“怎么写 Prompt”而是怎么把已经验证有效的 Prompt 模板统一分发给多个 Client 使用。比如 MCP Server 里定义一个 knowledge-qa 模板Client 传入text context检索到的知识片段 question用户问题Server 返回完整的 messages 数组text 你是企业知识库助手。 请严格基于参考资料回答。 没有资料就回答不知道。 回答要带引用。 参考资料 ... 问题 ...这样多个客户端就不需要各自维护一套 Prompt避免版本混乱。4. Tools、Resources、Prompts 的核心区别能力本质控制方典型场景Tools执行操作模型驱动查订单、发邮件、下单Resources提供数据应用驱动读配置、读表结构、读用户资料Prompts提供模板Client 驱动知识库问答、文档摘要、代码审查最终记忆text 有动作、有副作用Tools 只读数据、上下文Resources 标准提示词模板Prompts二、MCP Java SDKSpring AI 背后的底层实现前面使用 Spring AI 写 MCP Server 时可能只需要一个注解java McpTool(description 查询员工剩余年假天数) public String getUserAnnualLeave(String employeeId) { return 剩余 5 天; }看起来非常简单。但底层并不是魔法。Spring AI 背后依赖的是 MCP 官方 Java SDK。Spring AI 只是把 SDK 的底层步骤自动化了。关系可以这样理解text MCP 协议规范 ↓ MCP 官方 Java SDK ↓ Spring AI MCP 封装1. Java SDK 的四层架构MCP Java SDK 可以分为四层text Schema定义消息格式 Transport负责消息传输 Session管理连接生命周期和请求响应匹配 Client/Server开发者直接使用的 API2. Schema协议消息的数据结构Schema 层定义 MCP 协议里的标准消息类型。比如text Tool工具定义 CallToolRequest调用工具请求 CallToolResult工具调用结果 Resource资源定义 Prompt提示词模板 InitializeRequest初始化请求 InitializeResult初始化响应可以这样理解Schema 是 MCP 消息的数据结构说明书。例如一次工具调用中text Tool 告诉 Client 我有哪些工具、工具名是什么、参数怎么传。 CallToolRequest Client 说我要调用哪个工具参数是什么。 CallToolResult Server 说工具执行完了结果是什么。3. Transport消息怎么传Transport 层负责把 MCP 消息从一端传到另一端。它不关心消息内容只关心消息传输方式。常见 Transport 有三种text Stdio通过 stdin / stdout 通信 SSE下行 SSE 长连接 上行 HTTP POST Streamable HTTP按需 HTTP 请求 响应流式返回4. Stdio TransportStdio 通过标准输入输出传输 JSON-RPC 消息。典型场景是 Claude Desktop 或 Cursor 启动本地 MCP Server 子进程text Client 通过 stdin 发请求 Server 通过 stdout 返回响应注意一点text stdout 用来传协议消息 日志不能打到 stdout要打到 stderr否则日志会和 JSON-RPC 消息混在一起导致 Client 解析失败。5. SSE TransportSSE Transport 可以理解成text 下行 SSE 长连接 上行 HTTP POST流程如下text 1. Client 通过 HTTP GET 建立 SSE 长连接 2. Server 通过 SSE 向 Client 推送响应、通知、流式结果 3. Client 后续发送请求时额外走 HTTP POST 4. Server 可以通过原来的 SSE 通道返回结果核心点SSE 本身只能 Server → Client所以 MCP SSE Transport 需要用 HTTP POST 补上 Client → Server 的请求通道。6. Streamable HTTP TransportStreamable HTTP 是更推荐的远程传输方式。它不需要额外维护一条 SSE 长连接而是text Client 发 HTTP 请求 Server 直接在当前 HTTP 响应中流式返回流程text Client --HTTP POST-- Server Client --response chunk 1-- Server Client --response chunk 2-- Server Client --response chunk 3-- Server注意它不是 WebSocket。它仍然是 HTTP 请求-响应模型text Client 先请求 Server 再响应 只不过响应可以流式返回最终记忆text Stdio本地进程通信 SSE上行 HTTP POST下行 SSE 长连接 Streamable HTTP按需 HTTP 请求当前响应流式返回7. Session会话管理器Session 层负责管理一次 MCP 连接的生命周期。主要做三件事text 1. 管理连接状态是否初始化、是否关闭 2. 处理 initialize 握手交换 Client 和 Server 的能力 3. 请求响应匹配根据 JSON-RPC id 找到对应请求因为 MCP 底层使用 JSON-RPC请求和响应都有 id。Session 的作用就是保证某个响应能正确回到它对应的请求上。8. Client / Server开发者使用的门面 APIClient/Server 是开发者直接使用的 API。比如 Client 端java client.initialize(); client.listTools(); client.callTool(...); client.closeGracefully();Server 端java McpServer.sync(transportProvider) .serverInfo(...) .tool(...) .build();可以这样理解text Client/Server 是最上层门面 Schema、Transport、Session 是底层支撑。9. Spring AI 到底帮我们省了什么直接用 SDK 写 MCP Server需要手动做很多事text 手写 JSON Schema 手动提取 request.arguments() 手动包装 CallToolResult 手动创建 Transport 手动启动和关闭 ServerSpring AI 帮我们自动做了这些text 1. 扫描 McpTool / McpResource / McpPrompt 2. 根据方法签名自动生成 JSON Schema 3. 自动把请求参数映射到 Java 方法参数 4. 自动把返回值包装成 CallToolResult 5. 根据 Starter 自动配置 Transport 6. 接入 Spring Boot 生命周期所以可以这样总结text 纯 SDK 手动挡灵活但麻烦 Spring AI 自动挡适合大多数 Spring Boot MCP 项目三、RAG 多轮对话记忆设计RAG 核心链路解决的是text 用户提问 ↓ 检索知识库 ↓ 把相关资料交给大模型 ↓ 生成答案但如果没有多轮记忆系统会出现一个典型问题。用户第一轮问iPhone 16 Pro 的退货政策是什么系统回答得很好。用户第二轮追问那它的保修期呢如果系统没有带上历史模型就不知道“它”指的是 iPhone 16 Pro。这就是 RAG 系统的“失忆”问题。1. 大模型 API 默认没有记忆大模型每次 API 请求都是独立的。它不会自动记住text 上一轮用户问了什么 上一轮模型回答了什么 当前用户是谁 之前对话里出现过哪些实体所谓“有记忆”本质是应用层把历史消息重新放进 messages 数组中。单轮请求json { messages: [ {role: system, content: 你是一个电商客服助手}, {role: user, content: iPhone 16 Pro 的退货政策是什么} ] }多轮请求json { messages: [ {role: system, content: 你是一个电商客服助手}, {role: user, content: iPhone 16 Pro 的退货政策是什么}, {role: assistant, content: iPhone 16 Pro 的退货政策是...}, {role: user, content: 那它的保修期呢} ] }核心记忆模型没有真正记忆记忆是应用层管理 messages。2. 完整历史的问题Token 膨胀最简单的记忆方案是每次请求都带上完整历史。短对话可以这么做但长对话不行。因为对话越长Token 越多。RAG 场景下一次请求里通常要包含text System Prompt角色和规则 对话历史用户之前说过什么 检索上下文知识库查出来的 chunks 当前问题用户本轮问题 Generation Space预留回答空间上下文窗口是有限的如果历史占太多就会挤压检索上下文和生成空间。所以会话记忆的核心不是“要不要记住历史”而是如何在有限 Token 预算内保留最有价值的历史信息。3. 常见记忆策略3.1 完整历史完整历史就是每次都带上所有历史消息。优点text 信息不丢 实现简单缺点text Token 无限膨胀 成本高 容易超上下文窗口适合text 对话不超过 3~5 轮的简单场景3.2 滑动窗口滑动窗口只保留最近 N 轮对话。比如 N 3text 第 1 轮后[1] 第 2 轮后[1, 2] 第 3 轮后[1, 2, 3] 第 4 轮后[2, 3, 4] 第 5 轮后[3, 4, 5]优点text 简单 Token 可控 近期上下文保留较好缺点text 早期关键信息会丢失一句话滑动窗口保近期不保长期。3.3 Token 截断Token 截断不是按轮数保留而是按 Token 上限保留最近消息。它比滑动窗口更精确。因为不同轮对话长度差别很大text 用户好的 → 很短 用户贴一段商品描述 → 很长 助手解释售后流程 → 很长注意text 截断时最好按一轮对话成对处理 user 和 assistant 要么都保留要么都丢弃 不要只保留回答却丢掉问题一句话Token 截断是更精确的滑动窗口。3.4 摘要压缩摘要压缩不是直接丢掉早期历史而是把早期对话压缩成摘要。例如原来 20 轮对话可以压缩成text 客户咨询 iPhone 16 Pro 售后问题已确认订单号、购买日期、故障现象和客户诉求目前客户希望换新而不是维修。优点text 保留长期关键信息 大幅减少 Token缺点text 实现复杂 需要额外调用模型 摘要可能丢细节一句话摘要压缩解决长期记忆问题。3.5 混合策略摘要 最近 N 轮生产中更推荐混合策略text 早期对话压缩成摘要 最近 N 轮完整保留结构text System Prompt 对话背景摘要 最近 N 轮完整对话 当前用户问题好处text 长期记忆摘要保留早期关键信息 短期精度最近几轮完整保留 Token 可控不会无限增长最终记忆生产推荐长期摘要 短期完整。4. RAG 场景下的 Token 预算RAG 不只是聊天还要放检索上下文。检索上下文就是系统从知识库里查出来的 chunks也就是模型回答时参考的资料。例如用户问iPhone 16 Pro 的退货政策是什么系统可能检索到text chunk1iPhone 16 Pro 拆封后不支持七天无理由退货 chunk2质量问题可在 15 天内申请退换货 chunk3退货时需提供订单号、发票和原包装这些就是检索上下文。一次 RAG 请求通常由这些部分组成text System Prompt Conversation Memory Retrieved Chunks Current Question Generation Space其中 Generation Space 是给模型生成回答预留的 Token 空间。要记住text 上下文窗口 输入 Token 输出 Token不能把窗口全部塞满输入资料否则模型没有空间生成完整答案。5. 会话记忆的存储方案对话历史要存起来常见方案有三种text 内存开发调试用简单但重启丢失不适合分布式 Redis生产在线会话常用读写快支持 TTL MySQL长期归档、审计、数据分析用推荐组合text Redis 存在线会话 MySQL 做历史归档Redis 适合高频读写和自动过期MySQL 适合持久化、审计和数据分析。6. 多轮 RAG 还需要 Query 改写会话记忆只能让模型理解上下文但检索系统不一定能理解。例如text 第一轮iPhone 16 Pro 的退货政策是什么 第二轮那它的保修期呢模型如果看到历史就知道“它”是 iPhone 16 Pro。但向量数据库检索时如果拿到的 query 是text 那它的保修期呢这个 query 信息不完整检索效果会很差。所以要先改写成text iPhone 16 Pro 的保修期是什么再拿去检索。核心区别text 会话记忆让模型懂上下文 Query 改写让检索系统懂上下文最终记忆Query 改写是为了检索带上下文 Prompt 是为了生成。四、三篇文章串起来怎么理解这三篇文章其实可以组成一个完整的 AI Agent 工程认知。1. MCP 负责定义外部能力MCP 把外部能力分成text Tools执行操作 Resources提供上下文数据 Prompts提供提示词模板这解决的是模型如何标准化连接外部系统。2. Java SDK 负责落地协议实现Java SDK 提供text Schema消息格式 Transport消息传输 Session连接管理 Client/Server开发 APISpring AI 在 SDK 上进一步封装text 注解注册工具 自动生成 JSON Schema 自动配置 Transport 自动管理生命周期这解决的是Java 项目里如何真正实现 MCP Server / Client。3. RAG 记忆负责连续对话体验RAG 会话记忆解决的是text 模型如何理解多轮上下文 历史消息如何控制 Token 长对话如何保留关键信息 检索 query 如何结合上下文改写这解决的是AI 应用如何从单轮问答升级为连续对话系统。五、面试表达版如果面试官问我对 MCP 和 RAG 多轮记忆的理解我会这样回答MCP 是一种让大模型标准化连接外部能力的协议它不只有 Tools还包括 Resources 和 Prompts。Tools 负责执行操作比如查订单、发邮件Resources 负责提供只读上下文比如用户资料、系统配置、表结构Prompts 负责分发标准化提示词模板。简单来说Tools 让模型做事Resources 给模型资料Prompts 给模型操作手册。在 Java 生态里MCP 官方 Java SDK 是底层实现主要分为 Schema、Transport、Session、Client/Server 四层。Schema 定义协议消息格式Transport 负责 Stdio、SSE、Streamable HTTP 等传输方式Session 负责 initialize 握手和请求响应匹配Client/Server 是开发者使用的 API。Spring AI MCP 是在官方 SDK 上做的封装它通过注解自动注册工具、生成 JSON Schema、映射参数、包装返回值并接入 Spring Boot 生命周期。而 RAG 多轮对话记忆解决的是用户连续追问的问题。大模型 API 本身没有记忆所谓记忆是应用层把历史消息放进 messages 中。完整历史虽然简单但会导致 Token 膨胀所以实际项目中常用滑动窗口、Token 截断、摘要压缩生产更推荐“摘要 最近 N 轮”的混合策略。并且在多轮 RAG 中光有会话记忆还不够还需要 Query 改写让检索系统也能理解“它”“那个”这类上下文指代。六、最终记忆版text 1. MCP 不只有 Tools。 Tools 负责执行操作Resources 负责提供只读上下文Prompts 负责提供提示词模板。 2. Tools、Resources、Prompts 的区别 Tools 让模型做事 Resources 给模型资料 Prompts 给模型操作手册。 3. MCP Java SDK 是底层实现。 Schema 定义消息格式 Transport 负责消息传输 Session 管理连接和请求响应匹配 Client/Server 是开发者 API。 4. Spring AI MCP 是 SDK 的上层封装。 它帮我们自动扫描注解、生成 JSON Schema、映射参数、包装返回值、配置 Transport、管理生命周期。 5. 大模型 API 默认没有记忆。 多轮对话记忆是应用层把历史消息、摘要、最近几轮对话重新放进 messages 实现的。 6. RAG 记忆不能无脑塞完整历史。 因为会导致 Token 膨胀挤压检索上下文和生成空间。 7. 生产推荐的记忆策略 早期对话压缩成摘要最近 N 轮完整保留。 8. 多轮 RAG 光有会话记忆还不够。 会话记忆让模型懂上下文 Query 改写让检索系统懂上下文。一句话总结MCP 解决模型如何连接外部能力Java SDK 解决协议如何在 Java 中落地RAG 多轮记忆解决 AI 应用如何具备连续对话能力。
AI Agent学习day6 从 MCP 到 RAG 记忆:AI Agent 项目中的三块核心基础
发布时间:2026/5/31 23:47:42
从 MCP 到 RAG 记忆AI Agent 项目中的三块核心基础最近在学习 Ragent 项目里的 AI 基础内容连续看了三篇文章分别涉及MCP 中的 Tools、Resources、PromptsMCP 官方 Java SDK 的底层架构RAG 多轮对话记忆设计这三篇看似分散但其实可以串成一条主线MCP 负责规范模型如何连接外部能力Java SDK 负责在 Java 里实现这套协议RAG 会话记忆负责让 AI 应用真正具备连续对话能力。本文不展开所有细节只整理最核心、最值得复习和面试表达的内容。一、MCP 不只有 Tools很多人第一次学 MCP会把它简单理解成“大模型调工具”。但 MCP 里真正重要的能力不只有 Tools还包括 Resources 和 Prompts。可以用一句话区分text Tools让模型干活 Resources给模型资料 Prompts给模型操作手册1. Tools模型的“手”Tools 负责执行操作。比如查询订单状态发邮件提交退款申请调用外部接口修改数据库Tools 的特点是text 可能有副作用 通常由模型根据用户意图决定是否调用 适合“让模型做事”比如用户说帮我查一下订单 ORD001 的物流状态。模型判断需要调用工具于是调用 getOrderStatus 这类 Tool。所以 Tools 的核心是模型根据用户意图主动决定是否调用某个外部能力。2. Resources模型的“参考资料”Resources 负责提供只读数据。比如用户资料最近订单系统配置退货政策数据库表结构应用运行状态Resources 的特点是text 只读 无副作用 通常由 Host / Client 主动读取 适合作为上下文提供给模型例如用户刚进入客服页面系统可以提前读取text customer://users/123/profile customer://users/123/recent-orders docs://return-policy然后把这些信息放进上下文里让模型在回答前就知道用户是谁、买过什么、当前退货政策是什么。这和 Tools 的区别很关键text Tools 是模型主动调用 Resources 是应用主动提供。如果只是读取上下文资料用 Resources 比用 Tools 更合适。3. Prompts模型的“操作手册”Prompts 负责提供标准化提示词模板。比如知识库问答模板文档摘要模板代码审查模板SQL 优化模板面试模拟模板Prompts 解决的不是“怎么写 Prompt”而是怎么把已经验证有效的 Prompt 模板统一分发给多个 Client 使用。比如 MCP Server 里定义一个 knowledge-qa 模板Client 传入text context检索到的知识片段 question用户问题Server 返回完整的 messages 数组text 你是企业知识库助手。 请严格基于参考资料回答。 没有资料就回答不知道。 回答要带引用。 参考资料 ... 问题 ...这样多个客户端就不需要各自维护一套 Prompt避免版本混乱。4. Tools、Resources、Prompts 的核心区别能力本质控制方典型场景Tools执行操作模型驱动查订单、发邮件、下单Resources提供数据应用驱动读配置、读表结构、读用户资料Prompts提供模板Client 驱动知识库问答、文档摘要、代码审查最终记忆text 有动作、有副作用Tools 只读数据、上下文Resources 标准提示词模板Prompts二、MCP Java SDKSpring AI 背后的底层实现前面使用 Spring AI 写 MCP Server 时可能只需要一个注解java McpTool(description 查询员工剩余年假天数) public String getUserAnnualLeave(String employeeId) { return 剩余 5 天; }看起来非常简单。但底层并不是魔法。Spring AI 背后依赖的是 MCP 官方 Java SDK。Spring AI 只是把 SDK 的底层步骤自动化了。关系可以这样理解text MCP 协议规范 ↓ MCP 官方 Java SDK ↓ Spring AI MCP 封装1. Java SDK 的四层架构MCP Java SDK 可以分为四层text Schema定义消息格式 Transport负责消息传输 Session管理连接生命周期和请求响应匹配 Client/Server开发者直接使用的 API2. Schema协议消息的数据结构Schema 层定义 MCP 协议里的标准消息类型。比如text Tool工具定义 CallToolRequest调用工具请求 CallToolResult工具调用结果 Resource资源定义 Prompt提示词模板 InitializeRequest初始化请求 InitializeResult初始化响应可以这样理解Schema 是 MCP 消息的数据结构说明书。例如一次工具调用中text Tool 告诉 Client 我有哪些工具、工具名是什么、参数怎么传。 CallToolRequest Client 说我要调用哪个工具参数是什么。 CallToolResult Server 说工具执行完了结果是什么。3. Transport消息怎么传Transport 层负责把 MCP 消息从一端传到另一端。它不关心消息内容只关心消息传输方式。常见 Transport 有三种text Stdio通过 stdin / stdout 通信 SSE下行 SSE 长连接 上行 HTTP POST Streamable HTTP按需 HTTP 请求 响应流式返回4. Stdio TransportStdio 通过标准输入输出传输 JSON-RPC 消息。典型场景是 Claude Desktop 或 Cursor 启动本地 MCP Server 子进程text Client 通过 stdin 发请求 Server 通过 stdout 返回响应注意一点text stdout 用来传协议消息 日志不能打到 stdout要打到 stderr否则日志会和 JSON-RPC 消息混在一起导致 Client 解析失败。5. SSE TransportSSE Transport 可以理解成text 下行 SSE 长连接 上行 HTTP POST流程如下text 1. Client 通过 HTTP GET 建立 SSE 长连接 2. Server 通过 SSE 向 Client 推送响应、通知、流式结果 3. Client 后续发送请求时额外走 HTTP POST 4. Server 可以通过原来的 SSE 通道返回结果核心点SSE 本身只能 Server → Client所以 MCP SSE Transport 需要用 HTTP POST 补上 Client → Server 的请求通道。6. Streamable HTTP TransportStreamable HTTP 是更推荐的远程传输方式。它不需要额外维护一条 SSE 长连接而是text Client 发 HTTP 请求 Server 直接在当前 HTTP 响应中流式返回流程text Client --HTTP POST-- Server Client --response chunk 1-- Server Client --response chunk 2-- Server Client --response chunk 3-- Server注意它不是 WebSocket。它仍然是 HTTP 请求-响应模型text Client 先请求 Server 再响应 只不过响应可以流式返回最终记忆text Stdio本地进程通信 SSE上行 HTTP POST下行 SSE 长连接 Streamable HTTP按需 HTTP 请求当前响应流式返回7. Session会话管理器Session 层负责管理一次 MCP 连接的生命周期。主要做三件事text 1. 管理连接状态是否初始化、是否关闭 2. 处理 initialize 握手交换 Client 和 Server 的能力 3. 请求响应匹配根据 JSON-RPC id 找到对应请求因为 MCP 底层使用 JSON-RPC请求和响应都有 id。Session 的作用就是保证某个响应能正确回到它对应的请求上。8. Client / Server开发者使用的门面 APIClient/Server 是开发者直接使用的 API。比如 Client 端java client.initialize(); client.listTools(); client.callTool(...); client.closeGracefully();Server 端java McpServer.sync(transportProvider) .serverInfo(...) .tool(...) .build();可以这样理解text Client/Server 是最上层门面 Schema、Transport、Session 是底层支撑。9. Spring AI 到底帮我们省了什么直接用 SDK 写 MCP Server需要手动做很多事text 手写 JSON Schema 手动提取 request.arguments() 手动包装 CallToolResult 手动创建 Transport 手动启动和关闭 ServerSpring AI 帮我们自动做了这些text 1. 扫描 McpTool / McpResource / McpPrompt 2. 根据方法签名自动生成 JSON Schema 3. 自动把请求参数映射到 Java 方法参数 4. 自动把返回值包装成 CallToolResult 5. 根据 Starter 自动配置 Transport 6. 接入 Spring Boot 生命周期所以可以这样总结text 纯 SDK 手动挡灵活但麻烦 Spring AI 自动挡适合大多数 Spring Boot MCP 项目三、RAG 多轮对话记忆设计RAG 核心链路解决的是text 用户提问 ↓ 检索知识库 ↓ 把相关资料交给大模型 ↓ 生成答案但如果没有多轮记忆系统会出现一个典型问题。用户第一轮问iPhone 16 Pro 的退货政策是什么系统回答得很好。用户第二轮追问那它的保修期呢如果系统没有带上历史模型就不知道“它”指的是 iPhone 16 Pro。这就是 RAG 系统的“失忆”问题。1. 大模型 API 默认没有记忆大模型每次 API 请求都是独立的。它不会自动记住text 上一轮用户问了什么 上一轮模型回答了什么 当前用户是谁 之前对话里出现过哪些实体所谓“有记忆”本质是应用层把历史消息重新放进 messages 数组中。单轮请求json { messages: [ {role: system, content: 你是一个电商客服助手}, {role: user, content: iPhone 16 Pro 的退货政策是什么} ] }多轮请求json { messages: [ {role: system, content: 你是一个电商客服助手}, {role: user, content: iPhone 16 Pro 的退货政策是什么}, {role: assistant, content: iPhone 16 Pro 的退货政策是...}, {role: user, content: 那它的保修期呢} ] }核心记忆模型没有真正记忆记忆是应用层管理 messages。2. 完整历史的问题Token 膨胀最简单的记忆方案是每次请求都带上完整历史。短对话可以这么做但长对话不行。因为对话越长Token 越多。RAG 场景下一次请求里通常要包含text System Prompt角色和规则 对话历史用户之前说过什么 检索上下文知识库查出来的 chunks 当前问题用户本轮问题 Generation Space预留回答空间上下文窗口是有限的如果历史占太多就会挤压检索上下文和生成空间。所以会话记忆的核心不是“要不要记住历史”而是如何在有限 Token 预算内保留最有价值的历史信息。3. 常见记忆策略3.1 完整历史完整历史就是每次都带上所有历史消息。优点text 信息不丢 实现简单缺点text Token 无限膨胀 成本高 容易超上下文窗口适合text 对话不超过 3~5 轮的简单场景3.2 滑动窗口滑动窗口只保留最近 N 轮对话。比如 N 3text 第 1 轮后[1] 第 2 轮后[1, 2] 第 3 轮后[1, 2, 3] 第 4 轮后[2, 3, 4] 第 5 轮后[3, 4, 5]优点text 简单 Token 可控 近期上下文保留较好缺点text 早期关键信息会丢失一句话滑动窗口保近期不保长期。3.3 Token 截断Token 截断不是按轮数保留而是按 Token 上限保留最近消息。它比滑动窗口更精确。因为不同轮对话长度差别很大text 用户好的 → 很短 用户贴一段商品描述 → 很长 助手解释售后流程 → 很长注意text 截断时最好按一轮对话成对处理 user 和 assistant 要么都保留要么都丢弃 不要只保留回答却丢掉问题一句话Token 截断是更精确的滑动窗口。3.4 摘要压缩摘要压缩不是直接丢掉早期历史而是把早期对话压缩成摘要。例如原来 20 轮对话可以压缩成text 客户咨询 iPhone 16 Pro 售后问题已确认订单号、购买日期、故障现象和客户诉求目前客户希望换新而不是维修。优点text 保留长期关键信息 大幅减少 Token缺点text 实现复杂 需要额外调用模型 摘要可能丢细节一句话摘要压缩解决长期记忆问题。3.5 混合策略摘要 最近 N 轮生产中更推荐混合策略text 早期对话压缩成摘要 最近 N 轮完整保留结构text System Prompt 对话背景摘要 最近 N 轮完整对话 当前用户问题好处text 长期记忆摘要保留早期关键信息 短期精度最近几轮完整保留 Token 可控不会无限增长最终记忆生产推荐长期摘要 短期完整。4. RAG 场景下的 Token 预算RAG 不只是聊天还要放检索上下文。检索上下文就是系统从知识库里查出来的 chunks也就是模型回答时参考的资料。例如用户问iPhone 16 Pro 的退货政策是什么系统可能检索到text chunk1iPhone 16 Pro 拆封后不支持七天无理由退货 chunk2质量问题可在 15 天内申请退换货 chunk3退货时需提供订单号、发票和原包装这些就是检索上下文。一次 RAG 请求通常由这些部分组成text System Prompt Conversation Memory Retrieved Chunks Current Question Generation Space其中 Generation Space 是给模型生成回答预留的 Token 空间。要记住text 上下文窗口 输入 Token 输出 Token不能把窗口全部塞满输入资料否则模型没有空间生成完整答案。5. 会话记忆的存储方案对话历史要存起来常见方案有三种text 内存开发调试用简单但重启丢失不适合分布式 Redis生产在线会话常用读写快支持 TTL MySQL长期归档、审计、数据分析用推荐组合text Redis 存在线会话 MySQL 做历史归档Redis 适合高频读写和自动过期MySQL 适合持久化、审计和数据分析。6. 多轮 RAG 还需要 Query 改写会话记忆只能让模型理解上下文但检索系统不一定能理解。例如text 第一轮iPhone 16 Pro 的退货政策是什么 第二轮那它的保修期呢模型如果看到历史就知道“它”是 iPhone 16 Pro。但向量数据库检索时如果拿到的 query 是text 那它的保修期呢这个 query 信息不完整检索效果会很差。所以要先改写成text iPhone 16 Pro 的保修期是什么再拿去检索。核心区别text 会话记忆让模型懂上下文 Query 改写让检索系统懂上下文最终记忆Query 改写是为了检索带上下文 Prompt 是为了生成。四、三篇文章串起来怎么理解这三篇文章其实可以组成一个完整的 AI Agent 工程认知。1. MCP 负责定义外部能力MCP 把外部能力分成text Tools执行操作 Resources提供上下文数据 Prompts提供提示词模板这解决的是模型如何标准化连接外部系统。2. Java SDK 负责落地协议实现Java SDK 提供text Schema消息格式 Transport消息传输 Session连接管理 Client/Server开发 APISpring AI 在 SDK 上进一步封装text 注解注册工具 自动生成 JSON Schema 自动配置 Transport 自动管理生命周期这解决的是Java 项目里如何真正实现 MCP Server / Client。3. RAG 记忆负责连续对话体验RAG 会话记忆解决的是text 模型如何理解多轮上下文 历史消息如何控制 Token 长对话如何保留关键信息 检索 query 如何结合上下文改写这解决的是AI 应用如何从单轮问答升级为连续对话系统。五、面试表达版如果面试官问我对 MCP 和 RAG 多轮记忆的理解我会这样回答MCP 是一种让大模型标准化连接外部能力的协议它不只有 Tools还包括 Resources 和 Prompts。Tools 负责执行操作比如查订单、发邮件Resources 负责提供只读上下文比如用户资料、系统配置、表结构Prompts 负责分发标准化提示词模板。简单来说Tools 让模型做事Resources 给模型资料Prompts 给模型操作手册。在 Java 生态里MCP 官方 Java SDK 是底层实现主要分为 Schema、Transport、Session、Client/Server 四层。Schema 定义协议消息格式Transport 负责 Stdio、SSE、Streamable HTTP 等传输方式Session 负责 initialize 握手和请求响应匹配Client/Server 是开发者使用的 API。Spring AI MCP 是在官方 SDK 上做的封装它通过注解自动注册工具、生成 JSON Schema、映射参数、包装返回值并接入 Spring Boot 生命周期。而 RAG 多轮对话记忆解决的是用户连续追问的问题。大模型 API 本身没有记忆所谓记忆是应用层把历史消息放进 messages 中。完整历史虽然简单但会导致 Token 膨胀所以实际项目中常用滑动窗口、Token 截断、摘要压缩生产更推荐“摘要 最近 N 轮”的混合策略。并且在多轮 RAG 中光有会话记忆还不够还需要 Query 改写让检索系统也能理解“它”“那个”这类上下文指代。六、最终记忆版text 1. MCP 不只有 Tools。 Tools 负责执行操作Resources 负责提供只读上下文Prompts 负责提供提示词模板。 2. Tools、Resources、Prompts 的区别 Tools 让模型做事 Resources 给模型资料 Prompts 给模型操作手册。 3. MCP Java SDK 是底层实现。 Schema 定义消息格式 Transport 负责消息传输 Session 管理连接和请求响应匹配 Client/Server 是开发者 API。 4. Spring AI MCP 是 SDK 的上层封装。 它帮我们自动扫描注解、生成 JSON Schema、映射参数、包装返回值、配置 Transport、管理生命周期。 5. 大模型 API 默认没有记忆。 多轮对话记忆是应用层把历史消息、摘要、最近几轮对话重新放进 messages 实现的。 6. RAG 记忆不能无脑塞完整历史。 因为会导致 Token 膨胀挤压检索上下文和生成空间。 7. 生产推荐的记忆策略 早期对话压缩成摘要最近 N 轮完整保留。 8. 多轮 RAG 光有会话记忆还不够。 会话记忆让模型懂上下文 Query 改写让检索系统懂上下文。一句话总结MCP 解决模型如何连接外部能力Java SDK 解决协议如何在 Java 中落地RAG 多轮记忆解决 AI 应用如何具备连续对话能力。