无缝切换 ChatGPT:多模型接入就这么简单
上一篇我们用 DeepSeek 写出了第一个 AI 对话接口。。如果你跟着上一篇的教程一路走下来,现在你的项目里应该有一个/chat接口,调用的是 DeepSeek。现在老板说:“咱们要换个模型,用 OpenAI 的 ChatGPT。” 你的第一反应可能是:要改代码?要换依赖?要重新看文档?这就是 Spring AI 的抽象魅力。今天我们会用同一套代码,接入 OpenAI ChatGPT,体验模型
上一篇我们用 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-url 和 api-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.yml、application-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.1、gpt-4.1-mini、gpt-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-key和base-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。
更多推荐



所有评论(0)