📖 本章预览
本章为预览版本,展示部分核心内容。完整内容包含详细源码解析、实战代码和面试要点,加入知识星球即可解锁全部章节。
第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 章完整内容 + 持续更新
- ✅ 配套源码 + 实战项目
- ✅ 一对一答疑 + 面试辅导
- ✅ 简历优化 + 内推机会
📚 本章完整目录
以下为本章完整目录结构,加入知识星球即可解锁全部内容。