Spring AI 实战:第一章、Spring AI入门之DeepSeek调用

目录(如果文章对您有一丢丢输入,请点赞、收藏、转发吧~)[源码]
开篇、大模型时代:我们正站在浪潮之巅
第一章、Spring AI入门之DeepSeek调用
第二章、Spring AI提示词之玩转AI占卜的艺术
第三章、Spring AI结构化输出之告别杂乱无章
第四章、Spring AI多模态之看图说话
第五章、Spring AI本地模型部署之省钱小能手
第六章、Spring AI源码浅析之一山可容二虎
第七章、Spring AI Advisor机制之记忆大师
第八章、Spring AI Tool Calling之与时俱进
第九章、Spring AI MCP之万站直通
第十章、Spring AI RAG之博学多才
第十一章、Spring AI Agent之知行合一

引言:当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 核心能力

分类

功能描述

多模型支持‌

支持主流AI模型提供商(如OpenAI、Anthropic、Google、Microsoft等),覆盖多种模型类型:

  • 聊天补全(Chat Completion)
  • 嵌入(Embedding)
  • 文本生成图像/语音(Text-to-Image/Text-to-Speech)
  • 音频转录(Audio Transcription)
  • 内容审核(Moderation)

统一API接口‌

  • 提供跨AI厂商的‌便携式API‌(同步与流式调用),支持模型特定功能扩展,降低厂商锁定风险。

结构化输出映射‌

  • 将AI模型输出直接映射为POJOs,简化数据解析流程

向量数据库集成‌

  • 支持主流向量数据库(如Redis、PostgreSQL/PGVector、MongoDB等),提供类SQL的元数据过滤API,增强检索灵活性。

工具与实时交互‌

  • 函数调用(Function Calling)‌: 允许AI模型调用客户端工具/函数,获取实时数据(如天气、股票信息)。

企业级支持‌

  • 可观测性(Observability)‌: 监控AI操作性能与行为。
  • 文档ETL框架‌: 数据预处理管道,支持文档注入与结构化处理。
  • 模型评估工具‌: 检测生成内容的准确性与合理性,防止“幻觉”响应。

开发者友好设计‌

  • ChatClient API‌: 类似Spring WebClient的流畅API,简化与AI模型的交互。
  • Advisors API‌: 封装常见生成式AI模式(如数据转换、模型适配),提升代码可复用性。
  • 对话记忆(Chat Memory)与RAG(检索增强生成)‌: 支持上下文记忆及结合外部数据的增强生成。

快速集成‌

  • Spring Boot自动配置与Starter依赖,通过start.spring.io快速选择AI模型或向量存储,简化项目搭建。

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

2.1 手动执行请求

API-KEY的获取

进入DeepSeek开放平台 DeepSeek ,完成账号的注册与充值(开发学习时可以少充一点费用),点击 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
public class HelloController {

    private ChatClient chatClient;

    public HelloController(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) {
                throw new 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这套访问规范。

百炼控制台 创建个人专属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时代已然到来,让我们一起扬帆起航~~~

### 集成 DeepSeek AI 服务到 Spring 框架 为了在 Spring 框架中集成并调用 DeepSeek AI 服务,开发者可以通过利用 Spring AI 提供的一系列工具和支持来实现这一目标。Spring AI 是由 Spring 团队推出的开源项目,专门用于简化人工智能技术与 Spring 应用之间的融合过程[^1]。 #### 准备工作 确保已经安装了必要的依赖项,并配置好 Maven 或 Gradle 构建文件以引入所需的库。对于想要使用 DeepSeek 的场景来说,如果当前无法访问在线的服务,则建议考虑本地部署该大模型来进行测试和发展目的[^2]。 #### 添加依赖 在 `pom.xml` 文件或者 build.gradle 中加入如下所示的相关依赖: 对于 Maven 用户: ```xml <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-core</artifactId> <version>${spring-ai.version}</version> </dependency> <!-- 如果需要其他特定于 DeepSeek 的组件 --> <dependency> <groupId>com.example.deepseek</groupId> <artifactId>deepseek-client</artifactId> <version>${deepseek.version}</version> </dependency> ``` 对于 Gradle 用户: ```groovy implementation 'org.springframework.ai:spring-ai-core:${springAiVersion}' // 若有额外需求可添加更多依赖 implementation 'com.example.deepseek:deepseek-client:${deepSeekClientVersion}' ``` #### 编写代码逻辑 创建一个简单的 REST 控制器用来演示如何通过 HTTP 请求向 DeepSeek 发送数据并接收响应结果。这里假设有一个名为 `DeepSeekService` 的类负责处理具体的业务逻辑操作。 ```java @RestController @RequestMapping("/api/deepseek") public class DeepSeekController { private final DeepSeekService deepSeekService; public DeepSeekController(DeepSeekService deepSeekService) { this.deepSeekService = deepSeekService; } @PostMapping("/analyze") public ResponseEntity<String> analyze(@RequestBody String inputText) throws Exception { try { // 使用 spring ai 统一 api 调用 deepseek 进行分析 String result = deepSeekService.analyze(inputText); return new ResponseEntity<>(result, HttpStatus.OK); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } } } ``` 上述例子展示了怎样构建一个基本的应用程序端点 `/api/deepseek/analyze` 来接受 POST 方法请求并将传入的数据传递给内部定义好的 `DeepSeekService` 实现对象进行进一步处理。 #### 测试应用 完成以上步骤之后就可以启动应用程序并对新建立起来的功能模块执行单元测试或是集成测试验证其正确性和稳定性了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liaokailin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值