Spring AI Alibaba + Ollama:国产大模型DeepSeek LLM的低成本AI应用开发认知

写在前面


  • 官方文档很详细,有开发需求可以直接看文档
  • https://java2ai.com/docs/1.0.0-M5.1/get-started/
  • 博文内容为一个开发Demo,以及API简单认知
  • 理解不足小伙伴帮忙指正 😃,生活加油

我看远山,远山悲悯

持续分享技术干货,感兴趣小伙伴可以关注下 _


AI普惠时代的技术革新

在生成式AI技术快速发展的今天,大模型的高效部署与低成本应用成为企业智能化转型的核心挑战。国产大模型 DeepSeek LLM 凭借其轻量化设计、开源生态和高性价比优势,结合 Spring AI Alibaba 框架与 Ollama 本地化部署能力,为开发者提供了一条“平民化”AI应用的可行路径。

什么是 Spring AI

Spring AI 是由 Spring 官方维护的 AI 开发框架,旨在简化企业级 AI 应用构建。

Spring AI 借鉴了 Python 生态的 LangChain 等工具的设计理念,但并非直接移植,而是专注于解决 Java 开发者面临的 AI 集成核心难题——将企业数据/API 与 AI 模型无缝连接,突破 Python 生态垄断,推动生成式 AI 应用向多语言生态扩展。

什么是 Spring AI Alibaba?

Spring AI Alibaba阿里云Java 开发者打造的开源 AI 开发框架,基于 Spring AI 深度集成通义系列模型,提供标准化接口和高阶抽象能力。

Spring AI Alibaba 简化 AI 应用开发流程,支持以 Spring Boot 开发范式快速接入大模型能力,深度整合阿里云通义系列模型及百炼平台,提供模型部署到运维的最佳实践;

​关键能力:

  • 统一 API 抽象(支持聊天/多模态模型、同步/流式调用、跨模型无缝切换);
  • 智能体开发工具集(函数调用、对话记忆、RAG 全链路支持);
  • 工程化增强(结构化输出映射 POJO、向量数据库集成、离线文档处理工具)。
  • 相较于原生 API 调用,该框架通过 Fluent API 设计显著降低开发复杂度,使开发者聚焦业务逻辑而非底层模型交互细节。

API认知

Spring AI Alibaba框架中, 提供了 ​Chat Client​Chat Model 两类不同层次的组件,分别对应不同的开发场景需求。

  • Chat Model(聊天模型)​: 直接与 AI 大模型(比如通义系列模型)打交道的“电话听筒”。你可以把它想象成直接拨通大模型的电话,告诉它你的问题,然后接收它的原始回答。
  • Chat Client(智能体代理客户端)​: 封装好的“智能助手”。它不仅帮你拨通大模型的电话,还会自动帮你处理对话流程、记忆上下文、调用工具函数(比如查机票信息)等复杂操作。

下面我们详细看看

对话模型(Chat Model)

Chat Model 通过标准化 API 抽象,降低多模态大模型集成复杂度,使开发者聚焦业务逻辑,快速实现智能交互功能。

输入/输出形式 支持多模态交互(文本、语音、图片、视频),输入为消息序列(Message),输出为聊天消息(ChatMessage)。

角色区分 消息中可标记角色(如 usersystemassistant),帮助模型理解上下文来源(用户指令、系统提示或模型回复)。

特点

模型适配 :集成通义系列大模型服务(如通义千问、通义万象),支持以下功能:

  • 文本交互ChatModel):文本输入 → 格式化文本输出
  • 文生图ImageModel):文本输入 → 生成图片
  • 文生语音AudioModel):文本输入 → 合成语音
  • 语音转文本(如语音输入解析)。

开发集成

  • 复用 Spring AI 的 Model API,通过 spring-ai-alibaba-starter 自动配置默认实例。
  • 支持直接注入 ChatModelImageModel 等 Bean,亦可自定义模型实例。
API 核心逻辑

交互流程:Prompt(输入) → 模型处理 → ChatResponse(输出)

  • 输入:用户提供的 Prompt 或部分对话上下文。
  • 输出:模型生成的自然语言响应,可呈现给用户或用于后续处理。

底层原理 模型基于训练数据解析输入语义,结合上下文生成连贯、符合逻辑的响应。

对话客户端(Chat Client)

Chat Client 通过标准化流程和 Fluent API 提升开发效率,适合需快速落地的通用 AI 场景;

作用:提供与 AI 模型交互的 Fluent API,简化多组件协作流程(如提示词模板、聊天记忆、模型、解析器等)。

定位:类似应用程序的 服务层,封装底层复杂性,快速实现端到端 AI 交互流程。

特点
  • 编程模型:支持 同步反应式(Reactive) 调用。
  • 开发效率:通过链式调用(Fluent API)减少样板代码,避免手动协调组件(如 RAG、函数调用等)。
  • 功能集成:内置输入输出处理、参数配置等通用逻辑,开箱即用。
基础功能
功能说明
输入定制(Prompt)动态组装用户输入,支持模板化参数填充(如变量替换)。
结构化输出解析将模型返回的非结构化文本转换为结构化数据(如 JSON、对象)。
交互参数调整通过 ChatOptions 动态配置模型参数(如温度、最大 Token 数、Top-P 等)。
  • 聊天记忆(Chat Memory) 维护多轮对话上下文,支持短期记忆(内存)和长期记忆(持久化存储)。
  • 工具/函数调用(Function Calling) 模型根据输入动态调用外部服务或函数(如查询天气、调用 API),并整合结果至响应。
  • RAG(检索增强生成) 集成检索组件,通过向量数据库增强模型知识,生成基于业务数据的精准回答。

开发Demo

ollama 运行 deepseek-r1

启动服务

PS C:\Users\liruilong> ollama serve
2025/03/06 10:33:23 routes.go:1186: INFO server config env="map[CUDA_VISIBLE_DEVICES: GPU_DEVICE_ORDINAL: 
................................

运行模型测试

PS C:\Users\liruilong> ollama run deepseek-r1
>>> 1+1=?
<think></think>1 + 1 = **2**>>> Send a message (/? for help)

Spring AI Alibaba AI 应用开发

添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-ollama-spring-boot-starter</artifactId></dependency>

配置大模型相关配置

server:port: 10005spring:application:name: spring-ai-alibaba-ollama-demoai:ollama:base-url: http://localhost:11434chat:model: deepseek-r1:latest

克隆项目Demo

git clone --depth=1 https://github.com/springaialibaba/spring-ai-alibaba-examples.git
chat model
@RestController
@RequestMapping("/ollama/chat-model")
public class OllamaChatModelController {private static final String DEFAULT_PROMPT = "你好,介绍下你自己吧。请用中文回答。";private final ChatModel ollamaChatModel;public OllamaChatModelController(ChatModel chatModel) {this.ollamaChatModel = chatModel;}/*** 最简单的使用方式,没有任何 LLMs 参数注入。** @return String types.*/@GetMapping("/simple/chat")public String simpleChat() {return ollamaChatModel.call(new Prompt(DEFAULT_PROMPT)).getResult().getOutput().getContent();}/*** Stream 流式调用。可以使大模型的输出信息实现打字机效果。** @return Flux<String> types.*/@GetMapping("/stream/chat")public Flux<String> streamChat(HttpServletResponse response) {// 避免返回乱码response.setCharacterEncoding("UTF-8");Flux<ChatResponse> stream = ollamaChatModel.stream(new Prompt(DEFAULT_PROMPT));return stream.map(resp -> resp.getResult().getOutput().getContent());}/*** 使用编程方式自定义 LLMs ChatOptions 参数, {@link OllamaOptions}。* 优先级高于在 application.yml 中配置的 LLMs 参数!*/@GetMapping("/custom/chat")public String customChat() {OllamaOptions customOptions = OllamaOptions.builder().topP (0.95D).temperature (0.7D).numPredict (1024).build();return ollamaChatModel.call(new Prompt(DEFAULT_PROMPT, customOptions)).getResult().getOutput().getContent();}}

调用接口测试

PS C:\Users\liruilong> curl http://localhost:10005/ollama/chat-model/simple/chat
<think>
您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何任何问题,我会尽我所能为您提供帮助。
</think>您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何任何问题,我会尽我所能为您提供帮助。
PS C:\Users\liruilong> curl http://localhost:10005/ollama/chat-model/stream/chat
<think>
您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何任何问题,我会尽我所能为您提供帮助。
</think>您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何任何问题,我会尽我所能为您提供帮助。

下面为自定义模型参数调用

PS C:\Users\liruilong> curl http://localhost:10005/ollama/chat-model/custom/chat
<think>
您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何任何问题,我会尽我所能为您提供帮助。
</think>您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何任何问题,我会尽我所能为您提供帮助。
PS C:\Users\liruilong>
chat client
@RestController
@RequestMapping("/ollama/chat-client")
public class OllamaClientController {private static final String DEFAULT_PROMPT = "你好,介绍下你自己!请用中文回答。";private final ChatClient ollamaiChatClient;public OllamaClientController(ChatModel chatModel) {this.ollamaiChatClient = ChatClient.builder(chatModel).defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory())).defaultAdvisors(new SimpleLoggerAdvisor()).defaultOptions(OllamaOptions.builder ().topP (0.95D).temperature (0.7D).numPredict (1024).build()).build();}/*** ChatClient 简单调用*/@GetMapping("/simple/chat")public String simpleChat() {return ollamaiChatClient.prompt(DEFAULT_PROMPT).call().content();}/*** ChatClient 流式调用*/@GetMapping("/stream/chat")public Flux<String> streamChat(HttpServletResponse response) {response.setCharacterEncoding("UTF-8");return ollamaiChatClient.prompt(DEFAULT_PROMPT).stream().content();}}

Demo 代码可以看到 chatModel 都是通过自动装配注入的,不需要显示 newclientmodel 的基础上重新构造。

博文部分内容参考

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知 😃


https://sca.aliyun.com/

https://java2ai.com/docs/1.0.0-M5.1/get-started/


© 2018-至今 liruilonger@gmail.com, 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/72652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决:Word 保存文档失败,重启电脑后,Word 在试图打开文件时遇到错误

杀千刀的微软&#xff0c;设计的 Word 是个几把&#xff0c;用 LaTex 写完公式&#xff0c;然后保存&#xff0c;卡的飞起 我看文档卡了很久&#xff0c;就关闭文档&#xff0c;然后 TMD 脑抽了重启电脑 重启之后&#xff0c;文档打不开了&#xff0c;显示 杀千刀的&#xff…

掌握高效大模型任务流搭建术(二):链式流程如何赋能 AI 处理能力提升

前言&#xff1a; 在上一篇文章中&#xff0c;我们初步探索了 LangChain 的基础链式操作——LLMChain。它巧妙地将大语言模型&#xff08;LLM&#xff09;与提示模板&#xff08;Prompt Template&#xff09;相结合&#xff0c;为模型交互逻辑的封装提供了一种简洁而高效的方式…

虚拟卡 WildCard (野卡) 保姆级开卡教程

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 本篇教程为 WildCard 的介绍以及开卡教学&#xff0c;要了解不同平台&#xff08;Grok、Talkatone 等&#xff09;的订阅方式请移步《订阅教程》分类 当我们想要充值国外平台会员时&#xff0c;一般都需要使…

计算机数据库三级刷题总结(博主89分已过,总结的内容分享)

计算机数据库三级刷题总结&#xff08;博主89分已过&#xff0c;总结的内容分享&#xff09; 文章目录 计算机数据库三级刷题总结&#xff08;博主89分已过&#xff0c;总结的内容分享&#xff09;一、 数据库设计阶段二、事务相关三、数据库设计顺序四、数据库三级模式与二层映…

记录一些面试遇到的问题

重载和重写的区别 重载是overload&#xff0c;覆盖是override 重载属于编译时多态&#xff0c;覆盖属于运行时多态 运行时多态和编译时多态 运行时多态指的是在运行的时候才知道要调用哪一个函数&#xff0c;编译时多态是指在编译的时候就知道调用哪一个函数。 运行时多态…

HBuilder X 使用 TortoiseSVN 设置快捷键方法

HBuilder X 使用 TortoiseSVN 设置快捷键方法 单文件&#xff1a;(上锁&#xff0c;解锁&#xff0c;提交&#xff0c;更新) 安装好 TortoiseSVN &#xff0c;或者 按图操作&#xff1a; 1&#xff0c;工具栏中 【自定义快捷键】 2&#xff0c;点击 默认的快捷键设置&…

JmeterHttp请求头管理出现Unsupported Media Type问题解决

JmeterHttp请求头管理出现Unsupported Media Type问题解决 大多数的app与pc端压测的时候都会出现这种情况 当我们在jemter测试当中当中遇见Unsupported Media Type&#xff0c;有一种可能就是我们请求的网页的content-Type的类型与我们测试的时候的类型不一致 解决方法 可以添…

Spring AI 1.0.0-M6 快速开始(一)

Spring AI 1.0.0-M6 入门一、存储库二、依赖管理完整maven 入门 Spring 是JAVA中我们经常使用的框架之一&#xff0c;Spring AI不断的发展迭代目前已经到M6版本据说上半年会出一个稳定版本。 本节提供了如何开始使用Spring AI的M6。 一、存储库 1.0 M6 -添加Spring存储库 需…

顶点着色器和片段着色器

在Unity渲染中&#xff0c;**顶点着色器&#xff08;Vertex Shader&#xff09;和片段着色器&#xff08;Fragment Shader&#xff09;**是图形渲染管线中的两个核心阶段。我们可以通过一个比喻来理解它们的分工&#xff1a;想象你要画一幅由三角形组成的3D模型&#xff0c;顶点…

Impacket工具中的横向渗透利器及其使用场景对比详解

在渗透测试中&#xff0c;横向移动&#xff08;Lateral Movement&#xff09;是指攻击者在获得一个系统的控制权限后&#xff0c;通过网络进一步渗透到其他系统的过程。Impacket 是一款强大的渗透测试工具集&#xff0c;提供了多种实现横向渗透的脚本&#xff0c;常见的工具包括…

设计模式|策略模式 Strategy Pattern 详解

目录 一、策略模式概述二、策略模式的实现2.1 策略接口2.2 具体策略类2.3 上下文类2.4 客户端代码2.5 UML类图2.6 UML时序图 三、优缺点3.1 ✅优点3.2 ❌ 缺点 四、最佳实践场景4.1 适合场景描述4.2 具体场景 五、扩展5.1 继承复用机制和复合策略5.2 对象管理&#xff1a;优化策…

迷你世界脚本显示板管理接口:DisPlayBoard

显示板管理接口&#xff1a;DisPlayBoard 迷你世界 更新时间: 2023-04-26 10:21:14 具体函数名及描述如下: 序号 函数名 函数描述 1 showBoard(...) 对玩家显示显示板 2 hideBoard(...) 对玩家隐藏显示板 3 setBoardPicture 对玩家设置显示板的图片…

尚硅谷爬虫note14

一、scrapy scrapy&#xff1a;为爬取网站数据是&#xff0c;提取结构性数据而编写的应用框架 1. 安装 pip install scrapy 或者&#xff0c;国内源安装 pip install scrapy -i https&#xff1a;//pypi.douban.com/simple 2. 报错 报错1&#xff09;building ‘twisted.te…

merge函数

merge函数 今天在刷lc&#xff0c;从灵神题解中学到的 来源&#xff1a;560. 和为 K 的子数组 - 力扣&#xff08;LeetCode&#xff09; java8 merge()方法被引入到HashMap类中&#xff0c;用于简化键值对操作&#xff0c;在处理键值对时&#xff0c;提供一个重新映射函数来决…

Notepad++ 8.6.7 安装与配置全攻略(Windows平台)

一、软件定位与核心优势 Notepad 是开源免费的代码/文本编辑器&#xff0c;支持超过80种编程语言的高亮显示&#xff0c;相比系统自带记事本具有以下优势&#xff1a; 轻量高效&#xff1a;启动速度比同类软件快30%插件扩展&#xff1a;支持NppExec、JSON Viewer等200插件跨文…

建筑兔零基础自学python记录39|实战词云可视化项目——章节分布10(上)

这次我们来制作《红楼梦》各章节的分布情况&#xff1a; 源代码&#xff1a; import pandas as pd import numpy as np import matplotlib.pyplot as pltdf_hlm pd.read_csv("hlm.txt", names["hlm_texts"]).dropna()df_hlm df_hlm[~df_hlm.hlm_texts.s…

C++:#ifndef 头文件保护机制详解

在C开发中&#xff0c;头文件可能会被多个源文件包含&#xff0c;导致编译错误。为了避免这种情况&#xff0c;我们使用了头文件保护机制&#xff08;防止重复包含&#xff09;。 头文件保护的原理 通过预处理指令#ifndef&#xff08;如果没有定义&#xff09;和#define&…

利用MQ自动取消未支付超时订单最佳实践

一、利用MQ自动取消未支付超时订单最佳实践 1、基于 RocketMQ 延迟消息 1.1&#xff1a;延迟消息 当消息写入到 Broker 后&#xff0c;不会立刻被消费者消费&#xff0c;需要等待指定的时长后才可被消费处理的消息&#xff0c;称为延时消息。 1.2&#xff1a;实现流程 &am…

基于 ChatGPT 创建专属 GPTs

文章目录 基于 ChatGPT 创建专属 GPTs一、效果展示1.1 中文命名专家1.2 行程小助手 二、核心配置2.1 Instructions2.3 Actions 三、Agent 简介3.1 功能框架3.2 工作流程3.3 意图识别 四、数据流程 基于 ChatGPT 创建专属 GPTs ChatGPT 具备定制 GPTs 的能力&#xff0c;能够通…

Spring Boot WebFlux 中 WebSocket 生命周期解析

Spring Boot WebFlux 中的 WebSocket 提供了一种高效、异步的方式来处理客户端与服务器之间的双向通信。WebSocket 连接的生命周期包括连接建立、消息传输、连接关闭以及资源清理等过程。此外&#xff0c;为了确保 WebSocket 连接的稳定性和可靠性&#xff0c;我们可以加入重试…