news 2026/6/10 3:14:03

轻松入门SpringAI-SpringAI综合案例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
轻松入门SpringAI-SpringAI综合案例

轻松入门 Spring AI 综合案例
(2025-2026 比较实用且完整的入门组合示例)

以下是一个相对完整的、适合初学者到中级的 Spring AI 综合案例,包含目前最常用的几种核心能力:

功能清单: 1. 普通对话(ChatClient 最基础用法) 2. 流式回答(打字机效果) 3. 会话记忆(短期记忆) 4. 系统提示词工程 5. RAG 简单实现(基于内存向量存储) 6. 函数调用(Function Calling / Tools) 7. 结构化输出(JSON模式 + Bean转换)

完整综合案例代码(单文件版)

@RestController@RequestMapping("/ai/demo")@RequiredArgsConstructor@Slf4jpublicclassAiDemoController{privatefinalChatClientchatClient;// 1. 最基础聊天@GetMapping("/chat")publicStringsimpleChat(@RequestParamStringmessage){returnchatClient.prompt().user(message).call().content();}// 2. 流式回答(前端最推荐)@GetMapping(value="/stream",produces=MediaType.TEXT_EVENT_STREAM_VALUE)publicFlux<String>streamChat(@RequestParamStringmessage){returnchatClient.prompt().user(message).stream().content();}// 3. 带记忆 + 系统角色(最常用的组合写法)privatefinalChatMemorychatMemory=newMessageWindowChatMemory(10);// 保留最近10条@GetMapping("/memory")publicStringchatWithMemory(@RequestParamStringsessionId,@RequestParamStringmessage){returnchatClient.prompt().system(""" 你是一位友善、幽默、说话很接地气的「资深Java架构师」 用中文回答,尽量使用 markdown 格式排版 喜欢用表情和生活化比喻解释复杂概念 """).user(message).advisors(newMessageChatMemoryAdvisor(chatMemory,sessionId)).call().content();}// 4. 简单 RAG (内存向量存储版 - 适合快速体验)privatefinalEmbeddingModelembeddingModel;privatefinalVectorStorevectorStore=newSimpleVectorStore(embeddingModel);@PostConstructpublicvoidinitKnowledgeBase(){List<String>docs=List.of("Spring AI 是 Spring 家族推出的官方大模型集成框架,目标是让 Java 开发者用最熟悉的方式使用大语言模型。","目前支持 OpenAI、Azure、Ollama、HuggingFace、阿里通义、百度文心、智谱、Moonshot、DeepSeek 等多种模型。","ChatClient 是 Spring AI 提供的核心高层抽象,类似 RestTemplate 在 HTTP 时代的地位。","2025年下半年开始,Spring AI 正式进入 1.0 阶段,API 基本稳定。");List<Document>documents=docs.stream().map(content->newDocument(content,Map.of("source","spring-ai-doc"))).toList();vectorStore.add(documents);}@GetMapping("/rag")publicStringsimpleRag(@RequestParamStringquestion){List<Document>similarDocs=vectorStore.similaritySearch(SearchRequest.query(question).withTopK(3));Stringcontext=similarDocs.stream().map(Document::getContent).collect(Collectors.joining("\n\n"));returnchatClient.prompt().system("你现在是一个基于给定上下文回答问题的专家助手。\n上下文:\n"+context).user(question).call().content();}// 5. 函数调用(工具调用) - 经典天气例子@GetMapping("/tools")publicStringweatherWithTools(@RequestParamStringcity){recordWeatherInfo(@JsonProperty("city")Stringcity,@JsonProperty("temperature")doubletemperature,@JsonProperty("condition")Stringcondition,@JsonProperty("humidity")inthumidity){}Function<WeatherRequest,WeatherInfo>fakeWeatherFunction=req->newWeatherInfo(req.city(),24.5,"多云转晴",65);returnchatClient.prompt().user("请告诉我"+city+"现在的天气怎么样?").functions(List.of(FunctionCallbackContext.builder().function("get_weather",fakeWeatherFunction).description("获取指定城市的当前天气信息").responseConverter(newBeanOutputConverter<>(WeatherInfo.class)).build())).call().content();}// 6. 结构化输出(最推荐的写法之一)publicrecordTravelPlan(@JsonProperty("destination")Stringdestination,@JsonProperty("days")intdays,@JsonProperty("budget_level")StringbudgetLevel,// low/medium/high@JsonProperty("highlights")List<String>highlights,@JsonProperty("tips")List<String>tips){}@GetMapping("/structured")publicTravelPlanstructuredTravelPlan(@RequestParamStringdestination,@RequestParam(defaultValue="3")intdays,@RequestParam(defaultValue="medium")Stringbudget){BeanOutputConverter<TravelPlan>converter=newBeanOutputConverter<>(TravelPlan.class);StringjsonSchema=converter.jsonSchema;Stringprompt=""" 你是一位专业的旅行规划师。 请为用户规划一份 %d 天的%s预算%s旅行计划。 请严格按照以下 JSON Schema 输出,不要输出任何多余的文字: %s 目的地:%s """.formatted(days,budget,destination,jsonSchema,destination);StringrawJson=chatClient.prompt(prompt).call().content();returnconverter.convert(rawJson);}}

推荐学习路径(难度递增)

阶段重点掌握内容建议耗时推荐练习题目
第1天ChatClient基本用法 + 流式 + 系统提示词2~4小时写一个AI聊天室(带历史记录)
第2天会话记忆 + PromptTemplate3~5小时实现多角色对话(客服/面试官/女友等)
第3天简单RAG(内存/文件/PGVector)6~10小时做一个个人简历/知识库问答机器人
第4~5天Function Calling + 结构化输出8~15小时实现:天气+汇率+查快递+生成周报
第6天+多Agent协作 / ReAct / 工具链编排持续学习中写一个「程序员小助手」Agent(写代码+查资料+写文档)

一句话总结当前(2026年初)最舒服的入门技术栈建议:

Spring Boot 3.3.x + Spring AI 1.0.x + 硅基流动/DeepSeek官方 OpenAI兼容接口 + deepseek-r1:free / deepseek-v3:free(推理最强) + ChatClient流式 + Memory + 简单RAG + Function Calling + 结构化输出

祝你玩得开心,早日做出属于自己的AI小产品~ 🚀

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

Python+Vue的HPV疫苗接种管理系统的设计与实现 django Pycharm flask

目录 这里写目录标题目录项目介绍项目展示详细视频演示技术栈文章下方名片联系我即可~解决的思路开发技术介绍性能/安全/负载方面python语言Django框架介绍技术路线关键代码详细视频演示收藏关注不迷路&#xff01;&#xff01;需要的小伙伴可以发链接或者截图给我 项目介绍 …

作者头像 李华
网站建设 2026/6/10 10:10:33

【毕业设计】基于springboot+微信小程序的服装商城的设计与实现小程序(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/10 10:08:04

STM32F03C8T6通过AT指令获取天气API-下篇

这里写目录标题堆栈大小换算与修改说明一、十六进制到十进制的换算1.1 换算公式1.2 换算结果二、修改前后的对比修改前&#xff08;原始配置&#xff09;&#xff1a;修改后&#xff08;新配置&#xff09;&#xff1a;三、STM32F103C8T6的内存限制四、为什么需要调整堆栈大小&…

作者头像 李华
网站建设 2026/6/10 10:08:07

(1-1)人形机器人的发展历史、趋势与应用场景:人形机器人的发展历程

本章首先系统介绍了人形机器人的发展脉络&#xff0c;从早期仿人研究到ASIMO等里程碑事件&#xff0c;再到特斯拉、Figure、宇树等企业推动的商业化进程&#xff0c;勾勒出人形机器人产业的演进全景。然后进一步分析了具身智能、大模型融合背景下的人形机器人发展趋势及其在劳动…

作者头像 李华
网站建设 2026/6/10 10:05:30

day143—递归—对称二叉树(LeetCode-101)

题目描述给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。示例 1&#xff1a;输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a;输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a;树中节点数目在…

作者头像 李华
网站建设 2026/6/10 10:07:25

STM32-S184-车位感应+停车引导+闸道控制+车道防夹+计时计费+结算+OLED屏+声光报警+按键+(无线方式选择)(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫

STM32-S184-车位感应停车引导闸道控制车道防夹计时计费结算OLED屏声光报警按键(无线方式选择)STM32-S184N无无线-无APP板(硬件操作详细): STM32-S184B蓝牙无线-APP版: STM32-S184W-WIFI无线-APP版: STM32-S184CAN-视频监控WIFI无线-APP版: STM32-S184I-云平台-APP版: 产品功能描…

作者头像 李华