当前位置: 首页 > news >正文

【Springai】 2指定模型的三种方式(Ollama)

Springai 指定模型的三种方式(Ollama)

在实际开发中,Ollama 支持三种常用的模型指定方式:

1. 从 yml 配置读取默认模型

注意: 这是最基础、最推荐的方式,必须先配置好才能用自动注入的 OllamaChatModel。

spring:ai:ollama:base-url: http://localhost:11434chat:options:model: deepseek-r1:7b
@Autowired
private OllamaChatModel chatModel;
// 直接调用 chatModel.call(...) 即用默认模型

2. Prompt 临时指定模型

通过 Prompt 构造时传入 OllamaOptions,可临时切换模型:

import org.springframework.ai.ollama.api.OllamaOptions;Prompt prompt = new Prompt(messageList,OllamaOptions.builder().model("qwen2.5-vl") // 临时指定模型.build());return chatModel.stream(prompt);

3. 创建多个 OllamaChatModel 动态切换

可在配置类中为不同模型创建多个 Bean,或用工厂模式动态切换:

@Bean
public OllamaChatModel ollamaQwenModel() {OllamaApi ollamaApi = OllamaApi.builder().baseUrl("http://localhost:11434").build();// 解析参数OllamaOptions.Builder optionsBuilder = OllamaOptions.builder().model("qwen2.5-vl:3b");return OllamaChatModel.builder().ollamaApi(ollamaApi).defaultOptions(optionsBuilder.build()).build();
}@Bean
public OllamaChatModel ollamaLlamaModel() {OllamaApi ollamaApi = OllamaApi.builder().baseUrl("http://localhost:11434").build();// 解析参数OllamaOptions.Builder optionsBuilder = OllamaOptions.builder().model("llama2:7b");return OllamaChatModel.builder().ollamaApi(ollamaApi).defaultOptions(optionsBuilder.build()).build();
}

或通过自定义工厂类,根据参数动态返回不同模型实例:

public class DynamicModelFactory {public OllamaChatModel getModelByName(String modelName) {// ...根据modelName返回不同OllamaChatModel实例...}
}

接口调用时根据参数动态切换:

OllamaChatModel model = dynamicModelFactory.getModelByName(modelName);
return model.stream(prompt);

建议所有模型还是维护到数据库,因为大部分模型特别是相同供应商的调用方式都一样

CREATE TABLE `ai_model` (`id` bigint NOT NULL AUTO_INCREMENT,`vendor` varchar(64) NOT NULL COMMENT '供应商',`icon` varchar(255) DEFAULT NULL COMMENT '图标URL',`name` varchar(128) NOT NULL COMMENT '模型名称',`api_key` varchar(255) DEFAULT NULL COMMENT '密钥',`api_url` varchar(255) NOT NULL COMMENT '模型API地址',`tags` varchar(255) DEFAULT NULL COMMENT '标签(推理、对话、图片、语音等,逗号分隔)',`type` varchar(32) NOT NULL COMMENT '类型(对话、图片、音频、视频、量化)',`status` tinyint NOT NULL DEFAULT 1 COMMENT '模型可用状态 1:可用 0:不可用',`description` text COMMENT '模型描述',`params` json DEFAULT NULL COMMENT '模型参数(如温度等)',`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_german2_ci;

DynamicModelFactory.java

/*** 动态模型工厂,项目启动时缓存所有模型*/
@Component
public class DynamicModelFactory {@Autowiredprivate AiModelRepository aiModelRepository;private final HashMap<String, MyModel> modelHashMap = new HashMap<>();@PostConstructpublic void init() {List<AiModel> models = aiModelRepository.findAll();ObjectMapper objectMapper = new ObjectMapper();for (AiModel m : models) {MyModel myModel = new MyModel();myModel.vendor = m.getVendor();myModel.name = m.getName();myModel.apiKey = m.getApiKey();myModel.apiUrl = m.getApiUrl();myModel.type = m.getType();myModel.status = m.getStatus();myModel.params = m.getParams();// 这里只实现Ollama,后续可扩展其他供应商if ("ollama".equalsIgnoreCase(m.getVendor())) {OllamaApi ollamaApi = OllamaApi.builder().baseUrl(m.getApiUrl()).build();// 解析参数OllamaOptions.Builder optionsBuilder = OllamaOptions.builder().model(m.getName());if (m.getParams() != null && !m.getParams().isEmpty()) {try {Map<String, Object> paramMap = objectMapper.readValue(m.getParams(), Map.class);if (paramMap.containsKey("temperature")) {optionsBuilder.temperature(Double.parseDouble(paramMap.get("temperature").toString()));}// 可扩展更多参数} catch (Exception ignored) {}}myModel.chatModel = OllamaChatModel.builder().ollamaApi(ollamaApi).defaultOptions(optionsBuilder.build()).build();}// TODO: 其他供应商实现modelHashMap.put(m.getName(), myModel);}}public MyModel getModelByName(String name) {return modelHashMap.get(name);}public void refreshModel(String modelName) {AiModel m = aiModelRepository.findByName(modelName);if (m == null) return;MyModel myModel = new MyModel();myModel.vendor = m.getVendor();myModel.name = m.getName();myModel.apiKey = m.getApiKey();myModel.apiUrl = m.getApiUrl();myModel.type = m.getType();myModel.status = m.getStatus();myModel.params = m.getParams();if ("ollama".equalsIgnoreCase(m.getVendor())) {OllamaApi ollamaApi = OllamaApi.builder().baseUrl(m.getApiUrl()).build();OllamaOptions.Builder optionsBuilder = OllamaOptions.builder().model(m.getName());if (m.getParams() != null && !m.getParams().isEmpty()) {try {Map<String, Object> paramMap = new ObjectMapper().readValue(m.getParams(), Map.class);if (paramMap.containsKey("temperature")) {optionsBuilder.temperature(Double.parseDouble(paramMap.get("temperature").toString()));}} catch (Exception ignored) {}}myModel.chatModel = OllamaChatModel.builder().ollamaApi(ollamaApi).defaultOptions(optionsBuilder.build()).build();}// TODO: 其他供应商实现modelHashMap.put(m.getName(), myModel);}public static class MyModel {@Schema(description = "供应商")private String vendor;@Schema(description = "模型名称")private String name;@Schema(description = "密钥")private String apiKey;@Schema(description = "模型API地址")private String apiUrl;@Schema(description = "类型(对话、图片、音频、视频、量化)")private String type;@Schema(description = "模型可用状态 1:可用 0:不可用")private Integer status;@Schema(description = "模型参数(如温度等,json格式)")private String params;@Schema(description = "ollama对应的会话对象")private OllamaChatModel chatModel;// TODO: 其他供应商的会话ChatModelpublic OllamaChatModel getChatModel() { return chatModel; }public String getVendor() { return vendor; }public String getName() { return name; }public String getApiKey() { return apiKey; }public String getApiUrl() { return apiUrl; }public String getType() { return type; }public Integer getStatus() { return status; }public String getParams() { return params; }}
} 
http://www.lqws.cn/news/588277.html

相关文章:

  • 【算法】动态规划:1137. 第 N 个泰波那契数
  • (12)python+playwright自动化测试-iframe-中
  • torchvision中的数据使用
  • vue常见问题:
  • RNN中张量参数的含义与应用
  • stm32达到什么程度叫精通?
  • 如何用废弃电脑变成服务器搭建web网站(公网访问零成本)
  • 【知识图谱构建系列7】:结果评价(1)
  • JavaScript异步编程的五种方式
  • git 冲突解决
  • Android Fragment的生命周期(经典版)
  • 详解 Blazor 组件传值
  • Spring Boot + ONNX Runtime模型部署
  • 【机器学习】感知机学习算法(Perceptron)
  • 安卓面试之红黑树、工厂模式图解
  • 《汇编语言:基于X86处理器》第5章 复习题和练习,编程练习
  • 提升学习能力(一)
  • Python实例题:基于 Flask 的博客系统
  • 打卡day58
  • 【软考高项论文】论信息系统项目的范围管理
  • [Vue2组件]三角形角标
  • java初学习(-2025.6.30小总结)
  • 从入门到精通:npm、npx、nvm 包管理工具详解及常用命令
  • 【期末分布式】分布式的期末考试资料大题整理
  • 安装bcolz包报错Cython.Compiler.Errors.CompileError: bcolz/carray_ext.pyx的解决方法
  • 服务器被入侵的常见迹象有哪些?
  • AI--提升效率、驱动创新的核心引擎
  • 项目管理进阶——133个软件项目需求评审检查项
  • 集群【运维】麒麟V10挂载本地yum源
  • 03认证原理自定义认证添加认证验证码