摘要: 在探索本地大模型应用开发的过程中,我尝试使用 Spring AI 连接远程服务器上的 Ollama 服务。然而,这条路并非一帆风顺,我先后遭遇了 Bean 注入冲突以及最致命的内存不足(OOM)问题。本文将详细复盘这段“踩坑”之旅,记录如何从云端服务器转向本机开发,并最终成功实现流式对话的全过程。


一、 环境准备:引入核心依赖

在开始编码之前,我们需要在 pom.xml 中引入必要的依赖。为了兼顾阿里云的 DashScope 服务(作为备用)和本地的 Ollama 服务,我配置了以下核心依赖:

  • Spring Boot Web/Reactive:提供 Web 容器和响应式流支持。
  • Spring AI Ollama:连接本地大模型的核心驱动。
  • Alibaba Cloud AI:用于接入云端模型(本文中作为对比参考)。

核心依赖代码 (pom.xml):

二、 代码实现:构建流式对话接口

目标是实现一个流式接口,能够将用户的输入转发给大模型,并实时返回模型的“思考”过程。

代码逻辑 (OllamaController.java):

@RestController
@RequestMapping("/ollama")
public class OllamaController {

    @Autowired
    private OllamaChatModel ollamaChatModel; // 注入 Ollama 模型 Bean

    @GetMapping("/stream")
    public Flux<String> stream(String message, HttpServletResponse response) {
        // 关键:设置编码防止中文乱码
        response.setCharacterEncoding("UTF- 8");
        // 调用模型的 stream 方法,返回 Flux 流
        return ollamaChatModel.stream(message);
    }
}
三、 初次尝试:云端配置与 Bean 注入冲突

在本地开发阶段,我最初的设想是连接远程服务器(ECS)上的 Ollama 服务。但在启动项目时,遇到了第一个拦路虎。

1. Bean 注入冲突排查
报错信息显示:

Field chatModel in cn.evan.llm.llmentor.controller.PromptTemplateController required a single bean, but 2 were found:

  • dashScopeChatModel
  • ollamaChatModel
  • 原因:项目中同时引入了 spring-ai-alibaba-starter-dashscope(阿里云千问)和 spring-ai-ollama。这两个 Starter 可能都尝试注册了同名的 Bean(chatModel)。
  • 解决
    将项目中所有引入的ChatModel改名为dashScopeChatModel:
    @Autowired
    private ChatModel chatModel;
    改为:
    @Autowired 
    private ChatModel dashScopeChatModel;
    

2. 远程服务器配置陷阱
配置文件 application.yml 最初是这样写的:

spring:
  ai:
    ollama:
      base-url: http://xx.xxx.xxx.xxx:11434 # 服务器公网 IP
      chat:
        model: qwen3:4b

排错过程:

  • YAML 缩进问题:最初因为缩进错误,导致 model 属性没有被读取到,报 500 错误。YAML 对空格极其敏感,必须确保 model 与 base-url 处于同一层级。
四、 核心阻碍:服务器内存不足 (OOM)

当我修正了配置,准备在远程服务器上运行时,遇到了最致命的硬伤。

报错日志:

Error: 500 Internal Server Error: model requires more system memory (3.3 GiB) than is available (2.3 GiB)

深度分析:

  • 资源需求qwen3:4b(40亿参数版本)在运行推理时,需要至少 3.3GB 的系统内存(RAM)。
  • 环境现状:我使用的云服务器配置较低,仅有 2GB 内存。
  • 结论:物理限制无法突破。在云服务器上运行 4B 级别的模型不仅昂贵,而且对于开发调试来说是资源浪费。
五、 最终方案:回归本机开发环境

鉴于云端服务器的高昂成本与配置限制,我决定切换回 Windows 本机 进行开发。利用本机的高性能硬件(通常 16GB/32GB 内存)来运行模型,既经济又高效。

本机配置调整 (application.yml):

spring:
  application:
    name: llmentor
  ai:
    ollama:
      # 关键:Java 运行在本机,直接连接本地服务
      base-url: http://localhost:11434
      chat:
        model: qwen3:4b
六、 总结

这次开发经历让我深刻理解了大模型应用的底层逻辑:

  1. 依赖管理:Spring AI 的生态正在完善,混合使用不同厂商的 Starter 时,要注意 Bean 的命名冲突。
  2. 配置严谨:YAML 的缩进和模型名称的拼写是第一道关卡。
  3. 硬件是基础:大模型对内存的“吞噬”能力惊人。对于个人开发者,“本地开发 + 云端轻量部署(小模型)” 是目前最可行的路线。

现在,我的 Spring Boot 应用已经能够流畅地与本机的 qwen3 进行对话了!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐