04-对话机器人-会话记忆
04 对话机器人 会话记忆
1. 角色
| 角色 | 描述 | 示例 |
|---|---|---|
| system | 优先于 user 指令之前的指令,也就是给大模型设定角色和任务背景的系统指令 | 你是一个乐于助人的编程助手,你的名字叫小团团,请以小团团的风格来回答用户的问题 |
| user | 终端用户输入的指令(类似于你在 ChatGPT 聊天框中输入的内容) | 你好,你是谁? |
| assistant | 由大模型生成的消息,可能是上一轮对话生成的结果 | 注意,用户可能与大模型产生多轮对话,每轮对话模型都会产生不同的效果。 |
2. 使用步骤
-
定义会话存储方式
public interface ChatMemory { String DEFAULT_CONVERSATION_ID = "default"; String CONVERSATION_ID = "chat_memory_conversation_id"; default void add(String conversationId, Message message) { Assert.hasText(conversationId, "conversationId cannot be null or empty"); Assert.notNull(message, "message cannot be null"); this.add(conversationId, List.of(message)); } void add(String conversationId, List<Message> messages); List<Message> get(String conversationId); void clear(String conversationId); }提供了一个记忆存储的抽象接口:ChatMemoryRepository
public interface ChatMemoryRepository { List<String> findConversationIds(); List<Message> findByConversationId(String conversationId); void saveAll(String conversationId, List<Message> messages); void deleteByConversationId(String conversationId); }提供了一个默认的实现:MessageWindowChatMemory
@Bean public ChatMemoryRepository chatMemoryRepository() { return new InMemoryChatMemoryRepository(); } @Bean public ChatMemory chatMemory(ChatMemoryRepository chatMemoryRepository) { return MessageWindowChatMemory.builder() .chatMemoryRepository(chatMemoryRepository) .maxMessages(20) .build(); } -
配置会话记忆 Advisor
@Bean public ChatClient chatClient(OllamaChatModel model, ChatMemory chatMemory) { return ChatClient.builder(model) // 默认设定 .defaultSystem("你是可爱的助手,名字叫小团团。请以小团团的身份和语气回答问题。") // 默认 Advisor .defaultAdvisors( // 配置日志 Advisor new SimpleLoggerAdvisor(), // 配置会话记录 Advisor MessageChatMemoryAdvisor.builder(chatMemory).build() ) // 构建 ChatClient 实例 .build(); } -
添加会话 id
Flux<String> content = chatClient.prompt() .user("你好,我叫小明") // 将会话 id 添加到 AdvisorContext 上下文中 .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, chatId)) .stream() .content();
3. 配置项目
-
在
CommonConfiguration类中天加如下代码@Bean public ChatMemoryRepository chatMemoryRepository() { return new InMemoryChatMemoryRepository(); } @Bean public ChatMemory chatMemory(ChatMemoryRepository chatMemoryRepository) { return MessageWindowChatMemory.builder() .chatMemoryRepository(chatMemoryRepository) .maxMessages(20) .build(); } -
修改默认工厂
@Bean public ChatClient chatClient(OllamaChatModel model, ChatMemory chatMemory) { return ChatClient.builder(model) // 默认设定 .defaultSystem("你是可爱的助手,名字叫小团团。请以小团团的身份和语气回答问题。") // 默认 Advisor .defaultAdvisors( // 配置日志 Advisor new SimpleLoggerAdvisor(), // 配置会话记录 Advisor MessageChatMemoryAdvisor.builder(chatMemory).build() ) // 构建 ChatClient 实例 .build(); } -
配置会话 id
修改
ChatController使其可以正常获取到 chatId@RequestMapping(value = "/chatStream", produces = "text/html;charset=utf-8") public Flux<String> chatStream(String prompt, String chatId) { return chatClient.prompt() .user(prompt) .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, chatId)) .stream() .content(); } -
验证



浙公网安备 33010602011771号