【人工智能深度学习应用】妙笔API最佳实践
AI妙笔是一款以文本创作为主、多模态为辅的生成式创作大模型产品,专门为传媒、政务等特定的行业和组织提供行业化的内容创作辅助。它具备深度的行业知识,能够生成高质量的专业内容,能覆盖各行业常见的文体类型,写作文体丰富多样,包括时政稿件、时事评论、视频脚本、报告、请示、通知、方案、复函等。AI妙笔通过人工智能技术提升创作效率,帮助用户节省时间和精力,并提供准确、专业的内容,满足不同行业组织的需求。
本文提供妙笔写作链路 API的几个最佳实践,帮助您快速入门并开发您自己的业务应用。
前提条件
-
已开通服务
-
获取WorkSpaceId 获取Workspace ID
-
引入妙笔SDK 注意获取最新SDK版本
<dependency><groupId>com.aliyun</groupId><artifactId>alibabacloud-aimiaobi20230801</artifactId><version>1.0.11</version>
</dependency>
1、实现直接生成文章
基于妙笔提供的API,本节通过直接生成文章场景来帮助您熟悉API的使用。
生成调用demo如下:
package com.aliyun.sdk.service.aimiaobi20230801;import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.sdk.gateway.pop.Configuration;
import com.aliyun.sdk.gateway.pop.auth.SignatureVersion;
import com.aliyun.sdk.service.aimiaobi20230801.models.RunWritingRequest;
import com.aliyun.sdk.service.aimiaobi20230801.models.RunWritingResponseBody;import com.google.gson.Gson;
import darabonba.core.ResponseIterable;
import darabonba.core.ResponseIterator;
import darabonba.core.client.ClientOverrideConfiguration;import java.util.ArrayList;import java.util.List;/*** packageName com.dayouz.lightapp** @author dayouz* @version JDK 8* @className runStyleWriting* @date 2024/8/13* @description 直接写作demo*/
public class RunWritingTest {public static void main(String[] args) {StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder().accessKeyId(Constant.accessKeyId).accessKeySecret(Constant.accessKeySecret).build());AsyncClient client = AsyncClient.builder().region("cn-beijing").credentialsProvider(provider).serviceConfiguration(Configuration.create().setSignatureVersion(SignatureVersion.V3)).overrideConfiguration(ClientOverrideConfiguration.create().setProtocol("HTTPS").setEndpointOverride("aimiaobi.cn-beijing.aliyuncs.com")).build();//写作时的文体、篇幅、输出语言等控制参数List<RunWritingRequest.Tags> tags = new ArrayList<>();//构建语言为中文tags.add(RunWritingRequest.Tags.builder().tag("language").keyword("zh-CN").build());//构建文章篇幅字数300字左右tags.add(RunWritingRequest.Tags.builder().tag("gcNumberSizeTag").keyword("300字").build());//构建生成文章数量为1篇tags.add(RunWritingRequest.Tags.builder().tag("gcNumber").keyword("1").build());//构建写作文体为新闻评论tags.add(RunWritingRequest.Tags.builder().tag("writingStyle").keyword("新闻评论").build());RunWritingRequest request = RunWritingRequest.builder().workspaceId(Constant.workspaceId).prompt("写一篇关于国足对战日本0:7 失败的报道").writingConfig(RunWritingRequest.WritingConfig.builder()//设置传媒领域的写作.domain("media")//设置为自动补充素材,通过互联网检索.useSearch(true)//设置写作时的文体、篇幅、输出语言等控制参数.tags(tags).build()).build();ResponseIterable<RunWritingResponseBody> x = client.runWritingWithResponseIterable(request);ResponseIterator<RunWritingResponseBody> iterator = x.iterator();while (iterator.hasNext()) {System.out.println("----event----");RunWritingResponseBody event = iterator.next();System.out.println(new Gson().toJson(event));}System.out.println("ALL***********************");System.out.println("请求成功的请求头值:");System.out.println(x.getStatusCode());System.out.println(x.getHeaders());}
}
2、分步骤创作文章
package org.example.miaobi;import com.alibaba.fastjson2.JSONObject;
import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.sdk.gateway.pop.Configuration;
import com.aliyun.sdk.gateway.pop.auth.SignatureVersion;
import com.aliyun.sdk.service.aimiaobi20230801.AsyncClient;
import com.aliyun.sdk.service.aimiaobi20230801.models.RunStepByStepWritingRequest;
import com.aliyun.sdk.service.aimiaobi20230801.models.RunStepByStepWritingResponseBody;
import darabonba.core.ResponseIterable;
import darabonba.core.client.ClientOverrideConfiguration;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;@Slf4j
public class RunStepByStepWritingTest {public static AsyncClient asyncClient() {//accessKeyIdString accessKeyId = System.getenv("accessKeyId");//accessKeySecretString accessKeySecret = System.getenv("accessKeySecret");//域名:aimiaobi.cn-hangzhou.aliyuncs.comString domain = System.getenv("domain");return AsyncClient.builder().credentialsProvider(StaticCredentialProvider.create(Credential.builder().accessKeyId(accessKeyId).accessKeySecret(accessKeySecret).build())).serviceConfiguration(Configuration.create().setSignatureVersion(SignatureVersion.V3)).overrideConfiguration(ClientOverrideConfiguration.create().setProtocol("HTTPS").setEndpointOverride(domain)).build();}@Testpublic void runStepByStepWriting() {AsyncClient asyncClient = asyncClient();String workspaceId = System.getenv("WorkspaceId");String prompt = "中美关系如何破局";//大纲生成OutlineGenerateResult result = runOutlineGenerateResult(asyncClient, workspaceId, prompt);//判断是否成功失败if (result.latestResponse == null || result.latestResponse.getHeader().getErrorCode() != null || result.latestResponse.getHeader().getErrorMessage() != null) {log.error("runStepByStepWriting|runOutlineGenerateResult error:{}", JSONObject.toJSONString(result.latestResponse));return;}log.info("latestResponse:{}", JSONObject.toJSONString(result.latestResponse));log.info("searchQuery:{}", result.searchQuery);log.info("articles:{}", result.articles != null ? result.articles.stream().map(x -> {return String.format("%s:%s", x.getTitle(), x.getUrl());}).collect(Collectors.joining(",")) : null);log.info("miniDoc:{}", JSONObject.toJSONString(result.miniDoc));log.info("outlines:{}", JSONObject.toJSONString(result.outlines));List<String> miniDoc = result.miniDoc;List<String> outlines = result.outlines;//生成摘编SummarizationResult summarizationResult = runSummarizationGenerate(outlines, asyncClient, workspaceId, miniDoc, prompt);//判断是否成功失败if (summarizationResult.latestResponse == null || summarizationResult.latestResponse.getHeader().getErrorCode() != null || summarizationResult.latestResponse.getHeader().getErrorMessage() != null) {log.error("runStepByStepWriting|runSummarizationGenerate|error:{}", JSONObject.toJSONString(summarizationResult.latestResponse));return;}List<RunStepByStepWritingRequest.Outlines> outlineList = outlines.stream().map(x -> {return RunStepByStepWritingRequest.Outlines.builder().outline(x).build();}).collect(Collectors.toList());//生成文章RunWritingResult runWritingResult = runWriting(asyncClient, workspaceId, prompt, miniDoc, outlineList, summarizationResult.cachedSummarization);//判断是否成功失败if (runWritingResult.latestResponse == null || runWritingResult.latestResponse.getHeader().getErrorCode() != null || runWritingResult.latestResponse.getHeader().getErrorMessage() != null) {log.error("runStepByStepWriting|runSummarizationGenerate|error:{}", JSONObject.toJSONString(runWritingResult.latestResponse));return;}RunStepByStepWritingResponseBody.Output output = runWritingResult.latestResponse.getPayload().getOutput();//最终输出的正文String text = output.getText();log.info("最终输出的正文:{}", text);}public static class RunWritingResult {public final RunStepByStepWritingResponseBody latestResponse;public RunWritingResult(RunStepByStepWritingResponseBody latestResponse) {this.latestResponse = latestResponse;}}private static RunWritingResult runWriting(AsyncClient asyncClient, String workspaceId, String prompt, List<String> miniDoc, List<RunStepByStepWritingRequest.Outlines> outlineList, List<String> cachedSummarization) {ResponseIterable<RunStepByStepWritingResponseBody> iterable = asyncClient.runStepByStepWritingWithResponseIterable(RunStepByStepWritingRequest.builder().workspaceId(workspaceId).prompt(prompt).referenceData(RunStepByStepWritingRequest.ReferenceData.builder().miniDoc(miniDoc).outlines(outlineList).summarization(cachedSummarization).build()).writingConfig(RunStepByStepWritingRequest.WritingConfig.builder().step("Writing").build()).build());RunStepByStepWritingResponseBody latestResponse = null;//写作输出for (RunStepByStepWritingResponseBody item : iterable) {log.info("item:{}", JSONObject.toJSONString(item));latestResponse = item;}return new RunWritingResult(latestResponse);}public static class SummarizationResult {public final List<String> cachedSummarization;public final RunStepByStepWritingResponseBody latestResponse;public SummarizationResult(List<String> cachedSummarization, RunStepByStepWritingResponseBody latestResponse) {this.cachedSummarization = cachedSummarization;this.latestResponse = latestResponse;}}private static SummarizationResult runSummarizationGenerate(List<String> outlines,AsyncClient asyncClient,String workspaceId,List<String> miniDoc,String prompt) {List<RunStepByStepWritingRequest.Outlines> outlineList = outlines.stream().map(x -> {return RunStepByStepWritingRequest.Outlines.builder().outline(x).build();}).collect(Collectors.toList());ResponseIterable<RunStepByStepWritingResponseBody> iterable = asyncClient.runStepByStepWritingWithResponseIterable(RunStepByStepWritingRequest.builder().workspaceId(workspaceId).prompt(prompt).referenceData(RunStepByStepWritingRequest.ReferenceData.builder().miniDoc(miniDoc).outlines(outlineList).build()).writingConfig(RunStepByStepWritingRequest.WritingConfig.builder().step("MiniDocSummary").build()).build());List<String> cachedSummarization = null;RunStepByStepWritingResponseBody latestResponse = null;for (RunStepByStepWritingResponseBody responseBody : iterable) {latestResponse = responseBody;RunStepByStepWritingResponseBody.Output output = responseBody.getPayload().getOutput();if (output != null && output.getExtraOutput() != null && output.getExtraOutput().getSummarization() != null) {cachedSummarization = output.getExtraOutput().getSummarization();}}return new SummarizationResult(cachedSummarization, latestResponse);}private static OutlineGenerateResult runOutlineGenerateResult(AsyncClient asyncClient, String workspaceId, String prompt) {//生成大纲ResponseIterable<RunStepByStepWritingResponseBody> iterable = asyncClient.runStepByStepWritingWithResponseIterable(RunStepByStepWritingRequest.builder().workspaceId(workspaceId).prompt(prompt).writingConfig(RunStepByStepWritingRequest.WritingConfig.builder().step("OutlineGenerate").build()).build());//检索的QueryString searchQuery = null;//检索的文章List<RunStepByStepWritingResponseBody.Articles> articles = null;//排序好的文章切片List<String> miniDoc = null;//生成的大纲List<String> outlines = null;RunStepByStepWritingResponseBody latestResponse = null;for (RunStepByStepWritingResponseBody response : iterable) {latestResponse = response;if (articles == null) {articles = response.getPayload().getOutput().getArticles();}if (miniDoc == null) {miniDoc = response.getPayload().getOutput().getMiniDoc();}//检索后的queryif (searchQuery == null) {searchQuery = response.getPayload().getOutput().getSearchQuery();}//大纲生成结束if ("task-outline-end".equals(response.getHeader().getEvent())) {outlines = Arrays.asList(response.getPayload().getOutput().getText().split("\n"));}}return new OutlineGenerateResult(searchQuery, articles, miniDoc, outlines, latestResponse);}private static class OutlineGenerateResult {public final String searchQuery;public final List<RunStepByStepWritingResponseBody.Articles> articles;public final List<String> miniDoc;public final List<String> outlines;public final RunStepByStepWritingResponseBody latestResponse;public OutlineGenerateResult(String searchQuery, List<RunStepByStepWritingResponseBody.Articles> articles, List<String> miniDoc, List<String> outlines, RunStepByStepWritingResponseBody latestResponse) {this.searchQuery = searchQuery;this.articles = articles;this.miniDoc = miniDoc;this.outlines = outlines;this.latestResponse = latestResponse;}}
}
3、AI工具箱
AI工具箱包括内容续写、摘要生成、标题生成、内容缩写、内容扩写、关键词抽取等功能,最新实时能力可参考妙笔写作页面的AI工具箱。本节通过实现摘要生成场景来帮助您熟悉API的使用。
生成调用demo如下:
package com.aliyun.sdk.service.aimiaobi20230801;import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.sdk.gateway.pop.Configuration;
import com.aliyun.sdk.gateway.pop.auth.SignatureVersion;
import com.aliyun.sdk.service.aimiaobi20230801.models.RunSummaryGenerateRequest;
import com.aliyun.sdk.service.aimiaobi20230801.models.RunSummaryGenerateResponseBody;
import com.aliyun.sdk.service.aimiaobi20230801.models.RunWritingRequest;
import com.aliyun.sdk.service.aimiaobi20230801.models.RunWritingResponseBody;
import com.google.gson.Gson;
import darabonba.core.ResponseIterable;
import darabonba.core.ResponseIterator;
import darabonba.core.client.ClientOverrideConfiguration;import java.util.ArrayList;
import java.util.List;/*** packageName com.dayouz.lightapp** @author dayouz* @version JDK 8* @className runStyleWriting* @date 2024/8/13* @description 摘要生成Demo*/
public class RunSummaryGenerateTest {public static void main(String[] args) {StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder().accessKeyId(Constant.accessKeyId).accessKeySecret(Constant.accessKeySecret).build());AsyncClient client = AsyncClient.builder().region("cn-beijing").credentialsProvider(provider).serviceConfiguration(Configuration.create().setSignatureVersion(SignatureVersion.V3)).overrideConfiguration(ClientOverrideConfiguration.create().setProtocol("HTTPS").setEndpointOverride("aimiaobi.cn-beijing.aliyuncs.com")).build();//写作时的文体、篇幅、输出语言等控制参数List<RunWritingRequest.Tags> tags = new ArrayList<>();//构建语言tags.add(RunWritingRequest.Tags.builder().tag("language").keyword("zh-CN").build());//构建文章篇幅tags.add(RunWritingRequest.Tags.builder().tag("gcNumberSizeTag").keyword("300字").build());//构建生成文章数量tags.add(RunWritingRequest.Tags.builder().tag("gcNumber").keyword("2").build());//构建写作文体tags.add(RunWritingRequest.Tags.builder().tag("writingStyle").keyword("新闻评论").build());RunSummaryGenerateRequest request = RunSummaryGenerateRequest.builder().workspaceId(Constant.workspaceId).prompt("请为上述内容生成一段摘要,字数在100~200字以内。").content("云服务器ECS(Elastic Compute Service)是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。云服务器ECS免去了您采购IT硬件的前期准备,让您像使用水、电、天然气等公共资源一样便捷、高效地使用服务器,实现计算资源的即开即用和弹性伸缩。阿里云ECS持续提供创新型服务器,解决多种业务需求,助力您的业务发展。").build();ResponseIterable<RunSummaryGenerateResponseBody> x = client.runSummaryGenerateWithResponseIterable(request);ResponseIterator<RunSummaryGenerateResponseBody> iterator = x.iterator();while (iterator.hasNext()) {System.out.println("----event----");RunSummaryGenerateResponseBody event = iterator.next();System.out.println(new Gson().toJson(event));}System.out.println("ALL***********************");System.out.println("请求成功的请求头值:");System.out.println(x.getStatusCode());System.out.println(x.getHeaders());}
}相关文章:
【人工智能深度学习应用】妙笔API最佳实践
AI妙笔是一款以文本创作为主、多模态为辅的生成式创作大模型产品,专门为传媒、政务等特定的行业和组织提供行业化的内容创作辅助。它具备深度的行业知识,能够生成高质量的专业内容,能覆盖各行业常见的文体类型,写作文体丰富多样&a…...
SOMEIP_ETS_150: SD_Send_triggerEventUINT8Multicast_Eventgroup_6
测试目的: 验证DUT在Tester订阅事件组后,能够响应Tester触发的triggerEventUINT8Multicast方法,并将TestEventUINT8Multicast事件发送到订阅请求中端点选项指定的IP地址和端口。 描述 本测试用例旨在确保DUT能够正确处理事件组的订阅请求&…...
【EXCEL数据处理】000009 案列 EXCEL单元格数字格式。文本型数字格式和常规型数字格式的区别
前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【EXCEL数据处理】000009 案列 EXCEL单元格数字格式。文本型数字格式和…...
Vxe UI vue vxe-table vxe-text-ellipsis 如何实现单元格多行文本超出、多行文本溢出省略
Vxe UI vue vxe-table 如何实现单元格多行文本超出、多行文本溢出省略 代码 配合 vxe-text-ellipsis 组件实现多行文本溢出省略 <template><div><vxe-grid v-bind"gridOptions"><template #defaultAddress"{ row }"><vxe-te…...
FFmpeg源码:avio_feof函数分析
AVIOContext结构体和其相关的函数分析: FFmpeg源码:avio_r8、avio_rl16、avio_rl24、avio_rl32、avio_rl64函数分析 FFmpeg源码:read_packet_wrapper、fill_buffer函数分析 FFmpeg源码:avio_read函数分析 FFmpeg源码ÿ…...
各省-城镇化率(2001-2022年)
数据收集各省-城镇化率(2001-2022年).zip资源-CSDN文库https://download.csdn.net/download/2401_84585615/89465885 相关指标: 包括省份、年份、年末总人口数(万人)、年末城镇人口数(万人)、城镇化率等。 数据集构建: 数据集通…...
飞创龙门双驱XYZ直线模组高精度应用实例
飞创龙门双驱XYZ直线模组集超精密定位、高动态响应和灵活配置于一体,适用于电子制造行业(点胶、组装、检测)、半导体圆晶加工、芯片封装、激光切割、激光焊接、数控机床、精密检测及科研实验等,满足高精度、高动态的三维定位需求&…...
Prompt 初级版:构建高效对话的基础指南
Prompt 初级版:构建高效对话的基础指南 文章目录 Prompt 初级版:构建高效对话的基础指南一 “标准”提示二 角色提示三 多范例提示四 组合提示五 规范化提示 本文介绍了提示词的基础概念与不同类型,帮助用户更好地理解如何在对话中构建有效的…...
餐饮重点企业在AI领域的布局,看方大的AI实践
大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 AI已经被应用在餐饮餐厨行业的哪些方面&am…...
Axure PR 9 开关切换 设计交互
大家好,我是大明同学。 这期内容,我们来探讨Axure开关按钮设计与交互技巧。 创建切换开关所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.将“圆形”元件拖到画布上,在样式窗格中将高度和宽度设置为35,线段宽度…...
ruoyi-python 若依python版本部署及新增模块
ruoyi spring版本支持一键导出前后端代码,且b站上有很多教程,但是发现python版本的教程并不多,于是自己尝试创建一个简易的CRUD模块 1.各版本bug 主要尝试了1.1.2版本和vue2的版本,链接如下: v1.1.2 vue2 两个版本…...
【理论】负载均衡
目录 1. 定义2. 主要作用3. 实现方法4. 实现原理 1. 定义 负载均衡(Load Balancing)将网络流量、请求等输入分发到后端服务器,为后端服务器提供负载均衡,实现高可用和容错。 2. 主要作用 1. 高并发 通过将请求均匀分配到多个服务…...
流行前端框架Vue.js详细学习要点
Vue.js是一款流行的JavaScript前端框架,用于构建用户界面,特别是在构建交互式Web应用程序时表现出色。以下是Vue.js详细学习的一些要点: 1. Vue.js基础 定义与特点:Vue.js是一款渐进式JavaScript框架,提供响应式数据…...
Java.数据结构.TreeMap
一、什么是TreeMap TreeMap是Java集合框架中的一部分,并且基于红黑树数据结构。这说明TreeMap能够高效地执行键值对的存储、检索、排序等操作。 二、TreeMap的特点 有序性:TreeMap会根据键的自然顺序进行排序,当然,你也可以通过…...
什么是托管安全信息和事件管理 SIEM?
什么是 SIEM? 安全信息和事件管理 ( SIEM ) 解决方案最初是一种集中式日志聚合解决方案。SIEM 解决方案会从整个组织网络中的系统收集日志数据,使组织能够从单一集中位置监控其网络。 随着时间的推移,SIEM解决方案已发展成为一个完整的威胁…...
vscode安装及c++配置编译
1、VScode下载 VS Code官网下载地址:Visual Studio Code - Code Editing. Redefined。 2、安装中文插件 搜索chinese,点击install下载安装中文插件。 3、VS Code配置C/C开发环境 3.1、MinGW-w64下载 VS Code是一个高级的编辑器,只能用来写代…...
JavaScript使用渐变来美化对象!
我们的目标是渐变!渐变! 首先了解,渐变分为线性渐变和径向渐变,线性渐变可以是从左上角到右下角的渐变,径向渐变是从中心向外的渐变。 JavaScript中实现渐变可以使用addColorStop的方法,例如创建一个线性渐…...
Linux之实战命令24:od应用实例(五十八)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…...
【CKA】一、基于角色的访问控制-RBAC
1、基于角色的访问控制-RBAC 1. 考题内容: 2. 答题思路: 这道题就三条命令,建议直接背熟就行。 也可以查看帮助 kubectl create clusterrole -h kubectl create serviceaccount -h kubectl create rolebinding -h 注意: 1、资…...
【华为HCIP实战课程三】动态路由OSPF的NBMA环境建立邻居及排错,网络工程师
一、NBMA环境下的OSPF邻居建立问题 上节我们介绍了NBMA环境下OSPF邻居建立需要手动指定邻居,因为NBMA环境是不支持广播/组播的 上一节AR1的配置: ospf 1 peer 10.1.1.4 //手动指定邻居的接口地址,而不是RID peer 10.1.1.5 area 0.0.0.0 手动指定OSPF邻居后抓包查看OSP…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
