AI在线 AI在线

如何用 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 将模型分为四个风险等级

相关资讯

DeepSeek本地部署详细指南!从 Ollama 到个人知识库应用

作者:lushen一、系统介绍mbp pro:二、Ollama 安装与配置1. 跨平台安装指南Ollama 作为本地运行大模型的利器,支持三大主流操作系统:复制2. 服务验证复制出现上述则表示安装成功,可浏览器访问http://localhost:11434/验证。
2/11/2025 12:15:57 PM
腾讯技术工程

Manus AI联手Ollama:打造真正能“动手”的智能助手

第一次听到Manus AI,我的内心泛起一丝好奇——这款AI助手居然声称比DeepSeek和ChatGPT还强? 带着疑问,探索了它的独特之处,而结果着实让我吃惊。 Manus的名字来自拉丁语“Mens et Manus”,意即“头脑与双手”。
3/17/2025 12:00:00 AM
dev

手把手教你实现 Ollama+FastGPT+DeepSeek 打造个人专属 AI 知识库!

本文从零实现,基于Ollama、FastGPT、Deepseek在本地环境中打造属于自己的专业知识库,与大家分享~一、本地部署OllamaOllama是一个开源的本地大语言模型运行框架,专为在本地机器上便捷部署和运行大语言模型(LLM)而设计,无需依赖云端服务。 它提供简单易用的界面和优化的推理引擎,帮助我们轻松加载、管理和运行各种AI模型。 1.
3/26/2025 8:50:00 AM
小喵学AI
  • 1