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:

deepseek

千问:

千问

作者:Jonny