SpringAI的简单理解

发布时间:2026/10/6 13:44:22

SpringAI的简单理解 SpringAISpring AI 是 Spring 官方针对人工智能AI应用开发推出的标准化框架。它的核心宗旨是将 Spring 开发者熟悉的“依赖注入、统一抽象、声明式配置、面向接口编程”等生态优势完美复刻到 AI 和大模型开发领域。Java 程序员想在项目里接入大模型、搞 RAG 知识库或者搞 AgentSpring AI 就是量身定制的大模型开发脚手架。Spring AI 如何调用模型Spring AI 推荐使用ChatClientSpring Boot 会根据 starter 和配置自动创建ChatModel、EmbeddingModel与ChatClient.Builder。Spring AI ChatClient 文档1. Maven 依赖使用 OllamadependencyManagementdependenciesdependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-bom/artifactIdversion2.0.0/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-model-ollama/artifactId/dependency/dependencies该 starter 同时提供 Ollama Chat 和 Embedding 自动配置。Spring AI Ollama 文档2. 模型配置application.ymlspring:ai:ollama:base-url:http://localhost:11434chat:options:model:qwen3:8btemperature:0.7embedding:options:model:qwen3-embedding:0.6b确保本地已经存在模型模型下载详情见https://blog.csdn.net/sinat_32502451/article/details/163534744ollama pull qwen3:8b ollama pull qwen3-embedding:0.6b3. 使用 ChatClient 调用模型packagecom.example.ai;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.stereotype.Service;importreactor.core.publisher.Flux;ServicepublicclassAiChatService{privatefinalChatClientchatClient;publicAiChatService(ChatClient.BuilderchatClientBuilder){this.chatClientchatClientBuilder.build();}/** * 同步调用模型。 */publicStringchat(Stringquestion){returnchatClient.prompt().user(question).call().content();}/** * 携带系统提示词调用模型。 */publicStringchat(StringsystemPrompt,Stringquestion){returnchatClient.prompt().system(systemPrompt).user(question).call().content();}/** * 流式调用模型。 */publicFluxStringstream(Stringquestion){returnchatClient.prompt().user(question).stream().content();}}核心调用只有StringanswerchatClient.prompt().system(你是一个 Java 技术助手).user(介绍一下 Spring AI).call().content();各方法含义prompt()创建一次模型请求。system()设置系统提示词。user()设置用户消息。call()同步调用模型。stream()流式调用模型。content()取得模型返回的文本。4. 提供 REST 接口packagecom.example.ai;importorg.springframework.http.MediaType;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importreactor.core.publisher.Flux;RestControllerRequestMapping(/api/ai)publicclassAiController{privatefinalAiChatServiceaiChatService;publicAiController(AiChatServiceaiChatService){this.aiChatServiceaiChatService;}/** * 普通问答。 */GetMapping(/chat)publicStringchat(RequestParamStringquestion){returnaiChatService.chat(question);}/** * 流式问答。 */GetMapping(value/stream,producesMediaType.TEXT_EVENT_STREAM_VALUE)publicFluxStringstream(RequestParamStringquestion){returnaiChatService.stream(question);}}普通调用curlhttp://localhost:8080/api/ai/chat?question介绍一下Spring%20AI流式调用curl-Nhttp://localhost:8080/api/ai/stream?question介绍一下Spring%20AI5. 使用底层 ChatModelChatClient底层使用的是ChatModel。如果需要更直接地控制调用可以直接注入packagecom.example.ai;importorg.springframework.ai.chat.model.ChatModel;importorg.springframework.ai.chat.model.ChatResponse;importorg.springframework.ai.chat.prompt.Prompt;importorg.springframework.stereotype.Service;ServicepublicclassLowLevelChatService{privatefinalChatModelchatModel;publicLowLevelChatService(ChatModelchatModel){this.chatModelchatModel;}/** * 直接通过 ChatModel 调用模型。 */publicStringchat(Stringquestion){PromptpromptnewPrompt(question);ChatResponseresponsechatModel.call(prompt);returnresponse.getResult().getOutput().getText();}}也可以显式构造消息importjava.util.List;importorg.springframework.ai.chat.messages.SystemMessage;importorg.springframework.ai.chat.messages.UserMessage;importorg.springframework.ai.chat.model.ChatResponse;importorg.springframework.ai.chat.prompt.Prompt;SystemMessagesystemMessagenewSystemMessage(你是一个 Java 技术助手);UserMessageuserMessagenewUserMessage(Spring AI 是什么);PromptpromptnewPrompt(List.of(systemMessage,userMessage));ChatResponseresponsechatModel.call(prompt);Stringanswerresponse.getResult().getOutput().getText();6. 调用 Embedding 模型Spring Boot 同样会自动创建EmbeddingModel。Spring AI Ollama Embedding 文档packagecom.example.ai;importjava.util.List;importorg.springframework.ai.embedding.EmbeddingModel;importorg.springframework.stereotype.Service;ServicepublicclassAiEmbeddingService{privatefinalEmbeddingModelembeddingModel;publicAiEmbeddingService(EmbeddingModelembeddingModel){this.embeddingModelembeddingModel;}/** * 将一段文本转换为向量。 */publicfloat[]embed(Stringtext){returnembeddingModel.embed(text);}/** * 批量将文本转换为向量。 */publicListfloat[]embedAll(ListStringtexts){returnembeddingModel.embed(texts);}}使用float[]vectoraiEmbeddingService.embed(Spring AI 模型调用示例);System.out.println(vector.length);底层交互过程Java 代码chatClient.prompt().user(你好).call().content();Spring AI 内部执行ChatClient ↓ OllamaChatModel ↓ 将 Prompt 转换成 Ollama JSON 请求 ↓ POST http://localhost:11434/api/chat ↓ Ollama 调用 qwen3:8b ↓ JSON 响应转换为 ChatResponse ↓ content() 返回文本Embedding 调用则是EmbeddingModel.embed(text) ↓ OllamaEmbeddingModel ↓ POST http://localhost:11434/api/embed ↓ qwen3-embedding:0.6b ↓ 返回 float[] 向量Java 业务代码本身是供应商无关的。以后切换到 OpenAI、Azure OpenAI 或其他模型时通常只需要更换 starter 和application.ymlChatClient、ChatModel、EmbeddingModel的调用代码可以保持不变。资料spring-ai官方文档 https://docs.spring.io/spring-ai/reference/index.html
延伸阅读

更多相关文章

2026/10/2 17:39:37

大模型上下文管理实战:5种压缩策略对抗Context Rot

1. 先搞清楚“上下文管理”到底在管什么 如果你用过 ChatGPT、Claude 这类大模型,肯定遇到过对话太长后,模型开始“胡言乱语”的情况:它要么忘记你开头说了什么,要么把不同角色的对话内容搞混,甚至开始凭空捏造信息。这…

2026/9/30 17:05:33

ARM架构下进程和线程的核心区别(切换+创建)

疑问:为什么进程的切换开销比线程大? 进程切换全流程 1. 触发调度,进入内核态进程 A 正在用户态运行,CPU 接到中断信号。硬件自动保存现场: 在进入内核异常处理程序前,CPU 硬件会自动完成以下原子操作&…

2026/10/6 13:44:12

AI编程助手超能力指南:Claude Code与Codex CLI技能框架实战

1. 从"superpowers"这个词说起:它到底指什么 第一次看到"superpowers"这个项目名,很多人会以为是某个超级英雄题材的游戏或者娱乐项目。但结合热搜词里的 agentic skills framework 、 software development methodology 、 Cl…

2026/10/6 13:44:12

Caveman 像素字体实战:终端美化与复古网页设计指南

第一次看到“caveman”这个词,我脑子里冒出来的画面是:一个原始人蹲在火堆边上,拿树枝在泥地上画出一行歪歪扭扭的符号。再配上这个词在开发圈里常见的像素字体语境,Caveman 这款复古像素字,确实自带这种“从岩壁拓印下…

2026/10/6 13:44:12

扣子知识库实战:从文档到智能问答的RAG工程链路

简介:这是一份面向AI应用开发者与知识库搭建需求者的万字教程资源,围绕AI Agent概念与字节Coze平台展开,帮助零基础读者理解智能体原理并动手构建企业级知识库。内容系统梳理了AI Agent的核心公式——LLM、Planning、Memory、Tools四要素&…

2026/10/6 13:44:12

BPSK载波同步与Costas环原理详解:从数字接收机到AD9361工程实现

刚接触到数字接收机的时候,我一度觉得“同步”两个字特别玄乎。直到自己用AD9361平台调BPSK调制解调,第一次在解调链路里加入Costas Loop,才真正明白它解决的到底是什么问题。BPSK信号本身没有显式载波分量,接收端要做相干解调&am…

2026/10/6 13:44:12

marketingskills:营销技能的本质是供需校准操作系统

1. “marketingskills”不是技能清单,而是市场生存的底层操作系统 最近翻看几十份应届生简历、上百条招聘JD,还有几十个创业朋友发来的“为什么我做了半年内容却没转化”的困惑截图,发现一个扎心事实:所有人嘴上都在说“要学marke…

2026/10/6 13:39:12

黄金悖论:无用的金属如何成为价值巅峰?

黄金悖论:无用的巅峰 我最早开始琢磨“黄金悖论”这个词,是因为一个特别反常识的画面——疫情和通胀那阵子,金店门口排起长队,银行金条被买断货,年轻人抱着“攒金豆子”的心态每个月买一克;与此同时&#…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/5 17:38:27

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

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

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

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