01 spring ai alibaba(SAA1.1.2)基础聊天实现-ChatModel
前置条件
在使用 DashScopeChatModel 之前,你需要:
- 获取 DashScope API Key:访问 阿里云百炼
- 设置环境变量:
export AI_DASHSCOPE_API_KEY=your_api_key
添加依赖
<dependency> <groupId>com.alibaba.cloud.ai</groupId> <artifactId>spring-ai-alibaba-starter-dashscope</artifactId> <version>1.1.2.1</version> </dependency>基础使用
创建 ChatModel
import com.alibaba.cloud.ai.dashscope.api.DashScopeApi; import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel; import org.springframework.ai.chat.model.ChatModel; // 创建 DashScope API 实例 DashScopeApi dashScopeApi = DashScopeApi.builder() .apiKey(System.getenv("AI_DASHSCOPE_API_KEY")) .build(); // 创建 ChatModel ChatModel chatModel = DashScopeChatModel.builder() .dashScopeApi(dashScopeApi) .build();简单调用
// 使用字符串直接调用 String response = chatModel.call("介绍一下Spring框架"); System.out.println(response);使用 Prompt
import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.model.ChatResponse; // 创建 Prompt Prompt prompt = new Prompt(new UserMessage("解释什么是微服务架构")); // 调用并获取响应 ChatResponse response = chatModel.call(prompt); String answer = response.getResult().getOutput().getText(); System.out.println(answer);配置选项
使用 ChatOptions
DashScopeChatOptions 配置示例
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions; DashScopeChatOptions options = DashScopeChatOptions.builder() .model("qwen-plus") // 模型名称 .temperature(0.7) // Temperature 参数 .maxToken(2000) // 最大令牌数 .topP(0.9) // Top-P 采样 .build(); ChatModel chatModel = DashScopeChatModel.builder() .dashScopeApi(dashScopeApi) .defaultOptions(options) .build();常用选项说明:
- model: 要使用的模型 ID
- frequencyPenalty: 频率惩罚(-2.0 到 2.0),降低重复令牌的可能性
- maxTokens: 生成响应的最大令牌数
- presencePenalty: 存在惩罚(-2.0 到 2.0),鼓励谈论新主题
- stopSequences: 停止序列列表,遇到时停止生成
- temperature: 采样温度(0.0 到 2.0),控制随机性
- topK: Top-K 采样参数
- topP: Top-P(核采样)参数
此外,每个特定模型的 ChatModel/StreamingChatModel 实现都可以有自己的选项。例如,OpenAI Chat Completion 模型有自己的选项,如logitBias、seed和user。
这是一个强大的功能,允许开发者在启动应用程序时使用特定于模型的选项,然后在运行时使用Prompt请求覆盖它们。
运行时覆盖选项
通过prompt运行时覆盖选项示例
// 创建带有特定选项的 Prompt DashScopeChatOptions runtimeOptions = DashScopeChatOptions.builder() .withTemperature(0.3) // 更低的温度,更确定的输出 .withMaxToken(500) .build(); Prompt prompt = new Prompt( new UserMessage("用一句话总结Java的特点"), runtimeOptions ); ChatResponse response = chatModel.call(prompt);流式响应
流式响应示例
import reactor.core.publisher.Flux; // 使用流式 API Flux<ChatResponse> responseStream = chatModel.stream( new Prompt("详细解释Spring Boot的自动配置原理") ); // 订阅并处理流式响应 responseStream.subscribe( chatResponse -> { String content = chatResponse.getResult() .getOutput() .getText(); System.out.print(content); }, error -> System.err.println("错误: " + error.getMessage()), () -> System.out.println(" 流式响应完成") );多轮对话
多轮对话示例
import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.SystemMessage; import org.springframework.ai.chat.messages.AssistantMessage; import java.util.List; // 创建对话历史 List<Message> messages = List.of( new SystemMessage("你是一个Java专家"), new UserMessage("什么是Spring Boot?"), new AssistantMessage("Spring Boot是..."), new UserMessage("它有什么优势?") ); Prompt prompt = new Prompt(messages); ChatResponse response = chatModel.call(prompt);函数调用(外部工具)
DashScopeChatModel 支持函数调用(Function Calling),允许模型调用外部函数:
函数调用示例
import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.function.FunctionToolCallback; // 定义函数工具 ToolCallback weatherFunction = FunctionToolCallback.builder("getWeather", (String city) -> { // 实际的天气查询逻辑 return "晴朗,25°C"; }) .description("获取指定城市的天气") .inputType(String.class) .build(); // 使用函数 DashScopeChatOptions options = DashScopeChatOptions.builder() .withToolCallbacks(List.of(weatherFunction)) .build(); Prompt prompt = new Prompt("北京的天气怎么样?", options); ChatResponse response = chatModel.call(prompt);