如何用 Spring AI + Ollama 构建生成式 AI 应用

一、故事背景:Java 老炮儿与 AI 新秀的较量上周,产品经理拍着桌子说:"三天内必须上线智能客服! 要能回答订单查询、退换货政策,还要会讲冷笑话! " 我盯着需求文档陷入沉思:传统规则引擎就像老黄牛,拉不动这么重的活;调用 OpenAI 又怕数据泄露——这不是让 Java 程序员在钢丝上跳霹雳舞吗?
一、故事背景:Java 老炮儿与 AI 新秀的较量

上周,产品经理拍着桌子说:"三天内必须上线智能客服!要能回答订单查询、退换货政策,还要会讲冷笑话!" 我盯着需求文档陷入沉思:传统规则引擎就像老黄牛,拉不动这么重的活;调用 OpenAI 又怕数据泄露——这不是让 Java 程序员在钢丝上跳霹雳舞吗?

 这时候,实习生小王推了推眼镜:"试试 Spring AI + Ollama 呗!本地部署大模型,既能装逼又安全!" 这场景让我想起《黑客帝国》里 Neo 看到数据流的瞬间——当我们还在用 if-else 写逻辑时,年轻人已经掏出了矩阵级解决方案。

二、技术选型:为什么是这对 CP?

1. Spring AI:Java 界的 AI 翻译官

  • 零门槛上车:@Autowired 注入 LLM 客户端,比写 MyBatis 还简单
  • 企业级 buff:支持模型版本控制、请求限流、审计日志,CTO 看了都说稳
  • 生态融合:和 Spring Boot 天生一对,老项目改造就像换火花塞

2. Ollama:本地部署的 AI 变形金刚

  • 数据安全屋:所有计算本地完成,数据不出服务器半步
  • 模型百宝箱:LLaMA2、Mistral、CodeLlama 应有尽有
  • 性能黑科技:基于 Metal Performance Shaders 加速,MacBook Pro 秒变炼丹炉

小王神补刀:"这就像你家楼下开了个私人影院,想看啥片自己选,还不怕被邻居偷听。"

三、实战开发:从 Hello World 到智能客服

第一步:环境搭建(10 分钟搞定) 

复制
# 安装 Ollama(Mac 专属福利)
brew install ollama
# 启动服务(像启动 Tomcat 一样简单)
ollama serve
# 拉取中文模型(注意别手抖写成 pull request)
ollama pull mistral:7b-v0.1

小插曲:小王把 pull 敲成 push,结果把本地模型推到公共仓库,吓得他连夜改密码——这波操作像极了把私人日记发朋友圈。

第二步:Spring AI 集成

复制
<!-- 添加依赖,比追女朋友还直接 -->
<dependency>
   <groupId>com.ai.ollama</groupId>
   <artifactId>ollama-spring-boot-starter</artifactId>
   <version>0.2.1</version>
</dependency>

配置文件设置模型参数:

复制
ollama:
 endpoint: http://localhost:11434
 model: mistral:7b-v0.1
 temperature: 0.8  # 0.1 是钢铁直男,1.0 是话痨文艺青年
 max_tokens: 256   # 回答长度控制,比领导讲话还精炼

第三步:核心业务逻辑

复制
@Service
public class ChatService {
   private final OllamaClient ollamaClient;
   public ChatService(OllamaClient ollamaClient) {
       this.ollamaClient = ollamaClient;
   }
   public String generateResponse(String query) {
       // 给 AI 穿上客服制服
       String prompt = """
           你是专业电商客服豆包,回答要简洁。用户问:%s
           """.formatted(query);
       // 调用模型生成回答,像调用 Dubbo 接口一样丝滑
       return ollamaClient.generate(OllamaRequest.builder()
           .model("mistral:7b-v0.1")
           .prompt(prompt)
           .build())
           .stream()
           .map(OllamaResponse::getContent)
           .collect(Collectors.joining());
   }
}

隐藏彩蛋:当用户问"你是谁"时,AI 会回答:"我是您的专属豆包,由 Spring AI 和 Ollama 联合驱动,比您的前任更可靠。"

四、性能优化:让 AI 跑得比老板的 KPI 还快

1. 缓存加速(给 AI 配小本本)

复制
private final Map<String, String> cache = new ConcurrentHashMap<>();
public String generateResponse(String query) {
   if (cache.containsKey(query)) return cache.get(query);


   String response = ollamaClient.generate(...);
   cache.put(query, response);
   return response;
}

注意:涉及隐私的问题不能缓存,比如用户的银行卡密码——AI 也得守规矩。

2. 异步处理(多线程拯救世界)

复制
@Async("chatExecutor")
public CompletableFuture<String> generateResponseAsync(String query) {
   return CompletableFuture.supplyAsync(() -> 
       ollamaClient.generate(...).stream().collect(Collectors.joining())
   );
}

线程池配置建议:核心线程数=CPU 核心数,最大线程数=核心数×2,队列大小=核心数×10——比火锅配菜搭配还讲究。

3. 流式响应(实时看 AI 打字)

复制
@GetMapping("/stream")
public Flux<String> streamResponse(@RequestParam String query) {
   return ollamaClient.generateStream(OllamaRequest.builder()
       .prompt(query)
       .build())
       .map(OllamaResponse::getContent);
}

效果:用户能看到"豆包正在思考中…",就像看主播直播写代码,体验感拉满。

五、进阶玩法:解锁 AI 的隐藏技能

1. 多模态交互(AI 识图功能)

复制
public String handleImageQuery(MultipartFile image) throws IOException {
   String imageText = ocrService.recognize(image.getBytes());
   return chatService.generateResponse(imageText);
}

应用场景:用户发产品图问"这是什么型号",AI 直接返回购买链接——比导购员还机灵。

2. 上下文管理(记住聊天历史)

复制
private final Map<String, List<Message>> historyMap = new ConcurrentHashMap<>();
public String generateResponse(String userId, String message) {
   List<Message> history = historyMap.computeIfAbsent(userId, k -> new ArrayList<>());
   history.add(new Message("user", message));


   String prompt = buildPromptWithHistory(history);
   String response = ollamaClient.generate(prompt);
   history.add(new Message("assistant", response));


   return response;
}

效果:用户说"昨天推荐的手机",AI 能接着之前的话题聊——比人类还记性好。

3. 自定义插件(给 AI 安装 APP)

复制
@Bean
public OllamaPlugin calculatorPlugin() {
   return new OllamaPlugin("calculator")
       .addFunction("calculate", this::calculate)
       .addSchema(CalculatorSchema.class);
}
private Double calculate(CalculatorRequest req) {
   return req.getA() + req.getB();
}

用户问"100 加 50 等于多少",AI 直接调用插件计算,比程序员用 Excel 还快。

六、避坑指南:AI 开发的十大禁忌
  1. 模型越大越好:用 70B 模型回答"今天天气如何",就像用牛刀杀鸡
  2. 忽略 prompt 工程:直接把用户问题丢给 AI,结果生成火星文
  3. 数据裸奔:把身份证号传给云端模型,等于把金库钥匙交给陌生人
  4. 性能预估错误:用 8GB 内存跑 70B 模型,结果服务器直接 OOM
  5. 没有监控报警:AI 返回"我要统治人类"才发现模型中毒
  6. 缺乏回退机制:模型故障时让用户干等,比春运抢票还绝望
  7. 伦理失守:生成虚假医疗建议,可能吃官司
  8. 版本混乱:不同环境用不同模型版本,导致回答人格分裂
  9. 技术黑话:返回"根据余弦相似度计算…",用户直接黑人问号脸
  10. 没有测试用例:直接上线生产,结果用户问"怎么退货",AI 开始写诗

血泪教训:小王把 temperature 设为 1.5,AI 直接开始创作七言绝句,用户投诉“

客服是文艺青年”——这波操作像极了让数学老师教语文。

七、行业洞察:生成式 AI 的未来在哪里?

1. 企业级应用爆发

  • 代码生成:自动补全、单元测试生成,程序员可能失业?
  • 数据分析:自动生成 SQL 查询,BI 工程师瑟瑟发抖
  • 文档处理:合同条款自动解析,法务部要换人?

2. 硬件军备竞赛

  • 苹果 M3 Max 芯片跑 30B 模型无压力
  • 国产昇腾芯片性能逼近英伟达 A100
  • 量子计算研究取得突破,传统 GPU 瑟瑟发抖

3. 监管政策收紧

  • GDPR 要求 AI 生成内容必须标注
  • 中国《生成式人工智能服务管理暂行办法》正式实施
  • 欧盟 AI Act 将模型分为四个风险等级

相关资讯

Deepseek4j再更新:Java应用一行代码集成DeepSeek

deepseek4j 是什么deepseek4j() 是一个专为 Java 开发者打造的 DeepSeek 模型集成框架。 通过优雅的 API 设计,只需一行代码,即可实现接入 DeepSeek,并获得以下核心能力:完整思维链保留:完美保留 DeepSeek 模型的推理过程,让 AI 的思考过程可追溯流式输出体验:基于 Reactor 实现的流式响应,带来类 ChatGPT 的打字机效果复制使用 deepseek4j,您可以专注于业务逻辑开发,而无需关心底层细节。 一、v1.3 更新内容1.1 联网搜索支持1739118403新版本最重要的更新是引入了联网搜索能力,这一功能带来三个关键优势:突破时间边界:模型不再受限于预训练数据的时间范围,可以获取和处理最新信息实时信息获取:通过高质量信息源获取实时资讯,提供更精准的问答服务差异化竞争:在大模型同质化严重的当下,联网搜索成为关键的差异化竞争点复制1.2 智能系统提示词1739118117系统提示词(System Prompt)是基于模型开发的应用程序内置的指令,让决定了模型在特定上下文中的表现方式、回答风格和功能范围。

Spring 宣布接入 DeepSeek

DeepSeek 是深度求索公司发布的大模型,是国产之光。 大家应该学会如何使用 DeepSeek 大模型,下面我们将看下如何开发基于 DeepSeek 大模型的智能应用。 DeepSeek 大模型DeepSeek 推出两款模型;DeepSeek V 系列,对于V系列主要 对话,模型名称:deepseek-chatDeepSeek R 系统,对于R系统主要 推理, 模型名称:deepseek-reasonerDeepSeek 官方更新日志,可以看到模型发布和演化的过程。

Spring AI + Ollama 实现 deepseek-r1 的API服务和调用

兄弟们,今天咱来聊聊一个超有意思的技术组合 ——Spring AI Ollama 实现 deepseek - r1 的 API 服务和调用。 咱都知道,人工智能这几年那可是火得一塌糊涂,各种大模型你方唱罢我登场。 deepseek - r1 就是其中一个挺厉害的模型,那怎么把它用起来,让它为咱们的项目服务呢?