通过Spring AI接入DeepSeek,构建私有的AI API
Spring AI项目旨在简化人工智能功能应用程序的开发过程,避免不必要的复杂性。该项目从LangChain、LlamaIndex等著名Python项目中汲取灵感,但Spring AI并非这些项目的直接移植。项目创立时秉持着一个信念:下一代生成式AI应用将不仅限于Python开发者,而是会普及到多种编程语言中。Spring AI致力于解决AI集成中的核心挑战:将企业数据及API与AI模型无缝衔接。
通过Spring AI接入DeepSeek,构建私有的AI API
什么是Spring AI
Spring AI项目旨在简化人工智能功能应用程序的开发过程,避免不必要的复杂性。该项目从LangChain、LlamaIndex等著名Python项目中汲取灵感,但Spring AI并非这些项目的直接移植。项目创立时秉持着一个信念:下一代生成式AI应用将不仅限于Python开发者,而是会普及到多种编程语言中。Spring AI致力于解决AI集成中的核心挑战:将企业数据及API与AI模型无缝衔接。Spring AI 提供了一系列抽象层,作为开发 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"}]
...}]
更多推荐
所有评论(0)