1.报错
2.Java 代码
2.1 pom.xml
<dependencyManagement><dependencies><!-- Spring AI --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-M6</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><!-- Spring Ai OpenAI 模型依赖 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>1.0.0-M6</version></dependency>
2.2 application.yml
spring:ai:openai:base-url: https://dashscope.aliyuncs.com/compatible-mode # 默认使用 v1 版本号,如果添加会变成 /compatible-mode/v1/v1api-key: xxxxchat:options:model: qwen-max # 模型名称temperature: 0.8 # 模型温度,值越大,输出结果越随机
2.3 Config-配置类
package com.dragon.springboot3vue3.config;import com.dragon.springboot3vue3.tools.LogoutTools;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class OpenAIConfig {@Autowiredprivate LogoutTools logoutTools;/*** 配置会话存储方式* @return*/@Beanpublic ChatMemory chatMemory() {return new InMemoryChatMemory(); // 将历史会话临时存储在应用内存中(重启应用后数据丢失)。生产环境需要持久化存储(如 Redis、数据库)}@Beanpublic ChatClient chatClient(OpenAiChatModel model, ChatMemory chatMemory) {return ChatClient.builder(model).defaultSystem("""你是韶君,一个温柔可爱机智的智能助手。请:1.使用自然语言回答问题2.如果涉及到数学计算,使用标准数学符号(如+、-、×、÷)回答,示例格式:"18 ÷ 6 = 3"""").defaultAdvisors(new SimpleLoggerAdvisor(), // 配置日志 Advisor,需在 yml 开启日志级别(默认:debug)new MessageChatMemoryAdvisor(chatMemory) // 配置会话记忆).defaultTools(logoutTools) // Tool Calling.build();}}
2.4 Controller
package com.dragon.springboot3vue3.controller;import cn.dev33.satoken.util.SaResult;
import com.dragon.springboot3vue3.controller.dto.entityDto.ChatDto;
import com.dragon.springboot3vue3.tools.LogoutTools;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import java.util.List;@Tag(name = "Spring AI 对话接口")
@RestController
@RequestMapping("/aiConversation")
public class AiConversationController {@Autowiredprivate ChatClient chatClient;/*** 流式输出(要设置流式输出格式)*/@Operation(summary = "对话")@PostMapping(value = "/conversation",produces = "text/html;charset=utf-8")public Flux<String> chatClient(@RequestBody ChatDto chatDto) {return chatClient.prompt().user(chatDto.getPrompt()).advisors(item -> item.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY, chatDto.getConversationId())) // 将会话ID,添加到AdvisorsContext上下文.stream().content();}
}
2.5 LogoutTools
package com.dragon.springboot3vue3.tools;import cn.dev33.satoken.util.SaResult;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.stereotype.Component;@Component
public class LogoutTools {@Tool(name = "userLogout",description = "退出当前登录")public SaResult userLogout() {System.out.println("退出ing"); // 能输出“退出ing”,但是后续报错return SaResult.ok("退出成功");}
}