上一篇我们用 DeepSeek 写出了第一个 AI 对话接口。今天来验证 Spring AI 最核心的价值:一次编写,到处接入

如果你跟着上一篇的教程一路走下来,现在你的项目里应该有一个 /chat 接口,调用的是 DeepSeek。现在老板说:“咱们要换个模型,用 OpenAI 的 ChatGPT。” 你的第一反应可能是:要改代码?要换依赖?要重新看文档?

答案是:都不用。改两行配置就够了。

这就是 Spring AI 的抽象魅力。今天我们会用同一套代码,接入 OpenAI ChatGPT,体验模型切换零成本的快感,同时加深对 Spring AI 统一 API 的理解。

一、为什么可以无缝切换?

先回想一下上一篇的依赖:

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

这个 starter 的名字里有 “openai”,但我们在上一篇用它接了 DeepSeek。原因很简单:DeepSeek、通义千问、月之暗面等大量模型提供商的 API,都兼容 OpenAI 的接口格式。 Spring AI 正是利用这一点,把 “openai” 这个 starter 做成了一个 通用的 HTTP 客户端,通过配置不同的 base-urlapi-key 就能接入任何兼容 OpenAI 格式的服务。

你可以这样理解:

  • spring-ai-starter-model-openai 是一个万能遥控器。
  • base-url 是你要遥控的电视品牌(DeepSeek、OpenAI、通义千问……)。
  • api-key 是遥控器的电池,没它不行。

今天我们只是把遥控器指向另一个品牌的电视,其他什么都不用动。

二、环境准备:只需要一个 OpenAI API Key

2.1 获取 OpenAI API Key

访问 platform.openai.com/api-keys,登录后创建一个新的 API Key。

注意:OpenAI 对新用户的免费额度政策经常变化,目前通常需要绑定信用卡或预充值才能使用。如果你暂时没有条件,可以继续使用 DeepSeek 或其他国内模型,本文的知识点完全一样。你也可以用通义千问、Moonshot 等来替代体验——它们的接入方式几乎完全相同。

2.2 修改配置文件

打开 src/main/resources/application.yml,把 DeepSeek 的配置注释掉,换上 OpenAI 的:

spring:
  application:
    name: spring-ai-hello-world

  ai:
    openai:
      # 切换为 OpenAI
      api-key: ${OPENAI_API_KEY}            # 注意环境变量名也换了
      base-url: https://api.openai.com      # OpenAI 官方地址
      chat:
        options:
          model: gpt-4.1                    # 或 gpt-4o、gpt-4.1-mini 等
          temperature: 0.7

如果你想把两个配置都留着方便随时切换,可以用 Spring 的多环境配置(application-deepseek.ymlapplication-openai.yml),但这不属于今天的重点,暂时不展开。

2.3 设置新的环境变量

同样,不要把 Key 硬编码在文件里。在操作系统中设置:

# Mac / Linux
export OPENAI_API_KEY=sk-proj-你的密钥

# Windows PowerShell
$env:OPENAI_API_KEY="sk-proj-你的密钥"

如果使用 IDEA,记得在 Run Configuration 中更新环境变量。

三、代码:完全不动一行

这就是最令人舒适的地方——我们上一篇写的 ChatController 不需要做任何修改。直接放上上一篇的代码来重温一下:

package com.example.springaihelloworld;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ChatController {

    private final ChatClient chatClient;

    public ChatController(ChatClient chatClient) {
        this.chatClient = chatClient;
    }

    @GetMapping("/chat")
    public String chat(@RequestParam(defaultValue = "你好,请介绍一下你自己") String message) {
        return chatClient
                .prompt()
                .user(message)
                .call()
                .content();
    }
}

启动类也完全一样。代码零改动,模型全切换。 这就是 Spring AI 的抽象层带来的最大收益——你的业务逻辑依赖的是 ChatClient 接口,而不是具体的 DeepSeek 或 OpenAI 实现。

四、运行与演示:验证切换成功

4.1 启动项目

在 IDEA 中直接运行,或者 mvn spring-boot:run

4.2 测试接口

浏览器访问:

http://localhost:8080/chat?message=你是什么模型?

如果配置正确,你会得到类似这样的回复:

我是基于 OpenAI 的 GPT-4.1 模型构建的 AI 助手……

再试一个:

http://localhost:8080/chat?message=讲一个关于 Java 的笑话

一切都和上一篇一样流畅,只是背后的“大脑”换成了 ChatGPT。

4.3 体验差异:对比一下两个模型的回答风格

你可以用同一个问题分别测试 DeepSeek 和 ChatGPT(通过切换配置重启项目),直观感受不同模型在语气、详略、逻辑上的差异。例如问:“请解释一下面向对象编程的三大特性。”

这能帮助你理解:Spring AI 让你从“怎么接入不同模型”的繁琐细节中解脱出来,把精力放回“如何用好 AI”上。

五、常见问题与避坑提示

问题一:404 Not Found 或 “model not found”

org.springframework.ai.retry.NonTransientAiException: 404 The model `gpt-4.1` does not exist

原因:模型名写错了,或者你账号没有该模型的访问权限。

解决

  • 确认模型名正确。常见的可用模型包括 gpt-4.1gpt-4.1-minigpt-4o 等。可以查阅 OpenAI 官方文档的模型列表。
  • 如果是新注册的账号,某些模型可能需要申请权限才能使用。换成 gpt-4.1-mini 试试,这个一般都能用。

问题二:429 Too Many Requests

429 You exceeded your current quota

原因:免费额度用完了,或者请求太频繁触发了速率限制。

解决

  • 检查 OpenAI 账户的 usage 页面,确认是否还有余额。
  • 降低调用频率,或在代码中增加重试逻辑(后续文章会讲)。

问题三:API Key 前缀问题

OpenAI 的 API Key 通常以 sk-proj-sk- 开头。如果 Key 复制漏了前缀或者多了空格,会报 401 错误。和上一篇排查 401 的思路完全一样。

问题四:网络连接问题

国内环境直连 api.openai.com 可能会不稳定或超时。如果你遇到 Connection timed out,可以考虑:

  • 使用代理,并在 application.yml 中配置 proxy-url(上一篇文章提过)。
  • 或者继续使用国内可直连的模型(DeepSeek、通义千问等)来学习,知识点完全相同。

六、进阶思考:多模型共存的场景

你可能会问:“如果我一个应用里想同时用多个模型怎么办?比如用 DeepSeek 做日常对话,用 GPT-4.1 做复杂推理。”

Spring AI 完全支持这种场景。你可以定义多个 ChatClient Bean,分别注入不同的配置。这个话题我们在后面的综合项目里会展开实战,现在先留个印象:统一抽象的威力不止于单模型切换,更在于多模型编排。

七、小结与下一步预告

本篇回顾

  • 复习了 spring-ai-starter-model-openai 的万能遥控器原理
  • 只修改 application.yml 中的 api-keybase-url,代码零改动
  • 成功将同一个 /chat 接口从 DeepSeek 切换为 ChatGPT
  • 加深了对 Spring AI 统一抽象层的理解

关键心法

改配置,不改代码 = Spring AI 的核心价值

下一步预告

下一篇,我们将深入 ChatClient 的内部世界,彻底掌握它的强大能力:

  • 同步调用与异步调用的区别和场景
  • 如何给 AI “预设角色”(让它扮演客服、翻译、代码审查员……)
  • 如何打印请求/响应日志,方便调试
  • ChatClient 与底层 ChatModel 的关系

这些都是构建真实 AI 应用的必备技能。下一篇见。


本系列博客基于 Spring AI 1.1.6 版本编写。建议在实际开发时查阅 Spring AI 官方文档 获取最新信息。OpenAI API 文档见 platform.openai.com/docs

Logo

AtomGit AI 社区提供模型库、数据集、Agent、Token等资源

更多推荐