中州养老项目接入百度千帆大模型
Spring Boot 项目接入百度千帆大模型openai-java SDK踩坑记录项目环境若依RuoYiv3.8.8 Spring Boot 2.5.15 JDK 11 Maven 多模块项目一、我想做什么需求很简单在项目中通过openai-javaSDK 调用百度千帆 V2 接口它兼容 OpenAI 协议实现一个流式对话——就是像 ChatGPT 那样回答一个字一个字地蹦出来。代码总共不到 30 行这篇博客把整个排错过程记录下来这些坑对于老项目 新 SDK的组合几乎是必踩的希望能帮你少走弯路。先给出最终能跑通的完整代码。二、最终成功的代码Maven 依赖子模块 pom.xml!-- OpenAI Java SDK --dependencygroupIdcom.openai/groupIdartifactIdopenai-java/artifactIdversion2.20.1/version/dependencyJava 代码packagecom.zzyl.common;importcom.openai.client.OpenAIClient;importcom.openai.client.okhttp.OpenAIOkHttpClient;importcom.openai.core.http.StreamResponse;importcom.openai.models.chat.completions.ChatCompletionChunk;importcom.openai.models.chat.completions.ChatCompletionCreateParams;importjava.util.function.Consumer;publicclassMain{publicstaticvoidmain(String[]args){OpenAIClientclientOpenAIOkHttpClient.builder()// ⚠️ 不要把真实 API Key 硬编码在代码里提交到仓库// 建议放到环境变量中读取。获取方式https://console.bce.baidu.com/iam/#/iam/apikey/list.apiKey(System.getenv(QIANFAN_API_KEY))// 形如 bce-v3/ALTAK-xxx/xxx.baseUrl(https://qianfan.baidubce.com/v2/)// 千帆 ModelBuilder 平台地址.build();ChatCompletionCreateParamsparamsChatCompletionCreateParams.builder().addUserMessage(你能做什么)// 对话内容.model(ernie-4.5-turbo-32k)// 可用模型列表可通过 GET https://qianfan.baidubce.com/v2/models 查询.build();StreamResponseChatCompletionChunkchatCompletionclient.chat().completions().createStreaming(params);ConsumerChatCompletionChunkconsumers-s.choices().stream().findFirst().flatMap(c-c.delta().content()).ifPresent(System.out::println);chatCompletion.stream().forEach(consumer);}} 安全提示博客/仓库中的代码永远不要出现真实 API Key。上面用System.getenv(QIANFAN_API_KEY)从环境变量读取本地运行前先设置环境变量即可IDEA 的 Run Configuration 里也可以配。如果 Key 不小心泄露了第一时间去控制台重置。三、第一类坑依赖版本被 Spring Boot “偷偷降级”现象编译全部通过一运行就报各种奇怪的错报错缺的东西Spring Boot 锁定的版本SDK 实际需要NoSuchFieldError: Companionokhttp 4.x 的 Kotlin 伴生对象okhttp3.14.9okhttp4.12.0NoSuchMethodError堆栈含MapperBuilderJackson 2.14 才有的withCoercionConfig()方法jackson-databind2.12.7Jackson2.16.2NoClassDefFoundError: kotlin/enums/EnumEntriesKtkotlin-stdlib 1.8.20 才有的类kotlin-stdlib1.5.32kotlin-stdlib1.9.25原因Spring Boot 的版本仲裁机制Spring Boot 项目继承或导入了一个叫spring-boot-dependencies的BOMBill of Materials依赖版本清单它把几百个常用库的版本都锁死了保证它们互相兼容。这本来是好事但问题在于Spring Boot 2.5 是 2021 年的版本它锁定的都是老版本。而 openai-java 是用 Kotlin 1.9 编译的现代 SDK需要新版的 okhttp / Jackson / kotlin-stdlib。于是你在 pom 里引入 openai-javaMaven 会把它依赖的 okhttp 4.x 一起下载但 Spring Boot 的 BOM 说“okhttp 必须用 3.14.9”于是 Maven 听 BOM 的把版本降下去了编译时不缺类编译只看方法签名大体存在运行时才发现类里少了字段/方法于是抛出NoSuchFieldError/NoSuchMethodError/NoClassDefFoundError“三兄弟”解决方案在父 pom 中抢先声明高版本 BOMMaven 的dependencyManagement有一个规则先声明者优先。所以只要在父 pom的dependencyManagement中、spring-boot-dependencies的前面导入高版本的 BOM就能覆盖 Spring Boot 的锁定dependencyManagementdependencies!-- ⚠️ 以下三个 BOM 必须声明在 spring-boot-dependencies 之前顺序很重要 --!-- 覆盖 Jackson 版本openai-java 需要 2.14 --dependencygroupIdcom.fasterxml.jackson/groupIdartifactIdjackson-bom/artifactIdversion2.16.2/versiontypepom/typescopeimport/scope/dependency!-- 覆盖 okhttp 版本openai-java 需要 4.x --dependencygroupIdcom.squareup.okhttp3/groupIdartifactIdokhttp-bom/artifactIdversion4.12.0/versiontypepom/typescopeimport/scope/dependency!-- 覆盖 kotlin-stdlib 版本openai-java 由 Kotlin 1.9 编译 --dependencygroupIdorg.jetbrains.kotlin/groupIdartifactIdkotlin-bom/artifactIdversion1.9.25/versiontypepom/typescopeimport/scope/dependency!-- spring-boot-dependencies 放在它们后面 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion2.5.15/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagement改完后一定要验证mvn dependency:tree-Dincludesorg.jetbrains.kotlin mvn dependency:tree-Dincludescom.squareup.okhttp3确认输出中的版本是你期望的新版本再重新运行。老 Spring Boot 项目 新 SDK遇到运行时三兄弟异常NoSuchFieldError / NoSuchMethodError / NoClassDefFoundError第一反应就是查依赖版本是不是被 BOM 降级了。okhttp、Jackson、kotlin-stdlib 是重灾区。四、第二类坑云平台的模型说下线就下线坑 5403 PermissionDeniedException: model_offline我最开始照着网上教程用的模型是deepseek-r1-distill-qianfan-70b直接报 403PermissionDeniedException: OpenAIError{error{codemodel_offline, messageThe model is offline}}意思很直白这个模型已经被平台下线了。坑 6401 UnauthorizedException: invalid_model于是我换成了另一个教程里常见的ernie-speed-8k结果又报 401UnauthorizedException: OpenAIError{error{codeinvalid_model, messageThe model does not exist or you do not have access to it}}这次是模型名根本不存在免费系列已整体下线。注意这个 401 很容易让人误以为是 API Key 错了其实 Key 没问题是模型名的问题。解决方案别抄教程里的模型名实时查询可用列表千帆提供了查询接口用自己的 API Key 请求一下就知道当前能用哪些模型PowerShell 示例Invoke-RestMethod-Urihttps://qianfan.baidubce.com/v2/models-Headers {Authorization Bearer 你的API Key}|%data|%id我实测2026 年 7 月可用的对话模型有ernie-4.5-turbo-32k、ernie-4.5-turbo-128k、ernie-5.0、deepseek-v3.2、kimi-k2.6、glm-5、qwen3.5-*系列等。最终选了ernie-4.5-turbo-32k。 初学者记忆点云平台的模型名是易变资源网上教程里的模型名很快会过时。写代码前先调 models 接口确认报 401/403 时先怀疑模型名别急着重置 Key。五、第三类坑所谓OpenAI 兼容并不是 100% 兼容最隐蔽的问题坑 7OpenAIInvalidDataException: choices is invalid依赖修好了、模型换对了满心欢喜地运行结果Exception in thread main com.openai.errors.OpenAIInvalidDataException: choices is invalid, received [{index0, delta{content你好, roleassistant}, flag0}]注意看报错里的内容模型其实已经成功回复了你好数据都拿到了却在 SDK 解析这一步挂掉了。排查过程绕过 SDK直接看原始 HTTP 响应排查这类问题有个很有用的思路把 SDK 甩开直接用 HTTP 工具请求接口看服务器到底返回了什么。我用 PowerShell 直接请求千帆的流式接口发现它返回的 chunk 和 OpenAI 官方规范有两处偏差choices 元素里缺少finish_reason字段OpenAI 规范中必须有可以为 null多了一个非标准的flag字段而且我对比了 ernie 系和 deepseek 系模型chunk 格式完全一样——说明换模型没用这是千帆平台的统一行为。问题出在 SDK 侧openai-java0.22.00.x 老版本会对响应做严格校验字段和规范对不上就直接抛异常。解决方案升级 openai-java 到 1.0我用的 2.20.11.0 之后的版本改成了宽松校验能容忍这种字段差异。但升级后有两处要跟着改① 包路径变了1.0 重构了包结构// 旧版0.ximportcom.openai.models.ChatCompletionChunk;importcom.openai.models.ChatCompletionCreateParams;// 新版1.0importcom.openai.models.chat.completions.ChatCompletionChunk;importcom.openai.models.chat.completions.ChatCompletionCreateParams;② 流式消费建议用空安全写法避免某些 chunk 的 content 为空时报错chatCompletion.stream().forEach(s-s.choices().stream().findFirst().flatMap(c-c.delta().content()).ifPresent(System.out::println)); 初学者记忆点“OpenAI 兼容” ≠ 100% 兼容。第三方平台的响应经常有字段增减。遇到 SDK 解析报错先绕过 SDK 抓原始 HTTP 响应对比确认是数据问题还是 SDK 问题再决定是升级 SDK 还是换调用方式。六、完整踩坑链路回顾① NoSuchFieldError: Companion → okhttp 被降级前置 okhttp-bom 4.12.0 ② NoSuchMethodError (MapperBuilder) → Jackson 被降级前置 jackson-bom 2.16.2 ③ NoClassDefFoundError: EnumEntriesKt → kotlin-stdlib 被降级前置 kotlin-bom 1.9.25 ④ 403 model_offline → 模型下线换模型 ⑤ 401 invalid_model → 换的模型也下线了GET /v2/models 查真实列表 ⑥ choices is invalid → 千帆 chunk 非标准 SDK 严格校验 升级 openai-java 0.22.0 → 2.20.1 并适配新包结构 ⑦ 最终运行成功流式输出模型回复 ✅七、结语编译通过 ≠ 能跑。运行时的NoSuchFieldError/NoSuchMethodError/NoClassDefFoundError几乎都是依赖版本冲突。看堆栈里缺的类/方法属于哪个库用mvn dependency:tree查它被解析成了什么版本、被谁锁定了。改依赖后要验证别凭感觉。每次改完 pom用mvn dependency:tree -Dincludesxxx确认版本真的变了IDEA 里记得 Reload Maven Project否则 IDE 还在用旧依赖。对接第三方服务时学会降到 HTTP 层排查。SDK 只是 HTTP 的封装当 SDK 行为诡异时用 Postman / curl / PowerShell 直接请求接口看原始响应很多玄学问题立刻现出原形。最后再强调一下安全问题API Key 千万不要硬编码进代码提交到 Git 仓库尤其是公开仓库用环境变量或配置中心管理万一泄露立刻去控制台重置。记录时间2026 年 7 月。文中模型可用性、SDK 版本均为当时实测读者实践时请以最新情况为准。

相关新闻

最新新闻

日新闻

周新闻

月新闻