Spring AI 系列(四):告别 API 付费!Spring AI + Ollama 本地部署大模型保姆级教程
Spring AI 系列四告别 API 付费Spring AI Ollama 本地部署大模型保姆级教程个人主页夏天拐跑了西瓜专栏传送门《大模型应用开发》、《Java 实战开发》学习方向Java 后端AI‑Agent 大模型应用开发爱好者⭐人生格言路虽远行则将至Ollama 是一款开源的大语言模型LLM平台提供简洁易用的命令行界面和服务端让用户能够轻松下载、运行和管理各种开源 LLM。本文将手把手带你完成 Spring AI 与 Ollama 的整合实战涵盖基本聊天、流式输出、运行时参数配置以及 Embedding 文本相似度检索等核心功能。Ollama 官网https://ollama.comSpring AI 支持使用 Ollama 管理的模型下面介绍 Spring AI 中如何使用 Ollama Chat 和 Ollama Embeddings。这里默认已经安装好 Ollama。一、Ollama 下载与安装Ollama 下载地址https://ollama.com/download支持 Windows、macOS 和 Linux 三大平台。1.1 Windows 安装在官网下载页面选择 Windows 版本下载OllamaSetup.exe安装包下载完成后双击OllamaSetup.exe进行安装默认安装在C:\users\{user}\AppData\Local\Programs目录下建议 C 盘至少要有10G剩余的磁盘空间因为后续 Ollama 中还要下载其他模型到相应目录中。安装完成后电脑右下角自动出现 “Ollama” 图标并开机启动。1.2 macOS 安装macOS 用户推荐使用Homebrew一键安装brewinstallollama也可以从官网下载 macOS 版本的.dmg安装包下载后拖入应用程序文件夹即可完成安装。安装完成后打开终端验证是否安装成功ollama--version如果能正常输出版本号说明安装成功。接下来可以手动启动 Ollama 服务ollama serve提示通过.dmg安装的用户也可以在启动台Launchpad中找到 Ollama 并点击启动启动后菜单栏会出现 Ollama 图标。1.3 验证安装安装完成后可以在终端Windows 为 cmdmacOS 为 Terminal中运行模型进行会话# 命令ollama run 模型名ollama run deepseek-r1:1.5b你是谁think/think您好我是由中国的深度求索DeepSeek公司开发的智能助手DeepSeek-R1。如您有任何任何问题我会尽我所能为您提供帮助。注意使用run命令第一次运行模型时如果模型不存在会自动下载然后进入模型交互窗口后续使用会自动进入交互窗口。1.4 配置远程访问可选在浏览器中输入localhost:11434可以访问 Ollama输出 “Ollama is running”。默认情况下Ollama 服务仅监听本地回环地址127.0.0.1这意味着只有在本地计算机上运行的应用程序才能访问该服务。如果想要使用本机IP:11434访问 Ollama需要将OLLAMA_HOST设置为0.0.0.0这样 Ollama 就会监听所有网络接口包括本机 IP 地址。Windows 配置方式在系统环境变量中添加macOS 配置方式通过launchctl设置环境变量# 设置 Ollama 监听所有网络接口launchctl setenv OLLAMA_HOST0.0.0.0也可以将以下内容添加到~/.zshrc中使其永久生效echoexport OLLAMA_HOST0.0.0.0~/.zshrcsource~/.zshrc注意以上环境变量设置完成后需要重启 Ollama 才能生效。Windows 用户可在任务栏右下角退出 Ollama 后重新启动macOS 用户可先执行pkill ollama终止进程再重新启动。二、Ollama Chat 实战下面以 Spring AI 通过与 Ollama 中模型对话为例演示 Spring AI 的相关配置与使用。2.1 创建 Spring Boot 项目创建 Spring Boot 项目命名为SpringAIOllama2.2 配置 pom.xml?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.5.0/versionrelativePath/!-- lookup parent from repository --/parentgroupIdcom.example/groupIdartifactIdSpringAIOllama/artifactIdversion0.0.1-SNAPSHOT/versionnameSpringAIOllama/namedescriptionSpringAIOllama/descriptionpropertiesjava.version17/java.version/properties!-- 导入 Spring AI BOM用于统一管理 Spring AI 依赖的版本 --dependencyManagementdependenciesdependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-bom/artifactIdversion1.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/project说明这里spring-ai-bom使用正式发布版本1.0.0无需额外配置 SNAPSHOT 仓库依赖解析更加稳定可靠。2.3 配置 application.propertiesspring.application.nameSpringAIOllama server.port8080 # 配置 Ollama 的基础 URL 和使用模型 spring.ai.ollama.base-urlhttp://localhost:11434 spring.ai.ollama.chat.options.modeldeepseek-r1:1.5b spring.ai.ollama.chat.options.temperature0.82.4 基本聊天在SpringAIOllama项目中创建controller包在该包下编写ChatController.java类实现与 Ollama 中模型的基本聊天功能importorg.springframework.ai.ollama.OllamaChatModel;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;RestControllerRequestMapping(/ai)publicclassChatController{AutowiredprivateOllamaChatModelchatModel;GetMapping(/generate)publicStringgenerate(RequestParam(valuemessage,defaultValue给我讲个笑话)Stringmessage){System.out.println(收到消息message);StringresultchatModel.call(message);// 模型返回的内容System.out.println(result);returnresult;}}启动项目后浏览器输入http://localhost:8080/ai/generate?message你是谁可以看到输出内容如下我是DeepSeek Chat由深度求索公司DeepSeek开发的智能AI助手我可以帮你解答问题、提供建议、陪你聊天还能处理各种文本、文档等内容。无论是学习、工作还是日常生活中的疑问都可以来问我哦有什么我可以帮你的吗2.5 Stream 流式聊天Spring AI 使用 Ollama 中的模型与 Chat Models 一样直接在ChatController.java中添加如下方法实现 Stream 流式聊天importorg.springframework.ai.chat.messages.UserMessage;importorg.springframework.ai.chat.prompt.Prompt;importorg.springframework.ai.ollama.OllamaChatModel;importreactor.core.publisher.Flux;importjakarta.servlet.http.HttpServletResponse;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;RestControllerRequestMapping(/ai)publicclassChatController{AutowiredprivateOllamaChatModelchatModel;// ... 2.4 基本聊天方法 ...// 流式获取模型返回的内容GetMapping(/generateStream)publicFluxStringgenerateStream(RequestParam(valuemessage,defaultValue给我讲个笑话)Stringmessage,HttpServletResponseresponse){// 避免返回乱码response.setCharacterEncoding(UTF-8);System.out.println(收到消息message);varpromptnewPrompt(newUserMessage(message));FluxStringresultchatModel.stream(prompt).map(chatResponse-chatResponse.getResult().getOutput().getText());returnresult;}// ... 2.6 运行时参数方法 ...}说明以上代码展示了ChatController中流式聊天和运行时参数的完整方法实际开发中请将它们与 2.4 节的基本聊天方法放在同一个类中。重新启动项目后可以在浏览器输入http://localhost:8080/ai/generateStream?message你是谁查看模型 Stream 流式返回结果。2.6 运行时参数设置Spring AI 使用 Ollama 中的模型时也支持运行时参数设置可以在调用模型时创建一个Prompt并嵌入一个新的OllamaOptions来覆盖启动配置。在ChatController.java中添加如下方法// 运行时参数设置GetMapping(/runtimeOptions)publicStringruntimeOptions(RequestParam(valuemessage)Stringmessage,RequestParam(valuetemp,requiredfalse)Doubletemp){System.out.println(收到消息message);Promptprompt;if(temp!null){// 构建带 temperature 的 OllamaOptions覆盖默认 temperaturevaroptsOllamaOptions.builder().temperature(temp).build();promptnewPrompt(message,opts);System.out.println(使用运行时覆盖 temperaturetemp);}else{// 无 temperature 传入时使用默认配置promptnewPrompt(message);System.out.println(使用默认 temperature);}ChatResponserespchatModel.call(prompt);Stringresultresp.getResult().getOutput().getText();System.out.println(模型返回result);returnresult;}以上代码编写好后重启项目可以传入不同的参数进行测试GET http://localhost:8080/ai/runtimeOptions?message1加1等于几temp0.1三、Ollama Embeddings 实战Ollama Embeddings 是基于 Spring AI 中EmbeddingModel接口的实现使用 Ollama 本地部署的模型生成文本嵌入embeddings。使用 Ollama Embeddings 你需要准备如下内容本地安装 OllamaOllama 中已拉取下载 Embedding 模型3.1 下载 Embedding 模型Ollama 支持很多模型可以通过 https://ollama.com/library 查看可用的模型列表。在本机 Ollama 运行模型时对内存的要求如下模型规模最低内存要求7B70 亿参数8GB13B130 亿参数16GB33B330 亿参数32GB说明模型的参数数量直接影响其对内存的需求参数越多模型越复杂所需的内存也就越大。运行这些模型时请确保系统具有足够的内存。这里在 Ollama 中下载nomic-embed-text:latest嵌入模型命令如下ollama pull nomic-embed-text3.2 Embedding 案例——查找相似文本按照如下步骤完成 Ollama Embedding 案例需要准备如下内容创建 Spring Boot 项目引入spring-ai-starter-model-ollama相关依赖在application.properties配置中引入 Ollama 的嵌入模型3.2.1 准备 Service 及对应方法在SpringAIOllama项目中创建service包并在该包中创建EmbeddingService.java类写入如下内容importorg.springframework.ai.embedding.EmbeddingModel;importorg.springframework.stereotype.Service;importjava.util.List;ServicepublicclassEmbeddingService{privatefinalEmbeddingModelembeddingModel;privatefinalListfloat[]docVectors;// 1. 准备知识库文本内容privatefinalListStringdocsList.of(美食非常美味服务员也很友好。,这部电影既刺激又令人兴奋。,阅读书籍是扩展知识的好方法。);publicEmbeddingService(EmbeddingModelembeddingModel){this.embeddingModelembeddingModel;// 2. 启动时将所有文档向量化this.docVectorsthis.embeddingModel.embed(docs);}/** * 输入用户查询返回最相似文档的索引使用余弦相似度计算 * param query 用户输入的查询文本 * return 最相似的知识库文本 */publicStringqueryBestMatch(Stringquery){// 将用户的输入通过 EmbeddingModel 转换成向量float[]queryVecembeddingModel.embed(query);intbestIdx-1;// 记录目前最匹配文档在列表中的索引位置doublebestSim-1;// 记录目前的最高相似度// 遍历所有文档对应的向量计算与查询向量的相似度for(inti0;idocVectors.size();i){// 计算余弦相似度doublesimcosineSimilarity(queryVec,docVectors.get(i));if(simbestSim){bestSimsim;bestIdxi;}}returndocs.get(bestIdx);}/** * 余弦相似度计算 * 计算两个向量之间的余弦相似度数值范围在 [-1, 1] 之间 * 相似度越高越接近 1越接近 0越不相似 */privatedoublecosineSimilarity(float[]a,float[]b){doubledot0,na0,nb0;for(inti0;ia.length;i){dota[i]*b[i];naa[i]*a[i];nbb[i]*b[i];}returndot/(Math.sqrt(na)*Math.sqrt(nb));}}3.2.2 准备 Controller 及对应方法在SpringAIOllama项目中的controller/EmbeddingController.java类中注入如下依赖和增加如下方法importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importjava.util.Map;RestControllerpublicclassEmbeddingController{AutowiredprivateEmbeddingServiceservice;// 文本相似检测GetMapping(/ai/similarity)publicMapString,Stringsimilarity(RequestParam(query)Stringquery){Stringansservice.queryBestMatch(query);returnMap.of(query,query,answer,ans);}}3.2.3 启动项目并测试启动 Spring Boot 项目在浏览器中输入如下内容进行相似文本查找输入http://localhost:8080/ai/similarity?query美食 返回 { query: 美食, answer: 美食非常美味服务员也很友好。 } 输入http://localhost:8080/ai/similarity?query电影 返回 { answer: 美食非常美味服务员也很友好。, query: 电影 } 输入http://localhost:8080/ai/similarity?query书籍 返回 { answer: 美食非常美味服务员也很友好。, query: 书籍 }说明由于 Embedding 模型大小原因可能导致匹配不够精准。在实际生产环境中建议使用更大规模的 Embedding 模型或结合向量数据库如 Milvus来提升检索效果。总结本文是Spring AI 系列第 4 篇带大家完成了 Spring AI 与 Ollama 的整合实战。我们来回顾一下本文的核心内容内容要点Ollama 安装Windows / macOS 双平台安装教程支持 Homebrew 一键部署基本聊天通过OllamaChatModel实现与本地大模型的同步对话流式输出使用stream()实现打字机效果的逐字返回运行时参数通过OllamaOptions动态覆盖 temperature 等配置Embedding基于本地 Embedding 模型实现文本相似度检索相比前几篇使用 DeepSeek 云端 API本篇的最大亮点是完全本地化——不需要任何 API Key不需要联网一台普通电脑就能跑起来自己的 AI 应用。这对于数据隐私敏感、网络受限或想要深入理解 AI 底层原理的同学来说是一个非常实用的方案。本专栏持续更新 Spring AI 系列文章涵盖RAG 增强检索、MCP 模型上下文协议、多模态模型、Tool Calling 工具调用等热门话题感兴趣的同学记得点赞 关注第一时间获取更新通知如果本文对你有帮助欢迎点赞、收藏、评论三连支持一下你的支持是我持续输出的最大动力

相关新闻

【关注可白嫖源码】--课程设计--毕业设计--springboot简历管理系统[编号:project81389](案件分析)

【关注可白嫖源码】--课程设计--毕业设计--springboot简历管理系统[编号:project81389](案件分析)

本文仅展示核心实现逻辑与部分代码片段,完整项目源码、配套文档、数据库脚本内容较多,篇幅有限无法全部放出。 有需要完整资源的同学,可以在评论区留言【资料或领源码】,我会一 一回复站内私信,发送完整文件 目 录 摘…

2026/8/8 17:27:07 阅读更多 →
Python电商用户行为分析系统设计与实践

Python电商用户行为分析系统设计与实践

1. 项目概述 "基于Python的电商用户行为分析系统"是一个典型的电商数据分析应用,它通过收集用户在电商平台上的各种行为数据(如浏览、点击、加购、下单等),利用Python的数据分析能力挖掘用户行为模式,为电商…

2026/8/8 14:12:03 阅读更多 →
longchain4j实战 -- Multi-Agent协调机制实战

longchain4j实战 -- Multi-Agent协调机制实战

一、为什么需要 Multi-Agent?随着大模型应用的发展,单 Agent 架构在简单场景下可以满足需求,但是面对企业复杂业务时会遇到一些问题。例如,一个数据平台智能助手,需要同时具备:Flink 任务分析能力Kafka 消费…

2026/8/8 16:18:18 阅读更多 →

最新新闻

AI创意协作:从“十二星座恋综”看结构化内容生成工作流

AI创意协作:从“十二星座恋综”看结构化内容生成工作流

最近在尝试用 AI 生成一些创意内容时,我发现一个挺有意思的现象:很多人拿到一个像“十二星座恋综”这样的主题,第一反应往往是直接丢给 AI,让它生成一段描述或脚本。但结果常常是,要么生成的内容过于套路化&#xff0c…

2026/8/9 9:28:18 阅读更多 →
构建高效召回系统:MySQL、ES、Qdrant与Redis四库协同架构实践

构建高效召回系统:MySQL、ES、Qdrant与Redis四库协同架构实践

1. 项目缘起:为什么召回系统需要“四库全书”?做搜索和推荐的朋友,尤其是最近在折腾RAG(检索增强生成)架构的,肯定对“召回”这个词不陌生。简单说,召回就是从海量数据里,快速、准确…

2026/8/9 9:28:18 阅读更多 →
3步开启专业缠论分析:通达信免费插件终极指南

3步开启专业缠论分析:通达信免费插件终极指南

3步开启专业缠论分析:通达信免费插件终极指南 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 通达信缠论可视化分析插件是一款基于C开发的免费专业工具,专门为技术分析爱好者提供…

2026/8/9 9:28:18 阅读更多 →
FPGA ISP之CISP-Lite IP软件栈

FPGA ISP之CISP-Lite IP软件栈

CISP-Lite Linux CISP-Lite 在 Kria KV260 上的 Linux 相机软件栈 ISP V4L2 libcamera 树莓派 GStreamer 目录 项目简介特性系统架构CISP-Lite IP仓库结构快速上手License 项目简介 CISP-Lite 是一套基于 C/HLS 实现的轻量级图像信号处理器(ISP)&…

2026/8/9 9:28:18 阅读更多 →
PUBG罗技鼠标宏压枪脚本终极指南:5分钟快速上手提升射击精度

PUBG罗技鼠标宏压枪脚本终极指南:5分钟快速上手提升射击精度

PUBG罗技鼠标宏压枪脚本终极指南:5分钟快速上手提升射击精度 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为PUBG中难以控制的…

2026/8/9 9:28:18 阅读更多 →
Django全栈开发:从零构建博客系统实战指南

Django全栈开发:从零构建博客系统实战指南

1. Django全栈开发入门:为什么选择博客系统作为练手项目?十年前我刚接触Django时,导师扔给我一个任务:"用Django做个博客系统"。当时觉得这太基础了,直到真正动手才发现,一个完整的博客系统几乎涵…

2026/8/9 9:27:17 阅读更多 →

日新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/8 17:02:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/9 0:45:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/8 17:02:44 阅读更多 →