Spring AI (1) : 快速构建智能应用

发布时间:2026/9/24 17:51:43

Spring AI (1) : 快速构建智能应用 目录一、为什么选择 Spring AI二、环境准备三、基础配置3.1 网络代理配置3.2 API Key 配置四、核心功能实现4.1 基础文本对话4.2 流式输出4.3 图像生成4.4 语音能力4.5 多模态识别五、Function Calling让 AI 调用外部能力5.1 工作流程5.2 代码实现5.3 核心原理六、国产模型集成方案6.1 阿里云通义千问七、总结一、为什么选择 Spring AI在 Java 生态中接入大语言模型目前主要有两条路径Spring AI 和 LangChain4j。实际建议如果团队已有 Spring Boot 技术栈优先选 Spring AI。若需要构建一个高度定制化的多模型网关层LangChain4j 更合适。二、环境准备dependencyManagementdependenciesdependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-bom/artifactIdversion1.0.0-SNAPSHOT/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementdependencies!--Spring Web--dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency!--Spring AI OpenAI Starter--dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-openai-spring-boot-starter/artifactId /dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency/dependencies三、基础配置3.1 网络代理配置如果使用的是海外模型 API需要通过代理访问SpringBootApplicationpublicclassAiApplication{publicstaticvoidmain(String[]args){// 根据实际代理地址和端口配置System.setProperty(proxyHost,127.0.0.1);System.setProperty(proxyPort,7890);System.setProperty(proxySet,true);SpringApplication.run(AiApplication.class,args);}}3.2 API Key 配置ai:aicore:key:${OPEN_AI_KEY}url:${OPEN_AI_URL}spring:ai:openai:api-key:${ai.aicore.key}base-url:${ai.aicore.url}四、核心功能实现4.1 基础文本对话RestControllerRequestMapping(/api/ai)RequiredArgsConstructorpublicclassAiController{privatefinalChatClientchatClient;GetMapping(/chat)publicMapString,Stringchat(RequestParam(defaultValue讲个笑话)Stringmessage){StringresponsechatClient.prompt().user(message).call().content();returnMap.of(result,response);}}4.2 流式输出适用于需要逐字展示回答的场景提升用户体验GetMapping(value/stream,producestext/sse;charsetUTF-8)publicFluxStringstreamChat(RequestParam(defaultValue讲个笑话)Stringmessage){returnchatClient.prompt().user(message).stream().content();}前端通过 EventSource 即可接收 SSE 流式数据。// 1. 创建 EventSource 实例指向后端的流式接口// 注意这里可以带上查询参数对应后端的 RequestParamconsteventSourcenewEventSource(/stream?message讲个笑话);// 2. 监听消息事件 (对应后端每次推送的文本)eventSource.onmessagefunction(event){// event.data 就是后端推送过来的一段文本内容console.log(收到流式数据:,event.data);// 在实际业务中你可以把 event.data 追加到网页的聊天框里实现逐字显示的效果// document.getElementById(chatBox).innerHTML event.data;};// 3. 监听错误事件 (连接断开、网络异常等)eventSource.onerrorfunction(error){console.error(EventSource 发生错误:,error);// 如果连接关闭可以在这里做重连或提示用户eventSource.close();};// 4. 监听连接打开事件 (可选)eventSource.onopenfunction(){console.log(SSE 连接已建立);};4.3 图像生成privatefinalOpenAiImageModelimageModel;GetMapping(/image)publicStringgenerateImage(RequestParam(defaultValue一只猫)Stringprompt){ImageResponseresponseimageModel.call(newImagePrompt(prompt,OpenAiImageOptions.builder().withModel(dall-e-2).withQuality(hd).withN(1).withHeight(256).withWidth(256).build()));StringimageUrlresponse.getResult().getOutput().getUrl();returnimg srcimageUrl/;}4.4 语音能力语音转文字privatefinalOpenAiAudioTranscriptionModeltranscriptionModel;GetMapping(/speech-to-text)publicStringspeechToText(){varoptionsOpenAiAudioTranscriptionOptions.builder().withResponseFormat(TranscriptResponseFormat.TEXT).withTemperature(0f).build();varaudioFilenewClassPathResource(/sample.mp3);varpromptnewAudioTranscriptionPrompt(audioFile,options);returntranscriptionModel.call(prompt).getResult().getOutput();}文字转语音privatefinalOpenAiAudioApiaudioApi;GetMapping(/text-to-speech)publicStringtextToSpeech()throwsIOException{varrequestSpeechRequest.builder().withVoice(SpeechRequest.Voice.ONYX).withInput(你好欢迎使用 Spring AI).build();ResponseEntitybyte[]responseaudioApi.createSpeech(request);byte[]audioDataresponse.getBody();// 保存为 MP3 文件try(FileOutputStreamfosnewFileOutputStream(output.mp3)){fos.write(audioData);}return语音生成成功;}4.5 多模态识别GPT-4 等模型支持图文混合输入privatefinalOpenAiChatModelchatModel;GetMapping(/multimodal)publicStringmultimodal(RequestParamStringtext)throwsIOException{byte[]imageDatanewClassPathResource(/test.png).getContentAsByteArray();UserMessagemessagenewUserMessage(text,List.of(newMedia(MimeTypeUtils.IMAGE_PNG,imageData)));ChatResponseresponsechatModel.call(newPrompt(message,OpenAiChatOptions.builder().withModel(gpt-4-turbo-preview).build()));returnresponse.getResult().getOutput().getContent();}五、Function Calling让 AI 调用外部能力大模型本身不具备实时信息获取能力例如询问今天北京的天气怎么样时模型无法直接回答。Function Calling 机制允许模型在需要时调用你注册的外部接口。5.1 工作流程用户发送提问请求携带已注册的 Function 描述模型判断需要调用哪个 Function返回参数Spring AI 自动执行对应的 Java 方法执行结果返回给模型模型组织最终答案返回用户5.2 代码实现定义服务类ComponentpublicclassWaitTimeServiceimplementsFunctionWaitTimeService.Request,WaitTimeService.Response{OverridepublicResponseapply(Requestrequest){// 实际业务查询排队人数intcountqueryQueueCount(request.location(),request.name());returnnewResponse(request.location()当前有 count 人排队);}privateintqueryQueueCount(Stringlocation,Stringname){// 调用第三方 API 或查询数据库return10;}publicrecordRequest(Stringname,Stringlocation){}publicrecordResponse(Stringdescription){}}注册 Function BeanConfigurationpublicclassAiConfig{BeanpublicFunctionWaitTimeService.Request,WaitTimeService.ResponsegetWaitTime(){returnnewWaitTimeService();}}调用时启用 FunctionGetMapping(/function-call)publicStringfunctionCall(RequestParamStringmessage){UserMessageuserMessagenewUserMessage(message);ChatResponseresponsechatModel.call(newPrompt(List.of(userMessage),OpenAiChatOptions.builder().withFunction(getWaitTime)// 对应 Bean 名称.build()));returnresponse.getResult().getOutput().getContent();}5.3 核心原理Spring AI 在处理 Function Calling 时的工作机制将 withFunction 中注册的 Bean 信息转换为 OpenAI API 的 tools 参数首次调用 Chat Completion API携带 Function 描述如果模型决定调用 Function返回的 tool_calls 中包含参数 JSONSpring AI 自动将 JSON 反序列化为 Request 对象执行对应的 apply 方法获得 Response将 Response 作为消息再次请求大模型大模型根据 Function 返回结果生成最终回答六、国产模型集成方案6.1 阿里云通义千问阿里已推出基于 Spring AI 的官方 StarterdependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-ai/artifactIdversion最新版本/version/dependency配置与 OpenAI 类似只需替换 base-url 和 api-key 为阿里百炼的凭证。七、总结
延伸阅读

更多相关文章

2026/9/24 17:51:43

【n8n】图片节点自定义字体

自定义图片节点字体已成为提升n8n工作流视觉表达与品牌识别的常用方案。通过在图片节点配置专属字体,能够优化自动化生成图片的风格与专业感。 本文介绍在n8n中集成免费商用字体的方法,结合实际操作步骤,展示字体安装与配置过程,帮助实现工作流图片个性化。 文章目录 图片…

2026/9/24 17:51:43

用AI生成一个sql管理工具

创建的项目:https://github.com/yinlamei/SqlAssistantWpf.git 1、创建项目 提示词: SqlAssistant.sln ├── SqlAssistant.UI.csproj # WPF 主项目:View ViewModel ├── SqlAssistant.Application.csproj # 应用服务层…

2026/9/24 17:51:43

JVM(Java Virtual Machine)

目录 JVM-Java虚拟机/解释器 一次编写,到处编译: 一次编写,到处执行: JVM三个核心内容(面试常考) 1.JVM内存区域划分 1.程序计数器 2.栈 虚拟机栈 栈帧 本地方法栈 3.堆 4.元数据区 类的元信息…

2026/9/24 21:12:02

AI编码工程化治理:守住可追溯性与责任边界的实战指南

1. 这不是“反AI宣言”,而是一份工程师写给同行的紧急备忘录最近刷到“代码80%是AI写的,这家AI公司呼吁暂停AI开发”这个标题,很多人第一反应是:AI公司自己喊停AI?这不等于厨师宣布封灶、程序员删IDE?太反常…

2026/9/24 21:12:02

用Airflow实现生产级RAG流水线编排

1. 这不是“把RAG跑起来”,而是让RAG真正可运维、可追踪、可回滚你有没有试过这样搭RAG:本地跑通一个LangChain脚本,加载PDF、切块、存进Chroma,再用LLM问答——一切丝滑。但第二天同事问:“昨天那个合同条款检索功能&…

2026/9/24 21:12:02

Python深度学习CNN水果识别系统:从图像分类原理到PyTorch实战

简介:资源为基于Python与卷积神经网络CNN构建的水果识别系统完整项目工程,面向计算机相关专业毕业设计、期末大作业及深度学习入门实战人群。项目经导师指导并获98分高分评价,核心源码均经过本地编译与运行调试,可直接在常规Pytho…

2026/9/24 21:12:02

决策树算法详解:从信息熵到调参实战,理解机器学习基石

1. 为什么我把决策树当成机器学习的“第一课”在很多机器学习入门资料里,第一个接触的算法往往是线性回归,然后是逻辑回归,一路学到神经网络。但说实话,从我自己的学习经历和后来带新人的经验来看,决策树才是最适合建立…

2026/9/24 21:12:02

AI编程实战:构建人机协同的项目纪律系统

1. 从“写不出第一行代码”到跑通4个AI编程项目的实战路径我第一次打开Cursor时,光是配置Python环境就卡了两小时——不是因为不会装conda,而是根本不确定该用系统Python、pyenv还是直接上Docker。那会儿连requirements.txt里-e .代表什么都要查三遍文档…

2026/9/24 21:07:01

Markdown 语法完整实测与避坑指南:从基础格式到编辑器选型

经常写技术文档、做项目笔记的人,应该都体会过一种纠结:文档到底用 Word 还是 Markdown?Word 排版强大,但版本迁移、格式错乱、复制粘贴一团糟的问题能让人崩溃;Markdown 轻量、纯文本、可迁移,但很多人用起…

2026/9/24 20:24:47

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/24 0:00:21

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:21

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:21

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码