简介
本文介绍Spring Ai Alibaba快速入门的实战:对话。
申请API-KEY
需要先获取一个兼容 OpenAI 的平台的 ApiKey,推荐使用阿里的百炼平台,因为:
- 模型众多
- 还没有繁琐的申请与开通流程,注册账号、认证之后就可以直接使用
登录阿里百炼控制台,新用户可以免费领100W免费token,有效期90天。
注册
地址:https://bailian.console.aliyun.com/
创建:

结果

选择模型

本处选择千问max。点进去后,就可以复制模型编码:

创建SpringBoot项目
Spring AI对技术栈版本有要求,要求如下:
- Java 17+。(本文用JDK21)
- Spring Boot 3.x 或 Spring Boot 2.7+。(本文用3.5.7)
- Maven3.6.3+。(本文用Idea自带的3.8.1)
依赖
关键依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
整个pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.7</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.knife</groupId>
<artifactId>1_chat</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>1_chat</name>
<description>Demo project for Spring Ai</description>
<properties>
<java.version>21</java.version>
<spring-ai.version>1.1.0</spring-ai.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- 统一管理 SpringAI 相关依赖的版本 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- OpenAI 模型依赖 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
<!--spring3.x版本建议加上此依赖,否则会有启动的提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>4.5.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<!-- 指定maven编译的jdk版本。对于JDK8,写成8或者1.8都可以 -->
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
配置
application.yml
spring:
application:
name: 1_chat
ai:
openai:
# URL前缀
base-url: https://dashscope.aliyuncs.com/compatible-mode
api-key: sk-82e1084be1194e218f0794af9c861e39
chat:
# URL后缀,默认为:/v1/chat/completions。spring ai会自动将spring.ai.openai拼接到前边。
completions-path: /v1/chat/completions
options:
model: qwen-plus
temperature: 0.8
top-p: 0.7
logging:
level:
org.springframework.ai.chat.client.advisor: debug
knife4j:
enable: true
setting:
language: zh_cn
代码
测试接口
package com.knife.example.ai.chat.controller;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
@Slf4j
@Tag(name = "对话")
@RequestMapping("chat")
@RestController
public class ChatController {
@Autowired
private ChatClient chatClient;
@Operation(summary = "直接输出")
@GetMapping("direct")
public String direct(@Parameter(description = "消息") String message) {
return chatClient.prompt(message).call().content();
}
/**
* 可以用apifox测试
*/
@Operation(summary = "流式输出")
@GetMapping(value = "stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> stream(@Parameter(description = "消息") String message) {
return chatClient.prompt(message).stream().content();
}
}
配置文件
package com.knife.example.ai.chat.config;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AiCustomConfiguration {
@Bean
public ChatClient chatClient(ChatClient.Builder chatClientBuilder) {
return chatClientBuilder
.defaultSystem("你是一个博学的智能聊天助手,请根据用户提问回答!")
.defaultAdvisors(
new SimpleLoggerAdvisor() // 日志增强器
)
.build();
}
}
测试
测试1:直接输出
访问:http://localhost:8080/doc.html
可以发现:1秒钟后,整个输出一次性返回。

后台输出:
2025-12-06T22:12:06.116+08:00 DEBUG 4316 --- [1_chat] [nio-8080-exec-1] o.s.a.c.c.advisor.SimpleLoggerAdvisor : request: ChatClientRequest[prompt=Prompt{messages=[SystemMessage{textContent='你是一个博学的智能聊天助手,请根据用户提问回答!', messageType=SYSTEM, metadata={messageType=SYSTEM}}, UserMessage{content='介绍下自己吧', metadata={messageType=USER}, messageType=USER}], modelOptions=OpenAiChatOptions: {"streamUsage":false,"model":"qwen-max","temperature":0.8,"top_p":0.7}}, context={}]
2025-12-06T22:12:09.483+08:00 DEBUG 4316 --- [1_chat] [nio-8080-exec-1] o.s.a.c.c.advisor.SimpleLoggerAdvisor : response: {
"result" : {
"output" : {
"messageType" : "ASSISTANT",
"metadata" : {
"role" : "ASSISTANT",
"messageType" : "ASSISTANT",
"refusal" : "",
"finishReason" : "STOP",
"annotations" : [ { } ],
"index" : 0,
"id" : "chatcmpl-b188605f-559e-4fc6-82b8-3550b340276d"
},
"toolCalls" : [ ],
"media" : [ ],
"text" : "你好,我是通义千问,由阿里云开发的AI助手。我被设计用来回答各种问题、提供信息、进行对话等。无论是科技、文化、生活常识还是其他领域的问题,我都会尽力给出准确、有用的回答。同时,我也会不断学习和进步,以更好地为你服务。希望我们能有愉快的交流!"
},
"metadata" : {
"finishReason" : "STOP",
"contentFilters" : [ ],
"empty" : true
}
},
"metadata" : {
"id" : "chatcmpl-b188605f-559e-4fc6-82b8-3550b340276d",
"model" : "qwen-max",
"rateLimit" : {
"requestsLimit" : null,
"requestsRemaining" : null,
"requestsReset" : null,
"tokensLimit" : null,
"tokensRemaining" : null,
"tokensReset" : null
},
"usage" : {
"promptTokens" : 31,
"completionTokens" : 74,
"totalTokens" : 105,
"nativeUsage" : {
"completion_tokens" : 74,
"prompt_tokens" : 31,
"total_tokens" : 105,
"prompt_tokens_details" : {
"cached_tokens" : 0
}
}
},
"promptMetadata" : [ ],
"empty" : false
},
"results" : [ {
"output" : {
"messageType" : "ASSISTANT",
"metadata" : {
"role" : "ASSISTANT",
"messageType" : "ASSISTANT",
"refusal" : "",
"finishReason" : "STOP",
"annotations" : [ { } ],
"index" : 0,
"id" : "chatcmpl-b188605f-559e-4fc6-82b8-3550b340276d"
},
"toolCalls" : [ ],
"media" : [ ],
"text" : "你好,我是通义千问,由阿里云开发的AI助手。我被设计用来回答各种问题、提供信息、进行对话等。无论是科技、文化、生活常识还是其他领域的问题,我都会尽力给出准确、有用的回答。同时,我也会不断学习和进步,以更好地为你服务。希望我们能有愉快的交流!"
},
"metadata" : {
"finishReason" : "STOP",
"contentFilters" : [ ],
"empty" : true
}
} ]
}
测试2:流式输出
流式输出需要客户端支持,而swagger和doc.html不支持,本处使用apifox。
有人说需要设置请求头:Content-Type设置为text/event-stream。本处我测试,是不需要的。
开始对话(可以发现:是流式输出的,持续输出文字,每次输出几个字,结束后会断开连接。)


测试3:记忆功能(默认无记忆)
测一下,看有没有记忆功能。


可以发现,默认没有上下文记忆功能!

请先 !