Spring Boot 无缝接入 DeepSeek 和通义千问
本文将带你了解如何在 Spring Boot 中使用 spring-ai 无缝接入 DeepSeek 和通义千问来构建自己的 AI 应用。
Spring & JDK 版本:
- springboot 3.4.3
- jdk17
1、maven依赖
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
2、application.yaml 配置
# DeepSeek 配置,完全兼容openai配置
# spring:
# ai:
# openai:
# base-url: https://api.deepseek.com # DeepSeek的OpenAI式端点
# api-key: sk-xxxxxxxxx
# chat.options:
# model: deepseek-chat # 指定DeepSeek的模型名称
# 通义千问配置
spring:
ai:
openai:
base-url: https://dashscope.aliyuncs.com/compatible-mode # 通义千问
api-key: sk-xxxxxxxxxxx
chat.options:
model: qwen-plus
3、Controller
package org.example.springboot3ds.controller;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
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.model.ChatResponse;
import org.springframework.ai.chat.model.Generation;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* @author admin
*/
@RestController
public class ChatController {
/**
* 上下文
*/
private final List<Message> contextHistoryList = new ArrayList<>();
@Resource
private OpenAiChatModel model;
@PostConstruct
public void init() {
contextHistoryList.add(new SystemMessage("You are a Java technologist."));
}
/**
* 普通对话
*
* @param message 问题
* @return 回答结果
*/
@GetMapping("/chat")
public ChatResponse chat(String message) {
contextHistoryList.add(new UserMessage(message));
Prompt prompt = new Prompt(contextHistoryList);
ChatResponse chatResp = model.call(prompt);
Generation result = chatResp.getResult();
if (Objects.nonNull(result) && Objects.nonNull(result.getOutput())) {
contextHistoryList.add(result.getOutput());
}
return chatResp;
}
/**
* 流式返回
*
* @param message 问题
* @return 流式结果
*/
@GetMapping("/chat/v1")
public Flux<ChatResponse> chatV1(String message) {
contextHistoryList.add(new UserMessage(message));
Prompt prompt = new Prompt(contextHistoryList);
return model.stream(prompt);
}
}
4、简单定义一个页面进行测试
package org.example.springboot3ds.controller;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
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.model.ChatResponse;
import org.springframework.ai.chat.model.Generation;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* @author admin
*/
@RestController
public class ChatController {
/**
* 上下文
*/
private final List<Message> contextHistoryList = new ArrayList<>();
@Resource
private OpenAiChatModel model;
@PostConstruct
public void init() {
contextHistoryList.add(new SystemMessage("You are a Java technologist."));
}
/**
* 普通对话
*
* @param message 问题
* @return 回答结果
*/
@GetMapping("/chat")
public ChatResponse chat(String message) {
contextHistoryList.add(new UserMessage(message));
Prompt prompt = new Prompt(contextHistoryList);
ChatResponse chatResp = model.call(prompt);
Generation result = chatResp.getResult();
if (Objects.nonNull(result) && Objects.nonNull(result.getOutput())) {
contextHistoryList.add(result.getOutput());
}
return chatResp;
}
/**
* 流式返回
*
* @param message 问题
* @return 流式结果
*/
@GetMapping("/chat/v1")
public Flux<ChatResponse> chatV1(String message) {
contextHistoryList.add(new UserMessage(message));
Prompt prompt = new Prompt(contextHistoryList);
return model.stream(prompt);
}
}
测试
deepseek:
千问:
作者:Jonny