Spring AI Alibaba + Ollama:国产大模型DeepSeek LLM的低成本AI应用开发认知
写在前面
- 官方文档很详细,有开发需求可以直接看文档
- 博文内容为一个开发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
)。
角色区分 消息中可标记角色(如 user
、system
、assistant
),帮助模型理解上下文来源(用户指令、系统提示或模型回复)。
特点
模型适配 :集成通义系列大模型服务(如通义千问、通义万象),支持以下功能:
- 文本交互(
ChatModel
):文本输入 → 格式化文本输出 - 文生图(
ImageModel
):文本输入 → 生成图片 - 文生语音(
AudioModel
):文本输入 → 合成语音 - 语音转文本(如语音输入解析)。
开发集成
- 复用 Spring AI 的
Model API
,通过spring-ai-alibaba-starter
自动配置默认实例。 - 支持直接注入
ChatModel
、ImageModel
等 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: 10005
spring:
application:
name: spring-ai-alibaba-ollama-demo
ai:
ollama:
base-url: http://localhost:11434
chat:
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
都是通过自动装配注入的,不需要显示 new
,client
在 model
的基础上重新构造。
博文部分内容参考
© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知 :)
© 2018-至今 , 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)
- 点赞
- 收藏
- 关注作者
评论(0)