基于 SpringAI 整合 DeepSeek 模型实现 AI 聊天对话
目录
1、Ollama 的下载配置 与 DeepSeek 的本地部署流程
1.1 下载安装 Ollama
1.2 搜索模型并进行本地部署
2、基于 SpringAI 调用 Ollama 模型
2.1 基于OpenAI 的接口规范(其他模型基本遵循)
2.2 在 IDEA 中进行创建 SpringAI 项目并调用 DS 模型
3、基于 SpringAI 实现会话记忆功能
4、基于 SpringAI 实现会话历史功能
需求一:需要进行展示历史会话的列表信息
需求二:点击会话列表,展示对应的历史会话记录信息
📜后端代码地址:
MySpringAI: 基于 SpringAI + 大模型 实现基本的对话功能(只提供后端)
https://gitee.com/MIMIDeK/my-spring-ai.git
1、Ollama 的下载配置 与 DeepSeek 的本地部署流程
很多云平台都提供了一键部署大模型的功能,这里不再赘述(阿里云百炼平台、火山方舟-火山引擎等)
官网地址如下:
Ollamahttps://ollama.com/
1.1 下载安装 Ollama
首先,我们需要下载一个Ollama的客户端,在官网提供了各种不同版本的Ollama,大家可以根据自己的需要下载
注意:
Ollama默认安装目录是C盘的用户目录,如果不希望安装在C盘的话(其实C盘如果足够大放C盘也没事),就不能直接双击安装了,需要通过命令行安装
在 OllamaSetup.exe 所在目录打开cmd命令行,然后命令如下:
OllamaSetup.exe /DIR=你要安装的目录位置
安装完成后,需要进行环境变量的配置:
OLLAMA_MODELS=你想要保存模型的目录
1.2 搜索模型并进行本地部署
Ollama 是一个模型管理工具和平台,它提供了很多国内外常见的模型,我们可以在其官网上搜索自己需要的模型,这里我们部署的是 DeepSeek R1 模型(我选择的是 7b,根据需求进行选择):
其中,Ollama 的命令很像 Docker 的,选择好对应的模型后,在控制台中进行运行命令:
ollama run deepseek-r1:7b
首次下载的话会有些慢,耐性等待即可
以下是本地下载部署完成后,进行对话的场景,ctrl + d 进行退出与 DeepSeek 的对话:
2、基于 SpringAI 调用 Ollama 模型
2.1 基于OpenAI 的接口规范(其他模型基本遵循)
目前大多数大模型都遵循 OpenAI 的接口规范,是基于Http协议的接口;因此请求路径、参数、返回值信息都是类似的,可能会有一些小的差别,具体需要查看大模型的官方API文档
以下是基于 Python 的代码示范:
# Please install OpenAI SDK first: `pip3 install openai`from openai import OpenAI# 1.初始化OpenAI客户端,要指定两个参数:api_key、base_url
client = OpenAI(api_key="<DeepSeek API Key>", base_url="https://api.deepseek.com")# 2.发送http请求到大模型,参数比较多
response = client.chat.completions.create(model="deepseek-chat", # 2.1.选择要访问的模型messages=[ # 2.2.发送给大模型的消息{"role": "system", "content": "You are a helpful assistant"},{"role": "user", "content": "Hello"},],stream=False # 2.3.是否以流式返回结果
)print(response.choices[0].message.content)
接口说明
- 请求方式):通常是POST,因为要传递JSON风格的参数
- 请求路径):与平台有关
- DeepSeek官方平台:https://api.deepseek.com
- 阿里云百炼平台:https://dashscope.aliyuncs.com/compatible-mode/v1
- 本地ollama部署的模型:http://localhost:11434
- 安全校验):开放平台 都需要提供 API_KEY 来校验权限,本地 ollama 则不需要
- 请求参数)(这里只列举常用的):
- model:要访问的模型名称
- messages:发送给大模型的消息,是一个数组
- stream:true,代表响应结果流式返回;false,代表响应结果一次性返回,但需要等待
- temperature:取值范围[0:2),代表大模型生成结果的随机性,越小随机性越低。DeepSeek-R1不支持
- 这里请求参数中的 messages 是一个消息数组,其中包含两个属性):
- role:消息对应的角色
- content:消息内容
2.2 在 IDEA 中进行创建 SpringAI 项目并调用 DS 模型
以下是创建项目的基本依赖需求(基于SpringBoot3、JDK17):
.yaml 配置:
这里是基于 Ollama 的(默认端口是11434)
这里是基于 openAI 的,进行调用开放平台的 API,需要输入 API-KEY(后面就不具体写明了,这里主要是基于 Ollama 的调用演示)
Config 配置类:(固定写法)
@Configuration
public class CommonConfig {@Beanpublic ChatClient chatClient(OllamaChatModel model) {return ChatClient.builder(model).build();}
}
Controller 控制响应类:(这里是以流式的方式进行响应)
@RestController
@RequestMapping("/ai")
public class ChatController {@Resourceprivate ChatClient chatClient;// 由于以流式方式调用模型,展示的数据会出现乱码,需要进行规定编码格式@GetMapping(value = "/chat", produces = "text/html; charset=utf-8")public Flux<String> chat(String msg) {return chatClient.prompt().user(msg).stream().content();}
}
进行页面的调用(若非流式访问,则需要等待 DS 生成完毕,才会出现响应信息):
注意,进行接口的调用时,需要启动 ollama 中的模型
🔖也可以加上日志的控制台打印输出,方便调试
.yml 中的配置:
然后在 Config 配置类中添加这一行代码,即可开启日志的打印:
3、基于 SpringAI 实现会话记忆功能
大致步骤:
定义会话存储方式(默认基于Map集合) ➡️ 配置会话记忆(关联上下文) ➡️ 添加会话ID(保证每个会话独立)
这里使用默认方式,由源码可知是基于 Map 直接存入内存中的;当然也可以重写 ChatMemory,比如存入到 Redis 中做缓存之类的(根据业务需求)
然后将 "存储方式" 配置到 "会话的上下文" 中,以处理会话的内容
运行结果:
之前的msg提问信息是:现在有15个苹果,6个人应该怎么分才好
我现在直接问它x个人应该怎么分,很明显它会进行关联之前的会话,根据上下文,来进行作答
存在问题:
然而,以上会话的处理会比较混乱,不管是谁来进行提问,模型都会自动关联所有的会话上下文来进行回答,这显然是不符合需求的;这时就需要与前端进行交接,即传递对应的会话 ID 过来进行处理,以实现用户的每个独立会话内容互不干扰
由前端响应接口可知,不同的会话对应着不同的会话ID
这时需要在 Controller 接口中添加以下配置,来接收存储不同会话下的ID
4、基于 SpringAI 实现会话历史功能
存在问题:目前,只要页面一刷新,之前的会话列表和对话记录都会被清除,不会被保留展示
前言:以下的 type 参数可根据具体需求进行更换,chatId 建议作保留以记录唯一会话
需求一:需要进行展示历史会话的列表信息
以下是对应的 UI 页面,以及对应的接口地址(模拟):
以下是 自定义 的 方法接口 与 实现类,主要用于 保存 和 获取 会话信息
public interface ChatHistoryService {/*** 保存会话记录(这里的 type 可根据需求进行更改,chatId 建议保留以作为会话的唯一ID)*/void save(String type, String chatId);/*** 获取会话列表(这里的 type 可根据需求进行更改)*/List<String> getChatIds(String type);
}
@Service
public class ChatHistoryServiceImpl implements ChatHistoryService {// 使用 map 集合进行存储private final Map<String, List<String>> chatHistoryMap = new HashMap<>();/*** 保存会话记录(这里的 type 可根据需求进行更改,chatId 建议保留以作为会话的唯一ID)*/@Overridepublic void save(String type, String chatId) {// 1.判断当前是否存在对应的 type 类型,若不存在则新增if (! chatHistoryMap.containsKey(type)) {chatHistoryMap.put(type, new ArrayList<>());}// 2.判断当前的 type 对应的 会话集合ID 是否含有当前的会话IDList<String> chatIds = chatHistoryMap.get(type);if (chatIds.contains(chatId)) {return;}chatIds.add(chatId);}/*** 获取会话列表信息(这里的 type 可根据需求进行更改)*/@Overridepublic List<String> getChatIds(String type) {List<String> chatIds = chatHistoryMap.get(type);return chatIds == null ? new ArrayList<>() : chatIds;}
}
每次用户在进行模型对话的时候,都需要将会话ID做保存(这里的 key 根据自己的业务需求来定,比如使用 用户ID 来进行拼接等,这里先写死)
然后获取当前对应 key 的会话 ID 集合,进行会话列表信息展示
@RestController
@RequestMapping("/ai/history")
public class ChatHistoryController {@Resourceprivate ChatHistoryService chatHistoryService;/*** 获取历史会话列表信息(这里的 type 可根据需求进行更改)*/@RequestMapping("/{type}")public List<String> getChatIds(@PathVariable("type") String type) {return chatHistoryService.getChatIds(type);}
}
需求二:点击会话列表,展示对应的历史会话记录信息
像以下UI所示,随便点击其中一个会话列表,对应的历史会话记录依然存在,并进行全部展示
接口地址(模拟):
会话的存储是在 ChatMemory 类中进行的,所以需要跟进源码进行查看
主要还是这个 get 方法,来进行获取对应会话的对话记录
然后 返回值 Message 类型,内部有继承以及实现的类
其中的 Content 代表着对话记录的内容,MessageType 代表着当前对话记录的类型
以上结论:由于需要满足当前接口的返回值,所以需要创建一个 DTO 来进行满足
@Data
@NoArgsConstructor
public class MessageDTO implements Serializable {/*** 角色类型*/private String role;/*** 对应的内容信息*/private String content;public MessageDTO(Message message) {// 判断当前会话的类型switch (message.getMessageType()) {case USER:this.role = "user";break;case ASSISTANT:this.role = "assistant";break;case SYSTEM:this.role = "system";break;case TOOL:this.role = "tool";break;default:this.role = "";break;}this.content = message.getText();}@Serialprivate static final long serialVersionUID = 1L;
}
接下来实现 “查询对话记录” 接口,与前端交互,即可实现展现历史对话记录
/*** 查询会话记录详情(这里的 type 可根据需求进行更改,chatId 建议保留以作为会话的唯一ID)*/@GetMapping("/{type}/{chatId}")public List<MessageDTO> getChatHistory(@PathVariable("type") String type, @PathVariable("chatId") String chatId) {// 这里的展示记录条数最大值规定,直接使用的 int 型最大值,具体自己根据需求规定List<Message> messages = chatMemory.get(chatId, Integer.MAX_VALUE);if (messages == null) {return List.of();}// 进行封装返回类型return messages.stream().map(new Function<Message, MessageDTO>() {@Overridepublic MessageDTO apply(Message message) {return new MessageDTO(message);}}).toList();}
相关文章:
基于 SpringAI 整合 DeepSeek 模型实现 AI 聊天对话
目录 1、Ollama 的下载配置 与 DeepSeek 的本地部署流程 1.1 下载安装 Ollama 1.2 搜索模型并进行本地部署 2、基于 SpringAI 调用 Ollama 模型 2.1 基于OpenAI 的接口规范(其他模型基本遵循) 2.2 在 IDEA 中进行创建 SpringAI 项目并调用 DS 模型 3、基…...
Idea创建项目的搭建方式
目录 一、普通Java项目 二、普通JavaWeb项目 三、maven的JavaWeb项目 四、maven的Java项目 一、普通Java项目 1. 点击 Create New Project 2. 选择Java项目,选择JDK,点击Next 3. 输入项目名称(驼峰式命名法),可选…...
【MATLAB第115期】基于MATLAB的多元时间序列的ARIMAX的预测模型
【MATLAB第115期】基于MATLAB的多元时间序列的ARIMAX的预测模型 一、简介 ARIMAX(Autoregressive Integrated Moving Average with eXogenous inputs)模型是一种结合自回归(AR)、差分(I)、移动平均&a…...
【以太网安全】——防护高级特性配置总结
目前网络中以太网技术的应用非常广泛、然后、各种网络攻击的纯在(例如针对ARP DHCP 等攻击)不仅造成了网络合法用户无法正常访问网络资源、而且对网络信息安全构成严重威胁、以下配置是对局域网安全配置命令做详解 主要的安全威胁 MAC攻击:泛洪、欺骗 …...
微信小程序 van-dropdown-menu
点击其他按钮,关闭van-dropdown-menu下拉框 DropdownMenu 引入页面使用index.wxmlindex.scssindex.ts(重点)index.ts(全部) DropdownMenu 引入 在app.json或index.json中引入组件 "usingComponents": {"van-dropdown-menu": "vant/weapp…...
再见 Smartdaili,你好 Decodo!
我们将翻开新的篇章,推出新的名称以及更好的代理和刮擦解决方案。了解我们如何帮助全球用户构建、测试和扩展他们的公共网络数据项目。 Smartproxy,即后来的Smartdaili,由一个行业专业人士和企业家团队于2018年创立,其使命是创建一…...
海量文本中的词语距离:在 O(n) 时间内找到最近的词对
想象一个巨大的日志文件、一部鸿篇巨著或者网络爬虫抓取的数据——它们可能达到 TB 级别。现在,假设你需要找出两个特定的词(比如 词语1 和 词语2)在这段庞大文本中出现时,彼此“靠得最近”的距离是多少。 挑战: …...
TextCNN 模型文本分类实战:深度学习在自然语言处理中的应用
在自然语言处理(NLP)领域,文本分类是研究最多且应用最广泛的任务之一。从情感分析到主题识别,文本分类技术在众多场景中都发挥着重要作用。最近,我参与了一次基于 TextCNN 模型的文本分类实验,从数据准备到…...
前台调用接口的方式及速率对比
一、引言 在现代 Web 开发中,前台与后台的数据交互至关重要,而调用接口是实现这一交互的关键手段。不同的接口调用方式在速率上可能存在差异,这会影响用户体验和应用性能。本文将详细介绍几种常见的前台调用接口方式,并对它们的速…...
高级java每日一道面试题-2025年4月21日-基础篇[反射篇]-如何使用反射获取一个类的所有方法?
如果有遗漏,评论区告诉我进行补充 面试官: 如何使用反射获取一个类的所有方法? 我回答: 在Java中,反射是一种强大的机制,允许程序在运行时检查或“反射”自身,从而动态地操作类、字段、方法和构造函数等。这在需要动态调用方法…...
tomcat集成redis实现共享session
中间件:Tomcat、Redis、Nginx jar包要和tomcat相匹配 jar包:commons-pool2-2.2.jar、jedis-2.5.2.jar、tomcat-redis-session-manage-tomcat7.jar 配置Tomcat /conf/context.xml <?xml version1.0 encodingutf-8?> <!--Licensed to the A…...
2.6 递归
递归 特性: >.一递一归 >.终止条件 一般为:0 1 -1 #测试函数的返回值为函数 def test_recursion():return test_recursion() print(test_recursion()) RecursionError: maximum recursion depth exceeded #案例:计算 …...
鸿蒙应用开发:如何修改APP名称与APP的图标
如何修改APP的名称? 修改APP的名称需要修改entry/src/main/resources/base/element/string.json文件 将EntryAbility_label的value修改为“需要修改成的名字”。 文件目录: 代码修改: {"string": [{"name": "modu…...
AI 模型在前端应用中的典型使用场景和限制
典型使用场景 1. 智能表单处理 // 使用TensorFlow.js实现表单自动填充 import * as tf from tensorflow/tfjs; import { loadGraphModel } from tensorflow/tfjs-converter;async function initFormPredictor() {// 加载预训练的表单理解模型const model await loadGraphMod…...
前端性能优化全攻略:JavaScript 优化、DOM 操作、内存管理、资源压缩与合并、构建工具及性能监控
1 为什么需要性能优化? 1.1 性能优化的核心价值:用户体验与业务指标 性能优化不仅是技术层面的追求,更是直接影响用户体验和业务成败的关键因素。 用户体验(UX): 响应速度:用户期望页面加载时…...
使用 acme.sh 自动更新 SSL 证书的指南
上篇文章讲了一下 如何利用acme.sh来申请ssl,但没有讲3个月到期后 如何续期,续期的时候会碰到什么问题? 1.查看当前的当前签发域名的到期时间 acme.sh list 2.重新申请ssl acme.sh --issue --dns dns_namesilo -d xxx.ai -d *.xxx.ai --dns…...
查看Spring Boot项目所有配置信息的几种方法,包括 Actuator端点、日志输出、代码级获取 等方式,附带详细步骤和示例
以下是查看Spring Boot项目所有配置信息的几种方法,包括 Actuator端点、日志输出、代码级获取 等方式,附带详细步骤和示例: 1. 使用Spring Boot Actuator Actuator是Spring Boot提供的监控和管理工具,包含/configprops端点可查看…...
C++与C
文章目录 C与C命令空间const关键字new/delete表达式引用(重点)概念引用的本质引用的使用场景引用作为函数的参数引用作为函数的返回值 总结 强制转换函数重载extern "C"默认参数 bool类型inline(内联)函数异常处理&…...
Nginx中间件的解析
目录 一、Nginx的核心架构解析 二、Nginx的典型应用场景 三、Nginx的配置优化实践 四、Nginx的常见缺陷与漏洞 一、Nginx的核心架构解析 事件驱动与非阻塞IO模型 Nginx采用基于epoll/kq等系统调用的事件驱动机制,通过异步非阻塞方式处理请求,…...
Ansys Zemax | 在 MATLAB 中使用 ZOS-API 的技巧
附件下载 联系工作人员获取附件 本文将介绍一些在MATLAB中使用 ZOS-API 的技巧,以提高您的工作效率并充分利用 ZOS-API 的功能。 简介 OpticStudio开发了应用程序接口 (API) ,用户可以使用API与不同的脚本环境进行连接和交互。使用API,用…...
js 生成pdf 并上传文件
js 生成pdf 并上传文件 使用 JsPDF html2Canvas 代码直接使用 注意注释 import JsPDF from jspdf import html2Canvas from html2canvas // 上传文件的方法 import { handleUploadImage } from /utils/uploadQuillEditdownPDF() {// 要打印元素的idconst cloneDom document.…...
刷刷刷刷刷sql题
NSSCTF 【SWPUCTF 2021 新生赛】easy_sql 这题虽然之前做过,但为了学习sql,整理一下就再写一次 打开以后是杰哥的界面 注意到html网页标题的名称是 “参数是wllm” 那就传参数值试一试 首先判断注入类型(数字型或字符型) 传1 …...
JavaScript 中的 this 及 this 指向的改变方法
在 JavaScript 的世界里,this是一个既强大又容易让人困惑的概念。它的指向在不同的函数调用场景下会动态变化,而call()、apply()和bind()这三个方法则为我们提供了精确控制this指向的能力。本文将从基础概念出发,结合具体案例,带大…...
安卓模拟器绕过检测全解析:雷电、MuMu、蓝叠、逍遥、夜神与WSA完整指南
安卓模拟器绕过检测全解析:雷电、MuMu、蓝叠、逍遥、夜神与WSA完整指南 模拟器过检测合集雷电mumu蓝叠逍遥夜神WSA 转自风车2025 前言 随着手机游戏和应用的普及,越来越多的用户选择在PC上通过模拟器来运行安卓应用。然而,许多应用和游戏为…...
VSCode中安装GitGraph
前提是先安装git,官方下载地址:Git - Downloads 1. 在VSCode中安装GitGraph插件 2. 文件->首选项->设置,打开设置界面,在设置界面搜索git path 3. 打开配置文件配置git安装路径: 4. 打开源代码管理,…...
StartAI「万物迁移」功能设计师实操教程:模特换衣场景应用
一、功能核心优势解析 智能识别与场景融合 基于迁移学习算法,精准定位服装轮廓(支持复杂材质如蕾丝、镂空设计),自动匹配目标场景的光影方向与色温。 效率革命 传统PS手动换衣需2-3小时,使用万物迁移可压缩至2-5分…...
【RK3588 嵌入式图形编程】-SDL2-扫雷游戏-放置标记
放置标记 文章目录 放置标记1、概述2、更新Globals.h3、放置标记4、渲染标记5、标记计数6、完整代码7、改进建议8、总结在本文中,我们实现标记放置和跟踪以完成的扫雷游戏项目。 1、概述 在我们扫雷游戏文章系列的最后部分中,我们将添加玩家在可疑的地雷位置放置标记的功能。…...
【Python】Selenium切换网页的标签页的写法(全!!!)
在使用selenium做网站爬取测试的时候,我们经常会遇到一些需要点击的元素,才能点击到我们想要进入的页面, 于是我们就要模拟 不断地 点点点击 鼠标的样子。 这个时候网页上就会有很多的标签页,你的浏览器网页标签栏 be like: 那…...
Spring Boot多环境配置详解
一、为什么需要多环境配置 在实际项目开发中,我们通常需要将应用部署到不同的环境中,比如: 开发环境(dev) - 开发人员本地开发调试使用测试环境(test) - 测试人员功能测试使用生产环境&#x…...
进阶篇 第 6 篇:时间序列遇见机器学习与深度学习
进阶篇 第 6 篇:时间序列遇见机器学习与深度学习 (图片来源: Tara Winstead on Pexels) 在上一篇中,我们探讨了如何通过精心的特征工程,将时间序列预测问题转化为机器学习可以处理的监督学习任务。我们学习了如何创建滞后特征、滚动统计特征…...
RHCE 作业二(密钥登录实验)
1.进入ssh主配置文件恢复配置: 2.vim进入ssh子文件夹查看配置 3.重启服务 /etc/ssh/ key结尾或者.pub结尾的文件全部都是密钥 sshd_confg.d目录是服务的子配置文件 ssh_confg.d目录是客户端你的子配置文件 ~/.ssh/ 是当前用户的配置文件 4.服务器和客户端分别…...
android contentProvider 踩坑日记
写此笔记原因 学习《第一行代码》到第8章节实现provider时踩了一些坑,因此记录下来给后来人和自己一个提示,仅此而已。 包含内容 Sqlite数据库CURD内容provider界面provider项目中书籍管理provider实现逻辑用adb shell确认providercontentResolver接收…...
K8s:概念、特点、核心组件与简单应用
一、引言 在当今云计算和容器技术蓬勃发展的时代,Kubernetes(简称 K8s)已成为容器编排领域的事实标准。它为管理容器化应用提供了高效、可靠的解决方案,极大地简化了应用的部署、扩展和运维过程。无论是小型初创公司还是大型企业…...
基于表面肌电信号sEMG的手势识别——以Ninapro DB1数据集使用CNN网络识别为例
完整代码获取 评论区或者私信留邮箱 接论文辅导!中文核心辅导!SCI三四区辅导! 可接模型改进 任务描述 表面肌电信号( sEMG ) 是一种生物电信号,存在于肌肉神经。 当大脑下达肌肉动作指令,肌肉会产生控制信号ÿ…...
黑盒测试——等价类划分法实验
任务: 设某程序有两个输入:整数x1和整数x2,计算Yf(x1,x2)。x1和x2的取值范围为1< x1<500,1< x2<500。当x1在[1,200) 取值且x2在[1,300] 取值时,Yf(x1,x2) x1x2;当x1在[200,500] 取值且x2在[1,300] 取值时&…...
深度学习4月22笔记
1、过拟合与欠拟合 在训练深层神经网络时,由于模型参数较多,在数据量不足时很容易过拟合。而正则化技术主要就是用于防止过拟合,提升模型的泛化能力(对新数据表现良好)和鲁棒性(对异常数据表现良好)。 1. 概念认知 …...
【MySQL数据库入门到精通-03 数据类型及案列】
文章目录 一、三类数据类型二、数值类型三、字符串类型四、日期时间类型五、日期时间类型 一、三类数据类型 MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。 二、数值类型 比如: 1). 年龄字段 – 不会出现负数…...
【机器学习】决策树算法中的 “黄金指标”:基尼系数深度剖析
一、基尼系数的基本概念 基尼系数(Gini Impurity)在决策树分类算法中,是用于衡量数据纯度的重要指标,与信息熵有着相似的功能。在样本集合里,基尼系数代表随机选取一个样本时,该样本被分错的概率 。假设一…...
植被参数遥感反演技术革命!AI+Python支持向量机/随机森林/神经网络/CNN/LSTM/迁移学习在植被参数反演中的实战应用与优化
在全球气候变化与生态环境监测的重要需求下,植被参数遥感反演作为定量评估植被生理状态、结构特征及生态功能的核心技术,正面临诸多挑战。随着遥感技术的发展,数据复杂度不断提升,模型精度的要求也越来越高。同时,多源…...
【AI】SpringAI 第四弹:接入本地大模型 Ollama
Ollama 是一个开源的大型语言模型服务工具。它的主要作用是帮助用户快速在本地运行大模型, 简化了在 Docker 容器内部署和管理大语言模型(LLM)的过程。 1. 确保Ollama 已经启动 # 查看帮助文档 ollama -h# 自动下载并启动 ollama run deeps…...
C# MP3 伴奏
使用建议: 参数调节指南: 低频人声残留:降低CenterFrequency(800-1500Hz) 高频人声残留:提高CenterFrequency(2500-3500Hz) 消除力度不足:提高EliminationStrength(0.9-1.0) 伴奏失真:降低EliminationSt…...
【springsecurity oauth2授权中心】将硬编码的参数提出来放到 application.yml 里 P3
在application.yml里添加配置 application.yml oauth2:client:id: clientsecret: secretauthentication-method: client_secret_basicgrant-types: authorization_code,refresh_tokenredirect-uris:- http://localhost:8081/login/oauth2/code/client- http://localhost:8081…...
【Ansible】批量管理 Windows自动化运维
一,前期准备 1,控制端(Linux)的要求 Ansible可以在安装了Python 2(2.7版)或Python 3(3.5及更高版本)的任何机器上运行。控制端计算机不支持Windows。 2,客户端&#x…...
AES-128、AES-192、AES-256 简介
AES(Advanced Encryption Standard) 是一种广泛使用的对称加密算法,由美国国家标准与技术研究院(NIST)于2001年正式采纳,用于替代旧的 DES 和 3DES。AES 基于 Rijndael 算法,支持 128 位、192 位…...
osxcross 搭建 macOS 交叉编译环境
1. osxcross 搭建 macOS 交叉编译环境 1. osxcross 搭建 macOS 交叉编译环境 1.1. 安装依赖1.2. 安装 osxcross 及 macOS SDK 1.2.1. 可能错误 1.3. 编译 cmake 类工程1.4. 编译 configure 类工程1.5. 单文件编译及其他环境编译1.6. 打包成 docker 镜像1.7. 使用 docker 编译 …...
联通余额查询接口
接口名称 1) 请求地址 https://ucbss.10010.cn/npfweb/NpfWeb/Mustpayment/getMustpayment?number13112345586&province051&commonBean.phoneNo13112345586&channelType101https://ucbss.10010.cn/npfweb/NpfWeb/Mustpayment/getMustpayment?number13112345586&…...
Python 设计模式:桥接模式
1. 什么是桥接模式? 桥接模式是一种结构型设计模式,它通过将抽象部分与其实现部分分离,使得两者可以独立变化。桥接模式的核心思想是将抽象和实现解耦,从而提高系统的灵活性和可扩展性。 桥接模式的核心思想是将一个类的接口与其…...
7.6 GitHub Sentinel后端API实战:FastAPI高效集成与性能优化全解析
GitHub Sentinel Agent 用户界面设计与实现:后端 API 集成 关键词:前后端分离架构、RESTful API 设计、数据序列化、命令行工具开发、集成测试 后端 API 集成关键技术实现 本阶段需要完成前端界面与后端服务的无缝对接,实现以下核心功能: #mermaid-svg-FFnzT13beWV52dtx …...
Smart AI:在AI浪潮中崛起的智能NFT生态革命者
技术引领,智能进化:Smart AI强势登场 在全球AI技术浪潮席卷之际,由澳大利亚顶尖技术团队倾力打造的Smart AI平台横空出世,以其革命性的NFT智能进化系统,正在彻底重塑数字资产的未来图景。Smart AI不仅是一个平台&…...
Linux——基于socket编程实现简单的Tcp通信
前言1:想要实现一个简单的Tcp通信不难,对于初学者而言,难点在于使用了大量未曾接触过的函数调用,所以本篇重点在于详解每部分代码中相关函数的功能。 1. 简单认识一下TCP传输 TCP通信协议是面向字节流的、可靠的、有连接的传输&a…...