SpringAI接入DeepSeek
前言
随着人工智能技术的快速发展,大语言模型(LLM)在各种应用场景中展现出巨大潜力。本文将详细介绍如何使用Spring Boot整合Spring AI框架,并连接DeepSeek大模型,构建智能应用。
Spring AI 框架概述
Spring AI 是 Spring 官方推出的 AI 集成框架,旨在简化 Java 开发者与 大语言模型(LLM) 和 AI 服务 的交互。它提供了一套标准 API,支持 OpenAI、Azure AI、Hugging Face、DeepSeek、Ollama(本地LLM)等多种 AI 服务,让开发者可以轻松集成 AI 能力到 Spring Boot 应用中。Spring AI 提供了 ChatClient、EmbeddingClient 等统一接口,无论底层是 OpenAI、DeepSeek 还是本地 Ollama,调用方式一致,减少代码耦合。
支持的 AI 服务
1、云端 AI OpenAI (GPT-4)、DeepSeek、Azure OpenAI 企业级 AI 应用,需稳定 API 调用
2、开源模型 Llama 2、Mistral、Gemma(通过 Ollama 或 Hugging Face) 本地开发、数据隐私要求高的场景
3、向量数据库 Pinecone、Milvus、Redis AI 增强搜索(RAG)
主要模块
spring-ai-core 核心抽象接口(如 ChatClient、EmbeddingClient)
spring-ai-openai 集成 OpenAI 的 Starter(GPT-3.5/4)
spring-ai-ollama 集成本地 Ollama 运行的 Llama2、Mistral 等模型
spring-ai-azure 支持 Azure OpenAI 服务
spring-ai-pinecone 集成 Pinecone 向量数据库,用于检索增强生成(RAG)
常见模型类型
| 模型类型 | 功能说明 | 典型应用场景 |
|---|---|---|
| Chat(对话型) | 对话交互(如ChatGPT) | 客服机器人、聊天助手 |
| Embedding(嵌入型) | 将文本转换为向量(数值数组) | 语义搜索、RAG + 传统搜索基于关键词匹配(如Google早期的搜索),而语义搜索通过理解查询的语义(含义)来返回更相关的结果。 + 它利用深度学习模型(如BERT、Embedding模型)将文本转换为向量(vector),通过向量相似度匹配内容,即使查询词和文档没有直接的关键词重叠。 |
| Image(文生图型) | 生成/处理图像(如Stable Diffusion) | 设计辅助、内容生成 |
| Text-to-Speech(文转语音型) | 将文本转为语音 | 语音助手、有声内容 |
| Function Calling(函数回调型) | 让AI调用外部函数/API | 实时数据查询、工作流自动化 |
Spring AI 接入 DeepSeek
链接: link.
获取API密钥
前往DeepSeek官网申请API访问权限,获取API Key。
依赖配置
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>1.0.0-M6</version>
</dependency>
编写配置文件
# Spring AI OpenAI/DeepSeek 配置
spring:
ai:
openai:
api-key: apikey # 设置 DeepSeek API 的访问密钥,永远不要将密钥提交到代码仓库,建议通过环境变量注入。搞不好要花钱的。
base-url: https://api.deepseek.com # 指定 DeepSeek API 的基础地址,格式与OpenAI相同。
chat:
options:
model: deepseek-chat # 选择要调用的 DeepSeek 模型名称,必须与 DeepSeek 支持的模型列表匹配(如 deepseek-chat、deepseek-coder 等),不同模型可能有不同的计费标准和能力。
temperature: 1.3 # temperature 值越高,AI 回答越随机和创意;值越低,回答越确定和保守。1.3 属于高值,适合需要发散性输出的场景,但可能牺牲准确性。
编写 service
import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.SystemPromptTemplate;
import org.springframework.stereotype.Service;
import java.util.Map;
@RequiredArgsConstructor
@Service
public class AiService {
private final ChatModel chatModel;
// 简单的直接调用
public String generate(String message) {
return chatModel.call(message);
}
// 使用系统提示模板
public String generateWithSystemPrompt(String userMessage) {
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate("""
你是一个资深{domain}专家,回答需满足以下要求:
1. 语言风格:{tone}
2. 回答长度:{length}
3. 用户问题:{userMessage}
""");
Prompt prompt = new Prompt(
systemPromptTemplate.createMessage(Map.of(
"domain", "科技",
"tone", "幽默",
"length", "不超过100字",
"userMessage", userMessage
))
);
return chatModel.call(prompt).getResult().getOutput().getText();
}
}
编写 controller
import com.example.demo.service.AiService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/ai")
@RequiredArgsConstructor
public class AiController {
private final AiService aiService;
@GetMapping("/chat")
public String chat(@RequestParam String message) {
return aiService.generate(message);
}
@GetMapping("/chat-with-prompt")
public String chatWithPrompt(@RequestParam String message) {
return aiService.generateWithSystemPrompt(message);
}
}



4969

被折叠的 条评论
为什么被折叠?



