当前位置: 首页 > news >正文

Spring AI应用系列——基于ARK实现多模态模型应用

ARK 在这里指的是阿里云推出的 AIGC 研发平台 ARK,是阿里云面向开发者和企业用户打造的一站式 AIGC(AI Generated Content,人工智能生成内容)开发平台。

1. 引言

本文将深入探讨 ARK Multi-Model 的实现原理、架构设计以及关键参数的配置和使用方法。通过具体的代码示例和测试验证,我们将全面理解如何利用 Spring AI 和 Alibaba ARK 平台构建一个多模态模型应用。

2. 项目概述

Spring AI Alibaba ARK Multi-Model Example 是一个基于 Spring AI 和 Alibaba ARK 平台的多模态模型应用示例。它集成了聊天、图片生成、文本向量等多种模型能力,并通过 REST 接口提供服务。

3. 项目架构

项目的核心组件包括:

  • Spring Boot:作为基础框架,提供便捷的 Web 开发支持。
  • Spring AI:封装了多种 AI 模型的调用接口,简化了模型集成的复杂度。
  • Alibaba ARK:阿里云推出的一站式 AIGC 开发平台,提供了大模型 API 服务。
4. 核心功能模块
4.1 图片处理功能

MultiModelController.java

/** Licensed to the Apache Software Foundation (ASF) under one or more* contributor license agreements.  See the NOTICE file distributed with* this work for additional information regarding copyright ownership.* The ASF licenses this file to You under the Apache License, Version 2.0* (the "License"); you may not use this file except in compliance with* the License.  You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.alibaba.cloud.ai.example.controller;import com.alibaba.cloud.ai.example.controller.helper.FrameExtraHelper;
import org.apache.catalina.User;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.image.Image;
import org.springframework.ai.model.Media;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.MimeTypeUtils;
import org.springframework.web.bind.annotation.*;import java.net.URI;
import java.util.List;
import java.util.Map;/*** ark Multi-Model REST Controller* 提供聊天、图片生成、文本向量等多个模型能力的API接口** @author brian xiadong*/
@RestController
@RequestMapping("/api")
public class MultiModelController {private static final String DEFAULT_PROMPT = "这些是什么?";private static final String DEFAULT_VIDEO_PROMPT = "这是一组从视频中提取的图片帧,请描述此视频中的内容。";@Autowiredprivate ChatModel chatModel;private ChatClient openAiChatClient;public MultiModelController(ChatModel chatModel) {this.chatModel = chatModel;// 构造时,可以设置 ChatClient 的参数// {@link org.springframework.ai.chat.client.ChatClient};this.openAiChatClient = ChatClient.builder(chatModel)// 实现 Chat Memory 的 Advisor// 在使用 Chat Memory 时,需要指定对话 ID,以便 Spring AI 处理上下文。.defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory()))// 实现 Logger 的 Advisor.defaultAdvisors(new SimpleLoggerAdvisor())// 设置 ChatClient 中 ChatModel 的 Options 参数.defaultOptions(OpenAiChatOptions.builder().topP(0.7).build()).build();}@GetMapping("/image")public String image(@RequestParam(value = "prompt", required = false, defaultValue = DEFAULT_PROMPT)String prompt) throws Exception {List<Media> mediaList = List.of(new Media(MimeTypeUtils.IMAGE_PNG,new URI("https://dashscope.oss-cn-beijing.aliyuncs.com/images/dog_and_girl.jpeg").toURL()));UserMessage message = new UserMessage(prompt, mediaList);ChatResponse response = openAiChatClient.prompt(new Prompt(message)).call().chatResponse();return response.getResult().getOutput().getText();}@GetMapping("/stream/image")public String streamImage(@RequestParam(value = "prompt", required = false, defaultValue = DEFAULT_PROMPT)String prompt) {UserMessage message = new UserMessage(prompt,new Media(MimeTypeUtils.IMAGE_JPEG,new ClassPathResource("multimodel/dog_and_girl.jpeg")));List<ChatResponse> response = openAiChatClient.prompt(new Prompt(message)).stream().chatResponse().collectList().block();StringBuilder result = new StringBuilder();if (response != null) {for (ChatResponse chatResponse : response) {String outputContent = chatResponse.getResult().getOutput().getText();result.append(outputContent);}}return result.toString();}@GetMapping("/video")public String video(@RequestParam(value = "prompt", required = false, defaultValue = DEFAULT_VIDEO_PROMPT)String prompt) {List<Media> mediaList = FrameExtraHelper.createMediaList(10);UserMessage message = new UserMessage(prompt, mediaList);ChatResponse response = openAiChatClient.prompt(new Prompt(message)).call().chatResponse();return response.getResult().getOutput().getText();}
}

功能解析

  • 参数说明
    • @RequestParam(value = "prompt", required = false, defaultValue = DEFAULT_PROMPT) String prompt:用户输入的提示文本,默认值为“这些是什么?”。
    • mediaList:包含图片资源的媒体列表,这里使用了一个固定 URL 的图片资源。
  • 实现逻辑
    • 创建 UserMessage 对象,包含提示文本和媒体列表。
    • 通过 openAiChatClient.prompt() 方法发送请求,并获取响应结果。
4.2 视频帧提取功能

FrameExtraHelper.java

/** Copyright 2024 the original author or authors.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      https://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.alibaba.cloud.ai.example.controller.helper;import jakarta.annotation.PreDestroy;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.model.Media;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.io.PathResource;
import org.springframework.stereotype.Component;
import org.springframework.util.MimeType;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import java.util.stream.IntStream;import static org.bytedeco.javacpp.Loader.deleteDirectory;/*** @author yuluo* @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>*/@Component
public final class FrameExtraHelper implements ApplicationRunner {private FrameExtraHelper() {}private static final Map<String, List<String>> IMAGE_CACHE = new ConcurrentHashMap<>();private static final File videoUrl = new File("spring-ai-alibaba-multi-model-example/dashscope-multi-model/src/main/resources/multimodel/video.mp4");private static final String framePath = "spring-ai-alibaba-multi-model-example/dashscope-multi-model/src/main/resources/multimodel/frame/";private static final Logger log = LoggerFactory.getLogger(FrameExtraHelper.class);public static void getVideoPic() {List<String> strList = new ArrayList<>();File dir = new File(framePath);if (!dir.exists()) {dir.mkdirs();}try (FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videoUrl.getPath());Java2DFrameConverter converter = new Java2DFrameConverter()) {ff.start();ff.setFormat("mp4");int length = ff.getLengthInFrames();Frame frame;for (int i = 1; i < length; i++) {frame = ff.grabFrame();if (frame.image == null) {continue;}BufferedImage image = converter.getBufferedImage(frame); ;String path = framePath + i + ".png";File picFile = new File(path);ImageIO.write(image, "png", picFile);strList.add(path);}IMAGE_CACHE.put("img", strList);ff.stop();}catch (Exception e) {log.error(e.getMessage());}}@Overridepublic void run(ApplicationArguments args) throws Exception {log.info("Starting to extract video frames");getVideoPic();log.info("Extracting video frames is complete");}@PreDestroypublic void destroy() {try {deleteDirectory(new File(framePath));}catch (IOException e) {log.error(e.getMessage());}log.info("Delete temporary files...");}public static List<String> getFrameList() {assert IMAGE_CACHE.get("img") != null;return IMAGE_CACHE.get("img");}public static List<Media> createMediaList(int numberOfImages) {List<String> imgList = IMAGE_CACHE.get("img");int totalFrames = imgList.size();int interval = Math.max(totalFrames / numberOfImages, 1);return IntStream.range(0, numberOfImages).mapToObj(i -> imgList.get(i * interval)).map(image -> new Media(MimeType.valueOf("image/png"),new PathResource(image))).collect(Collectors.toList());}}

功能解析

  • 参数说明
    • int numberOfImages:需要提取的图片帧数量。
  • 实现逻辑
    • IMAGE_CACHE 中获取所有图片帧路径。
    • 根据 numberOfImages 计算间隔,均匀选择图片帧。
    • 将选中的图片帧转换为 Media 对象并返回。
5. 参数配置与使用
5.1 application.yml 配置

application.yml

spring:ai:openai:# API Key Configuration。api-key: ${ARK_API_KEY:your-api-key}# Ark LLM API Base URLbase-url: https://ark.cn-beijing.volces.com/api/chat:options:# Model ID, replace with actual access point IDmodel: ${ARK_MODEL_ID:your-model-id}# Chat API path, consistent with OpenAI interfacecompletions-path: /v3/chat/completionsserver:port: 8080logging:level:org:springframework:ai:chat:client:advisor: DEBUG

配置解析

  • api-key:ARK 平台的 API 密钥,用于身份验证。
  • base-url:ARK LLM API 的基础 URL。
  • model:使用的模型 ID。
  • completions-path:Chat API 的路径,与 OpenAI 接口保持一致。
5.2 ChatClient 构造参数
@RestController
@RequestMapping("/api")
public class MultiModelController {private static final String DEFAULT_PROMPT = "这些是什么?";private static final String DEFAULT_VIDEO_PROMPT = "这是一组从视频中提取的图片帧,请描述此视频中的内容。";@Autowiredprivate ChatModel chatModel;private ChatClient openAiChatClient;public MultiModelController(ChatModel chatModel) {this.chatModel = chatModel;// 构造时,可以设置 ChatClient 的参数// {@link org.springframework.ai.chat.client.ChatClient};this.openAiChatClient = ChatClient.builder(chatModel)// 实现 Chat Memory 的 Advisor// 在使用 Chat Memory 时,需要指定对话 ID,以便 Spring AI 处理上下文。.defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory()))// 实现 Logger 的 Advisor.defaultAdvisors(new SimpleLoggerAdvisor())// 设置 ChatClient 中 ChatModel 的 Options 参数.defaultOptions(OpenAiChatOptions.builder().topP(0.7).build()).build();}}

参数解析

  • MessageChatMemoryAdvisor:实现 Chat Memory 的 Advisor,用于管理对话上下文。
  • SimpleLoggerAdvisor:实现 Logger 的 Advisor,用于日志记录。
  • OpenAiChatOptions:设置 ChatModel 的选项参数,如 topP(采样策略)。
6. 测试验证

为了验证功能的正确性,我们进行以下测试:

6.1 图片处理功能测试

测试步骤

  1. 发送 GET 请求至 /api/image,携带提示文本参数。
  2. 检查响应结果是否符合预期。

测试结果
假设请求 URL 为 http://localhost:8080/api/image?prompt=这是一张什么照片?,响应结果如下:

{"result": "这是一张在海滩上拍摄的照片,照片中有一个人和一只狗。"
}
6.2 视频帧提取功能测试

测试步骤

  1. 调用 FrameExtraHelper.createMediaList(10) 方法,提取 10 帧图片。
  2. 检查返回的 Media 列表是否正确。

测试结果
成功返回 10 个 Media 对象,每个对象包含一张视频帧图片。

7. 总结

本文详细介绍了 Spring AI Alibaba ARK Multi-Model 的实现原理、架构设计以及关键参数的配置和使用方法。通过具体的代码示例和测试验证,我们验证了项目的功能正确性和稳定性。希望本文能为读者理解和应用 Spring AI 和 Alibaba ARK 平台提供有价值的参考。

8. 参考资料
  • Spring AI 官方文档
  • Alibaba ARK 平台文档

以上就是本次技术博客的全部内容,感谢阅读!如果有任何问题或建议,请随时留言交流。

相关文章:

Spring AI应用系列——基于ARK实现多模态模型应用

ARK 在这里指的是阿里云推出的 AIGC 研发平台 ARK&#xff0c;是阿里云面向开发者和企业用户打造的一站式 AIGC&#xff08;AI Generated Content&#xff0c;人工智能生成内容&#xff09;开发平台。 1. 引言 本文将深入探讨 ARK Multi-Model 的实现原理、架构设计以及关键参…...

从边缘到云端:边缘计算与云计算的协同未来

在数字化转型的浪潮中&#xff0c;云计算和边缘计算作为两种重要的计算范式&#xff0c;正在深刻改变着我们的生活和工作方式。云计算以其强大的计算能力和数据存储能力&#xff0c;已经成为企业数字化转型的核心支撑&#xff1b;而边缘计算则凭借其低延迟和高效率的特点&#…...

基于策略模式实现灵活可扩展的短信服务架构

基于策略模式实现灵活可扩展的短信服务架构 引言 在企业级应用开发中&#xff0c;短信服务是不可或缺的基础功能之一。随着业务发展&#xff0c;我们可能需要接入多个短信服务提供商&#xff08;如阿里云、腾讯云、第三方短信网关等&#xff09;&#xff0c;并能够在不修改核…...

安全指南 | MCP安全检查清单:AI工具生态系统的隐形守护者

随着大型语言模型&#xff08;LLM&#xff09;技术的迅猛发展&#xff0c;MCP&#xff08;Model Context Protocol&#xff09;已经成为连接AI模型与外部工具、数据源的关键桥梁。它为AI应用&#xff08;如Claude Desktop、Cursor等&#xff09;提供了更高效的集成体验&#xf…...

ChipCN IDE KF32 导入工程后,无法编译的问题

使用ChipON IDE for KungFu32 导入已有的工程是时&#xff0c;发现能够编译&#xff0c;但是点击&#xff0c;同时选择硬件调试时 没有任何响应。查看工程调试配置时&#xff0c;发现如下问题&#xff1a; 没有看到添加有启动配置&#xff0c;说明就是这里的问题了(应该是IDE的…...

Win下的Kafka安装配置

一、准备工作&#xff08;可以不做&#xff0c;毕竟最新版kafka也不需要zk&#xff09; 1、Windows下安装Zookeeper &#xff08;1&#xff09;官网下载Zookeeper 官网下载地址 &#xff08;2&#xff09;解压Zookeeper安装包到指定目录C:\DevelopApp\zookeeper\apache-zoo…...

Vue2 vs Vue2.7 深度对比

Vue2 vs Vue2.7 深度对比 前言 作为 Vue 生态中承前启后的重要版本&#xff0c;Vue2.7 在保留 Vue2 核心特性的同时&#xff0c;引入了 Vue3 的诸多创新设计。本文将深入解析二者差异&#xff0c;通过架构对比、代码实战和性能基准测试&#xff0c;为企业技术选型提供决策依据…...

WPF使用高性能图表

WPF高性能图表实现方案 一、WPF图表技术选型对比 技术方案优点缺点适用场景​​WPF原生控件​​无需第三方依赖,完全可控开发成本高,性能有限简单图表需求​​OxyPlot​​轻量级,跨平台,开源功能相对基础中小型应用​​LiveCharts​​现代API,支持动画复杂场景性能一般中…...

当算力遇上贫困补助:能否让补助精准到户?

目录 一、让"贫困画像"从模糊到高清 ​​ 二、破解扶贫"三大世界难题" ​​三、算力扶贫路上的三座大山 ​​算力应该温暖谁?​​ 以往扶贫的画面是“扶贫干部背着米面油翻山越岭”,当算力发展到一定程度,会呈现出一种新的画面:农民伯伯用手机扫描…...

基于连接感知的实时困倦分类图神经网络

疲劳驾驶是导致交通事故的主要原因之一。脑电图(EEG)是一种直接从大脑活动中检测睡意的方法&#xff0c;已广泛用于实时检测驾驶员的睡意。最近的研究表明&#xff0c;使用基于脑电图数据构建的大脑连接图来预测困倦状态的巨大潜力。然而&#xff0c;传统的脑连接网络与下游预测…...

Set系列之HashSet源码分析:原理剖析与实战对比

引言&#xff1a;哈希集合的基石 1.1 集合框架的核心地位 数据存储的三大特性&#xff1a;唯一性、无序性、快速访问HashSet的市场占有率&#xff1a;Java集合框架中使用率TOP3&#xff08;占日常开发场景的45%&#xff09; 1.2 为什么需要深入理解HashSet&#xff1f; 隐藏…...

vscode vim插件操作查缺补漏

一.多光标编辑 在 VSCode 中使用 Vim 插件 (VSCodeVim) 实现多光标选择和同时编辑的常用方法&#xff1a; 1. 逐个添加匹配项 (推荐) 快捷键&#xff1a; CtrlD (Win/Linux) / CmdD (Mac)操作&#xff1a; 将光标放在想选中的单词上。重复按此快捷键&#xff0c;会依次选中下…...

Python 爬取微店商品列表接口(item_search)的实战指南

在电商数据分析、市场调研或竞品分析中&#xff0c;获取商品列表信息是常见的需求。微店作为知名的电商平台&#xff0c;提供了丰富的商品资源和相应的 API 接口。本文将详细介绍如何使用 Python 爬虫技术&#xff0c;通过微店的 item_search 接口根据关键词搜索商品列表&#…...

游戏性能测试

1. 分阶段&#xff0c;看目的&#xff0c;确定高中低三档测试机&#xff0c;最低档机的确定需要和客户端主程和制作人等共同确定 确定三档机的方式&#xff1a; 1. 要上线地区的top100&#xff0c;根据用户占比&#xff0c;划分出三档 2. 根据用研部门提供的数据&#xff0c;确…...

Webug4.0通关笔记06- 第8关CSV注入

目录 CSV注入漏洞 1.CSV漏洞简介 2.漏洞原理 &#xff08;1&#xff09;公式执行 &#xff08;2&#xff09;DDE机制 &#xff08;3&#xff09;OS命令执行 3.漏洞防御 第08关 CSV注入 1.打开靶场 2.修改源码 3.注入命令 4.导出excel表 5.打开excel表 CSV注入漏洞…...

最新DeepSeek-Prover-V2-671B模型 简介、下载、体验、微调、数据集:专为数学定理自动证明设计的超大垂直领域语言模型(在线体验地址)

DeepSeek-Prover-V2-671B模型 简介、下载、体验、微调、数据集&#xff1a;专为数学定理自动证明设计的超大垂直领域语言模型&#xff08;在线体验地址&#xff09; 体验地址&#xff1a;[Hugging Face 在线体验]https://huggingface.co/playground?modelIddeepseek-ai/DeepS…...

iView Admin的side menu改为top menu

和iView Admin结缘于某次在“顾问群”里问&#xff0c;“有什么开源前端框架推荐吗&#xff1f;”。群里一位老开发答&#xff0c;“试试iView Admin”。于是我就试了试&#xff0c;发现很好用&#xff0c;对新手也很友好&#xff0c;试过撸一个管理后台的前端用了4天&#xff…...

2025上海车展 | 移远通信推出自研NG-eCall QuecOpen方案,助力汽车安全新标准加速落地

4月29日&#xff0c;在2025上海国际汽车工业展览会期间&#xff0c;全球领先的物联网和车联网整体解决方案供应商移远通信宣布&#xff0c;正式发布自主研发的NG-eCall&#xff08;下一代紧急呼叫系统&#xff09;QuecOpen解决方案。 该方案凭借高度集成的软硬件协同设计&…...

使用gitea发布软件包

1、新建hello工程 &#xff08;1&#xff09;HelloApplication.java package cn.ac.trimps.sv;import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplicati…...

如何加速机器学习模型训练:深入探讨与实用技巧

在机器学习和深度学习的应用中&#xff0c;训练模型通常需要耗费大量时间。随着数据集的增大、模型复杂度的提升以及任务的多样化&#xff0c;训练速度变得越来越重要。无论是在学术研究中&#xff0c;还是在工业应用中&#xff0c;加速训练过程不仅能提高工作效率&#xff0c;…...

HBuider中Uniapp去除顶部导航栏-小程序、H5、APP适用

文件pages.json中改"globalStyle" "globalStyle": {"navigationBarTextStyle": "black","navigationBarBackgroundColor": "#F8F8F8","backgroundColor": "#F8F8F8","titleNView"…...

scGPT-spatial:持续预训练scGPT用于空间转录组

空间转录组学已成为一种关键技术&#xff0c;可在细胞的空间环境中对其基因表达进行分析。公开可用的空间数据的迅速增长&#xff0c;为我们进一步理解驱动细胞命运决定和疾病进展的微环境提供了契机。然而&#xff0c;现有的基础模型大多是在scRNA-seq数据上进行预训练的&…...

ERP管理系统对企业财务管理有什么重要意义

在知识经济浪潮的推动下&#xff0c;企业的核心资产正经历着从传统厂房设备向知识产权的历史性跨越。专利技术、品牌价值、人才储备等无形资产逐渐成为驱动企业发展的核心引擎&#xff0c;但这类资产的非实体性与价值波动性&#xff0c;却让传统财务管理工具陷入"看得见摸…...

【数据库原理及安全实验】实验五 数据库备份与恢复

指导书原文 数据库的备份与恢复SSMS 【实验目的】 1) 熟悉并掌握利用界面操作进行数据库备份和恢复的原理和操作。 【实验原理】 1) 数据库的恢复包括大容量日志恢复模式和简单恢复模式。其中大容量日志恢复模式&#xff0c;简单地说就是要对大容量操作进行最小日志记录&a…...

【人脸去遮挡前沿】三阶段级联引导学习如何突破真实场景遮挡难题?

一、现实痛点:当人脸被遮挡,AI “认脸” 有多难? 你是否遇到过这样的场景? 中考体育测试:2025 年天津泰达街中考考场要求考生 “脸部无遮挡” 才能通过人脸识别入场,戴口罩、帽子的学生需现场调整发型。智能门锁:奇景光电在 CES 2025 推出的 WiseEye 掌静脉模块,通过掌…...

Kettle下载安装教程

## 什么是Kettle Kettle&#xff08;现在也称为Pentaho Data Integration&#xff0c;简称PDI&#xff09;是一款开源的ETL&#xff08;Extract-Transform-Load&#xff09;工具&#xff0c;用于数据抽取、转换和加载。它允许用户通过图形化界面设计和执行数据集成流程&#xf…...

树的序列化 - 学习笔记

树的序列化可以有很多种类&#xff1a;可以变成 dfs 序&#xff0c;可以变成欧拉序&#xff0c;还有什么括号序的科技。 但是除了第一个以外其他的都没什么用&#xff08;要么也可以被已有的算法给替代掉&#xff09;。所以表面上是讲树的序列化&#xff0c;实际上还是讲的 df…...

数电发票整理:免费实用工具如何高效解析 XML 发票数据

如今数字电子发票越来越普及&#xff0c;但是数电发票的整理还是颇有讲究~ 今天给大家介绍一个 XML 发票阅读器。使用它完全不收取任何费用&#xff0c;且无广告干扰&#xff0c;对财务人员而言十分实用。 01 软件介绍 这款软件就是XML格式&#xff08;数电票&#xff09;阅读…...

ubuntu22.04 qemu arm64 环境搭建

目录 创建 安装 Qemu 启动 # 进入qemu虚拟机后执行 qemu编译器安装 创建 qemu-img create ubuntu22.04_arm64.img 40G 安装 qemu-system-aarch64 -m 4096 -cpu cortex-a57 -smp 4 -M virt -bios QEMU_EFI.fd -nographic -drive ifnone,fileubuntu-22.04.5-live-server-a…...

数据转储(go)

​ 随着时间推移&#xff0c;数据库中的数据量不断累积&#xff0c;可能导致查询性能下降、存储压力增加等问题。数据转储作为一种有效的数据管理策略&#xff0c;能够将历史数据从生产数据库中转移到其他存储介质&#xff0c;从而减轻数据库负担&#xff0c;提高系统性能&…...

LeetCode167_两数之和 Ⅱ - 输入有序数组

LeetCode167_两数之和 Ⅱ - 输入有序数组 标签&#xff1a;#数组 #双指针 #二分查找Ⅰ. 题目Ⅱ. 示例 0. 个人方法官方题解一&#xff1a;二分查找官方题解二&#xff1a;双指针 标签&#xff1a;#数组 #双指针 #二分查找 Ⅰ. 题目 给你一个下标从 1 开始的整数数组 numbers …...

【AI平台】n8n入门5:创建MCP服务,及vscode调用MCP测试

前言 用n8n搭建一个MCP服务&#xff0c;然后用开发环境的MCP测试工具&#xff0c;测试调用一下。例子简单&#xff0c;只为了解原理。在开发环境&#xff0c;安装测试mcp服务的工具&#xff0c;vscode和Trae操作类似&#xff0c;而且在一个机器上的话&#xff0c;安装的插件公…...

第六部分:实战项目与拓展

欢迎来到 OpenCV 教程的第六部分&#xff01;你已经走过了从像素操作到特征提取、再到基础目标检测的旅程。现在&#xff0c;我们将迎接更激动人心的挑战&#xff1a;将这些技术结合起来&#xff0c;构建更贴近实际应用的系统。 本部分将带领你从更高层面思考如何设计一个计算…...

SQL Server连接异常 证书链是由不受信任的颁发机构颁发的

使用SQL Server连接数据库时报错如下&#xff1a; 标题: 连接到服务器 ------------------------------ 无法连接到 DESKTOP-N2KOQ8J\SQLEXPRESS。 ------------------------------ 其他信息: A connection was successfully established with the server, but then an erro…...

WebGL图形编程实战【5】:层次构建 × Shader初始化深度剖析

层次结构模型 三维模型和现实中的人类或机器人不一样&#xff0c;它的部件并没有真正连接在一起。如果直接转动上臂&#xff0c;那么肘部以下的部分&#xff0c;包括前臂、手掌和手指&#xff0c;只会留在原地&#xff0c;这样手臂就断开了。 所以&#xff0c;当上臂绕肩关节转…...

126. 单词接龙 II

题目 按字典 wordList 完成从单词 beginWord 到单词 endWord 转化&#xff0c;一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -> s2 -> ... -> sk 这样的单词序列&#xff0c;并满足&#xff1a; 每对相邻的单词之间仅有单个字母不同。转换过程中的每个…...

【LeetCode Hot100】二叉树篇

前言 本文用于整理LeetCode Hot100中题目解答&#xff0c;因题目比较简单且更多是为了面试快速写出正确思路&#xff0c;只做简单题意解读和一句话题解方便记忆。但代码会全部给出&#xff0c;方便大家整理代码思路。 94. 二叉树的中序遍历 一句话题意 返回二叉树中序遍历的数…...

MySQL基础关键_002_DQL

目 录 一、初始化 二、简单查询 1.部分语法规则 2.查询一个字段 &#xff08;1&#xff09;查询员工编号 &#xff08;2&#xff09;查询员工姓名 3.查询多个字段 &#xff08;1&#xff09;查询员工编号、姓名 &#xff08;2&#xff09;查询部门编号、名称、位置 …...

游戏引擎学习第249天:清理调试宏

欢迎大家&#xff0c;让我们直接进入调试代码的改进工作 接下来&#xff0c;我们来看一下上次停留的位置。如果我没记错的话&#xff0c;上一场直播的结尾我有提到一些我想做的事情&#xff0c;并且在代码中留下了一个待办事项。所以也许我们今天首先做的就是解决这个问题。但…...

TwinCAT数据类型,%MX,%MD这些特殊符号

在 TwinCAT&#xff08;Beckhoff PLC 编程环境&#xff09;中&#xff0c;%MX、%MD 等符号是 IEC 61131-3 标准的地址表示法&#xff0c;用于直接访问 PLC 的物理 I/O 或内存区域。这些符号通常用于 变量声明 或 直接寻址&#xff0c;特别是在 TwinCAT 2 和 传统 PLC 编程 中较…...

力扣——20有效的括号

目录 1.题目描述&#xff1a; 2.算法思路&#xff1a; 3.代码展示: 1.题目描述&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须…...

正点原子STM32H743单片机实现ADC多通道检测

目标 使用STM32CubeMX工具&#xff0c;配置ADC相关参数&#xff0c;实现在STM32H743单片机上获取ADC多通道电压值。共14个ADC引脚&#xff0c;ADC2有5个&#xff0c;ADC3有9个&#xff0c;全部设置单通道 ADC引脚 PF3PF4PF5PF10PC0PC2PC3PH2PH3PA3PB0PB1PA4PA5PA6 STM32cube…...

前端封装WebSocket工具n

Web API 提供的 WebSocket 类&#xff0c;封装一个 Socket 类 // socket.js import modal from /plugins/modal const baseURL import.meta.env.VITE_APP_BASE_WS; const EventTypes [open, close, message, error, reconnect]; const DEFAULT_CHECK_TIME 55 * 1000; // 心…...

Docker进入MySQL之后如何用sql文件初始化数据

关闭Docker-compose.yml里面所有容器 docker compose -f docker_compose.yml down后台形式开启Docker-compose.yml所有容器 docker compose -f docker_compose.yml up -d罗列出所有启动过的&#xff08;包括退出过的&#xff09;容器 docker ps -a进入指定容器ID内部 docke…...

Docker搜索镜像报错

科学上网最方便。。。。 尝试一&#xff1a; 报错处理 Error response from daemon: Get https://index.docker.io/v1/search?qmysql&n25: dial tcp 31.13.84.2:443: i/o timeout 国内从 DockerHub 拉取镜像有时会遇到困难&#xff0c;此时可以配置镜像加速器。Docke…...

【Unity笔记】基于距离驱动的参数映射器 InverseDistanceMapper 设计与实现

需求&#xff1a; 当用户距离目标位置越近&#xff0c;参数值越大。 可用于控制场景亮度、动画进度、交互强度等多种效果。 一、需求背景&#xff1a;如何让“距离”成为设计的一部分&#xff1f; 在虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;乃…...

【Spring AI】Java结合ollama实现大模型调用

在较新的Java版本中&#xff0c;编译器已经支持了接入各种AI模型工具进行开发&#xff0c;这篇文章我会介绍如何利用Spring AI进行大模型的调用的基础方法。 环境准备 由于这篇文章是结合ollama进行演示&#xff0c;所以在开始前需要先安装ollama服务&#xff0c;这个的具体步…...

docker制作python大模型镜像(miniconda环境),工程改造记录

**环境说明&#xff1a;**从系统镜像开始打造python大模型镜像&#xff0c;之前是人工手动装的方式&#xff0c;并且模型和依赖在公网中&#xff0c;对于离线交付环境不太友好&#xff0c;所以打造的离线化交付版本 Dockerfile: FROM centos:7.9 ENV PYTHONIOENCODINGutf-8 E…...

在油气地震资料积分法偏移成像中,起伏地表处理

在油气地震资料积分法偏移成像中&#xff0c;起伏地表情况会带来波场传播路径畸变、静校正问题以及成像精度下降等挑战。以下是处理起伏地表的常用方法和技术要点&#xff1a; 1. 静校正预处理 高程静校正&#xff1a;将地表各接收点校正到统一基准面&#xff08;浮动基准面或…...

经典算法 独立任务最优调度问题

独立任务最优调度问题 题目描述 用2 台处理机A 和B 处理n 个作业。设第i 个作业交给机器A 处理时需要时间ai &#xff0c;若由机器B 来处理&#xff0c;则需要时间bi 。由于各作业的特点和机器的性能关系&#xff0c;很可能对于某些i&#xff0c;有ai >bi&#xff0c;而对…...