超上头!Spring AI 酷炫教程来袭_spring alive
haoteby 2025-09-08 20:48 18 浏览
宝子们,今天咱就来搞超酷的 Spring AI,这波操作绝对能让你瞬间爱到不行,直接上头!
一、环境要求
1. jdk 要跟上潮流
咱得用 jdk21+,老版本可不行哦,新的才够劲!
2. Maven 引入依赖
在 Maven 里加上这个依赖:
<dependency> <groupId>io.springboot.ai</groupId> <artifactId>spring-ai-ollama-spring-boot-starter</artifactId> <version>1.0.3</version> </dependency> |
这就好比给你的项目穿上了超级无敌装备,战斗力直接原地起飞,杠杠的!
3. 启动(yml)文件配置
在 Yml 文件里这么设置:
spring: ai: ollama: base-url: http://127.0.0.1:11434 chat: options: model: deepseek-r1:7b |
这一步就像是给你的 AI 小伙伴设定 “家的地址” 和 “思考模式”,超级重要哒,可千万别弄错咯!马上我们本地部署的deepseek就要炫起来了
二、后端实现
流式响应,代码来咯:
@Value("${spring.ai.ollama.chat.options.model}") private String ollamamodel; /** * 流式对话 */ @ApiOperation(value = "流式对话", notes = "流式对话") @RequestMapping(value = "/streamChatV3", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public Flux<ChatResponse> streamChatV3(@RequestBody(required = false) String jsonstr) { JSONObject jsonObj = JSON.parseObject(jsonstr, JSONObject.class); String askquestion = jsonObj.getString("askquestion"); try { askquestion = java.net.URLDecoder.decode(askquestion, StandardCharsets.UTF_8); } catch (Exception ignored) { } Prompt prompt = new Prompt( askquestion, OllamaOptions.create() .withModel(this.ollamamodel) .withTemperature(0.8F)); // 我们可以先在后端模拟流式打印效果 // Prompt prompt = new Prompt(new UserMessage(askquestion)); // Flux<ChatResponse> flux = ollamaChatClient.stream(prompt); // flux.toStream().forEach(chatResponse -> { // System.out.print(chatResponse.getResult().getOutput().getContent()); // }); return ollamaChatClient.stream(prompt); } |
这段代码可牛啦,能让后端像个超级话痨,源源不断地给你回复消息,就像打开了话匣子,根本停不下来,超厉害有木有!
三、 前端实现
1. 发送消息到服务器
/** * 发送消息到服务器 */ function askQuestionByStream(askquestion) { var isstream = false; var requestData = {}; requestData.askquestion = encodeURIComponent(askquestion); $.when(fetchData(url, JSON.stringify(requestData))).done( function (responseData) { streamData(responseData, 100); } ) } |
这一步就是让前端能把你的问题 “嗖” 地一下 “飞” 到后端去,开启超有意思的对话之旅,是不是很神奇!
2. 处理流式数据
function streamData(data, interval) { var respData = data; const decoder = new TextDecoder('utf-8'); return data.read().then(({done, value}) => { // 检查是否读取完毕 if (done) { console.log("数据接收完毕"); return; } //处理每个数据块 value = decoder.decode(value, {stream: true}); var respData = {}; try { respData = JSON.parse(value); } catch (error) { respData = eval("(" + value + ")"); } showStreamData(respData, interval); //继续读取下一个数据块 streamData(data, interval); }); } |
这段代码就像个超级厉害的数据 “翻译官”,能把后端传来的数据变得美美的,整整齐齐的,准备好展示给你,超贴心哒!
3. 展示数据
function showStreamData(respData, interval) { let index = 0; const timer = setInterval(() => { if (index < respData.length) { var content = respData[index].result.output.content; content = content.replace(/>/g, ">"); content = content.replace(/</g, "<"); content = content.replace(/'/g, "'"); content = content.replace(/\r\n/g, "<br/>"); content = content.replace(/\n/g, "<br/>"); content = content.replace(/\r/g, "<br/>"); content = content.replace(/\t/g, " "); $("#inforesult").append(content); index++; } else { clearInterval(timer); // 完成所有数据输出后停止定时器 } }, interval); } |
这里就是把数据展示在页面上,让你能清楚看到 AI 小伙伴的回答,超直观,一目了然,这下和 AI 交流就轻松多啦!
4. 发送后端 API
function fetchData(url, formData) { var deferred = $.Deferred(); //中止其他的fetch请求 var controller = new AbortController(); controller.abort(); var fetchParams = { method: "post", body: formData, dataType: "text/event-stream", headers: {"Content-Type": "application/json"} }; fetch(url, fetchParams) .then(function (response) { //response.status表示响应的http状态码 if (response.ok) { //json是返回的response提供的一个方法,会把返回的json字符串反序列化成对象,也被包装成一个Promise return response.body; } else { console.log('error'); return null; } }) .then(function (respdata) { //响应的内容 try { var reader = respdata.getReader(); deferred.resolve(reader); } catch (error) { deferred.resolve(error); } }) .catch(error => { console.log(error); deferred.reject(error); }); //异步返回 return deferred.promise(); } |
这部分代码就是负责和后端 “打电话”,把你的请求妥妥地送过去,再把回复顺顺利利地带回来,超关键,是前后端交流的重要桥梁哦!
JavaScript 的 fetch 是用于发起网络请求的现代 API,它基于 Promise 设计,替代了传统的 XMLHttpRequest,提供了更简洁、强大的方式处理 HTTP 请求。以下是 fetch 的核心概念和基本用法:
fetch(url, { method: 'POST', // 请求方法(GET、POST、PUT等) headers: { 'Content-Type': 'application/json', // 请求头 }, body: JSON.stringify({ key: 'value' }), // 请求体(如表单数据、JSON) mode: 'cors', // 跨域模式(cors/no-cors/same-origin) credentials: 'include', // 携带cookies等凭证 }); |
处理响应
Response 对象提供多种方法解析数据:
response.json ():解析为 JSON 对象。
response.text ():解析为纯文本。
response.blob ():解析为二进制 Blob(如图像)。
response.formData ():解析为表单数据。
错误处理
fetch 只有在网络故障时才会拒绝 Promise,HTTP 错误状态码(如 404、500)需要通过 response.ok 检查:
高级功能
取消请求:
使用 AbortController 中止请求:
四、前端效果
看!这就是前端的效果,超酷的有木有!简直帅炸了!
宝子们,按照这个教程,赶紧麻溜地动手试试,让你的项目也拥有超酷的 Spring AI 吧!冲鸭,奥利给!
相关推荐
- 如何随时清理浏览器缓存_清理浏览器缓存怎么弄
-
想随时清理浏览器缓存吗?Cookieformac版是Macos上一款浏览器缓存清理工具,所有的浏览器Cookie,本地存储数据,HTML5数据库,FlashCookie,Silverlight,...
- Luminati代理动态IP教程指南配置代理VMLogin中文版反指纹浏览器
-
介绍如何使用在VMLogin中文版设置Luminati代理。首先下载VMLogin中文版反指纹浏览器(https://cn.vmlogin.com)对于刚接触Luminati动态ip的朋友,是不是不懂...
- mac清除工具分享,解除您在安全方面的后顾之忧
-
想要永久的安全的处理掉重要数据,删除是之一,使用今天小编分享的mac清除工具,为您的操作再增一层“保护”,小伙伴慎用哟,一旦使用就不可以恢复咯,来吧一起看看吧~mac清除工具分享,解除您在安全方面的后...
- 取代cookie的网站追踪技术:”帆布指纹识别”
-
【前言】一般情况下,网站或者广告联盟都会非常想要一种技术方式可以在网络上精确定位到每一个个体,这样可以通过收集这些个体的数据,通过分析后更加精准的去推送广告(精准化营销)或其他有针对性的一些活动。Co...
- 辅助上网为啥会被抛弃 曲奇(Cookie)虽甜但有毒
-
近期有个小新闻,大概很多小伙伴都没有注意到,那就是谷歌Chrome浏览器要弃用Cookie了!说到Cookie功能,很多小伙伴大概觉得不怎么熟悉,有可能还不如前一段时间被弃用的Flash“出名”,但它...
- 浏览器指纹是什么?浏览器指纹包括哪些信息
-
本文关键词:浏览器指纹、指纹浏览器、浏览器指纹信息、指纹浏览器原理什么是浏览器指纹?浏览器指纹是指浏览器的各种信息,当我们访问其他网站时,即使是在匿名的模式下,这些信息也可以帮助网站识别我们的身份。...
- 那些通用清除软件不曾注意的秘密_清理不常用的应用软件
-
系统清理就像卫生检查前的大扫除,即使你使出吃奶的劲儿把一切可能的地方都打扫过,还会留下边边角角的遗漏。随着大家电脑安全意识的提高,越来越多的朋友开始关注自己的电脑安全,也知道安装360系列软件来"武装...
- 「网络安全宣传周」这些安全上网小知识你要知道!
-
小布说:互联网改变了人们的衣食住行,但与之伴生的网络安全威胁也不容忽视。近些年来,风靡全球的勒索病毒、时有发生的电信诈骗、防不胜防的个人信息泄露时时刻刻都威胁着我们的生活。9月18日-24日是第四届...
- TypeScript 终极初学者指南_typescript 进阶
-
在过去的几年里TypeScript变得越来越流行,现在许多工作都要求开发人员了解TypeScript...
- jQuery知识一览_jquery的认识和使用
-
一、概览jQuery官网:https://jquery.com/jQuery是一个高效、轻量并且功能丰富的js库。核心在于查询query。...
- 我的第一个Electron应用_electronmy
-
hello,好久不见,最近笔者花了几天时间入门Electron,然后做了一个非常简单的应用,本文就来给各位分享一下过程,Electron大佬请随意~笔者开源了一个Web思维导图,虽然借助showSav...
- HTML5 之拖放(Drag 和 Drop)_html拖放api
-
简介拖放是一种常见的特性,即抓取对象以后拖到另一个位置。在HTML5中,拖放是标准的一部分,任何元素都能够拖放。先点击一个小例子:在用户开始拖动<p>元素时执行JavaScrip...
- 如何用JavaScript判断输入值是数字还是字母?
-
在日常开发中,我们有时候需要判断用户输入的是数字还是字母。本文将介绍如何用JavaScript实现这一功能。检查输入值是否是数字或字母...
- 图形编辑器开发:快捷键的管理_图形编辑工具
-
大家好,我是前端西瓜哥。...
- 浏览器原生剪贴板:原来它能这样读取用户截图!
-
当我们使用GitHub时,会发现Ctrl+V就能直接读取用户剪贴板图片进行粘贴,那么它是如何工作的?安全性如何?...