代碼

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;
    }
}

效果

使用Spring-AI的chatMemoryAdvisor實現多輪會話_#java


AI可以記住我的名字

使用Spring-AI的chatMemoryAdvisor實現多輪會話_#java_02