遨游Spring AI:第一盘菜Hello World

Spring AI的正式版已经发布了,很显然,接下来我们要做的事情就是写一个Hello World。

总体思路就是在本地搭建一个简单的大模型,然后编写Spring AI代码与模型进行交互。  

分五步:

1. 安装Ollama;

2. 安装DeepSeek;

3. 创建Spring AI工程;

4. 编码;

5. 测试与小结。

1. 安装Ollama

为了在本地环境安装DeepSeek,我们先安装Ollama。Ollama是一个开源的大型语言模型服务工具,它帮助用户快速在本地运行大模型。

打开官网:https://ollama.com/download,选择Windows版本:

下载完成后,安装非常简单,按照提示操作即可,不过它默认安装在C盘。所以在D盘新建一个Ollama的文件,并且把安装程序(OllamaSetup.exe)拷贝到这个目录中。

然后以管理员身份运行cmd,切换到D盘以后,运行如下的命令,用于设置系统的环境变量:

setx OLLAMA_MODELS "D:\Ollama\models" /M

切换到D盘的Ollama目录,运行如下的命令:

OllamaSetup.exe /dir=D:\Ollama

随后弹出安装界面,按照提示点击下一步即可。安装成功后,在任务栏可以看到Ollama的图标(一个小的羊驼)。也可以在命令行输入ollama -v来查看它的版本号。

D:\>ollama -v
ollama version is 0.5.11

2. 安装DeepSeek

还是进到Ollama官网,点击DeepSeek-R1超链接:

在跳转的页面中,选择体积最小的1.5b版本。这个b是billion(十亿)的缩写,1.5b就代表该模型包含15亿个参数,属于轻量级的人工智能模型。

点击右侧的复制按钮,把命令复制下来并且运行,可以先把它下载到本地:

ollama pull deepseek-r1:1.5b

下载完成后,即可以在本地运行DeepSeek,把上面命令中的pull改成run即可运行。然后就可以跟DeepSeek进行对话了:

D:\>ollama run deepseek-r1:1.5b
>>> who are you
<think></think>Greetings! I'm DeepSeek-R1, an artificial intelligence assistant created by DeepSeek. I'm at your service and would be delighted to assist you with any inquiries or tasks you may have.

3. 创建Spring AI工程

接下来我们创建Spring AI工程。使用Spring Initializr可以快速生成脚手架: https://start.spring.io/,工程类型、语言、版本等内容可以参考下图进行选择,JDK选择版本17:

点击GENERATE按钮即可生成,把它下载到本地并用idea打开。注意,在pom.xml文件中,它默认使用的是openai,把它改成ollama的starter,否则会报错:

<!--<dependency>-->
<!--	<groupId>org.springframework.ai</groupId>-->
<!--	<artifactId>spring-ai-starter-model-openai</artifactId>-->
<!--</dependency>-->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>

同时,修改yml文件的配置信息如下:

spring:http:encoding:charset: UTF-8enable: trueforce: trueai:ollama:base-url: http://localhost:11434chat:model: deepseek-r1:1.5b

4. 编码

我们从常见的AI聊天开始。Spring AI提供了ChatClient接口,它使用流畅API与AI模型进行交互。

流畅API(Fluent API),也可理解链式API,它是一种编程接口设计风格,通过链式方法调用和上下文连贯性设计,使代码具有类似自然语言的流畅性和可读性‌。它的特点是每个方法都返回当前对象实例,从而支持链式调用,减少代码冗余,提升可读性。

通过ChatClient.Builder对象可创建ChatClient,而对象ChatClient.Builder象可通过自动装配的方式获得。以下是controller的代码,功能就是:用户输入消息,程序把消息发送给DeepSeek并返回对应的字符串结果:

package com.myai.demo.controller;import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/ai")
publicclass ChatController {privatefinal ChatClient chatClient;public ChatController(ChatClient.Builder chatClient) {this.chatClient = chatClient.build();}@GetMapping("/chat")public String chat(@RequestParam(value = "message") String message) {String result;try {result = chatClient.prompt().user(message).call().content();} catch (Exception e) {return"Exception";}return result;}
}

5. 测试与小结

这是Spring Boot程序,当然还需要对应的启动类,这个很简单,此处不再给出,如果需要完整的源代码,或者搭建过程中遇到什么问题,也欢迎后台私信进行讨论。程序启动后,我们跟它打个招呼,输入你好,看看它返回什么:

没问题,大模型返回了相应的消息,这样,第一盘菜Hello World算是搭建成功了。

初步想一想,应用程序能够与后台的大模型实时交互与对话,未来的想象空间确实比较大,让原本规规矩矩的程序变得十分强大,一些传统的功能经过大模型的智能运算处理,会厉害很多倍。

而且,当前这个程序只是基于本地的参数不多的模型,如果接入功能更为丰富、时效性更强的大模型,会智能得多。

接下来让我们一起插上AI的翅膀,让应用程序飞翔起来吧。

创作不易,烦请点个在看、点个赞。

有任何问题,也欢迎留言讨论。

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

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

相关文章

华为云Flexus+DeepSeek征文|基于华为云Flexus X和DeepSeek-R1打造个人知识库问答系统

目录 前言 1 快速部署&#xff1a;一键搭建Dify平台 1.1 部署流程详解 1.2 初始配置与登录 2 构建专属知识库 2.1 进入知识库模块并创建新库 2.2 选择数据源导入内容 2.3 上传并识别多种文档格式 2.4 文本处理与索引构建 2.5 保存并完成知识库创建 3接入ModelArts S…

Java优化:双重for循环

在工作中&#xff0c;经常性的会出现在两张表中查找相同ID的数据&#xff0c;许多开发者会使用两层for循环嵌套&#xff0c;虽然实现功能没有问题&#xff0c;但是效率极低&#xff0c;一下是一个简单的优化过程&#xff0c;代码耗时凑从26856ms优化到了748ms。 功能场景 有两…

Prompt Tuning:生成的模型文件有什么构成

一、为什么Prompt Tuning会生成模型文件? 1. Prompt Tuning的本质:优化可训练的「提示参数」 核心逻辑:Prompt Tuning(提示调优)是一种轻量级的微调技术,仅优化模型输入层的提示向量(Prompt Embedding)或少量额外参数,而非更新整个预训练模型的权重。生成模型文件的原…

ARM SMMUv3简介(一)

1.概述 SMMU&#xff08;System Memory Management Unit&#xff0c;系统内存管理单元&#xff09;是ARM架构中用于管理设备访问系统内存的硬件模块。SMMU和MMU的功能类似&#xff0c;都是将虚拟地址转换成物理地址&#xff0c;不同的是MMU转换的虚拟地址来自CPU&#xff0c;S…

在 Windows 系统上运行 Docker 容器中的 Ubuntu 镜像并显示 GUI

在 Windows 上安装一个 X Server&#xff08;如 VcXsrv 或 X410&#xff09;&#xff0c;Ubuntu 容器通过网络将图形界面转发到 Windows。 步骤&#xff1a; 安装 X Server&#xff1a; 推荐使用VcXsrv&#xff0c;免费开源。 安装后运行 XLaunch&#xff0c;选择&#xff1…

Vue3学习(4)- computed的使用

1. 简述与使用 作用&#xff1a;computed 用于基于响应式数据派生出新值&#xff0c;其值会自动缓存并在依赖变化时更新。 ​缓存机制​&#xff1a;依赖未变化时直接返回缓存值&#xff0c;避免重复计算&#xff08;通过 _dirty 标志位实现&#xff09;。​响应式更新​&…

【HarmonyOS 5】出行导航开发实践介绍以及详细案例

以下是 ‌HarmonyOS 5‌ 出行导航的核心能力详解&#xff08;无代码版&#xff09;&#xff0c;聚焦智能交互、多端协同与场景化创新&#xff1a; 一、交互革新&#xff1a;从被动响应到主动服务 ‌意图驱动导航‌ ‌自然语义理解‌&#xff1a;用户通过语音指令&#xff08;如…

csrf攻击学习

原理 csrf又称跨站伪造请求攻击&#xff0c;现代网站利用Cookie、Session 或 Token 等机制识别用户身份&#xff0c;一旦用户访问某个网站&#xff0c;浏览器在之后请求会自动带上这些信息来识别用户身份。用户在网站进行请求或者操作时服务器会给出对应的内容&#xff0c;比如…

深入剖析MySQL锁机制,多事务并发场景锁竞争

一、隐藏字段对 InnoDB 的行锁&#xff08;Record Lock&#xff09;与间隙锁&#xff08;Gap Lock&#xff09;的影响 1. 隐藏字段与锁的三大核心影响 类型影响维度描述DB_TRX_IDMVCC 可见性控制决定是否读取当前版本&#xff0c;或在加锁时避开不可见版本&#xff08;影响加锁…

以SMMUv2为例,使用Trace32可视化操作SMMU的常用命令详解

Trace32支持一系列的SMMU命令&#xff0c;可以帮助用户更好地配置、查看和分析SMMU。换句话说&#xff0c;就是让SMMU的配置变得可视化。 在添加SMMU实例之前&#xff0c;需要选择一个CPU来激活该SMMU实例的相关命令。Trace32让SMMU的配置可视化的本质是&#xff0c;操纵CPU读取…

将数据库表导出为C#实体对象

数据库方式 use 数据库;declare TableName sysname 表名 declare Result varchar(max) /// <summary> /// TableName /// </summary> public class TableName {select Result Result /// <summary>/// CONVERT(NVARCHAR(500), ISNULL(ColN…

CSS 预处理器与工具

目录 CSS 预处理器与工具1. Less主要特性 2. Sass/SCSS主要特性 3. Tailwind CSS主要特性 4. 其他工具PostCSSCSS Modules 5. 选择建议 CSS 预处理器与工具 1. Less Less 是一个 CSS 预处理器&#xff0c;它扩展了 CSS 语言&#xff0c;添加了变量、嵌套规则、混合&#xff0…

this.$set() 的用法详解(Vue响应式系统相关)

1. 什么是 this.$set()&#xff1f; this.$set(target, key, value) 是 Vue 2 中提供的一个方法&#xff0c;用于向响应式对象中动态添加属性&#xff0c;确保新加的属性同样是响应式的。 2. 为什么需要它&#xff1f; Vue 2 的响应式系统基于 Object.defineProperty&#…

【HarmonyOS Next之旅】DevEco Studio使用指南(三十)

目录 1 -> 部署云侧工程 2 -> 通过CloudDev面板获取云开发资源支持 3 -> 通用云开发模板 3.1 -> 适用范围 3.2 -> 效果图 4 -> 总结 1 -> 部署云侧工程 可以选择在云函数和云数据库全部开发完成后&#xff0c;将整个云工程资源统一部署到AGC云端。…

如何配置nginx解决前端跨域请求问题

我们以一个简单的例子模拟不同情况下产生的跨域问题以及解决方案。假设在http://127.0.0.1:8000的页面调用接口 fetch(http://127.0.0.1:8003/api/data)常看到的错误“Access to fetch at ‘http://127.0.0.1:8003/api/data’ from origin ‘http://localhost:8000’ has been…

React Hooks 指南:何时使用 useEffect ?

在 React 的函数组件中&#xff0c;useEffect Hook 是一个强大且不可或缺的工具。它允许我们处理副作用 (side effects)——那些在组件渲染之外发生的操作。但是&#xff0c;什么时候才是使用 useEffect 的正确时机呢&#xff1f;让我们深入探讨一下&#xff01; 什么是副作用…

bat批量去掉本文件夹中的文件扩展名

本文本夹内 批量去掉本文件夹中的文件扩展名 假如你有一些文件&#xff0c;你想去掉他们的扩展名 有没有方便的办法呢 今天我们就分享一种办法。 下面&#xff0c;就来看看吧。 首先我们新建一个记事本&#xff0c;把名字改为&#xff0c;批量去掉本文件夹中的文件扩展名.txt 然…

STM32标准库-输入捕获

一、输入捕获 1.简介 IC&#xff08;Input Capture&#xff09;输入捕获输入 捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存到CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器和…

在linux系统上搭建git服务器(ssh协议)

1.在windows上生成RSA密钥对 ssh-keygen -t rsa -b 2048 -C"git用户名/邮箱地址" 命令执行后会在 C:\Users\${windows登录账户}\.ssh 目录下生成密钥对 其中 id_rsa 为私钥&#xff0c;id_rsa.pub 为公钥 2.在 linux 系统上登记公钥 vim ~/.ssh/authorized_keys…

RAG检索系统的两大核心利器——Embedding模型和Rerank模型

在RAG系统中&#xff0c;有两个非常重要的模型一个是Embedding模型&#xff0c;另一个则是Rerank模型&#xff1b;这两个模型在RAG中扮演着重要角色。 Embedding模型的作用是把数据向量化&#xff0c;通过降维的方式&#xff0c;使得可以通过欧式距离&#xff0c;余弦函数等计算…