SpringAI-1.0.0使用
依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
</dependencies>
配置文件
spring:
ai:
openai:
api-key: ${env.ALI_API_KEY}
base-url: https://dashscope.aliyuncs.com/compatible-mode
chat:
options:
model: qwen-plus
注意:需要去掉官方提供的base-url后的v1
配置ChatClient
@Bean
public ChatClient chatClient(ChatClient.Builder builder) {
return builder.build();
}
简单对话
@Autowired
private ChatClient chatClient;
@GetMapping("{message}")
public String chat(@PathVariable String message) {
return chatClient.prompt()
.user(message)
.call()
.content();
}
流式输出
@GetMapping(value = "stream/{message}",produces = "text/stream;charset=utf-8")
public Flux<String> stream(@PathVariable String message) {
return chatClient.prompt()
.user(message)
.stream()
.content();
}
角色预设
@Bean
public ChatClient chatClient(ChatClient.Builder builder) {
return builder
.defaultSystem("你是一个法律专家")
.build();
}
打印日志
添加日志Advisor
@Bean
public ChatClient chatClient(ChatClient.Builder builder) {
return builder
.defaultAdvisors(new SimpleLoggerAdvisor())
.build();
}
设置日志等级
logging:
level:
org.springframework.ai.chat.client.advisor: debug
对话记忆
@Autowired
private ChatMemory chatMemory; //新版本可直接使用,默认基于内存
@Bean
public ChatClient chatClient(ChatClient.Builder builder) {
return builder
.defaultAdvisors(MessageChatMemoryAdvisor
.builder(chatMemory).build())
.build();
}
对话隔离
@GetMapping("quarantine/{id}/{message}")
public String quarantine(@PathVariable Integer id,
@PathVariable String message) {
return chatClient.prompt()
.user(message)
.advisors(ds -> ds.param(ChatMemory.CONVERSATION_ID,id))//根据id进行隔离
.call()
.content();
}
查看历史
@Autowired
private ChatMemory chatMemory;
@GetMapping("history/{id}")
public List<String> history(@PathVariable Integer id) {
List<Message> messages = chatMemory.get(id.toString());
return messages.stream()
.filter(message -> MessageType.USER.equals(message.getMessageType()))//筛选类型
.map(Message::getText)
.toList();
}
使用工具
定义工具
public class MyTools {
@Tool(description = "获取城市的天气")
String getWeather(@ToolParam(description = "城市") String city){
if ("杭州".equals(city)){
return "暴雨";
}
return "晴天";
}
}
配置工具
@Bean
public ChatClient chatClient(ChatClient.Builder builder) {
return builder
.defaultTools(new MyTools())
.build();
}
使用Ollama
依赖
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>
配置
spring:
ai:
ollama:
chat:
model: deepseek-r1:1.5b
base-url: http://localhost:11434
使用
@RestController
@RequestMapping("ollama")
public class OllamaController {
private ChatClient chatClient;
public OllamaController(@Qualifier("ollamaChatModel") ChatModel chatModel) {
chatClient = ChatClient.builder(chatModel)
.build();
}
@GetMapping("chat/{message}")
public String chat(@PathVariable("message") String message) {
return chatClient.prompt()
.user(message)
.call()
.content();
}
}
注意:如果项目中同时引入多个模型,需要使用ChatModel并使用@Qualifier进行区分,ChatClient.Builder方式会报错