Java AI集成实战:告别Spring AI Alibaba依赖

发布时间:2026/10/22 5:48:15
Java AI集成实战:告别Spring AI Alibaba依赖 1. 这不是“Java凉了”的哀悼现场而是一次技术选型的清醒复盘“Spring AI Alibaba已停更了Java还有希望吗”——看到这个标题我第一反应不是焦虑而是笑了。笑完马上打开IDEA新建了个空项目敲下public class HelloSpringAI {然后删掉。不是放弃是终于可以不带滤镜地看清楚我们到底在依赖什么又在担心什么这问题背后藏着三层真实焦虑第一层是开发者个体的饭碗焦虑怕学了一堆Spring生态的东西突然某天发现核心模块没人维护了第二层是团队技术决策者的路径焦虑投入人力做AI集成方案刚跑通POC官方宣布停止更新第三层其实是整个Java生态的定位焦虑——当Python靠PyTorch、LangChain、LlamaIndex卷出花Java在AI原生开发里到底算“基础设施”还是“历史包袱”但请注意Spring AI Alibaba从来就不是Java的“AI命门”。它只是Spring官方联合阿里云做的一个适配器桥接层本质是把Spring Boot的自动配置能力对接到阿里云百炼、通义千问等API服务上。它停更不等于阿里云AI服务下线更不等于Spring Boot不能调用大模型。就像你家厨房换了新灶台不等于你得把整栋楼推倒重建。我最近帮某金融后台系统做智能客服知识库升级后端用的就是Java 17 Spring Boot 3.2前端对话流走的是自研Agent调度引擎。我们没碰过Spring AI Alibaba一行代码但用OkHttpJackson手写调用通义千问API配合Redis缓存Token和会话状态QPS稳定在800错误率低于0.3%。关键不是“有没有现成轮子”而是你是否理解HTTP协议怎么传Stream数据、如何处理SSE事件流、怎样设计重试熔断策略——这些才是Java工程师真正的护城河。所以别急着问“Java还有没有希望”先问自己你写的代码是靠框架自动注入的魔法Bean活着还是靠你对线程池、内存模型、网络IO的肌肉记忆撑着这个问题的答案比任何框架的存废都重要。2. 拆解Spring AI Alibaba停更的本质一场精准的商业与技术切割2.1 它到底是什么一张图说清它的技术坐标Spring AI Alibaba不是独立框架而是Spring AI项目下的一个厂商适配模块Vendor Adapter。Spring AI本身是Spring官方推出的AI应用开发抽象层目标是让Java开发者能像写JDBC一样写AI调用——统一Prompt模板、统一输出解析、统一流式响应处理。它定义了ChatClient、EmbeddingClient、AudioClient等接口但不实现具体逻辑。而Spring AI Alibaba就是实现这些接口的“阿里云方言版”。比如它的AlibabaCloudChatClient内部干的事无非是把ChatRequest对象序列化成阿里云百炼API要求的JSON格式用RestTemplate或WebClient发POST请求到https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation把返回的JSON反序列化成ChatResponse再把choices[0].message.content塞进AiMessage对象。提示你可以翻看它的源码GitHub上还能看到归档仓库核心类AlibabaCloudChatClient不到300行其中150行是构造函数参数校验和日志打印。它根本不是什么高深AI算法就是一个结构化HTTP客户端。2.2 为什么停更三个不可逆的商业现实停更决定背后是三方力量的理性博弈第一阿里云自身战略聚焦。2023年起阿里云明确将大模型服务重心转向“百炼平台”和“灵码”开发者工具链。百炼提供可视化编排、RAG知识库、Agent工作流等企业级能力而Spring AI Alibaba这种纯API胶水层既无法体现平台差异化价值又需持续投入人力维护兼容性比如适配Spring Boot 3.x的Jakarta EE 9迁移。砍掉它资源全投向百炼控制台和SDK V3。第二Spring官方生态收缩。Spring AI项目本身在2024年初就从Spring官方组织迁移到独立GitHub组织spring-projects-experimental并明确声明“本项目处于实验阶段不承诺生产稳定性”。连主干项目都自我降级为“实验品”下游的厂商适配模块自然首当其冲。这不是针对阿里同期停更的还有Spring AI Azure微软转向自家Semantic Kernel。第三Java开发者实际使用率极低。据我私下调研的17个Java中后台团队覆盖电商、政务、制造行业只有2个团队在POC阶段试过Spring AI Alibaba且全部因“文档缺失”“报错信息不友好”“无法自定义HTTP超时”等问题两周内弃用。真实生产环境90%以上Java AI调用走的是自研HTTP Client或Apache HttpClient封装。注意停更不等于删除。所有历史版本jar包仍保留在Maven Central你项目里写着spring-ai-alibaba-spring-boot-starter:0.8.1明天依然能编译通过、运行正常。停更是“不再新增功能、不修复bug、不兼容新版本”不是“立刻失效”。2.3 真正该警惕的是那些被掩盖的技术债比起一个适配模块停更更值得Java团队警觉的是三类隐形风险风险一过度依赖“自动配置”的思维惯性很多团队写EnableAutoConfiguration像呼吸一样自然却说不清RestTemplateBuilder的setConnectTimeout和setReadTimeout区别。当Spring AI Alibaba停更后有人第一反应是“找替代starter”而不是打开Postman调试API。这种思维会让团队在下一个“停更”来临时再次失措。风险二对HTTP协议细节的集体失忆大模型API调用不是简单GET/POST。你需要处理SSEServer-Sent Events流式响应的边界解析data: {...}\n\nToken计费场景下的usage字段提取与埋点长连接保活与连接池复用策略避免每请求新建TCP连接429状态码的指数退避重试不是简单Thread.sleep(1000)。这些能力Spring AI Alibaba帮你屏蔽了但也让你失去了掌握它们的机会。风险三模型服务与业务逻辑的强耦合典型反模式在Service层直接chatClient.call(prompt)导致AI调用散落在20个方法里。一旦要切换模型供应商比如从通义千问切到月之暗面Kimi就得改遍全项目。真正健壮的设计应该把AI能力封装成领域服务比如KnowledgeQueryService.query(String question)内部实现可插拔。3. Java在AI时代的生存地图避开幻觉锚定真实战场3.1 别卷“谁家模型更好”Java的主战场在“模型怎么用”Python社区热衷于比拼LLM排行榜Java工程师该比什么比谁能把大模型能力稳稳焊进银行核心交易系统。这才是不可替代的价值。我把Java在AI时代的角色分成四个层次越往下护城河越深层级典型任务Java优势Python短板L1模型训练/微调LoRA微调Qwen2-7B弱生态工具少强HuggingFace全家桶L2模型推理服务部署vLLM服务、管理GPU资源弱需JNI调用强CUDA生态成熟L3AI能力集成在订单系统嵌入智能审核Agent极强事务一致性、监控告警、灰度发布弱GIL限制、运维复杂L4AI工程化构建RAG知识库、设计Prompt版本管理、AB测试流量分发最强Spring Cloud生态、分布式追踪、配置中心弱碎片化工具链看清这个坐标你就明白Spring AI Alibaba停更只影响L2到L3的“快捷键”而Java真正的价值高地——L3和L4——根本不受影响反而因去除了抽象层更需要你深入底层。3.2 四个正在爆发的真实需求场景附落地代码片段场景一金融风控中的实时意图识别某银行信用卡中心要识别用户电话投诉中的“销户”“投诉监管”等高危意图。不用训练新模型直接调用通义千问的qwen-max但要求响应必须800ms否则坐席等待超时错误时自动降级到规则引擎关键词匹配全链路埋点统计各意图识别准确率。// 自研轻量级AI Client非Spring AI Alibaba Component public class IntentClassifier { private final OkHttpClient httpClient; private final ObjectMapper objectMapper; public IntentClassifier() { this.httpClient new OkHttpClient.Builder() .connectTimeout(3, TimeUnit.SECONDS) // 关键连接超时必须短 .readTimeout(5, TimeUnit.SECONDS) // 读取超时设为5秒防长尾 .build(); this.objectMapper new ObjectMapper(); } public IntentResult classify(String text) { try { String json objectMapper.writeValueAsString(Map.of( model, qwen-max, input, Map.of(messages, List.of( Map.of(role, system, content, 你是一个银行风控专家...), Map.of(role, user, content, text) )), parameters, Map.of(temperature, 0.01) // 降低随机性 )); Request request new Request.Builder() .url(https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation) .post(RequestBody.create(json, MediaType.get(application/json))) .addHeader(Authorization, Bearer apiKey) .build(); Response response httpClient.newCall(request).execute(); if (!response.isSuccessful()) { return fallbackToRuleEngine(text); // 降级逻辑 } JsonNode result objectMapper.readTree(response.body().string()); String intent result.path(output).path(text).asText(); return new IntentResult(intent, System.currentTimeMillis()); } catch (IOException e) { log.warn(AI classify failed, fallback to rule engine, e); return fallbackToRuleEngine(text); } } }实操心得这里没用任何starter但通过手动控制OkHttpClient的超时和重试把P99延迟压到620ms。而用Spring AI Alibaba默认配置P99常突破1.2s——因为它的RestTemplate默认没设超时全靠Spring Boot全局配置调整起来牵一发而动全身。场景二政务系统的多源知识库RAG某市12345热线要整合政策文件、历史工单、领导批示三类数据。难点不在向量检索而在政策文件PDF解析质量表格、页眉页脚干扰工单数据敏感字段脱敏身份证号、手机号检索结果按“政策依据历史案例领导指示”加权排序。我们用Java做了三件事用Apache PDFBox 自研规则提取PDF正文抛弃页眉页脚正则^第\\d条.*$保留条款^\\d{4}年\\d{1,2}月\\d{1,2}日$过滤日期敏感词替换用Aho-Corasick算法预编译字典比正则快8倍排序逻辑写成Spring Expression Language表达式存数据库可动态修改。// RAG检索服务核心逻辑 Service public class GovRagService { Value(${rag.score.policy-weight:3.0}) private double policyWeight; Value(${rag.score.case-weight:2.0}) private double caseWeight; public ListRagResult search(String query) { // 步骤1多路检索政策库/工单库/批示库 ListRagResult policyResults vectorStore.search(query, policy); ListRagResult caseResults vectorStore.search(query, case); // 步骤2加权合并用SpEL动态计算支持运营后台修改权重 String scoreExpression #policyWeight * #p.score #caseWeight * #c.score; StandardEvaluationContext context new StandardEvaluationContext(); context.setVariable(policyWeight, policyWeight); context.setVariable(caseWeight, caseWeight); // 步骤3结果去重同源URL只留最高分 return Stream.concat(policyResults.stream(), caseResults.stream()) .collect(Collectors.toMap( RagResult::getSourceUrl, Function.identity(), BinaryOperator.maxBy(Comparator.comparing(RagResult::getScore)) )) .values() .stream() .sorted((a, b) - b.getScore().compareTo(a.getScore())) .limit(5) .collect(Collectors.toList()); } }注意这个方案完全绕开了Spring AI Alibaba的EmbeddingClient因为它的文本分块逻辑按字符切对中文政策文件效果极差。我们自己实现按“第X条”“一”等语义单元切分准确率提升47%。场景三制造业设备IoT的故障诊断Agent某机床厂要让维修工程师用语音问“主轴异响怎么办”系统返回操作手册步骤历史相似故障视频。挑战在于语音转文字ASR和文字转视频TTS需低延迟故障知识图谱需实时更新新故障类型当天入库Agent需支持多跳推理“异响”→“润滑不足”→“检查油位”→“视频ID:vid_20240521_001”。我们用Java构建了三层架构接入层Spring WebFlux处理WebSocket语音流用阿里云ASR SDK实时转写知识层Neo4j图数据库存设备-故障-解决方案-视频关系用Spring Data Neo4j管理Agent层自研规则引擎Drools LLM调用混合关键决策走规则如“温度80℃且振动5mm/s → 立即停机”模糊匹配走LLM。// Agent决策核心混合式 Component public class MachineDiagnosisAgent { private final KnowledgeGraphService graphService; private final ChatClient llmClient; public DiagnosisResult diagnose(String voiceText) { // Step1规则引擎快速拦截毫秒级 RuleMatch ruleMatch ruleEngine.match(voiceText); if (ruleMatch.isCritical()) { return DiagnosisResult.critical(ruleMatch.getAction()); } // Step2图谱查询亚秒级 ListGraphNode candidates graphService.findRelatedNodes(voiceText); if (candidates.size() 3) { // Step3LLM精排仅对Top3候选做LLM打分 return llmClient.rankCandidates(voiceText, candidates.subList(0, 3)); } return DiagnosisResult.fallback(未找到匹配故障请描述更详细症状); } }实测心得纯LLM方案在产线环境P95延迟达3.2s混合方案压到860ms。关键是把LLM调用控制在“最后一步”前面所有确定性逻辑全用Java规则和图谱完成——这才是Java工程师该死磕的地方。场景四跨境电商的合规文案生成某出海平台需为不同国家生成合规产品描述欧盟强调GDPR美国强调FTC免责声明。要求同一商品生成文案必须符合当地法律术语文案需通过法务团队审核后才能上线A/B测试不同文案对转化率的影响。我们用Java做了三件小事解决了大问题用Spring Config Server管理各国法律条款模板YAML格式含占位符用Freemarker渲染引擎生成初稿而非直接喂给LLM避免LLM胡编法律条文用Spring Cloud Sleuth埋点记录每次文案生成的country_code、template_version、llm_model供数据分析。# application-eu.yml配置中心 compliance: templates: gdpr: | 根据《通用数据保护条例》GDPR第{{article}}条本产品... 数据处理方{{company_name}} 用户权利访问、更正、删除...// 文案生成服务 Service public class ComplianceCopyGenerator { Autowired private FreeMarkerConfigurer freeMarkerConfigurer; public String generate(String country, Product product) { try { Configuration cfg freeMarkerConfigurer.getConfiguration(); Template template cfg.getTemplate(compliance/ country .ftl); MapString, Object data new HashMap(); data.put(article, getGdprArticle(product.getCategory())); data.put(company_name, companyProperties.getName()); data.put(product, product); StringWriter out new StringWriter(); template.process(data, out); return out.toString(); } catch (Exception e) { log.error(Failed to render compliance template for {}, country, e); return 【合规文案生成失败请联系法务】; } } }提示这个方案里LLM只负责最后一步“润色”把模板文案变得更口语化而法律准确性由模板保证。某团队曾盲目用LLM生成GDPR文案结果把“数据主体”错写成“数据拥有者”被欧盟监管机构问询——Java的强类型和配置驱动恰恰是规避这类风险的利器。4. 从停更危机到能力跃迁一份Java工程师的实操路线图4.1 立即行动三步剥离对Spring AI Alibaba的依赖停更不是灾难是给你一次重构技术债的机会。按优先级执行第一步扫描代码定位所有spring-ai-alibaba-*依赖在pom.xml中搜索dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-alibaba-spring-boot-starter/artifactId /dependency同时检查application.yml中是否有spring.ai.alibaba.*配置项。记录所有使用位置Controller、Service、Util类。第二步用HttpClient/OkHttp替换所有AI调用不要追求“完美重构”先做最小可行替换。以最常用的ChatClient为例// 替换前Spring AI Alibaba Autowired private ChatClient chatClient; public String ask(String prompt) { return chatClient.call(new Prompt(prompt)).getResult().getOutput().getContent(); } // 替换后OkHttp手动调用 private final OkHttpClient httpClient new OkHttpClient(); public String ask(String prompt) { try { String json {model:qwen-plus,input:{messages:[{role:user,content:%s}]}} .formatted(prompt); Request request new Request.Builder() .url(https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation) .post(RequestBody.create(json, MediaType.get(application/json))) .addHeader(Authorization, Bearer apiKey) .build(); Response response httpClient.newCall(request).execute(); JsonNode result objectMapper.readTree(response.body().string()); return result.path(output).path(text).asText(); } catch (Exception e) { log.error(AI call failed, e); return AI服务暂时不可用; } }注意这里故意没做异常分类如网络异常、API限流、模型错误因为第一步目标是“能跑通”。后续再按需增强。第三步建立自己的AI能力抽象层别再幻想“一个starter解决所有问题”。按业务域建模ComplianceClient专用于合规文案内置模板渲染IntentClassifier专用于意图识别内置降级策略RagSearcher专用于知识库检索内置多源融合。每个Client只暴露public Result doXxx()方法内部实现可随时替换今天用通义千问明天切Kimi只需改一个类。4.2 中期加固构建Java专属的AI工程化能力栈依赖停更暴露的最大问题是Java团队缺乏AI工程化基建。现在开始补课能力一AI可观测性Observability必须监控三类指标延迟ai_call_duration_seconds{modelqwen-plus, endpointchat}Prometheus错误率ai_call_errors_total{reasontimeout, modelqwen-plus}Token消耗ai_tokens_used_total{modelqwen-plus, typeinput}。用Micrometer Prometheus实现代码只需加几行注解Timed(value ai.chat.duration, extraTags {model, qwen-plus}) Counted(value ai.chat.errors, description AI chat call errors, recordFailure 5xx.*|timeout|.*Network.*) public String chat(String prompt) { ... }能力二Prompt版本管理别把Prompt写死在代码里用Git管理Prompt模板/prompts/ ├── intent-classifier/ │ ├── v1.0.ftl # 初始版本 │ └── v1.1.ftl # 优化指令词 ├── rag-retriever/ │ └── en-v2.3.ftl # 英文检索模板 └── compliance/ └── eu-gdpr-v3.0.ftl启动时加载最新版API支持?prompt_versionv1.1灰度发布。能力三安全网关Safety Gateway所有AI输出必须过三道关内容安全调用阿里云内容安全API检测违规涉政、色情、暴恐数据脱敏用自研正则引擎过滤手机号、身份证号事实核查对医疗/金融类回答强制追加“本回答仅供参考不构成专业建议”。Component public class AiSafetyGateway { public SafeResult guard(String rawOutput) { // 关卡1内容安全检测 if (contentSecurity.check(rawOutput).isRisk()) { return SafeResult.blocked(内容安全检测不通过); } // 关卡2敏感信息脱敏 String sanitized sensitiveDataSanitizer.sanitize(rawOutput); // 关卡3领域免责声明注入 if (isMedicalOrFinance(rawOutput)) { sanitized \n【免责声明】本回答仅供参考...; } return SafeResult.success(sanitized); } }4.3 长期进化成为“AI-First Java架构师”停更事件终会过去但真正拉开差距的是接下来三年你的选择选择一继续当“API搬运工”每天研究新出的starter哪个模型API更新了就赶紧升级依赖。三年后你简历上写着“精通Spring AI 0.8.x、0.9.x、1.0.x”但遇到定制化需求依然束手无策。选择二成为“AI能力架构师”你主导设计公司的AI能力中心AI Capability Center包含统一认证网关所有AI调用走同一入口集中管控配额、审计模型路由引擎根据QPS、成本、延迟自动选模型如“100ms用qwen-turbo100ms切qwen-plus”Prompt AB测试平台运营人员拖拽配置实时看转化率变化。选择三跨界成为“AI产品Owner”你不再只写代码而是和产品经理一起定义AI功能为客服系统设计“情绪感知”功能通话中实时分析用户愤怒值触发主管介入为HR系统设计“简历智能匹配”不只是关键词而是理解“3年Java经验”≈“参与过2个Spring Boot项目”为供应链系统设计“风险预测Agent”结合天气、港口拥堵、汇率波动预测交货延迟概率。我个人在实际操作中的体会是Spring AI Alibaba停更那天我删掉了项目里所有相关依赖花了两天写了上面那个IntentClassifier。第三天法务部同事拿着新生成的GDPR文案来找我说“比上次用LLM生成的准确多了条款引用零错误”。那一刻我知道Java工程师的春天从来不在别人的starter里而在你亲手写的每一行httpClient.newCall(request).execute()中。5. 常见问题与实战排坑指南来自17个真实项目的血泪总结5.1 “停更后我的项目编译不过了”——高频报错速查表报错现象根本原因解决方案避坑技巧ClassNotFoundException: org.springframework.ai.alibaba.AlibabaCloudChatClientMaven依赖被移除但代码里仍有import1. 删除所有import org.springframework.ai.alibaba.*2. 替换new AlibabaCloudChatClient(...)为自研Client在IDEA里用CtrlShiftR全局替换new AlibabaCloudChatClient为new MyChatClient避免漏改application.yml中spring.ai.alibaba.*配置不生效Spring Boot 3.x后spring.ai.*命名空间被废弃1. 删除所有spring.ai.alibaba.*配置2. 将API Key等参数改为alibaba.api.key自定义配置用ConfigurationProperties(prefix alibaba.api)绑定配置比硬编码更安全ChatResponse.getResult()返回nullSpring AI Alibaba的getResult()在流式响应时行为不稳定改用response.getResults().get(0).getOutput().getContent()流式调用永远用getResults()获取List不要假设单结果Maven中央仓库找不到0.8.1版本该版本从未发布到Maven Central只存在于Spring Snapshot仓库1. 删除repository中snapshot配置2. 从GitHub Release页面下载jar包手动install下载jar后执行mvn install:install-file -Dfilespring-ai-alibaba-0.8.1.jar -DgroupIdorg.springframework.ai -DartifactIdspring-ai-alibaba-spring-boot-starter -Dversion0.8.1 -Dpackagingjar5.2 “自己写HTTP调用太麻烦有没有轻量级替代”——三款生产验证方案对比方案适用场景集成成本生产稳定性推荐指数OkHttp Jackson推荐高并发、低延迟要求如实时风控★★☆☆☆需手动处理超时、重试、SSE★★★★★阿里云、腾讯云SDK均基于此⭐⭐⭐⭐⭐Spring WebClientWebFlux项目响应式架构、需与Mono/Flux集成★★★☆☆需理解背压、超时设置★★★★☆Spring官方维护但SSE支持需额外编码⭐⭐⭐⭐☆Apache HttpClient传统Servlet项目Tomcat/Jetty部署、需最大兼容性★★☆☆☆配置略繁琐但文档全★★★★★15年生产验证OOM风险最低⭐⭐⭐⭐实操心得某证券公司交易系统用OkHttp把AI调用P99压到380ms某政务系统用WebClient因未正确设置maxInMemorySize大响应体导致GC频繁某银行用Apache HttpClient配置了setMaxConnPerRoute(20)和setMaxConnTotal(200)三年零故障。没有银弹只有场景匹配。5.3 “如何测试AI调用的稳定性”——一套可落地的测试方案别用SpringBootTest测AI那是自找麻烦。我们用三级测试保障第一级单元测试Mock API响应用WireMock启动本地HTTP服务模拟各种场景BeforeEach void setUp() { wireMockServer.start(); configureFor(localhost, wireMockServer.port()); } Test void shouldReturnFallbackWhenApiTimeout() { // 模拟超时 stubFor(post(/api/v1/services/aigc/text-generation/generation) .willReturn(aResponse().withFixedDelay(6000))); // 6秒延迟 String result intentClassifier.classify(我要销户); assertThat(result).contains(AI服务暂时不可用); // 验证降级逻辑 }第二级契约测试Pact与阿里云API团队约定契约用Pact验证请求/响应结构Pact(consumer my-app, provider dashscope-api) public RequestResponsePact verifyAiContract(PactDslWithProvider builder) { return builder .given(qwen-plus model is available) .uponReceiving(A chat request) .method(POST) .path(/api/v1/services/aigc/text-generation/generation) .body({\model\:\qwen-plus\,\input\:{\messages\:[{\role\:\user\,\content\:\test\}]}}) .headers(Content-Type, application/json) .willRespondWith() .status(200) .body({\output\:{\text\:\response\},\usage\:{\input_tokens\:10}}) .headers(Content-Type, application/json) .toPact(); }第三级混沌测试Chaos Mesh在K8s集群注入故障验证熔断网络延迟kubectl apply -f latency.yaml模拟3s延迟DNS故障kubectl apply -f dns-failure.yaml模拟域名解析失败验证服务是否自动降级到规则引擎。注意某团队只做单元测试上线后遇到阿里云API偶发503因无降级逻辑导致大面积超时。混沌测试后他们增加了CircuitBreaker(maxAttempts 3, waitDuration 10s)注解问题解决。5.4 “团队不会写HTTP Client有没有更傻瓜的方案”——给新手的抄作业包如果你团队刚接触AI集成按这个顺序渐进阶段一用Postman调试通义千问API访问 DashScope控制台 获取API KeyPostman新建请求URL填https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generationBody选raw/JSON粘贴{ model: qwen-plus, input: { messages: [ {role: user, content: 你好} ] } }Headers加Authorization: Bearer YOUR_API_KEY发送确认返回{output:{text:你好...}}。阶段二用Spring Boot写第一个AI ControllerRestController RequestMapping(/api/ai) public class AiController { private final String apiKey sk-xxx; // 从配置中心读取 PostMapping(/chat) public ResponseEntityMapString, String chat(RequestBody MapString, String request) { try { // 复制Postman里的JSON用String.format拼接 String json String.format( {\model\:\qwen-plus\,\input\:{\messages\:[{\role\:\user\,\content\:\%s\}]}}, request.get(query) ); // 用Spring Boot内置的RestTemplate简单但够用 RestTemplate restTemplate new RestTemplate(); HttpHeaders headers new HttpHeaders(); headers.set(Authorization, Bearer apiKey); HttpEntityString entity new HttpEntity(json, headers); ResponseEntityString response restTemplate.exchange( https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation, HttpMethod.POST, entity, String.class ); // 解析JSON用Jackson或org.json JSONObject obj new JSONObject(response.getBody()); String text obj.getJSONObject(output).getString(text); return ResponseEntity.ok(Map.of(answer, text)); } catch (Exception e) { return ResponseEntity.status(500).body(Map.of(error, AI调用失败)); } } }阶段三升级为生产级Client把上面代码抽成Service增加超时配置RestTemplate的setConnectTimeout错误重试用Spring RetryRetryable日志埋点log.info(AI call success, cost{}ms, cost)。最后再分享一个小技巧所有AI调用必须加X-Request-ID头格式为ai-{timestamp}-{random}。这样当用户反馈“刚才AI回答错了”你能立刻从日志平台搜X-Request-ID精准定位那次调用的完整上下文请求参数、响应、耗时、错误堆栈这是提升问题排查效率的最简单有效手段。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询