Spring Boot 深度集成 Ollama 指南:从聊天模型配置到生产级应用开发

Spring Boot 深度集成 Ollama 指南:从聊天模型配置到生产级应用开发

前言

在人工智能应用开发中,大语言模型(LLM)的本地化部署需求日益增长。Ollama 作为开源的本地LLM运行平台,支持Mistral、LLaMA等主流模型,并提供与OpenAI兼容的API接口,而 Spring AI 则为Java开发者提供了便捷的集成工具链。本文将结合Spring Boot框架,详细讲解如何通过Spring AI实现Ollama聊天模型的全生命周期管理,涵盖基础配置、高级功能开发及生产环境优化,帮助开发者构建高效、可控的本地化智能应用。

一、Ollama 环境搭建与 Spring Boot 集成

1. 安装与启动 Ollama
  • 本地安装
    从 Ollama 官网 下载对应系统的二进制文件(如Windows、macOS或Linux),启动后默认监听端口 11434
    # 启动命令(示例)
    ./ollama server
    
  • 模型拉取
    通过命令行预拉取模型,避免运行时延迟:
    ollama pull mistral       # 拉取默认聊天模型
    ollama pull hf.co/llama3 # 拉取Hugging Face GGUF格式模型
    
2. Spring Boot 依赖配置

pom.xml 中引入Spring AI对Ollama的支持模块:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>
<dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>3.2.0</version> <!-- 替换为最新版本 --><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

二、核心配置:聊天模型参数与自动管理

1. 基础连接与模型初始化

application.yaml 中配置Ollama服务地址及模型拉取策略:

spring:ai:ollama:base-url: http://localhost:11434  # Ollama API地址init:pull-model-strategy: when_missing  # 自动拉取策略(always/never/when_missing)timeout: 10m                      # 拉取超时时间max-retries: 2                    # 拉取失败重试次数chat:include: true                   # 是否初始化聊天模型additional-models: ["llama3-13b"] # 额外预拉取的模型列表
2. 聊天模型参数详解

通过 spring.ai.ollama.chat.options 前缀配置模型行为,关键参数如下:

属性描述示例配置
model目标模型名称(如mistralllavamodel: mistral
temperature生成随机性(0.0保守,1.0创意)temperature: 0.7
num-ctx上下文窗口大小(影响历史对话记忆,单位:Token)num-ctx: 4096
stop终止生成的字符序列(如["###", "\nEND"]stop: ["###"]
keep-alive模型在内存中保持加载的时间(避免频繁重新加载)keep-alive: 10m
num-gpuGPU加速层数(macOS设为1启用Metal,-1自动检测)num-gpu: 1

完整配置示例

spring:ai:ollama:chat:options:model: mistraltemperature: 0.8num-ctx: 2048stop: ["用户:", "###"]top-k: 50

三、高级功能开发:从函数调用到多模态支持

1. 函数调用(Tool Calling)

通过Ollama的函数调用能力,实现LLM与外部工具的联动(需Ollama ≥0.2.8):

@RestController
public class ToolController {private final OllamaChatModel chatModel;@Autowiredpublic ToolController(OllamaChatModel chatModel) {this.chatModel = chatModel;}@PostMapping("/tool/call")public ChatResponse toolCall(@RequestBody String prompt) {// 注册可调用的函数列表List<String> functions = Arrays.asList("searchWeather", "calculate");return chatModel.call(new Prompt(prompt, OllamaOptions.builder().functions(functions).build()));}
}

LLM将返回包含函数名和参数的JSON,例如:

{"function_call": {"name": "searchWeather","parameters": { "city": "北京", "date": "2023-10-01" }}
}
2. 多模态支持(文本+图像)

利用LLaVA等多模态模型处理图像输入(需Ollama支持多模态模型):

@GetMapping("/multimodal")
public ChatResponse multimodalQuery() throws IOException {// 加载图像资源ClassPathResource imageResource = new ClassPathResource("cat.jpg");Media imageMedia = new Media(MimeTypeUtils.IMAGE_JPEG, imageResource);// 构造包含图像的用户消息UserMessage userMessage = new UserMessage("描述图片中的动物", imageMedia);return chatModel.call(new Prompt(userMessage, OllamaOptions.builder().model("llava").build()));
}

多模态是指模型同时理解和处理来自各种来源的信息(包括文本、图像、音频和其他数据格式)的能力。

Ollama 中支持多模态的一些模型是 LLaVA 和 BakLLaVA(请参阅完整列表)。 有关更多详细信息,请参阅 LLaVA:大型语言和视觉助手。

Ollama 消息 API 提供了一个 “images” 参数,用于将 base64 编码的图像列表与消息合并。

Spring AI 的 Message 接口通过引入 Media 类型来促进多模态 AI 模型。 此类型包含有关消息中媒体附件的数据和详细信息,使用 Spring 的org.springframework.util.MimeType以及org.springframework.core.io.Resource对于原始媒体数据。

下面是一个摘自 OllamaChatModelMultimodalIT.java 的简单代码示例,说明了用户文本与图像的融合。

var imageResource = new ClassPathResource("/multimodal.test.png");var userMessage = new UserMessage("Explain what do you see on this picture?",new Media(MimeTypeUtils.IMAGE_PNG, this.imageResource));ChatResponse response = chatModel.call(new Prompt(this.userMessage,OllamaOptions.builder().model(OllamaModel.LLAVA)).build());

该示例显示了一个模型,将multimodal.test.png图像:
多模态测试图像
以及文本消息 “Explain what do you see on this picture?”,并生成如下响应:

The image shows a small metal basket filled with ripe bananas and red apples. The basket is placed on a surface,
which appears to be a table or countertop, as there's a hint of what seems like a kitchen cabinet or drawer in
the background. There's also a gold-colored ring visible behind the basket, which could indicate that this
photo was taken in an area with metallic decorations or fixtures. The overall setting suggests a home environment
where fruits are being displayed, possibly for convenience or aesthetic purposes.
3. 结构化输出与JSON Schema

强制模型返回符合指定格式的结构化数据,便于后续解析:

// 定义JSON Schema
String schema = """{"type": "object","properties": {"steps": {"type": "array","items": { "type": "string" }},"result": { "type": "number" }},"required": ["steps", "result"]}
""";// 在请求中指定格式
ChatResponse response = chatModel.call(new Prompt("计算1+2+3的步骤", OllamaOptions.builder().format(new ObjectMapper().readValue(schema, Map.class)).build()
));

四、生产环境优化与最佳实践

1. 模型管理策略
  • 禁用自动拉取:生产环境中通过 pull-model-strategy: never 关闭自动拉取,提前通过 ollama pull 预下载模型。
  • 模型版本控制:固定模型版本(如mistral:latest),避免因模型更新导致的行为变化。
2. 资源性能调优
  • GPU加速:设置 num-gpu: -1 自动检测GPU,或根据硬件指定层数(如num-gpu: 8)。
  • 内存优化:启用 low-vram: true 减少显存占用,或 use-mlock: true 锁定模型内存防止交换。
3. 连接与容错
  • 连接池配置:通过 OllamaApi 配置连接超时(如connectTimeout(5000))和重试机制。
  • 监控与日志:集成Micrometer监控Ollama请求延迟、错误率,或通过SLF4J记录模型调用日志。

五、OpenAI API 兼容模式:无缝迁移现有应用

Ollama提供与OpenAI API兼容的端点,允许直接复用Spring AI的OpenAI客户端:

spring:ai:openai:chat:base-url: http://localhost:11434  # 指向Ollama服务options:model: mistral                  # 使用Ollama模型temperature: 0.9

此模式下,原有基于OpenAI的代码(如函数调用、流式响应)无需修改即可运行,示例:

@Autowired
private OpenAIAsyncChatClient openAiClient;public String openAICompatQuery() {return openAiClient.chat(Collections.singletonList(new ChatMessage(ChatMessageRole.USER, "推荐一本技术书籍"))).block();
}

在这里插入图片描述

六、手动配置与低级API使用

若需自定义Bean或绕过自动配置,可手动构建OllamaChatModel

@Configuration
public class OllamaConfig {@Beanpublic OllamaChatModel ollamaChatModel() {OllamaApi ollamaApi = OllamaApi.builder().baseUrl("http://remote-ollama-server:11434").build();return OllamaChatModel.builder().ollamaApi(ollamaApi).defaultOptions(OllamaOptions.builder().model("mistral").temperature(0.6).build()).build();}
}

下面的类图说明了OllamaApi聊天界面和构建块:
在这里插入图片描述

总结

本文全面展示了如何通过Spring AI在Spring Boot中集成Ollama,实现从基础聊天功能到多模态交互、函数调用的全场景支持。核心优势包括:

  1. 本地化部署:保障数据隐私,降低网络延迟;
  2. 灵活配置:通过丰富的参数调优模型行为,适应不同业务场景;
  3. 兼容性强:支持OpenAI API兼容模式,简化迁移成本;
  4. 生产就绪:提供模型预拉取、资源优化等最佳实践,确保稳定性。

随着Ollama持续支持更多模型(如代码生成模型、多语言模型),结合Spring生态的工程化能力,本地化AI应用将在企业服务、智能客服、数据分析等领域释放更大价值。未来可进一步探索模型微调、分布式部署等高级场景,构建更强大的智能系统。

参考资料

  • Ollama 官方文档
  • Spring AI GitHub 仓库
  • GGUF 模型库

标签:#SpringBoot #Ollama #LLM #本地化部署 #智能聊天机器人

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/82620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查询oracle进程数和会话数进行优化

查看当前参数配置 首先需要查询当前的 processes 和 sessions 参数值&#xff0c;以确定是否需要调整。 SQL SHOW PARAMETER processes; SHOW PARAMETER sessions; 这些命令可以显示当前实例中允许的最大进程数和会话数 查询当前连接数&#xff0c;查询并发会话 SELECT COUNT…

顶会新方向:卡尔曼滤波+目标检测

卡尔曼虑波&#xff0b;目标检测创新结合&#xff0c;新作准确率突破100%! 一个有前景且好发论文的方向:卡尔曼滤波&#xff0b;目标检测! 这种创新结合&#xff0c;得到学术界的广泛认可&#xff0c;多篇成果陆续登上顶会顶刊。例如无人机竞速系统 Swift&#xff0c;登上nat…

运维自动化工具 ansible 知识点总结

1.Ansible 基础 1.1 Ansible简介 Ansible 是一个开源软件&#xff0c;提供配置管理和应用程序部署等项目通用的管理功能。它主要运行在类 Unix 系统上&#xff0c;通过特性语言来描述各种资源对象&#xff0c;进而管理类 Unix 系统和 Microsoft Windows 系统等系统资源。 官网…

基于python,html,flask,echart,ids/ips,VMware,mysql,在线sdn防御ddos系统

详细视频:【基于python,html,flask,echart,ids/ips,VMware,mysql,在线sdn防御ddos系统-哔哩哔哩】 https://b23.tv/azUqQXe

C语言进阶--数据的存储

1.数据类型介绍 内置类型 char //字符数据类型 1字节 short //短整型 2字节 int //整型 4字节 long //长整型 4/8字节 long long //更长的整型 8字节 (C99中引入的) float //单精度浮点数 4字节 double //双精度浮点数 8字节sizeof(long…

C++学习细节回顾(汇总三)

一.多态概念 同样是动物叫的⼀个⾏为(函数)&#xff0c;传猫对象过去&#xff0c;就是”(>ω<)喵“&#xff0c;传狗对象过去&#xff0c;就是"汪汪"。 1.根据对象不同类型&#xff0c;调用不同函数&#xff0c;这就叫做运行时多态(动态多态) 2.编译时多态(静态…

SpringAI+MCPServer+MCPClient快速入门

SpringAI MCPServer MCPClient 快速入门编写大纲 源代码地址&#xff1a;https://download.csdn.net/download/user_admin_god/90926893 1. 介绍 本文通过使用免费的智普AI的glm-4-flash模型&#xff0c;设计并实现了一个智能问答系统。在该系统中&#xff0c;我们编写了一…

Linux `vi/vim` 编辑器深度解析与高阶应用指南

Linux `vi/vim` 编辑器深度解析与高阶应用指南 一、核心功能解析1. 模式系统2. 与主流编辑器对比二、核心操作体系1. 高效导航命令2. 文本操作矩阵三、高阶配置体系1. .vimrc 配置示例2. 插件管理系统四、企业级开发实践1. 代码编辑技巧2. 宏录制与批量处理五、可视化与多窗口1…

Java五种方法批量处理List元素全解

Java:如何优雅批量处理List中的每个元素 一、场景分析&#xff1a;为什么需要批量处理List&#xff1f;二、核心方法&#xff1a;五种实现方式对比2.1 普通for循环&#xff08;最直接的方式&#xff09;代码示例&#xff1a;优缺点&#xff1a; 2.2 Java 8 replaceAll&#xff…

【Elasticsearch】`_refresh`和`_flush`的区别

在Elasticsearch中&#xff0c;_refresh和_flush操作虽然看似都与“刷新”有关&#xff0c;但它们的功能和作用范围有显著区别&#xff1a; _refresh操作 - 目的&#xff1a;使索引操作&#xff08;如新增、更新、删除文档&#xff09;后的更改能够立即被搜索到。 - 工作原理…

Java核心数据类型:String深度解析(JDK 8+)

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 问题驱动&#xff1a;从用户注册场景说起 场景描述&#xff1a;开发一个用户注册功能时&#xff0c;需要处理用户名的校验、格式化和存储。你可能会遇到…

人员睡岗检测算法AI智能分析网关V4打造工业/安防/交通等多场景应用方案

一、引言​ 在工业生产、安防监控等多领域&#xff0c;众多岗位需员工长时间值守&#xff0c;如流水线工人、监控值班员等。但高强度工作易引发睡岗问题&#xff0c;导致生产效率下降&#xff0c;甚至造成安全事故与财产损失。传统人工巡检响应慢、成本高&#xff0c;难以满足…

自动生成提示技术突破:AUTOPROMPT重塑语言模型应用

AUTOPROMPT 预训练语言模型的显著成功促使人们研究这些模型在预训练期间学习了哪些类型的知识。将任务重新表述为填空题(例如,完形填空测试)是衡量此类知识的自然方法 但是,它的使用受到编写合适提示所需的手动工作和猜测的限制。为了解决这个问题,我们开发了 AUTOPROMP…

6个月Python学习计划 Day 7 - 复盘 + 测试日

第一周 Day 1 - Python 基础入门 & 开发环境搭建 Day 2 - 条件判断、用户输入、格式化输出 Day 3 - 循环语句 range 函数 Day 4 - 列表 & 元组基础 Day 5 - 字典&#xff08;dict&#xff09;与集合&#xff08;set&#xff09; Day 6 - 综合实战&#xff1a;学生信息…

Pycharm and Flask 的学习心得(9)

request对象&#xff1a; 1. request包含前端发送过来的所有请求数据 将from表单里的内容CV到request里面&#xff0c;可以添加if语句来做判断出请求类型后的操作 在网页上的表单上input的数据&#xff0c;后端如何获取呢&#xff1f; request对象获取前端发送来的数据 // …

设计模式-依赖倒转原则

依赖倒转原则 依赖倒转原则 (Dependency Inversion Principle, DIP) 是面向对象设计中 SOLID 原则的第五个原则。 它包含两条核心思想&#xff1a; 高层模块不应该依赖于低层模块。两者都应该依赖于抽象。 高层模块 (High-level modules): 通常包含复杂的业务逻辑和策略&…

AI赋能引爆短剧全球化风潮,腾讯云媒体处理助力短剧平台出海吸金

2023年&#xff0c;中国短剧市场以全平台8000万日投放、近500亿规模的爆发式增长震惊行业。紧凑的内容、爽快的剧情令国内观众迅速爱上了几分钟一集的微短剧。然而在平台内卷、监管收紧、巨头入场等因素的冲击下&#xff0c;不到两年时间&#xff0c;这条赛道就已陷入红海。但与…

开源第三方库发展现状

摘要&#xff1a;当前&#xff0c;开源第三方库生态正呈现爆发式增长趋势。GitHub 目前已托管超过 4.2 亿个代码仓库&#xff0c;远超早期统计的 1 亿规模&#xff0c;显示出开发者社区的活跃度持续攀升。同时&#xff0c;37 个主流包管理器所维护的开源组件数量可能已达到数千…

服务器开机自启动服务

前言&#xff1a; 将服务器中脚本开启自启动执行 步骤&#xff1a; 1.创建一个 systemd 服务文件: /etc/systemd/system/ 目录下创建一个新的服务文件。例如&#xff0c;命名为 myapp.service&#xff1a; sudo nano /etc/systemd/system/myapp.service2.编写 [Unit] Descri…

采用Bright Data+n8n+AI打造自动化新闻助手:每天5分钟实现内容日更

一、引言 在信息爆炸的时代&#xff0c;作为科技领域的内容创作者&#xff0c;我每天都要花费2-3小时手动收集行业新闻、撰写摘要并发布到各个社群。直到我发现Bright Datan8nAI这套"黄金组合"&#xff0c;才真正实现了从"人工搬运"到"智能自动化&qu…