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 工具调用等热门话题感兴趣的同学记得点赞 关注第一时间获取更新通知如果本文对你有帮助欢迎点赞、收藏、评论三连支持一下你的支持是我持续输出的最大动力