使用SpringAI快速实现离线本地大模型应用

Spring AI Alibaba: 支持国产大模型的Spring ai框架 Spring AI Alibaba是阿里巴巴推出的一个专注于人工智能应用开发的框架,它基于Spring生态系统构建,旨在简化AI应用程序的开发流程。同时,Spring AI也充分利用了Java面向对象编程的优势,允许开发者通过熟悉的编程模式来操作复杂的AI模型和算法,从而加速了从概念验证到生产环境的整个过程。此外,Spring AI与原有的Spring生态系统完美兼容,这意味着已经熟悉Spring框架的开发者可以无缝过渡到使用AI技术,无需学习全新的工具或语言。来测试这个聊天API。 阅读详情

前言

大模型(LLM),Large Language Model作为当前比较热门的技术,最近在年在各行各业中都得到了广泛的应用。

在我们目前使用较多的AI产品中,几乎都是使用的互联网(云端)上的AI工具,即:需要先把数据传输给AI平台,由AI平台处理后,再将信息回馈到我们的本地应用。

然而在许多领域,由于大模型的数据没有采集到更细化的信息,亦或者出于安全原因某些数据不能对外公开,这时使用离线大模型来实现信息的生成与检索则变得非常重要。

很久没用Spring的我,最近看到Spring官网出了Spring AI这个框架,出于好奇体验了下感觉非常不错,在此写篇博文记录下。

本文重点为:如何快速从0到1搭建一个离线大模型,并使用SpringAI进行交互调用。

ollama介绍与安装

ollama作为一个工具(且开源),让大模型的安装与运行变得非常简单。
ollama

ollama支持多种操作系统,为了方便可以直接使用Docker运行。

下载命令一行搞定:

sudo docker pull ollama/ollama:latest

ollama上手

ollama下载好后,直接运行

#运行ollama,并指定挂载目录和映射端口
docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
#进入ollama容器
docker exec -it ollama bash
#运行ollama命令pull一个大模型,这里拉取具有图像识别能力的minicpm-v
ollama pull minicpm-v

ollama支持的大模型非常多,如google的gemma、facebook的llama、阿里的qwen通通都有,按需所取。
模型仓库地址为:https://ollama.com/library

大模型下载好了后,就可以使用ollama run命令运行对应的模型,并可以进行命令行的文本交互

ollama run minicpm-v

ollama-run

open-webui安装

为了能获得更好的体验,可以使用开源的open-webui进行来访问离线大模型,UI界面和ChatGPT的非常像。

docker下拉取命令:

sudo docker pull ghcr.io/open-webui/open-webui:main

拉取好后直接运行:

docker run -d --network=host -v open-webui:/app/backend/data -e OLLAMA_BASE_URL=http://127.0.0.1:11434 --name open-webui --restart always ghcr.io/open-webui/open-webui:main

这里笔者为了方便使用的是host网络,默认暴露的端口为8080,指定了webui存储数据的目录为/app/backend/data,并指定了ollama的后端地址为http://127.0.0.1:11434

基本功能体验

通过上面几行命令安装好了ollama与open-webui,之后就可以体验下离线大模型的常用功能了。

访问方式:直接访问open-webui的ip+port就行。
如我这里的docker物理机为_192.168.140.8_,则访问地址为http://192.168.140.8:8080

智能对话

首次访问open-webui需要先本地注册,随便填一个账号信息就行,并且首次注册的账号也是管理员账号。

由于我前面下载的大模型为minicpm-v,它是支持中文,效果如下:
chat-gif

图片识别

如minicpm-v的介绍所述
minicpm-v

minicpm-v模型支持图像和视频识别,传一个兴隆湖的照片让它试一下。
read-img
识别效果也还可以

文生图

文生图方面比较知名的开源大模型为StableDiffusion,为了方便我们可以使用在StableDiffusion基础上进行二次开发的ComfyUI。
关于comfyui的安装方式可以参考此链接https://comfyui-wiki.com/zh-CN进行学习。

要注意的是,要让open-webui能成功调用ComfyUI进行文生图,需要确保ComfyUI的监听端口能访问到,且开启了DevMode。

之后再进入open-webui的设置界面的图像栏进行设置,在其中填入ComfyUI的接口地址与模型配置即可。
open-webui-settings

配置好了之后再回到对话界面,如有符合可以生成图片的提示词界面上就会出点一个图像按钮,点一下即可生成图片

以生成一个小女孩的需求为例,演示一下:
gen-img
上面例子中输入的关键字为:回复提示词"A girl",仅回复提示词,不要回复别的信息

如想让提示词更加完善,可以使用https://ollama.com/impactframes/llama3_ifai_sd_prompt_mkr_q4km这个模型,它可以自动完善提示词以让生成的图像更丰富。

ollama run impactframes/llama3_ifai_sd_prompt_mkr_q4km

用它生成图像时,就可以这样进行对话:

Write prompts for “A smiling girl,in bikini.”. Only response the prompts for the image and nothing else.

在OpenWebUi中调用文生图,其最终都会调用到本地的ComfyUI里,大量生成图片、动画、视频的需求更建议直接使用ComfyUI,效果更佳
ComfyUI

spring-ai

前面介绍了如何使用ollama与open-webui快速搭建一个离线大模型平台,并体验了AI的相关功能。

但在实际业务场景中,前端程序往往与后端平台进行对接,与大模型的交互由后端程序来负责接入则更为合适。

站在这一维度考虑,使用Spring AI来接入大模型则是一个不错的选择。

SpringAI

关于Spring AI的详细介绍可参考:https://spring.io/projects/spring-ai

Spring AI is an application framework for AI engineering. Its goal is to apply to the AI domain Spring ecosystem design principles such as portability and modular design and promote using POJOs as the building blocks of an application to the AI domain.

翻译一下:Spring AI是一个AI工程框架。它的目标是将Spring生态的设计原则应用到AI领域,比如可移植性和模块化,并推广使用POJO来构建AI生态。

换句话讲:Spring AI不生产AI,只是AI的搬运工

快速接入

尽管Spring AI目前还处于开发阶段,但已经提供了使用文档,以让我们能体验并使用Spring AI的基本功能。接入方式说明可参考:getting-started

Spring AI支持接入的大模型较多,这里以接入离线的ollama为例,记录下接入过程

spring-ai-flow

pom依赖

新建一个maven项目,其pom.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.0</version>
        <relativePath/>
    </parent>
    <groupId>com.haiyang</groupId>
    <artifactId>spring-ai-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-ai-demo</name>
    <description>spring-ai-demo</description>
    <properties>
        <java.version>17</java.version>
        <spring-ai.version>1.0.0-SNAPSHOT</spring-ai.version>
    </properties>
    <dependencies>
        <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>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>${spring-ai.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
    </repositories>
</project>

需要了解到的是:目前Spring AI还没有正式版,所以需要添加repository标签以能从snapshot仓库下载到依赖。

大模型接口配置

在SpringBoot项目的配置文件中添加配置项,在application.properties中新增:

#配置ollama接口地址
spring.ai.ollama.base-url=http://192.168.140.8:11434/
#配置使用的ollama模型
spring.ai.ollama.chat.options.model=gemma:7b
启动类与接口实现

在Application类中创建ChatClient

@SpringBootApplication
public class SpringAiDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringAiDemoApplication.class, args);
    }

    @Bean
    public ChatClient chatClient(ChatClient.Builder builder) {
        return builder.build();
    }
}

在controller中添加一个接口

@RestController
public class AIController {
    @Resource
    private ChatClient chatClient;

    @GetMapping("/ai")
    public Map<String, String> completion(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        return Map.of(
                "generation",
                Objects.requireNonNull(chatClient.prompt()
                        .user(message)
                        .call()
                        .content()));
    }
}

以上,一个基于集成了gemma的离线大模型后端就实现好了。是不是非常简单

对话接口验证

访问http://127.0.0.1:8080/ai试一下
api-test

试一下携带参数,message=成都有哪些好玩的地方
withParamTest

stream消息接口实现

我们知道智能对话的底层是AIGC,也就是它的结果是一个字一个字冒出来的,为了视觉上更好的直观体验,我们也一般采用实时更新的方式将冒出的字词一个个通知到前端。

sse

用于后端向前端实时通信的方案有很多,为了实现性能好开销低,推荐使用SSE(Server-Sent Events)的方式进行字符(token)的推送

HTTP 短轮询、HTTP 长轮询、WebSocket、SSE 的顺序重新排列的对比表格
cmp-sse

在Spring AI中,使用自带的ChatModel就可以实现。示例接口代码如下:

    @GetMapping("/ai/generateStream")
    public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        Prompt prompt = new Prompt(new UserMessage(message));
        return this.chatModel.stream(prompt);
    }

使用stream返回数据时,则可以看到前端收到的消息则是一个字一个字发下去的了。
sse-cap

再搭配Vaadin实现一个前端界面,源码为:

@Route("")
public class HaiyangAIView extends VerticalLayout {

    public HaiyangAIView(ChatService chatService) {
        String chatId = chatService.establishChat();
        var messageList = new VerticalLayout();
        var messageInput = new MessageInput();
        messageInput.setWidthFull();
        messageInput.addSubmitListener(e -> submitPromptListener(chatId, e, chatService, messageList));
        addClassName("centered-content");
        add(messageList, messageInput);
    }

    private static void submitPromptListener(String chatId, MessageInput.SubmitEvent e, ChatService chatService, VerticalLayout messageList) {
        var question = e.getValue();
        var userMessage = new MarkdownMessage(question, "You", Color.AVATAR_PRESETS[6]);
        var assistantMessage = new MarkdownMessage("haiyangAI", Color.AVATAR_PRESETS[0]);
        messageList.add(userMessage, assistantMessage);
        chatService.chat(chatId, question)
                .map(res -> Optional.ofNullable(res.getResult().getOutput().getContent()).orElse(""))
                .subscribe(assistantMessage::appendMarkdownAsync);
    }
}

再看一下效果,应答内容就动起来了
haiyangAI-demo

总结

使用Spring AI与ollama进行离线大模型平台的搭建又快又简单。

为Spring AI点赞,向ollama与各种开源大模型致敬!

本文源码地址:https://github.com/puhaiyang/springai-demo

【AI】大模型知识入门扫盲以及SpringAi快速入门 AI技术生态核心概念摘要 大模型LLM:基于海量数据训练的深度学习模型,具备语言理解与生成能力(如ChatGPT)。 Ollama:轻量级工具,支持本地一键部署大模型,提供统一API接口。 MCP协议:标准化通信协议,安全连接大模型与外部工具(如数据库/API),由微软、阿里等推动。 RAG:检索增强生成技术,通过外部知识库优化模型输出,适用于企业文档问答等场景。 Agent:自主决策的AI实体,整合LLM、RAG和MCP,实现任务闭环(如LangChain4j框架)。 向量数据库:存储语义向量(如文本Em 阅读详情

相关推荐

使用springAI,调用vllm,让大模型调用mcp工具,一直报400错误,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 2666

大模型技术专栏—5分钟搭建SpringAI大模型

大模型可以类比人类的大脑。如同人类的学习过程,需要阅读大量的书籍、文章和网页才能变得非常博学多才。在AI的世界里,大模型就是这样一个经过海量数据训练的“数字大脑”,通过深度学习模型、调节大量参数并训练海量数据,从而理解自然语言、图像、声音等各种复杂的数据。大模型队伍中的佼佼者有OpenAI的GPT4.0、Claude3.0、谷歌的Gemini 、国内的文心一言、通义等。

python1234567_的博客 2052

【AI大模型】SpringBoot整合Spring AI 核心组件使用详解

SpringBoot整合Spring AI 核心组件使用详解

congge 1万+

使用SpringAI快速实现离线/本地大模型应用

使用Spring AI进行离线大模型平台的搭建又快又简单,智能对话、图片识别、文生图、图生图样样都不错。 为Spring AI点赞,向ollama与各种开源大模型致敬!

水中加点糖 6074

【大模型】Spring AI Alibaba 对接百炼平台大模型使用详解

Spring AI Alibaba 对接百炼平台大模型使用详解

congge 2万+

从XSA到Linux应用:Petalinux与Vitis的嵌入式开发全流程解析

本文详细解析了从XSA文件到Linux应用的嵌入式开发全流程,重点介绍了Petalinux与Vitis工具链的使用技巧和实战经验。通过XSA硬件描述、Petalinux工程搭建、系统镜像优化及Vitis开发配置等关键步骤,帮助开发者高效完成ZYNQ平台开发,解决常见问题并提升开发效率。

weixin_29195217的博客 192

SpringAI与Ollama联袂:打造企业级离线大模型API服务

本文详细介绍了如何利用SpringAI与Ollama构建企业级离线大模型API服务,解决数据安全与隐私合规问题。通过本地部署开源大模型,结合Spring框架实现高效API开发,提供流式响应、权限控制等企业级功能扩展方案,助力金融、医疗等敏感行业安全使用AI技术。

weixin_29292535的博客 273

R 分析裂区试验设计

裂区试验有主区部分和副区部分, 因而有主区部分误差(误差 a,简记为Ea )和副区部分误差(误差b,简记为Eb) 分别用于测验主区处理以及副区处理和主、副互作的显著性。对同一个二因素试验资料作自由度和平方和的分解,则可发现随机区组的误差项自由度和平方和分别为DFe、SSe,而裂区设计有两个误差项,其自由度和平方和分别为DFEa,DFEb, SSEa, SSEb。而区组,处理效应等各个变异项目的自由

samhuairen的专栏 8934

使用SpringAI对接大模型DeepSeek-r1

使用SpringAI对接大模型DeepSeek-r1

weixin_65832899的博客 1230

BERT + BiLSTM-CRF 处理流程

BERT是一个基于 Transformer 的预训练语言模型。与传统的语言模型不同,BERT 是双向的,即它同时利用上下文信息进行词表示学习。BERT 在大规模语料库上进行预训练,可以捕捉到深层次的语言知识和上下文关系,生成非常丰富的词向量表示。在序列标注任务中,BERT 被用作输入文本的编码器,将每个词映射为上下文相关的词嵌入(embeddings)。

AI Agent 首席体验官 2257

把数字化转型真正落到组织里:读懂 SAP 的 OCM 六维框架

摘要: SAP的变革管理框架(OCM)强调数字化转型不仅是技术任务,更需关注组织与人的适应性。OCM包含六大维度:变革战略(明确方向与风险)、变革领导力(统一关键管理者行动)、变革沟通(分层传递信息)、变革实现(细化岗位级影响)、变革赋能(按角色设计培训)和变革有效性(持续评估)。该框架贯穿项目全周期,尤其在云项目中,需从早期规划变革策略,避免后期高代价调整。OCM的核心是将系统设计转化为组织语言,确保业务真正采纳新方式运作。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1433

DeepSeek+SpringAI家庭AI医生

DeepSeek+SpringAI家庭AI医生

缘友一世的博客 2106

R语言实战应用精讲50篇(二)-多重线性回归系列之稳健回归

前言 线性回归的参数估计主要采用的是最小二乘法(又称最小平方法),该法是将使观测值与模型预测值之差的平方达到最小的值作为参数估计值。如果数据存在异常点或者异方差,最小二乘法估计会存在偏差,常用的处理策略就是改用稳健回归(Robust Regression)。 稳健回归就是采用更为稳健的参数估计方法来拟合模型,所谓稳健就是数据的波动对参数估计影响不大,比如不受异常值影响,或删除某一观测后对结果影响不大。稳健估计的方法有很多,主要有这么几类:最小绝对值回归(也称最小一乘法回归,lAV),最小中位数二乘法(L

wenyusuran的专栏 3160

JB3-9-SpringAI(一)

基础对话,通义千问,SpringAI,SpringAIAlibaba,AI对话,文生图,文生音频,文生视频,AI记忆,RAG,ETL,向量库,ToolCalling,MCP,Graph 等。

周航宇的博客 3924

Python在振动信号处理中的应用(一):振动信号消除多项式趋势项

文章目录一、概述二、最小二乘法去除趋势项原理三、python模块介绍3.1 scikitlearn简介(1)转化器(Transformer)(2)估计器(Estimator)3.2 线性回归LinearRegression3.3 多项式PolynomialFeatures3.4 工作流Pipeline四、python代码实现4.1 构造模拟信号4.2 编写去除趋势项主代码4.3 展示算法效果五、TIPS 一、概述   在振动测试过程中,传感器或采集设备由于自身性能问题或受环境干扰(如温度、供电等影响),容易

白银时代的博客 8578

网工、运维利器:MobaXterm,一款全能的远程工具

你好,这里是网络技术联盟站,我是瑞哥。是一款由Mobatek开发的多功能远程计算机管理工具,集成了多种网络协议和工具,专为网络工程师和系统管理员设计。它提供了丰富的远程连接功能,包括SSH、RDP、VNC、X11转发等,支持文件传输和多标签界面,内置了文本编辑器和多种网络工具,是一款全能的远程管理软件。MobaXterm的开发起始于2008年,最初只是一个简单的X服务器,但随着用户需求的不断增加和软件的逐步完善,MobaXterm逐渐发展成了一款功能全面、界面友好的远程管理工具。

网络技术联盟站 5229

SpringAI系列2:Spring AI + Ollama 本地大模型入门

调用大模型需要配置apiKey,需要充钱,作为一名“白嫖党”,这可不能接受,能不能有不花钱还能练手的方式呢?别急,今天就来为大家解密这一“白嫖”方式,使用ollama部署本地大模型并使用SpringAI进行调用,废话不多说,开始我们springAI系列的第二讲《Spring AI + Ollama 本地大模型入门》📚 Ollama官网:https://ollama.com/download/linux。

zhangxiaotao0904的博客 945

跨应用服务器的自定义 IDoc 传输实战:以 CATSDB 工时为例,打通两套 SAP 系统的数据通道

本文介绍了在企业多SAP系统环境下,使用SAP ALE/IDoc技术实现工时数据跨系统传输的解决方案。文章从技术选型、系统架构到具体配置步骤进行了详细说明,重点阐述了IDoc/ALE在异步传输、全链路追踪和数据重放方面的优势。 文章详细讲解了端到端实施流程,包括Logical System配置、RFC Destination创建、Message Type定义、Segment和Basic Type设计等关键步骤。同时提供了出站封装的ABAP代码示例,强调调用MASTER_IDOC_DISTRIBUTE函数后执

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 172

ollama+llm+springai集成

本文详细介绍了ollama+anything+llm本地环境搭建与RAG检索增强环境的配置方法。主要内容包括:1)ollama的安装配置及模型下载;2)与SpringAI的集成验证,包括ChatClient、ChatModel、工具调用和MCPServer的实现;3)AnythingLLM的安装使用,重点讲解Workspace工作区配置和RAG文档验证;4)常用ollama命令汇总。文章指出SpringAI文档更新滞后,建议直接使用HTTP接口而非依赖第三方包,并分享了实际开发中的经验教训和问题发现。

yanghuashuiyue的专栏 1209

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: 【数据库】SQL相关知识点总结1(数据库约束、三大范式、关系模型、聚合函数)
下一篇: Nginx auth_request详解
AIGC镜像空间
博客等级 码龄5年 4万+粉丝 689原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值