Spring AI :Java 生态原生 AI 框架入门指南

Spring AI :Java 生态原生 AI 框架入门指南

在大模型席卷全球的技术浪潮下,Java 开发者们迫切需要一款贴合自身生态、低门槛接入 AI 能力的框架。Spring AI 的出现,恰好填补了这一空白 —— 它并非简单移植 Python 生态的现有方案,而是深度遵循 Spring 设计哲学,为 Java 和 Spring 开发者打造了原生的 AI 开发框架。本文将从 Spring AI 的核心概念、核心特性出发,结合实际环境搭建与首个对话案例,带大家快速上手这款框架,解锁 Java 生态与 AI 融合的全新可能。

一、什么是 Spring AI?

Spring AI 是面向 Java 和 Spring 生态的原生人工智能框架,其核心设计理念完全传承自 Spring:依赖注入、POJO 编程、模块化架构与可配置性。它重构了 AI 应用的全开发流程,让开发者无需关注底层模型的适配细节,就能像调用数据库、Web API 一样轻松集成聊天、文本嵌入、图像生成、语音处理等 AI 能力。

在这里插入图片描述

更重要的是,Spring AI 完美解决了多 AI 供应商适配的痛点 —— 通过 “一套接口,多种实现” 的统一抽象,开发者可以无缝切换 OpenAI、Anthropic、Bedrock、Hugging Face、Vertex AI、Ollama 等主流 AI 服务,无需修改核心业务代码。同时,它还支持企业内部数据与 AI 模型的快速关联,这正是检索增强生成(RAG)等高级场景的核心需求。

官网地址
官网地址:https://spring.io/projects/spring-ai
官方文档:https://docs.spring.io/spring-ai/reference/index.html
中文文档:https://spring-ai.spring-doc.cn/docs/1.0.0/index.html

二、Spring AI 核心特性:为什么值得选?

Spring AI 覆盖了 AI 应用开发的全流程,其核心特性可以总结为以下 7 点,每一点都精准命中开发者的实际需求:

1. 全栈多供应商模型适配,覆盖主流 AI 能力

深度对接Anthropic、OpenAI等主流服务商,覆盖聊天交互、文本嵌入、多模态生成、语音交互、内容安全等核心能力。

聊天交互(文本对话、多轮上下文对话)

文本嵌入(语义向量转换,支撑语义搜索)

多模态生成(文生图、图生文)

语音交互(音频转录/语音转文字、文本转语音)

内容安全(敏感信息检测与审核)

所有模型统一接口封装,切换模型无需修改业务代码,提升项目灵活性与可扩展性。

2. 标准化抽象 API,统一调用体验

Spring AI 提供了 ChatClient、EmbeddingModel、ImageModel 等标准化接口,开发者无需关心底层模型的差异。支持同步/流式调用及模型高级功能(如OpenAI Function Calling),聚焦业务逻辑,提升开发效率。

3. 原生集成 Spring Boot,开箱即用

遵循Spring Boot设计理念,通过Starter依赖与自动装配实现AI组件一键集成,Spring Initializr可快速生成项目骨架,开箱即用,贴合Java开发者习惯。

4. 结构化输出与类型安全,降低维护成本

支持将AI非结构化响应自动解析映射到Java POJO,保障类型安全,避免繁琐的字符串解析与类型转换,降低维护成本。

5. 内置向量存储与 RAG 支持,激活私有知识库

Spring AI 集成了 PostgreSQL/pgvector、Pinecone、Qdrant、Redis、Weaviate 等主流向量数据库,提供元数据过滤、相似度检索能力;同时内置ETL流程,可快速搭建RAG系统,解决大模型“知识过期”“不懂私有数据”痛点。

6. 工具调用能力,打通业务系统闭环

原生支持模型驱动的工具调用,可将Spring Bean注册为AI可调用工具,实现AI自动调用业务接口、查询数据库等操作,例如:

调用天气 API 获取实时气象数据

查询企业 CRM 系统获取客户详情

执行业务数据统计与分析操作

实现AI与业务流程深度融合,让AI从“对话工具”升级为“业务智能入口”,打通需求到执行的全闭环。

三、快速上手:环境准备与 Deepseek 对话案例

理论再多不如实际动手,下面我们将通过一个完整的案例,教大家搭建 Spring AI 环境,并实现与 Deepseek 模型的对话交互。

3.1 环境要求
Spring AI 构建在 Spring Boot 3.x 之上,对环境有明确要求:

JDK:必须为 17 及以上版本(不支持 Java 8/11/16)
Maven:3.6 及以上版本
Spring Boot:3.x 系列(本文使用 3.5.0 版本)
JDK 17 安装步骤
下载地址:https://www.oracle.com/cn/java/technologies/downloads/#java17
安装路径建议:D:\Program Files\Java\jdk17\jdk(可自定义)
安装成功后,配置环境变量,也可以在 Spring Boot 项目中指定 JDK 版本。

3.2 创建 Spring Boot 项目
Step 1:访问 Spring Initializr:https://start.spring.io/,或在 IDEA 中直接创建 New Module。项目配置如下:

Name:Weiz-SpringAI-QuickStart
Group:com.example
Artifact:Weiz-SpringAI-QuickStart
Package name:com.example.weizspringai
Language:Java
JDK:17
Spring Boot:3.5.3
Packaging:Jar

Step 2:Spring Boot版本选择3.5.x,依赖选择:仅需添加「Spring Web」依赖(后续通过 Maven 引入 Spring AI 相关依赖)。

创建完成后的项目结构如下:

Weiz-SpringAI-QuickStart/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── example/ │ │ │ └── weizspringai/ │ │ │ └── WeizSpringAiQuickStartApplication.java │ │ └── resources/ │ │ └── application.properties │ └── test/ └── pom.xml 

Step 3:配置 pom.xml 依赖

在 pom.xml 中添加 Spring AI 相关依赖,核心是导入 Spring AI BOM 统一管理版本,并引入 Deepseek 模型 starter:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.example</groupId><artifactId>Weiz-SpringAI</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>Weiz-SpringAI-QuickStart</artifactId><name>Weiz-SpringAI-QuickStart</name><description>Weiz-SpringAI-QuickStart</description><properties><java.version>17</java.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-deepseek</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

Step 4:配置 application.properties
在 src/main/resources/application.properties 中配置 Deepseek 模型的基础信息:

spring.application.name=Weiz-SpringAI-QuickStart server.port=8080 # Deepseek URL spring.ai.deepseek.base-url=https://api.deepseek.com spring.ai.deepseek.api-key=你的Deepseek appkey spring.ai.deepseek.chat.options.model=deepseek-chat 注意:Deepseek API 密钥需要在 Deepseek 官网注册获取,替换配置中的占位符。 

Step 5:编写 ChatController
创建 com.example.weizspringai.controller 包,并编写 ChatController 类,实现与 Deepseek 模型的交互:

importorg.springframework.ai.deepseek.DeepSeekChatModel;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/ai")publicclassChatController{@AutowiredprivateDeepSeekChatModel chatModel;@PostMapping("/chat")publicChatResponsechat(@RequestBodyChatRequest chatRequest){String resp = chatModel.call(chatRequest.getMessage());returnnewChatResponse(resp);}}

Step 6:启动并测试
运行 WeizSpringAiEmbeddingApplication.java 启动项目。
浏览器访问:http://localhost:8080/ai/chat?message=你是谁,即可看到模型响应:
你好!我是DeepSeek,由深度求索公司创造的AI助手!😊 我是一个纯文本模型,虽然不支持多模态识别功能,但我有文件上传功能,可以帮你处理图像、txt、pdf、ppt、word、excel等文件,并从中读取文字信息进行分析处理。我完全免费使用,拥有128K的上下文长度,还支持联网搜索(需要你在Web/App中手动点开联网搜索按键)。 你可以通过官方应用商店下载我的App来使用。我很乐意帮助你解答问题、处理文档、进行对话交流等等! 有什么我可以帮你的吗?无论是学习、工作还是日常生活中的问题,我都很愿意协助你!✨

四、实战进阶:流式响应与可视化界面优化

前面使用SpringAI 快速整合DeepSeek,实现了与大模型对话的功能,但是,这个项目存在两个不足:
1. 无可视化交互界面;
2. AI 响应为一次性返回,缺乏实时感。下面对项目进行优化升级。
Step 1:实现流式返回接口

在ChatController 中,创建新接口/ai/chatStream接口。

@PostMapping("/chatStream")publicSseEmitterchatStream(@RequestBodyChatRequest chatRequest){SseEmitter emitter =newSseEmitter(Long.MAX_VALUE);Flux<String> stream = chatModel.stream(chatRequest.getMessage()); stream.subscribe( chunk ->{try{ChatResponse chatResponse =newChatResponse(); chatResponse.setResponse(chunk); chatResponse.setCode(200); chatResponse.setMessage("streaming");String json = objectMapper.writeValueAsString(chatResponse); emitter.send(SseEmitter.event().data(json).build());}catch(IOException e){ emitter.completeWithError(e);}}, error ->{ emitter.completeWithError(error);},()->{ emitter.complete();});return emitter;}

Step 2:创建可视化聊天界面
为了更直观地与模型交互,我们可以在 src/main/resources/static 目录下创建 index.html,实现简单的聊天界面:

<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>AI 聊天助手(流式响应)</title><style>*{ margin:0; padding:0; box-sizing: border-box;} body { font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial, sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); height:100vh; display: flex; justify-content: center; align-items: center;}.chat-container { width:800px; height:600px; background: white; border-radius:16px; box-shadow:020px 60px rgba(0,0,0,0.3); display: flex; flex-direction: column; overflow: hidden;}.chat-header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding:20px; color: white;}.chat-header h1 { font-size:24px; font-weight:600;}.chat-header p { font-size:14px; opacity:0.9; margin-top:5px;}.chat-messages { flex:1; padding:20px; overflow-y: auto; background: #f5f5f5;}.message { margin-bottom:16px; display: flex; align-items: flex-start;}.message.user { justify-content: flex-end;}.message.assistant { justify-content: flex-start;}.message-content { max-width:70%; padding:12px 16px; border-radius:12px; line-height:1.5; word-wrap:break-word;}.message.user .message-content { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-bottom-right-radius:4px;}.message.assistant .message-content { background: white; color: #333; border-bottom-left-radius:4px; box-shadow:02px 8px rgba(0,0,0,0.1);}.chat-input-container { padding:20px; background: white; border-top:1px solid #e0e0e0;}.chat-input-form { display: flex; gap:12px;} #messageInput { flex:1; padding:12px 16px; border:2px solid #e0e0e0; border-radius:24px; font-size:16px; outline: none; transition: border-color 0.3s;} #messageInput:focus { border-color: #667eea;} #sendButton { padding:12px 32px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; border-radius:24px; font-size:16px; font-weight:600; cursor: pointer; transition: transform 0.2s, box-shadow 0.2s;} #sendButton:hover { transform:translateY(-2px); box-shadow:04px 12px rgba(102,126,234,0.4);} #sendButton:active { transform:translateY(0);} #sendButton:disabled { background: #ccc; cursor: not-allowed; transform: none;}.typing { display: inline-block; padding:8px 12px;}.typing::after{ content:'...'; animation: typing 1.5s steps(4, end) infinite;}@keyframes typing {0%,100%{ content: '';}25%{ content:'.';}50%{ content:'..';}75%{ content:'...';}}.welcome-message { text-align: center; color: #666; padding:40px 20px;}.welcome-message h2 { font-size:20px; margin-bottom:10px; color: #333;}.welcome-message p { font-size:14px;}</style></head><body><div class="chat-container"><div class="chat-header"><h1>AI 聊天助手</h1><p>基于 Spring AI 和 DeepSeek 的智能对话系统(流式响应)</p></div><div class="chat-messages" id="chatMessages"><div class="welcome-message"><h2>欢迎使用 AI 聊天助手!</h2><p>请在下方输入您的问题,我会尽力为您解答。</p></div></div><div class="chat-input-container"><form class="chat-input-form" id="chatForm"><input type="text" id="messageInput" placeholder="输入您的问题..." autocomplete="off" required><button type="submit" id="sendButton">发送</button></form></div></div><script>const chatMessages = document.getElementById('chatMessages');const chatForm = document.getElementById('chatForm');const messageInput = document.getElementById('messageInput');const sendButton = document.getElementById('sendButton');const welcomeMessage = document.querySelector('.welcome-message');// 移除欢迎消息 function removeWelcomeMessage(){if(welcomeMessage){ welcomeMessage.remove();}}// 添加消息到聊天界面 function addMessage(content, isUser =false){removeWelcomeMessage();const messageDiv = document.createElement('div'); messageDiv.className = `message ${isUser ?'user': 'assistant'}`;const messageContent = document.createElement('div'); messageContent.className = 'message-content'; messageContent.textContent = content; messageDiv.appendChild(messageContent); chatMessages.appendChild(messageDiv);// 滚动到底部 chatMessages.scrollTop = chatMessages.scrollHeight;}// 添加加载消息 function addLoadingMessage(){removeWelcomeMessage();const messageDiv = document.createElement('div'); messageDiv.className = 'message assistant'; messageDiv.id = 'loadingMessage';const messageContent = document.createElement('div'); messageContent.className = 'message-content typing'; messageContent.textContent = 'AI 正在思考'; messageDiv.appendChild(messageContent); chatMessages.appendChild(messageDiv); chatMessages.scrollTop = chatMessages.scrollHeight;}// 移除加载消息 function removeLoadingMessage(){const loadingMessage = document.getElementById('loadingMessage');if(loadingMessage){ loadingMessage.remove();}}// 发送消息(流式响应) async function sendMessage(message){addMessage(message,true);addLoadingMessage(); sendButton.disabled =true; messageInput.disabled =true;try{const response = await fetch('/ai/chatStream',{ method:'POST', headers:{ 'Content-Type': 'application/json',}, body: JSON.stringify({ message: message })});if(!response.ok){thrownewError('网络请求失败');}removeLoadingMessage();// 创建一个新的消息容器用于显示流式响应const messageDiv = document.createElement('div'); messageDiv.className = 'message assistant'; messageDiv.id = 'currentStreamMessage';const messageContent = document.createElement('div'); messageContent.className = 'message-content'; messageContent.textContent = ''; messageDiv.appendChild(messageContent); chatMessages.appendChild(messageDiv); chatMessages.scrollTop = chatMessages.scrollHeight;// 处理流式响应const reader = response.body.getReader();const decoder =newTextDecoder(); let fullText = '';while(true){const{ done, value }= await reader.read();if(done)break;// 解码并解析数据const chunk = decoder.decode(value,{ stream:true});// 尝试解析 JSON 行const lines = chunk.split('\n').filter(line => line.trim());for(const line of lines){try{// 移除可能的数据前缀(如 "data:")const cleanLine = line.replace(/^data:\s*/, '').trim();if(!cleanLine)continue;const jsonStr = cleanLine.replace(/,$/, '').trim();const data = JSON.parse(jsonStr);if(data.response){ fullText += data.response; messageContent.textContent = fullText; chatMessages.scrollTop = chatMessages.scrollHeight;}elseif(data.reply){ fullText += data.reply; messageContent.textContent = fullText; chatMessages.scrollTop = chatMessages.scrollHeight;}}catch(e){ console.warn('解析 JSON 失败:', e, line);// 如果解析失败,尝试直接显示文本if(chunk.trim()){ fullText += chunk; messageContent.textContent = fullText; chatMessages.scrollTop = chatMessages.scrollHeight;}}}}// 移除当前消息的 ID 标记if(messageDiv){ messageDiv.removeAttribute('id');}}catch(error){removeLoadingMessage();addMessage('抱歉,发生了错误:' + error.message,false);}finally{ sendButton.disabled =false; messageInput.disabled =false; messageInput.focus();}}// 表单提交 chatForm.addEventListener('submit', async (e)=>{ e.preventDefault();const message = messageInput.value.trim();if(!message)return; messageInput.value = ''; await sendMessage(message);});// 页面加载时聚焦输入框 messageInput.focus();</script></body></html>

Step 3:启动并测试
重启项目后,访问 http://localhost:8080,即可通过可视化界面与 AI 聊天,例如输入 “你好”,模型会流式返回。

在这里插入图片描述

总结

本文我们从 Spring AI 的核心概念出发,详细介绍了它的 7 大核心特性,并通过一个完整的 Deepseek 对话案例,带大家完成了环境搭建、依赖配置、代码编写与测试的全流程。Spring AI 的核心优势在于 “原生集成 Spring 生态” 与 “统一抽象接口”,让 Java 开发者无需跨生态就能快速接入 AI 能力,极大降低了 AI 应用的开发门槛。

Read more

【大模型实战篇】基于Claude MCP协议的智能体落地示例

【大模型实战篇】基于Claude MCP协议的智能体落地示例

1. 背景         之前我们在《MCP(Model Context Protocol) 大模型智能体第一个开源标准协议》一文中,介绍了MCP的概念,虽然了解了其概念、架构、解决的问题,但还缺少具体的示例,来帮助进一步理解整套MCP框架如何落地。         今天我们基于claude的官方例子--获取天气预报【1】,来理解MCP落地的整条链路。 2. MCP示例         该案例是构建一个简单的MCP天气预报服务器,并将其连接到主机,即Claude for Desktop。从基本设置开始,然后逐步发展到更复杂的使用场景。         大模型虽然能力非常强,但其弊端就是内容是过时的,这里的过时不是说内容很旧,只是表达内容具有非实时性。比如没有获取天气预报和严重天气警报的能力。因此我们将使用MCP来解决这一问题。         构建一个服务器,该服务器提供两个工具:获取警报(get-alerts)和获取预报(get-forecast)。然后,将该服务器连接到MCP主机(在本例中为Claude for Desktop)。         首先我们配置下环

By Ne0inhk
AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建

AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建

AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建 作者:高瑞冬 本文目录 * AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建 * 一、MCP协议简介 * 二、创建MCP工具集 * 1. 获取MCP服务地址 * 2. 在FastGPT中创建MCP工具集 * 三、测试MCP工具 * 四、AI模型调用MCP工具 * 1. 调用单个工具 * 2. 调用整个工具集 * 五、私有化部署支持 * 1. 环境准备 * 2. 修改docker-compose.yml文件 * 3. 修改FastGPT配置 * 4. 重启服务 * 六、使用MCP-Proxy集成多个MCP服务 * 1. MCP-Proxy简介 * 2. 安装MCP-Proxy * 3. 配置MCP-Proxy * 4. 将MCP-Proxy与FastGPT集成 * 5. 高级配置

By Ne0inhk
基于腾讯云HAI + DeepSeek快速设计自己的个人网页

基于腾讯云HAI + DeepSeek快速设计自己的个人网页

前言:通过结合腾讯云HAI 强大的云端运算能力与DeepSeek先进的 AI技术,本文介绍高效、便捷且低成本的设计一个自己的个人网页。你将了解到如何轻松绕过常见的技术阻碍,在腾讯云HAI平台上快速部署DeepSeek模型,仅需简单几步,就能获取一个包含个人简介、技能特长、项目经历及联系方式等核心板块的响应式网页。 目录 一、DeepSeek模型部署在腾讯云HAI 二、设计个人网页 一、DeepSeek模型部署在腾讯云HAI 把 DeepSeek 模型部署于腾讯云 HAI,用户便能避开官网访问限制,直接依托腾讯云 HAI 的超强算力运行 DeepSeek-R1 等模型。这一举措不仅降低了技术门槛,还缩短了部署时间,削减了成本。尤为关键的是,凭借 HAI 平台灵活且可扩展的特性,用户能够依据自身特定需求定制专属解决方案,进而更出色地适配特定业务场景,满足各类技术要求 。 点击访问腾讯云HAI控制台地址: 算力管理 - 高性能应用服务 - 控制台 腾讯云高性能应用服务HAI已支持DeepSeek-R1模型预装环境和CPU算力,只需简单的几步就能调用DeepSeek - R1

By Ne0inhk
AI革命先锋:DeepSeek与蓝耘通义万相2.1的无缝融合引领行业智能化变革

AI革命先锋:DeepSeek与蓝耘通义万相2.1的无缝融合引领行业智能化变革

云边有个稻草人-ZEEKLOG博客 目录 引言 一、什么是DeepSeek? 1.1 DeepSeek平台概述 1.2 DeepSeek的核心功能与技术 二、蓝耘通义万相2.1概述 2.1 蓝耘科技简介 2.2 蓝耘通义万相2.1的功能与优势 1. 全链条智能化解决方案 2. 强大的数据处理能力 3. 高效的模型训练与优化 4. 自动化推理与部署 5. 行业专用解决方案 三、蓝耘通义万相2.1与DeepSeek的对比分析 3.1 核心区别 3.2 结合使用的优势 四、蓝耘注册流程 五、DeepSeek与蓝耘通义万相2.1的集成应用 5.1 集成应用场景 1. 智能医疗诊断

By Ne0inhk