代碼
controller/ZhipuChatMemoryController.java
package org.example.controller;
import org.example.advisor.CallAdvisor1;
import org.example.advisor.CallAdvisor2;
import org.example.advisor.SimpleMessageChatMemoryAdvisor;
import org.example.entity.Book;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.ai.zhipuai.ZhiPuAiChatOptions;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
@RestController
@RequestMapping("/chatMemory")
public class ZhipuChatMemoryController {
// 聲明 ChatClient 實例,用於與 AI 模型進行交互
private final ChatClient chatClient;
/**
* 構造函數,初始化 ChatClient 並配置聊天內存顧問
* @param builder ChatClient.Builder 實例,用於構建 ChatClient
*/
public ZhipuChatMemoryController(ChatClient.Builder builder) {
// 創建 MessageWindowChatMemory,用於管理對話歷史消息窗口
MessageWindowChatMemory windowChatMemory = MessageWindowChatMemory.builder()
.build();
// 創建 MessageChatMemoryAdvisor,用於管理對話內存
MessageChatMemoryAdvisor chatMemoryAdvisor = MessageChatMemoryAdvisor.builder(windowChatMemory)
.build();
// 構建 ChatClient,設置默認Advisors
this.chatClient = builder
.defaultAdvisors(chatMemoryAdvisor)
.build();
}
/**
* 處理聊天請求
* @param question 用户問題
* @param sessionId 會話ID,用於區分不同用户的對話上下文
* @return AI 模型的響應內容
*/
@GetMapping("/messageChatMemoryAdvisor")
public String messageChatMemoryAdvisor(@RequestParam(name = "question") String question,
@RequestParam(name = "sessionId") String sessionId) {
String content = chatClient.prompt()
.user(question)
// 把會話ID存入上下文,確保對話記憶與特定會話關聯
.advisors(advisorSpec -> advisorSpec.param(ChatMemory.CONVERSATION_ID, sessionId))
.call()
.content();
return content;
}
}
效果
AI可以記住我的名字