通过Spring AI接入DeepSeek,构建私有的AI API

什么是Spring AI

Spring AI项目旨在简化人工智能功能应用程序的开发过程,避免不必要的复杂性。该项目从LangChain、LlamaIndex等著名Python项目中汲取灵感,但Spring AI并非这些项目的直接移植。项目创立时秉持着一个信念:下一代生成式AI应用将不仅限于Python开发者,而是会普及到多种编程语言中。Spring AI致力于解决AI集成中的核心挑战:将企业数据及API与AI模型无缝衔接。Spring AI 提供了一系列抽象层,作为开发 AI 应用程序的基础。这些抽象层具有多种实现方式,只需极少的代码改动即可轻松替换组件。

Spring AI

项目初始化

通过start.spring.io初始化一个Spring Boot项目,本文基于Spring Boot3.4.5,Java17的版本来创建项目。由于DeepSeek的API兼容openai的API,我们可以直接添加spring-ai-starter-model-openai依赖来使用DeepSeek,

添加pom依赖

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
      <groupId>org.springframework.ai</groupId>
      <artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>

Spring AI物料清单(BOM)声明了特定版本Spring AI所推荐使用的所有依赖项版本。这是一个仅包含BOM的版本,只涉及依赖项管理。将BOM添加到项目中的方式如下:

  <dependencyManagement>
  	<dependencies>
  		<dependency>
  			<groupId>org.springframework.ai</groupId>
  			<artifactId>spring-ai-bom</artifactId>
  			<version>1.0.0-M8</version>
  			<type>pom</type>
  			<scope>import</scope>
  		</dependency>
  	</dependencies>
  </dependencyManagement>

API配置

在application.yaml中配置API信息如下,由于使用的是阿里云百炼提供的大模型服务,在配置API时,需要将base-url:https://dashscope.aliyuncs.com/compatible-mode/v1 后面的v1去掉,并且结尾加上"/"号。api-key可以在阿里云百炼大模型服务平台中配置和查看。

spring.ai.openai.base-url=https://dashscope.aliyuncs.com/compatible-mode/
spring.ai.openai.api-key=sk-xxxxxxxxxxxxxxxxx
spring.ai.openai.chat.options.model=deepseek-r1

创建RestController

创建一个可注入到类中的 OpenAiChatModel 实现。以下是一个简单的 @RestController 类示例,该类使用聊天模型进行文本生成,包含两个API,分别用于同步和流式请求。

  • /ai/generate 同步请求
  • /ai/generateStream 流式请求
package com.example.demo.controller;

import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.util.Map;

@RestController
public class ChatController {
    private final OpenAiChatModel chatModel;

    @Autowired
    public ChatController(OpenAiChatModel chatModel) {
        this.chatModel = chatModel;
    }

    @GetMapping("/ai/generate")
    public Map generate(@RequestParam(value = "message", defaultValue = "9.9和9.11谁大") String message) {
        return Map.of("generation", chatModel.call(message));
    }

    @GetMapping("/ai/generateStream")
    public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "9.9和9.11谁大") String message) {
        Prompt prompt = new Prompt(new UserMessage(message));
        return this.chatModel.stream(prompt);
    }
}

测试api

curl http://localhost:8080/ai/generate
{"generation":"9.9比9.11大。\n\n**步骤解析:**\n\n1. **对齐小数位数**:将9.9写成9.90,使其与9.11的小数位数一致。\n2. **逐位比较**:\n   - **整数部分**:均为9,相等。\n   - **十分位**:9.90的十分位是9,9.11的十分位是1。由于9 > 1,此时已能确定大小。\n3. **结论**:无需继续比较百分位,9.90(即原数9.9)更大。\n\n**答案**:9.9 > 9.11。"}

curl http://localhost:8080/ai/generateStream
[{"result":{"metadata":{"finishReason":"","contentFilters":[],"empty":true},"output":{"messageType":"ASSISTANT","metadata":{"refusal":"","finishReason":"","index":0,"role":"ASSISTANT","id":"chatcmpl-cfdd5f2d-c0b9-99bf-811c-f99f21df4c96","messageType":"ASSISTANT"},"toolCalls":[],"media":[],"text":null}},"results":[{"metadata":{"finishReason":"","contentFilters":[],"empty":true},"output":{"messageType":"ASSISTANT"}]
...}]
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐