Spring AI 实战|Spring AI入门之DeepSeek调用

简介: 本文介绍了Spring AI框架如何帮助Java开发者轻松集成和使用大模型API。文章从Spring AI的初探开始,探讨了其核心能力及应用场景,包括手动与自动发起请求、流式响应实现打字机效果,以及兼容不同AI服务(如DeepSeek、通义千问)的方法。同时,还详细讲解了如何在生产环境中添加监控以优化性能和成本管理。通过Spring AI,开发者可以简化大模型调用流程,降低复杂度,为企业智能应用开发提供强大支持。最后,文章展望了Spring AI在未来AI时代的重要作用,鼓励开发者积极拥抱这一技术变革。

引言:当Spring遇上AI,会擦出怎样的火花?

作为一名Java开发者,是否曾经眼红Python阵营那些花里胡哨的AI应用?是否在对接各种大模型API时,被五花八门的接口规范搞得头大?好消息是,Spring家族的新成员——Spring AI,正在用Java开发者最熟悉的方式,为我们打开AI应用开发的新世界大门。


一、Spring AI初探 - 你的AI管家

1.1 为什么需要Spring AI?

场景假设

  • 你的老板说:"我们要做个智能客服,先用OpenAI,下个月换Claude,年底可能用Gemini..."
  • 产品经理要求:"这个AI回答要能直接转成我们的领域对象"
  • 运维大哥抱怨:"AI调用太慢了,能不能给个监控看板?"

解决方案

将Spring AI框架集成到应用当中,它是一个专注于AI工程的应用框架;旨在将Spring生态的设计原则(如可移植性、模块化)引入AI领域,简化企业数据或者API服务与大模型的集成,将大模型的调用通过普通Java对象来封装,降低开发复杂度‌,从而高效构建企业智能应用。

// 不管底层是哪个AI服务,调用方式都一样
String joke = aiClient.generate("讲个程序员笑话");

1.2 核心能力

二、实战DeepSeek - 从手动到自动

2.1 手动执行请求

API-KEY的获取

进入DeepSeek开放平台 https://platform.deepseek.com/usage,完成账号的注册与充值(开发学习时可以少充一点费用),点击 API keys创建个人专属API key 并保存下来。

curl手动执行

填写上正确的Key后执行curl发起Http请求,快速得到响应结果。

curl https://api.deepseek.com/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <DeepSeek API Key>" \
  -d '{
        "model": "deepseek-chat",
        "messages": [
          {"role": "system", "content": "You are a helpful assistant."},
          {"role": "user", "content": "讲一个笑话"}
        ],
        "stream": false
      }'
{
  "id": "0e8dd4b9-694e-417b-888a-7be54a77633f",
  "object": "chat.completion",
  "created": 1742744584,
  "model": "deepseek-chat",
  "choices":
  [
    {
      "index": 0,
      "message":
      {
        "role": "assistant",
        "content": "当然!这是一个经典的笑话:\n\n有一天,小明去面试。面试官问他:“你有什么特长吗?”\n\n小明想了想,认真地说:“我会预测未来。”\n\n面试官笑了笑:“那你预测一下,你什么时候能被录用?”\n\n小明淡定地回答:“这个嘛……我预测我不会被录用。”\n\n面试官愣了一下,笑着说:“你被录用了!我们需要你这样的人才!”\n\n😄"
      },
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage":
  {
    "prompt_tokens": 12,
    "completion_tokens": 74,
    "total_tokens": 86,
    "prompt_tokens_details":
    {
      "cached_tokens": 0
    },
    "prompt_cache_hit_tokens": 0,
    "prompt_cache_miss_tokens": 12
  },
  "system_fingerprint": "fp_3a5770e1b4_prod0225"
}

返回数据以JSON格式,解析格式中的content内容得到为大模型给我们讲的笑话。

2.2 代码自动发起

创建第一个Spring AI工程

访问 https://start.spring.io/按截图所示勾选依赖,生成代码框架。

Spring Boot 3.x

JDK 17+

spring-ai-openai-starter(是的,它能兼容DeepSeek)

将生成的代码导入到IDEA中,启动应用。

很遗憾,竟然没有启动起来,出现一个OpenAI API key must be set. Use the connection property: spring.ai.openai.api-key or spring.ai.openai.chat.api-key property的错误。

很明显是没有配置对应的API key,打开application.properties进入参数配置后发现启动成功。

配置application.properties

spring.application.name=hello

spring.ai.openai.api-key=换成个人的DeepSeek API key

spring.ai.openai.base-url=https://api.deepseek.com

spring.ai.openai.chat.options.model=deepseek-chat

编写Controller

@RestController
publicclassHelloController {

    private ChatClient chatClient;

    publicHelloController(ChatClient.Builder builder){
        this.chatClient = builder.build();
    }
    @GetMapping("/hello")
    public String hello(@RequestParam(value = "input", defaultValue = "讲一个笑话") String input){

        return chatClient.prompt(input).call().content();

    }
}

打开浏览器访问 http://localhost:8080/hello得到结果。

三、流式响应-打字机效果

3.1 Reactor初体验

通常大模型的响应耗时较长,为了优化用户体验,ChatGPT等厂商纷纷采用流式输出;我们可以通过Reactor框架来实现,它是一个响应式编程库,提供构建异步和非阻塞应用程序的能力。

private ExecutorService executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MICROSECONDS, new LinkedBlockingQueue<>(10));

@GetMapping(value = "/mock/stream", produces = "text/html;charset=UTF-8")
public Flux<String> mockStream(){

    Sinks.Many<String> sink = Sinks.many().multicast().onBackpressureBuffer();

    executor.submit(() -> {
        for (int i = 0; i < 100; i++) {

            sink.tryEmitNext(i + " ");
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                thrownew RuntimeException(e);
            }
        }
    });

    return sink.asFlux();
}

Sinks.Many 用于创建多值(Multi-Value)的发布者(Publisher)的一种机制,它允许用户将数据从一个地方发送到多个订阅者,示例中启动异步线程做写入操作,通过asFlux获取Flux对象;启动看效果:

3.2 大模型的流式输出

@GetMapping(value = "/hello/stream", produces = "text/html;charset=UTF-8")
    public Flux<String> helloStream(@RequestParam(value = "input", defaultValue = "讲一个笑话") String input){

        return chatClient.prompt(input).stream().content();

    }

把前面的call方法修改为stream即可,最终返回一个Flux对象,搞定流式输出~

四、OpenAI的starter兼容DeepSeek?

DeepSeek

观察pom.xml文件发现配置的是spring-ai-openai-starter却配置DeepSeek的URL,是不是觉得有点魔幻?

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

其实这是Spring AI的"障眼法":

1.OpenAI的API规范已成为事实标准;

2.DeepSeek等国内服务兼容这套规范;

3.Spring AI利用"可移植API"设计,实现一套代码多处使用;

就像JDBC驱动可以连接不同数据库,Spring AI的客户端也能适配不同AI服务。

通义千问

类似的,阿里系通义大模型也同样适用OpenAI这套访问规范。

https://bailian.console.aliyun.com/?tab=model#/api-key创建个人专属API-KEY(有免费的额度)。

application.properties修改配置:

spring.ai.openai.api-key=sk-xxx

spring.ai.openai.base-url=https://dashscope.aliyuncs.com/compatible-mode
# 指定模型
spring.ai.openai.chat.options.model=qwen-plus

五、生产环境必备 - 给你的AI装上监控

老板问:"AI花了多少钱?效果怎么样?" ,不用慌,可以通过监控来解决。

添加监控依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

启动监控

management.endpoints.web.exposure.include=health,metrics,prometheus
spring.ai.observability.enabled=true

访问/actuator/prometheus,将看到:(如果配合grafana可视化效果会更加直观)。

结语:未来以来

Spring AI的出现,为Java开发者提供一整套大模型应用研发基础底座,为众多Java生态企业级的应用迈向AI领域开辟一条航向; AI时代已然到来,让我们一起扬帆起航~~~



来源  |  阿里云开发者公众号

作者  |  布乙

相关文章
|
19天前
|
人工智能 Java Nacos
Spring AI Alibaba + Nacos 动态 MCP Server 代理方案
本文介绍如何通过 Spring AI Alibaba MCP 模块,基于 Nacos 的服务注册信息,实现将现有服务无缝转换为 MCP 协议的服务。方案无需修改原有业务代码,支持动态新增或删除 MCP 服务。
723 37
|
8天前
|
人工智能 程序员 应用服务中间件
何谓AI编程建官网实战【01】AI编程企业官网建设实践-以优雅草星云智控为例-优雅草卓伊凡
何谓AI编程建官网实战【01】AI编程企业官网建设实践-以优雅草星云智控为例-优雅草卓伊凡
25 1
何谓AI编程建官网实战【01】AI编程企业官网建设实践-以优雅草星云智控为例-优雅草卓伊凡
|
9天前
|
人工智能 自然语言处理 数据可视化
DeepSeek+Coze:普通人也能轻松搭建AI智能体的完整指南优雅草卓伊凡
DeepSeek+Coze:普通人也能轻松搭建AI智能体的完整指南优雅草卓伊凡
128 1
DeepSeek+Coze:普通人也能轻松搭建AI智能体的完整指南优雅草卓伊凡
|
15天前
|
人工智能 安全 Shell
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
Jupyter MCP服务器基于模型上下文协议(MCP),实现大型语言模型与Jupyter环境的无缝集成。它通过标准化接口,让AI模型安全访问和操作Jupyter核心组件,如内核、文件系统和终端。本文深入解析其技术架构、功能特性及部署方法。MCP服务器解决了传统AI模型缺乏实时上下文感知的问题,支持代码执行、变量状态获取、文件管理等功能,提升编程效率。同时,严格的权限控制确保了安全性。作为智能化交互工具,Jupyter MCP为动态计算环境与AI模型之间搭建了高效桥梁。
71 2
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
|
8天前
|
Java 关系型数据库 MySQL
【Spring】【事务】初学者直呼学会了的Spring事务入门
本文深入解析了Spring事务的核心概念与使用方法。Spring事务是一种数据库事务管理机制,通过确保操作的原子性、一致性、隔离性和持久性(ACID),维护数据完整性。文章详细讲解了声明式事务(@Transactional注解)和编程式事务(TransactionTemplate、PlatformTransactionManager)的区别与用法,并探讨了事务传播行为(如REQUIRED、REQUIRES_NEW等)及隔离级别(如READ_COMMITTED、REPEATABLE_READ)。
72 1
|
8天前
|
人工智能 Java 决策智能
Spring AI Alibaba Graph:多智能体框架实践
Spring AI Alibaba 是一个面向 Java 开发者的开源人工智能框架,旨在简化 AI 应用开发。本文重点介绍其 Graph 组件,用于解决工作流与多智能体协作问题。Graph 组件通过声明式编程接口,提供统一的上下文管理、消息记忆、人工确认节点等功能,支持复杂 AI 应用的构建。
|
9天前
|
人工智能 搜索推荐 算法
深度剖析:AI 建站的现状、局限与未来展望-AI编程建站实战系列预告优雅草卓伊凡
深度剖析:AI 建站的现状、局限与未来展望-AI编程建站实战系列预告优雅草卓伊凡
20 0
深度剖析:AI 建站的现状、局限与未来展望-AI编程建站实战系列预告优雅草卓伊凡
|
19天前
|
存储 机器学习/深度学习 人工智能
多模态RAG实战指南:完整Python代码实现AI同时理解图片、表格和文本
本文探讨了多模态RAG系统的最优实现方案,通过模态特定处理与后期融合技术,在性能、准确性和复杂度间达成平衡。系统包含文档分割、内容提取、HTML转换、语义分块及向量化存储五大模块,有效保留结构和关系信息。相比传统方法,该方案显著提升了复杂查询的检索精度(+23%),并支持灵活升级。文章还介绍了查询处理机制与优势对比,为构建高效多模态RAG系统提供了实践指导。
188 0
多模态RAG实战指南:完整Python代码实现AI同时理解图片、表格和文本
|
1月前
|
开发框架 人工智能 Java
破茧成蝶:阿里云应用服务器让传统 J2EE 应用无缝升级 AI 原生时代
本文详细介绍了阿里云应用服务器如何助力传统J2EE应用实现智能化升级。文章分为三部分:第一部分阐述了传统J2EE应用在智能化转型中的痛点,如协议鸿沟、资源冲突和观测失明;第二部分展示了阿里云应用服务器的解决方案,包括兼容传统EJB容器与微服务架构、支持大模型即插即用及全景可观测性;第三部分则通过具体步骤说明如何基于EDAS开启J2EE应用的智能化进程,确保十年代码无需重写,轻松实现智能化跃迁。
245 39
|
16天前
|
人工智能 数据挖掘
🔔阿里云百炼智能体和工作流可以发布为组件了,AI应用变成“搭积木”
本文介绍了如何通过智能体组件化设计快速生成PPT。首先,创建一个“PPT大纲生成”智能体并发布为组件,该组件可根据用户输入生成结构清晰的大纲。接着,在新的智能体应用中调用此组件与MCP服务(如ChatPPT),实现从大纲到完整PPT的自动化生成。整个流程模块化、复用性强,显著降低AI开发门槛,提升效率。非技术人员也可轻松上手,满足多样化场景需求。
🔔阿里云百炼智能体和工作流可以发布为组件了,AI应用变成“搭积木”