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

【Spring AI 实战】基于 Docker Model Runner 构建本地化 AI 聊天服务:从配置到函数调用全解析

【Spring AI 实战】基于 Docker Model Runner 构建本地化 AI 聊天服务:从配置到函数调用全解析

前沿:本地化 AI 推理的新范式

随着大语言模型(LLM)应用的普及,本地化部署与灵活扩展成为企业级 AI 开发的核心需求。Docker Model Runner 作为 Docker 官方推出的 AI 推理引擎,支持集成多厂商模型并提供标准化 API,结合 Spring AI 的强大生态,可快速构建低成本、高可控的本地化聊天服务。本文将深入解析如何通过 Spring AI 与 Docker Model Runner 的无缝集成,实现开箱即用的 LLM 功能,涵盖环境配置、属性调优、函数调用等核心技术点。

一、环境准备:搭建 Docker Model Runner 基础架构

1. 前提条件

  • Docker Desktop 安装:下载并安装适用于 Mac 的 Docker Desktop 4.40.0(其他平台请对应选择)。
  • 启用 Model Runner
    选项 1(直接启用)
    docker desktop enable model-runner --tcp 12434
    
    基 URL 配置为 http://localhost:12434/engines
    选项 2(Testcontainers 容器化)
    通过 Socat 容器映射端口,适用于自动化测试:
    @Container
    private static final SocatContainer socat = new SocatContainer().withTarget(80, "model-runner.docker.internal");@Bean
    public OpenAiApi chatCompletionApi() {var baseUrl = "http://%s:%d/engines".formatted(socat.getHost(), socat.getMappedPort(80));return OpenAiApi.builder().baseUrl(baseUrl).apiKey("test").build();
    }
    

2. Spring AI 依赖配置

pom.xmlbuild.gradle 中引入最新 Starter:

<!-- Maven -->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
// Gradle
implementation 'org.springframework.ai:spring-ai-starter-model-openai'

二、核心配置:从连接到模型调优

1. 基础连接配置

通过 application.properties 配置 Docker Model Runner 端点:

spring.ai.openai.api-key=test          # 任意有效字符串(非真实 OpenAI Key)
spring.ai.openai.base-url=http://localhost:12434/engines  # Model Runner 引擎端点
spring.ai.openai.chat.options.model=ai/gemma3:4B-F16      # 选择目标模型(需与 Model Runner 支持的镜像匹配)

2. 聊天属性深度解析

Spring AI 提供细粒度配置,支持重试策略、连接参数及模型行为调优,以下为核心属性表:

重试策略(前缀:spring.ai.retry
属性名称描述默认值
max-attempts最大重试次数10
backoff.initial-interval初始回退间隔(秒)2
backoff.multiplier回退间隔乘数(指数增长因子)5
backoff.max-interval最大回退间隔(秒)180
on-client-errors是否重试 4xx 错误false
模型行为配置(前缀:spring.ai.openai.chat.options
属性名称描述默认值
temperature输出随机性控制(0-1,越高越随机)0.8
max-tokens最大生成令牌数无限制(受模型上下文限制)
frequencyPenalty重复令牌惩罚(-2.0~2.0)0.0
responseFormat强制输出 JSON 格式
tools允许调用的工具列表
多模型管理

通过 spring.ai.model.chat 开关启用/禁用 OpenAI 聊天模型:

spring.ai.model.chat=openai  # 启用 OpenAI 聊天模型(默认)
# spring.ai.model.chat=none  # 禁用聊天模型

三、进阶功能:函数调用与流式响应

1. 智能工具集成(函数调用)

Docker Model Runner 支持模型自动触发注册函数,实现外部服务交互。
示例代码:

@SpringBootApplication
public class DockerModelRunnerDemo {@Bean@Description("获取指定地点天气")public Function<WeatherRequest, WeatherResponse> weatherFunction() {return request -> {double temp = "Amsterdam".equals(request.location()) ? 20 : 25;return new WeatherResponse(temp, request.unit());};}@BeanCommandLineRunner runner(ChatClient chatClient) {return args -> {String response = chatClient.prompt().user("巴黎和阿姆斯特丹的天气如何?").functions("weatherFunction")  // 引用 Bean 名称.call().content();System.out.println(response);  // 输出:阿姆斯特丹 20℃,巴黎 25℃};}
}record WeatherRequest(String location, String unit) {}
record WeatherResponse(double temp, String unit) {}

2. 流式响应实现

通过 stream() 方法支持实时逐令牌输出,提升交互体验:

@RestController
public class ChatController {private final OpenAiChatModel chatModel;@GetMapping("/ai/generateStream")public Flux<ChatResponse> generateStream(@RequestParam String message) {Prompt prompt = new Prompt(new UserMessage(message));return chatModel.stream(prompt);  // 流式返回响应}
}

四、实战示例:构建基础聊天接口

1. 控制器实现

创建 REST 端点处理用户输入并返回生成结果:

@RestController
public class ChatController {private final OpenAiChatModel chatModel;@Autowiredpublic ChatController(OpenAiChatModel chatModel) {this.chatModel = chatModel;}@GetMapping("/ai/generate")public Map<String, String> generate(@RequestParam String message) {String response = chatModel.call(message);  // 同步调用模型return Collections.singletonMap("result", response);}
}

2. 禁用无关功能(如 Embedding)

由于 Docker Model Runner 暂不支持 Embedding,需显式关闭:

spring.ai.openai.embedding.enabled=false

五、最佳实践与注意事项

  1. 模型选择:确保 spring.ai.openai.chat.options.model 与 Model Runner 中加载的镜像标签一致(如 ai/gemma3:4B-F16)。
  2. 性能优化:通过降低 temperature(如 0.5)提升输出确定性,或调整 max-tokens 避免超长响应。
  3. 错误处理:利用 retry.exclude-on-http-codes 排除无需重试的状态码(如 404),减少无效重试。

总结:本地化 AI 开发的破局之道

本文通过 Docker Model Runner 与 Spring AI 的集成实践,展示了如何快速构建可控、可扩展的本地化聊天服务。核心优势包括:

  • 低成本部署:无需依赖云端 API,降低数据传输延迟与成本;
  • 灵活扩展:支持多模型热插拔,通过函数调用无缝连接外部服务;
  • 企业级适配:细粒度的配置体系满足高可用、高性能需求。

随着 AI 应用的落地深化,本地化推理与框架级集成将成为企业构建智能应用的核心竞争力。通过 Spring AI 的标准化接口与 Docker Model Runner 的模型管理能力,开发者可聚焦业务逻辑,加速 AI 功能落地。

延伸阅读

  • Spring AI 升级指南
  • OpenAI 函数调用规范

相关文章:

  • 从 Git 到 GitHub - 使用 Git 进行版本控制 - Git 常用命令
  • AI云防护真的可以防攻击?你的服务器用群联AI云防护吗?
  • 基于OpenCV的人脸识别:EigenFaces算法
  • 【愚公系列】《Manus极简入门》028-创业规划顾问:“创业导航仪”
  • TB6600HG-富利威
  • AI与自然语言处理(NLP):从BERT到GPT的演进
  • NextPolish1.4.1 安装与使用-bioinformatics tools54
  • 按位宽提取十六进制值
  • 【动态导通电阻】p-GaN HEMTs正向和反向导通下的动态导通电阻
  • 催缴机器人如何实现停车费追缴“零遗漏”?
  • 【递归、搜索和回溯】递归、搜索和回溯介绍及递归类算法例题
  • 2025数维杯数学建模B题完整限量论文:马拉松经济的高质量发展思路探索
  • 动态创建链表(头插法、尾插法)
  • Oracle链接服务器导致SQL Server异常终止
  • 相机的方向和位置
  • 波特五力分析——AI与思维模型【99】
  • 软件工程之软件项目管理深度解析
  • The 2024 ICPC Kunming Invitational Contest G. Be Positive
  • 人工智能 机器学习期末考试题
  • 8.1.Kubernetes进阶
  • A股三大股指低收:银行股再度走强,两市成交11920亿元
  • 比特币价格时隔三个月再度站上10万美元
  • 外交部答澎湃:美方攻击抹黑中加关系与合作的卑劣图谋不会得逞
  • 保利发展前4个月销售额约876亿元,单月斥资128亿元获4个项目
  • 长安汽车辟谣作为二级企业并入东风集团:将追究相关方责任
  • 是否有中国公民受印巴冲突影响?外交部:建议中国公民避免前往冲突涉及地点