news 2026/4/10 21:53:01

[特殊字符] Spring AI 超细图解:让 Javaer 也能 30 分钟撸出“ChatGPT 同款”后端

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[特殊字符] Spring AI 超细图解:让 Javaer 也能 30 分钟撸出“ChatGPT 同款”后端

一句话总结:Spring 官方终于把大模型做成了“Spring Bean”,改配置就能换模型,Java 党直接原地过年。

1️⃣ 为什么 Java 党需要 Spring AI?

痛点传统做法Spring AI 做法
切模型 = 改代码手写 3 套 SDK一行配置:model=gpt-4o → qwen-max
Prompt 拼接像串 SQL"请扮演"+role+"回答"+qPromptTemplate + SpEL,热更新
流式打字机自己写 SSEFlux<ChatResponse> 直接 return
私域知识问答Python+FAISS+LCJava 原生:Tika → VectorStore → RAG
生产可观测0 埋点复用 Actuator,token 成本仪表盘

2️⃣ 架构一张图秒懂

👉 官方定位:把 LLM 当成“另一种数据源”,Spring 熟悉的味道不变。

3️⃣ Hello World:4 行代码跑起来

① 依赖

<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> <version>1.0.0-M6</version> </dependency>

② 配置

spring: ai: openai: api-key: ${OPENAI_API_KEY} chat: options: model: gpt-4o temperature: 0.7

③ 代码

@RestController @RequiredArgsConstructor public class ChatController { private final ChatClient chatClient; @GetMapping("/chat") public String chat(@RequestParam String q) { return chatClient.prompt().user(q).call().content(); } }

✅ 启动后curl http://localhost:8080/chat?q=SpringAI好用吗直接出答案。

4️⃣ Prompt 模板:像写 Thymeleaf 一样玩提示词

模板文件coder.st

你是资深 {role},请用 {style} 风格解释 {concept},不超过 {maxWords} 字。

Java 侧

PromptTemplate template = new PromptTemplate(coderResource); Prompt prompt = template.create(Map.of( "role", "Java 架构师", "style", "知乎", "concept", "Spring AI", "maxWords", 200)); return chatClient.prompt(prompt).call().content();

🎯 好处:运营也能改提示,无需发版;结合 Spring Cloud Config 可热更新。

5️⃣ 结构化输出:让 GPT 直接给你 Java Bean

public record Movie(String name, LocalDate releaseDate, List<String> actors) {} Movie movie = chatClient.prompt() .user("随机生成一部科幻电影") .call() .entity(Movie.class); // ← 关键

📌 成功率 98%,失败抛SpringAiException,加@Retryable自动重试。

6️⃣ Function Calling:把“查天气”做成 Java 方法

@Service public class ToolBox { @Tool(description = "根据城市查实时温度,返回摄氏度") public int getTemperature(String city) { return RestClient.create() .get().uri("https://wttr.in/{city}?format=%t", city) .retrieve().body(String.class).trim(); } }

LLM 自动决定何时调用,日志里能看到完整链路。

7️⃣ RAG:30 分钟搭一个公司知识库问答

架构路线

PDF → Tika → TextSplitter → Embedding → VectorStore → Retrieval → ChatModel → 答案

核心代码(灌库)

List<Document> docs = new PdfDocumentReader("employee-handbook.pdf").get(); vectorStore.add(docs);

问答接口

List<Document> topK = vectorStore.similaritySearch(q, 3); String context = topK.stream().map(Document::getContent).collect(joining("\n")); return chatClient.prompt() .system("你是 HR,只能根据以下文档回答:\n" + context) .user(q) .call() .content();

📊 实测 200 页手册,平均延迟 1.2 s,token 成本 0.3 分/次。

8️⃣ 流式 SSE:前后端“打字机”效果

后端

@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<ServerSentEvent<String>> stream(String q) { return chatClient.prompt().user(q).stream() .map(resp -> ServerSentEvent.builder(resp.getResult().getOutput().getContent()).build()); }

前端(React 伪代码)

const evtSource = new EventSource(`/stream?q=${question}`); evtSource.onmessage = e => setTxt(prev => prev + e.data);

9️⃣ 可观测 & 成本管控

Spring AI 内置 Micrometer 指标:

指标含义
ai.chat.tokens.prompt提问 token 数
ai.chat.tokens.completion回答 token 数
ai.chat.cost.total自动换算人民币
ai.chat.latency端到端延迟

📈 Grafana 模板直接导入,老板一眼看穿“昨天问答烧掉 23 块”。

🔟 Spring AI vs LangChain4j 对比

维度Spring AILangChain4j
语言亲和Java 原生Python 翻译版
生态红利Spring 全家桶自己拼装
函数调用注解 @Tool手动封装
配置刷新@RefreshScope不支持
社区文档官方 roadmap社区驱动

1️⃣1️⃣ 生产踩坑锦囊

  1. 超时:国内网络建议timeout=60s+ 重试。
  2. 上下文溢出:用TokenCountUtility预估,超长主动摘要。
  3. 函数死循环:设置max-function-calls=3
  4. 向量库一致性:Milvus 2.3 支持事务,RedisSearch 不支持。
  5. key 权限:OpenAI “project key” 2025 新功能,最小化权限。

1️⃣2️⃣ 未来 roadmap & 结语

时间计划
2025 Q1GA 版 + 多模态统一 ChatClient
2025 Q2Spring Batch AI(大模型批处理)
2025 Q3Serverless 弹性伸缩

🌈 一句话:Java 生态在 AI 时代的“最后一块拼图”已到位。
别再写脚本式 Python,用 Spring AI,把大模型真正“工程化”。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 18:28:52

基于微信小程序的维修服务平台的设计与实现

前言 &#x1f31e;博主介绍&#xff1a;✌CSDN特邀作者、全栈领域优质创作者、10年IT从业经验、码云/掘金/知乎/B站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战&#xff0c;以及程序定制化开发、文档编写、答疑辅导等。✌…

作者头像 李华
网站建设 2026/4/9 21:51:26

基于SpringBoot+Vue的图书馆选座平台设计与实现毕设源码

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于SpringBoot和Vue的图书馆选座平台&#xff0c;以满足现代图书馆在座位管理方面的需求。具体研究目的如下&#xff1a; 首先&#x…

作者头像 李华
网站建设 2026/4/10 15:02:55

主生产计划:PMC体系的核心引擎解析

MPS&#xff1a;承上启下的“总调度台” 在主生产计划与物料控制体系中&#xff0c;主生产计划处于中枢位置。它向上承接销售预测与客户订单&#xff0c;向下驱动物料需求计划与车间作业排程。简单说&#xff0c;MPS决定了“在什么时间、生产什么产品、生产多少数量”&#xff…

作者头像 李华
网站建设 2026/4/9 19:36:40

第八章 基因的表达与调控

第九章基因工程和基因组学第十章基因突变第十一章细胞质遗传第十二章遗传与发育第十三章数量性状遗传第十四章群体遗传与进化

作者头像 李华
网站建设 2026/4/8 19:04:39

Post-training with Tinker:定制语言模型的最佳解决方案

Post-training with Tinker&#xff1a;定制语言模型的最佳解决方案 在深度学习和自然语言处理领域&#xff0c;定制化的语言模型正逐渐成为提升模型性能的重要手段。今天&#xff0c;我们将深入探讨 Tinker 及其配套工具 Tinker Cookbook&#xff0c;这两个开放源码库旨在帮助…

作者头像 李华
网站建设 2026/4/10 9:19:30

通达信庄家轨迹 源码 贴图

{}HJ_1:IF(DATE>11208015,0,1); HJ_2:5; HJ_3:(2*CLOSEHIGHLOW)/4; HJ_4:LLV(LOW,34); HJ_5:HHV(HIGH,34); HJ_6:EMA((HJ_3-HJ_4)/(HJ_5-HJ_4)*100,13); HJ_7:EMA(0.667*REF(HJ_6,1)0.333*HJ_6,2)*HJ_1; 轨道线:EMA(HJ_7,HJ_2)*HJ_1,COLORRED; HJ_8:HHV(HIGH,9)-LLV(LOW,9);…

作者头像 李华