跳到主要内容
📖 本章预览

本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。

第20章 对话记忆:让 AI 记住你是谁

20.1 ChatMemory 接口与实现

20.1.1 核心接口

/**
* ChatMemory —— 对话记忆的统一抽象
*/
public interface ChatMemory {
/** 添加消息到指定会话 */
void add(String conversationId, List<Message> messages);
/** 获取指定会话的历史消息 */
List<Message> get(String conversationId, int lastN);
/** 清除指定会话的记忆 */
void clear(String conversationId);
}

20.1.2 内存实现

/**
* 基于内存的 ChatMemory —— 适合开发测试
*/
public class InMemoryChatMemory implements ChatMemory {

// 每个会话一个消息列表
private final Map<String, List<Message>> store = new ConcurrentHashMap<>();

@Override
public void add(String conversationId, List<Message> messages) {
store.computeIfAbsent(conversationId, k -> new ArrayList<>()).addAll(messages);
}

@Override
public List<Message> get(String conversationId, int lastN) {
List<Message> messages = store.getOrDefault(conversationId, List.of());
if (messages.size() <= lastN) {
return new ArrayList<>(messages);
}
return new ArrayList<>(messages.subList(messages.size() - lastN, messages.size()));
}

@Override
public void clear(String conversationId) {
store.remove(conversationId);
}
}

20.2 会话隔离

20.2.1 conversationId 机制

/**
* 每个用户/会话有独立的 conversationId
* 确保不同用户的对话互不干扰
*/
@RestController
public class ChatController {

@Autowired
private ChatModel chatModel;
@Autowired
private ChatMemory chatMemory;

@PostMapping("/chat")
public String chat(@RequestParam String sessionId, @RequestBody String message) {
// 1. 加载历史消息
List<Message> history = chatMemory.get(sessionId, 20);

// 2. 构建完整消息列表
List<Message> messages = new ArrayList<>();
messages.add(new SystemMessage("你是一个友好的助手。"));
messages.addAll(history);
messages.add(new UserMessage(message));

// 3. 调用模型
ChatResponse response = chatModel.call(new Prompt(messages));
String reply = response.getResult().getOutput().getText();

// 4. 保存本轮对话
chatMemory.add(sessionId, List.of(
new UserMessage(message),
new AssistantMessage(reply)
));

return reply;
}
}

20.2.2 使用 MessageChatMemoryAdvisor

/**
* 更优雅的方式:用 Advisor 自动管理记忆


🔒 解锁完整内容

本章剩余内容需要解锁后查看

以上仅为本章部分预览内容,完整内容包含更多深度源码解析、实战代码和面试要点。

加入知识星球你将获得:

  • ✅ 全部 26 章完整内容 + 持续更新
  • ✅ 配套源码 + 实战项目
  • ✅ 一对一答疑 + 面试辅导
  • ✅ 简历优化 + 内推机会

📚 本章完整目录

以下为本章完整目录结构,加入知识星球即可解锁全部内容。

20.3 记忆策略

20.3.1 滑动窗口

20.3.2 Token 限制策略

20.3.3 摘要压缩策略

20.4 持久化存储

20.4.1 Redis 实现