
1. Java 到底能不能做 AI 开发先看 Spring AI 接入 OpenAI 兼容接口这件事Java 能不能做 AI 开发这个问题在团队里被问过很多次。我的判断是能而且对已经有 Spring Boot 工程的人来说接入成本比想象中低。核心检索词就三个——Spring AI、OpenAI 兼容接口、ChatClient。你只要把这三样串起来就能在一个已有工程里跑通一次真实对话而不是停留在“听说 Java 也能调大模型”。过去 Java 调大模型确实别扭。很多服务只给 HTTP 接口或者给一个非标准的 SDK字段命名、异常处理、流式返回各搞一套跟 Java 的面向对象习惯对不上。Spring AI 做的事情是把这些差异收敛成一套统一抽象ChatClient、Prompt、ChatResponse、流式 Flux换供应商时主要改配置而不是改业务代码。这一点对 Java 开发者很关键因为我们的工程里通常已经有分层、有依赖注入、有配置中心最怕的就是为了接一个模型把架构打散。这篇聚焦一个最小可验证目标在 Spring Boot 工程里配置 Base URL 与 API Key用 ChatClient 完成一次对话并打印响应。Base URL 指向 TaoToken 的 OpenAI 兼容入口API Key 在控制台生成。跑通之后你就能自己判断Java 做 AI 开发顺不顺手。适合谁有 Spring Boot 基础、想给现有接口加 AI 能力、又不想引入一堆非标准 SDK 的后端同学。下面从依赖坐标、application.yml、Controller 到 curl 验证一步步来。2. 前置准备TaoToken 的 Base URL、API Key 与模型 ID 怎么拿在写代码之前先把三件套准备好Base URL、API Key、Model ID。这三样在 Spring AI 里分别对应spring.ai.openai.base-url、spring.ai.openai.api-key、spring.ai.openai.chat.options.model。少一个都会在启动或请求时报错所以先确认清楚。Base URL 用https://taotoken.net/api这是 OpenAI 兼容入口Spring AI 的 openai starter 会在这个地址后面拼接/v1/chat/completions之类的路径。注意不要手动多加/v1否则会出现路径重复导致 404。API Key 到控制台创建地址是https://taotoken.net/console/api-keys创建后复制保存页面上通常只完整显示一次。Model ID 按你实际要用的模型填比如对话场景填一个 chat 类模型名具体以控制台或文档里列出的为准不要凭记忆写。如果你只是想先验证模型能不能通不想写代码可以先用模型对话页面发一条消息确认 Key 和模型名没问题再回到工程里配置。这个顺序能帮你把“Key 错”和“代码错”分开排查省很多时间。文档入口在https://taotoken.net/doc里面有各语言的接入示例Java 部分可以对照着看。注意API Key 不要硬编码进 Git 仓库。本地用环境变量线上用配置中心或密钥管理这是基本习惯。下面示例里我用${TAOTOKEN_API_KEY}占位你替换成自己的变量名即可。3. 可复制配置pom.xml 依赖坐标与 application.yml 片段先确认环境JDK 17 及以上Spring Boot 3.3.x 及以上。Spring AI 的 starter 对 Spring Boot 版本有要求版本太低会在自动装配阶段报类找不到。下面给出 Maven 依赖和 application.yml都是可以直接复制的片段。pom.xml 里加 Spring AI 的 OpenAI starter以及 Web starter如果你要写 Controller 暴露接口dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-openai-spring-boot-starter/artifactId version1.0.0-M6/version /dependency /dependencies版本号按你实际能拉到的里程碑版本调整M6 只是示例。如果拉不到检查是否需要加 Spring 的 milestone 仓库repositories repository idspring-milestones/id nameSpring Milestones/name urlhttps://repo.spring.io/milestone/url snapshots enabledfalse/enabled /snapshots /repository /repositories然后是 application.yml这是整篇最关键的配置片段路径和字段名要和 Spring AI 的约定一致spring: ai: openai: base-url: https://taotoken.net/api api-key: ${TAOTOKEN_API_KEY} chat: options: model: your-chat-model-id temperature: 0.7这里三个字段对应三件套base-url是 TaoToken 的 OpenAI 兼容入口api-key从环境变量注入model填你要用的模型 ID。temperature可选控制随机性验证阶段填 0.7 就行。启动前在终端里导出环境变量export TAOTOKEN_API_KEY你的KeyWindows PowerShell 用$env:TAOTOKEN_API_KEY你的Key。配置完成后Spring AI 会自动装配一个ChatClient.Builder你注入它就能构建ChatClient。这一步不需要你手写 HTTP 客户端也不需要自己拼 JSON这是 Spring AI 相对裸调接口最省事的地方。4. 写一个 Controller 并验证ChatClient 调用与 curl 请求结果配置好了写一个最小 Controller。注入ChatClient.Builder构建ChatClient暴露一个 GET 接口接收 input 参数调用模型并返回文本import org.springframework.web.bind.annotation.*; import org.springframework.ai.chat.client.ChatClient; RestController RequestMapping(/ai) public class ChatController { private final ChatClient chatClient; public ChatController(ChatClient.Builder builder) { this.chatClient builder.build(); } GetMapping(/chat) public String chat(RequestParam String input) { return chatClient.prompt() .user(input) .call() .content(); } }启动应用然后用 curl 验证curl http://localhost:8080/ai/chat?input用一句话说明Java能不能做AI开发如果一切正常你会看到模型返回的一段文本中文不乱码。这一步成功意味着Base URL 通了、API Key 有效、Model ID 正确、ChatClient 装配成功。四个环节任意一个错都会在这里暴露出来。如果你想验证流式输出把.call()换成.stream()返回类型改成FluxStringGetMapping(value /stream, produces text/event-stream;charsetUTF-8) public FluxString stream(RequestParam String input) { return chatClient.prompt() .user(input) .stream() .content(); }流式接口用 curl 加-N参数能看到逐块输出curl -N http://localhost:8080/ai/stream?input介绍一下Spring AI单元测试也可以验证用SpringBootTest注入ChatClient.Builder断言content()非空即可。实测下来非流式接口从请求到返回通常在几秒内流式则首块很快出现。跑通这一步Java 做 AI 开发这件事就有了可复现的答案而不是停留在讨论层面。5. 常见报错排查401、local proxy failed、reading choices 与 OAuth 报错接入阶段最容易卡在几个固定报错上这里按真实错误信息对照排查。401 Unauthorized最常见。原因通常是 API Key 没注入成功或者环境变量名和 yml 里的占位符不一致。先确认echo $TAOTOKEN_API_KEY有值再确认 yml 里写的是同一个变量名。还有一种情况是 Key 复制时带了空格或换行重新从控制台复制一次。local proxy failed / connection refused这类报错说明请求根本没发出去或者发到了错误地址。检查base-url是不是https://taotoken.net/api有没有多写/v1或少了/api。另外确认本机网络能正常访问该地址公司内网如果有出口限制需要走正常的网络配置不要用任何非正规手段。Error reading choices / choices is null请求发出去了但响应结构不符合预期。常见原因是 Model ID 填错或者 base-url 指向了一个不返回 OpenAI 标准结构的地址。回到 yml 确认model字段用模型对话页面先验证同一个模型名能不能通。OAuth / authentication 相关报错如果你用的是某些需要 OAuth 的客户端工具报错信息里会出现 OAuth 字样。Spring AI 走的是 API Key 模式不涉及 OAuth所以看到这类报错通常是配置串了检查是不是把别的工具的配置复制过来了。Codex 的auth.json、Cline 的 MCP 配置、CC Switch 这类工具各有自己的字段不要混用。排查顺序建议先 curl 直连验证 Key 和地址再跑 Spring Boot最后查代码。这样能把问题范围一步步缩小而不是一上来就怀疑框架。6. 跑通之后Java AI 开发的下一步与接入入口一次对话跑通说明链路是通的。接下来你可以做几件事把ChatClient封装成 Service加 Prompt 模板做参数化把流式接口接到前端做打字机效果用ChatMemory做多轮对话或者把模型调用嵌到已有的业务接口里比如自动生成摘要、分类、字段抽取。对长期做编码和 Agent 场景的团队可以考虑 Coding Plan把模型调用纳入日常开发流程需要验证不同模型效果时用模型对话页面快速对比接入文档在https://taotoken.net/docAPI Key 在https://taotoken.net/console/api-keys管理。Java 做 AI 开发顺不顺手跑通这一次之后你自己就有判断了。我的经验是Spring AI 把最烦的适配层收掉了剩下的就是业务逻辑这对 Java 团队来说反而是熟悉的战场。