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

自然语言转SQL之Vanna.ai:AI集成数据库

自然语言转SQL之Vanna.ai:AI集成数据库

  • 一、Vanna.ai是什么
  • 二、落地步骤:实现三层需求
    • 2.1 官方示例看效果
    • 2.2 对接自己的数据库
    • 2.3 完全本地化之路
  • 三、构建自己的产品
    • 3.1 提问转SQL
    • 3.2 执行SQL查询
    • 实例2

要实现的功能就是:用中文语言同数据库交流,而数据库给出的结果也是自然语言。
在这里插入图片描述

一、Vanna.ai是什么

在这里插入图片描述
同数据库对话的理论依据
我们知道,自古以来,数据库就是用来存储数据的。但是想要查数据,得找个懂数据库语言的程序员进行操作。数据库语言也叫“SQL语句”。比如,要查询“有没有一个叫张三的学生”,那么SQL语句就是:“SELECT * FROM students WHERE name = ‘张三’;”。而且,你得知道数据存在哪个库里的哪张表中。很显然,这种数据库语言,并不是每个人都能掌握的。

但是(转折来啦),大语言模型的出现,让这件事变简单了。大语言模型即懂你也懂SQL,因此它可以作为一个媒介。

在这里插入图片描述

毫无悬念,这段SQL是可用的。
在这里插入图片描述

可以再次借助大语言模型,将表格数据转化为我们看得懂的语言。
在这里插入图片描述

于是乎,这个对话过程就走通了。整体流程大概是下面这个样子:
在这里插入图片描述

在这里插入图片描述

上面只是理论知识,那在项目实践上,该如何写代码呢?

在具体落地时,会面临怎么管理大语言模型的问题。比如,怎么告诉它我提问题了你该这么这么回答。怎么衔接大模型生成的SQL语句,又怎么去连接数据库查询结果。拿到结果后,又怎么让大模型给出通俗的结论。上面图中的智能系统,那些个①号坑位、②号坑位都需要有流程来管理并通信。

这一切的一切,你可以来写。但是,有比你更聪明的人已经写完了,而且还开源了。合适你就用,不合适咱就改。这个项目就是Vanna框架。

二、落地步骤:实现三层需求

vanna的官网是:vanna.ai,开源地址是:github.com/vanna-ai/vanna。

一般情况下,官网的示例会体现出两大特点:使用简单、功能强大。其目的就是告诉你它能干啥,以此吸引你使用。至于你想真正用上它,那是先爱上它再付出一番努力的后续。
安装vanna

pip install vanna

2.1 官方示例看效果

5行代码就可以构建起来一个智能对话数据库系统。

# The import statement will vary depending on your LLM and vector database. This is an example for OpenAI + ChromaDBfrom vanna.openai.openai_chat import OpenAI_Chat
from vanna.chromadb.chromadb_vector import ChromaDB_VectorStoreclass MyVanna(ChromaDB_VectorStore, OpenAI_Chat):def __init__(self, config=None):ChromaDB_VectorStore.__init__(self, config=config)OpenAI_Chat.__init__(self, config=config)vn = MyVanna(config={'api_key': 'sk-...', 'model': 'gpt-4-...'})# See the documentation for other options

注意:api_key需要从vanna.ai官网申请,免费点击一下就行。
在这里插入图片描述
官网提供个性化生成demo
https://vanna.ai/docs/mysql-ollama-chromadb/
在这里插入图片描述

pip install vanna[chromadb,ollama,mysql]

运行这5行代码,会启动一个服务,生成一个网站,默认是 localhost:8084。访问这个地址,就可以与数据库对话了:

在这里插入图片描述

效果不错。

询问“最受欢迎的3位艺术家的销量”,它生成了查询语句,列出了查询结果,还画出了柱形图。最后来了一个总结:根据销量数据,最受欢迎的3位艺术家分别是Iron Maiden(销量:140)、U2(销量:107)和Metallica(销量:91)。

等会儿……哪儿跟哪儿,怎么它就艺术家了,那些销量哪来的?数据库又在哪里?

这是个官方的例子,只求最简单,宣传5行代码搞定。它害怕让你自己部署一套服务器,因此默认了一个sqlite数据库。这个数据库可下载,地址就是代码vn.connect_to_sqlite连接的那个vanna.ai/Chinook.sqlite。

我下载这个sqlite数据库,执行它生成的语句,确实如此。
在这里插入图片描述

那它这个demo就不是故弄玄虚,其实是真的查询数据库了。只不过数据库是它提供的。

不是说它对接了大模型吗?代码里怎么没有看到?!

在这个例子中,它把大模型也封装好了。它默认采用的GPT 3.5模型。

2.2 对接自己的数据库

“我肯定要用自己的数据库!”,这是客户老孙在大山深处喊出来的。

上面我们说了,vanna是管理流程的,更换数据库对它来说,只不过是将坑位换一个参展商。
在这里插入图片描述

它支持很多种数据库,我们拿最常用的MySQL搞一搞。

我有这么一个数据库,这里面存储的是我写的文章,就相当于我的私人文库。
在这里插入图片描述

这个数据库很简单,就仨表,一个存文章信息,一个存文章评论信息,一个存文章的类型信息。

那我们就用自己的数据库替换一下。工具要为我所用才是真的有用。

关键点就是连接数据库的那一段代码:

vn.connect_to_mysql(host='localhost', dbname='article_db', user='root', password='123', port=3306)

这句代码做了指定数据库信息,它的地址,端口,叫啥名,用户名密码是多少。

连接上了,你说话就好使了吗?肯定不是!数据库是你的,大模型怎么懂?!你要告诉大模型这个表是干什么的,里面有什么东西。当然它也足够智能,可以自己去读取库里的信息。

下面这句话就可以让它自己读取,然后自己理解并训练。

info_schema = vn.run_sql("SELECT * FROM INFORMATION_SCHEMA.COLUMNS;")
plan = vn.get_training_plan_generic(info_schema)
vn.train(plan=plan)

但是,你家数据库设计的规范吗?你的字段名称起的标准吗?各类外键设置的是否正确?即便很规范,名字不是“mz”是“name”。但是特殊行业也会有自己的特色,比如“人情世故”就很难翻译成英文,还是叫“renqin_shigu”更便于理解。

这时候我们就需要告诉大模型我们的人情世故,要让它入乡随俗。

我们可以将ddl(数据描述语言)传给大模型,让它了解各个字段的含义。

vn.train(ddl="""CREATE TABLE `article_types` (`id` int(11) NOT NULL AUTO_INCREMENT,`type_name` varchar(100) NOT NULL COMMENT '文章类型名称',PRIMARY KEY (`id`),UNIQUE KEY `type_name` (`type_name`)) ENGINE=InnoDB COMMENT='存储文章类型信息';
""")

有了上面的训练,当我们问有哪些文章类型时,大模型就会知道从article_types表中去查询type_name字段。

除此之外,我们还可以约定一些个性化的需求。

vn.train(documentation="请注意,我们公司一般将1作为否,0作为是。")

一般来说,大众的认知,数值0表示否定,1表示肯定。但是我们可以通过documentation来重新改变通用模型的认知。告诉LLM在我这儿和外界是相反的,以此来符合自己的场景。

如果上面还不行。那么还有绝招。

vn.train(question="天涯何处是我家?",sql="select name from tianya")

即便你用文言文的方式询问数据库,只要你告诉大模型你的风格是这样的,那么它也会成全你。反正最终就是生成SQL呗。用外语问都行,更何况是文言文了。但是,前提是你需要打个样。因为,在此之前没人这么干过。

好了,换完了数据库,下面开始问答。

在这里插入图片描述

这就是你的私人数据助手,到这里其实已经挺有意思了。没花钱,仅凭自己有数据,就搞了个带有AI属性的东西出来。

2.3 完全本地化之路

请注意,上面的vanna已经本地化安装,MySQL也是私有库,但是大模型用的还是人家的GPT 3.5。它支持好多大模型。

在这里插入图片描述

官方推荐的是vanna内嵌的openAI。这样最方便实现,也有利于它卖货。不过它也支持其他大厂的LLM,比如谷歌的Gemini,再比如所有符合OpenAI标准API的LLM,以及其他LLM。

我们先搞一个在线版本的,再搞一个本地版本的。

如果接入一个标准的OpenAI协议的LLM,该怎么搞呢?很简单:

from vanna.openai import OpenAI_Chat
from vanna.chromadb import ChromaDB_VectorStore
from openai import OpenAI client = OpenAI(api_key="你得写你的",base_url="https://xx.cn/api/paas/v4/"
) class MyVanna(ChromaDB_VectorStore, OpenAI_Chat):def __init__(self,client=None, config=None):ChromaDB_VectorStore.__init__(self, config=config)OpenAI_Chat.__init__(self,client=client, config=config)vn = MyVanna(client=client, config={"model": "xx"})

区别看出来了吗?原来是VannaDefault,这里面人家都封装好了,内置有LLM。

vn = VannaDefault(model='x', api_key='x', config={"language":"chinese"})

但是现在你不想用它的,那需要你新建一个类指定一下用哪个。具体指定谁家的大模型,得看你手里的资源。通过MyVanna实例化出vn之后,后面连接数据库啥的都一样一样的。这就是用框架管理的好处。

除了符合这种OpenAI标准的大模型之外,其他LLM可以吗?当然可以。比如智普出的GLM4,也可以作为Vanna流程中的LLM使用。

from vanna.chromadb import ChromaDB_VectorStore
from vanna.ZhipuAI import ZhipuAI_Chatclass MyVanna(ChromaDB_VectorStore, ZhipuAI_Chat):def __init__(self, config=None):ChromaDB_VectorStore.__init__(self, config=config)ZhipuAI_Chat.__init__(self, config=config)vn = MyVanna(config={"api_key":"x","language":"chinese"})

同样,也是构建一个MyVanna,将一个ZhipuAI_Chat初始化进去。从vanna.ZhipuAI中我们发现,ZhipuAI已经内嵌到vanna中作为它的一部分了。

在这里插入图片描述

大模型的选型会对效果产生什么影响呢?

我们看同样的问题“最近10篇文章的阅读量趋势”在不同大模型中的表现。

在GLM4中是这样的:
在这里插入图片描述

在GPT 3.5中是这样的:
在这里插入图片描述

他们生成的SQL查询语句都是一样的,因此查询结果也是一样的。但是,他们后续对结果的分析,以及绘图和总结是不同的。

有细心的朋友发现了,怎么你一直没提代码里面的那个ChromaDB_VectorStore,chroma是个什么东西?

它是一个词向量数据库。Chroma词向量数据库是一个用于自然语言处理和机器学习的工具,它主要用于词嵌入,可以将单词转换为向量表示,能捕获单词之间的语义和语法关系,使得计算机能够更好地理解和处理自然语言。

总而言之,大语言模型离不开词向量的支持。vanna框架考虑到不让用户再去搭建复杂的词向量数据库,因此提供了线上默认版本。但是,咱们非要本地化部署,那么只能再安装一套词向量的数据库在本地。chroma只是其中一个选择。这也导致,我们训练完成之后,根目录下会产生一些数据文件。这里面存储的就是词向量相关的信息。就像是“为何”、“因何”、“缘何”它们其实指的是同样的意思,词向量相近。

你要是不想将词向量数据放在根目录(有人嫌乱),可以指定chroma的存储路径,在构建自定义Vanna类时传入config的path路径即可。

vn = MyVanna(config={"path":model_path, ...})

本地化大模型

我们选用清华大学的ChatGLM3做本地化部署。干完了这一票,整个数据库问答系统就完全本地化。

假设你已经搭建好了一套ChatGLM3环境。因为搭建环境部署程序这类教程太多了,我不多说了。下载项目 github.com/THUDM/ChatGLM3 ,然后最好去HuggingFace下载权重模型和bge-m3。这样会更快,下载完了保存到本地。

找到ChatGLM3下的openai_api_demo文件下的api_server.py文件。这个文件是API服务,启动了它就相当于具备了一个任意基于ChatGPT应用的后端。
在这里插入图片描述

运行之前,注意配置好模型文件路径,修改它的路径为你下载文件的真实路径。
在这里插入图片描述

调用python api_server.py就可以启动它。启动了它,就相当于你本地127.0.0.1有了一个OpenAI大模型。

于是,Vanna替换为本地LLM就像下面这么简单。

base_url = "http://127.0.0.1:8000/v1/"
client = OpenAI(api_key="EMPTY", base_url=base_url)
vn = MyVanna(client=client, config={"model": "chatglm3-6b"})

建立了vn之后,随后的连接数据库、训练数据、启动服务,代码都是一样的。这里只是一个坑位的变化。

至此,这套可以对话数据库的智能系统就建立好了。你以为这样就结束了吗?没有!不可能!

三、构建自己的产品

你觉得有自己的智能数据助手,万事大吉了吗?可以不用加班了?呵呵,被短暂的愉悦冲昏了头脑吧!

你没有界面啊,你甘心用Vanna提供的这套对话页面吗?

在这里插入图片描述

虽然它提供了很多配置:
在这里插入图片描述

auth:要使用的身份验证方法。
debug:控制是否显示调试控制台。
allow_llm_to_see_data:指示是否允许LLM查看数据。
logo:用户界面中显示的标志。默认为Vanna标志。
title:设置要在UI中显示的标题。
subtitle:设置要在UI中显示的副标题。
show_training_data:控制是否在UI中显示训练数据。
sql:控制是否在UI中显示SQL输入。
table:控制是否在UI中显示表格输出。
csv_download:指示是否允许将表格输出作为CSV文件下载。
chart:控制是否在UI中显示图表输出。
ask_results_correct:指示是否询问用户结果是否正确。
summarization:控制是否显示摘要。
……

在这里插入图片描述

但是这些依然会很难符合你的需求。听我说,我们可以调用它的接口,自己来实现界面。

通过查询VannaFlaskApp的接口,我们可以获得业务流程最多分为4步。

3.1 提问转SQL

第1步,调用api/v0/generate_sql。

此步收到用户的提问文本,调用大模型接口生成sql语句。这个接口中,经过训练的大模型会将自然语言转为sql语句。转换成功后还会返回一个业务id。这个id一直绑定后续流程直至任务结束。

3.2 执行SQL查询

第2步,调用api/v0/run_sql。

此步执行上一步生成的sql语句。执行过后,会获得查询结果。在数据库查询结果中,对于希望获得一些趋势或者走向的问题,会返回是否需要绘制图表的字段 should_generate_chart 。
在这里插入图片描述

3.3 生成图表
第3步,如果需要展示图表,那么调用 api/v0/generate_plotly_figure 生成绘制数据,绘制并保存为图片。

3.4 答案总结
第4步,根据以上数据,将结果交给大模型进行总结。如果觉得总结的不好,你也可以加上一些prompt引导,最终获得一条可阅读的结论。调用的接口是 api/v0/generate_summary 。

3.5 集成到UI
接口全都有了。从问题到数据,再到趋势图表,最后有总结答案。就看你想展示什么,自己调用就可以了。

对于带图表的情况,也可以正常展示。

实例2

docker pull marqoai/marqo:latest
docker run --name marqo -it -p 8882:8882 marqoai/marqo:latest

未完待续

相关文章:

自然语言转SQL之Vanna.ai:AI集成数据库

自然语言转SQL之Vanna.ai:AI集成数据库 一、Vanna.ai是什么二、落地步骤:实现三层需求2.1 官方示例看效果2.2 对接自己的数据库2.3 完全本地化之路 三、构建自己的产品3.1 提问转SQL3.2 执行SQL查询实例2 要实现的功能就是:用中文语言同数据库…...

【零基础到精通Java合集】第二十二集:CMS收集器详解(低延迟的里程碑)

课程标题:CMS收集器详解——低延迟垃圾回收的经典实现(15分钟) 目标:掌握CMS核心工作原理、适用场景与调优策略,理解其在高并发场景下的价值与局限性 0-1分钟:课程引入与CMS设计目标 以“高速公路不停车收费”类比CMS核心思想:在用户线程运行的同时并发回收垃圾,最大…...

2025-03-04 学习记录--C/C++-PTA 习题5-5 使用函数统计指定数字的个数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 二、代码&#xff08;C语言&#xff09;⭐️ #include <stdio.h>int CountDigit( int number, int di…...

SP导入模型设置

法线贴图格式 Blender,Unity选择OpenGL UE,3DMax选择DirectX...

计算机网络——IP地址

一、IP地址是什么&#xff1f; 定义 IP地址是互联网协议&#xff08;Internet Protocol&#xff09;为每台联网设备分配的唯一标识符&#xff0c;由一串数字&#xff08;IPv4&#xff09;或字母与数字组合&#xff08;IPv6&#xff09;构成。 核心作用&#xff1a;定位设备位置…...

openharmony 软总线-设备发现流程

6.1 设备发现流程 6.1.1 Wi-Fi设备发现 6.1.1.1 Wi-Fi设备发现流程 Wi-Fi设备在出厂状态或者恢复出厂状态下&#xff0c;设备上电默认开启SoftAP模式&#xff0c;SoftAP的工作信道在1&#xff0c;6&#xff0c;11中随机选择&#xff0c;SoftAP的Beacon消息中携带的SSID eleme…...

零信任架构和传统网络安全模式的

零信任到底是一个什么类型的模型&#xff1f;什么类型的思想或思路&#xff0c;它是如何实现的&#xff0c;我们要做零信任&#xff0c;需要考虑哪些问题&#xff1f; 零信任最早是约翰金德瓦格提出的安全模型。早期这个模型也是因为在安全研究上考虑的一个新的信任式模型。他最…...

TCP/IP四层模型:从入门到精通

第一部分&#xff1a;基础概念 1.1 什么是TCP/IP&#xff1f; - TCP/IP 是互联网的基础通信协议簇&#xff0c;定义了数据如何在网络中传输和路由。 - 与OSI七层模型的对比&#xff1a;TCP/IP更简化&#xff0c;分为四层&#xff0c;注重实际应用。 1.2 四层模型结构 1. 应…...

二、QT和驱动模块实现智能家居-----问题汇总1

1、文件地址改变后必须在QT下更改地址 2、指定了QT内Kits下的Sysroot头文件地址&#xff0c;但是还是找不到头文件&#xff1a; 3、提示无法执行QT程序&#xff1a;先干掉之前的QT程序 ps //查看程序PIDkill -9 PID 4、无法执行QT程序 1&#xff09;未设置环境变量 …...

10、HTTP/3有了解过吗?【中高频】

HTTP/2 虽然具有多个流并发传输的能力&#xff0c;但是传输层是 TCP 协议&#xff0c;依然存在缺陷&#xff1a; 队头阻塞&#xff0c;HTTP/2 是基于 TCP 协议来传输数据的&#xff0c;TCP 是字节流协议&#xff0c;TCP 层必须保证收到的字节数据是完整、连续的&#xff0c;当「…...

基于https虚拟主机配置

一、https介绍 http 明文&#xff0c;80/tcp https 密文&#xff0c;443/tcp 二、安全性保障 1、数据安全性 数据加密 2、数据完整性 3、验证身份的真实性、有效性 三、数据安全性 手段&#xff1a;加密 发送方加密数据&#xff0c;接收方解密数据 对称加密算法 加密、解密数据…...

小白入坑向:Java 全栈系统性学习推荐路线之一

文章目录 一、 引言1.1 学习路径&#xff1a;1.2 技术栈全景概述1.3 前沿技术与趋势预判 二、 前端篇2.1 基础知识2.2 进阶技术2.3 前端框架与工具 三、 后端篇3.1 Java 基础3.2 进阶与新特性 四、 企业级框架与开发工具4.1 构建与项目管理4.2 核心框架4.3 数据持久层4.4 微服务…...

云原生存储架构:构建数据永续的新一代存储基础设施

引言&#xff1a;重新定义数据基础设施边界 蚂蚁集团基于Ceph构建的全闪存存储集群达到EB级规模&#xff0c;单集群IOPS突破1亿&#xff0c;延迟稳定在200μs内。Snowflake的存储计算分离架构使其数据湖查询速度提升14倍&#xff0c;存储成本降低82%。Gartner预测到2025年70%企…...

QTableWidget之表格列的隐藏与显示(折叠)

今天晚上花点时间研究一下表格列的显隐问题&#xff08;类似与excel的隐藏列功能&#xff09;&#xff0c;在网络上搜罗了一通资料&#xff0c;没现成的例子作为借鉴&#xff0c;只能自己研究编写了。现在将过程记录下来&#xff0c;以便日后翻阅。 首先声明&#xff1a;因为时…...

Leetcode3146. 两个字符串的排列差

题目描述&#xff1a; 给你两个字符串 s 和 t&#xff0c;每个字符串中的字符都不重复&#xff0c;且 t 是 s 的一个排列。 排列差 定义为 s 和 t 中每个字符在两个字符串中位置的绝对差值之和。 返回 s 和 t 之间的 排列差 。 代码思路&#xff1a; 建立字符位置映射&…...

二百八十五、华为云PostgreSQL——建分区表并设置主键

一、目的 在PostgreSQL里建表&#xff0c;设置主键&#xff0c;三个字段确认数据的唯一性。设置分区字段&#xff0c;按月分区 二、PostgreSQL版本 三、PostgreSQL 9.2.4 版本缺点 在 PostgreSQL 9.2.4 中&#xff0c;虽然你可以创建分区表&#xff0c;但需要注意的是&#…...

系统架构设计师-第3章 数据库设计

【本章学习建议】 根据考试大纲&#xff0c;本章主要考查系统架构设计师单选题&#xff0c;预计考5分左右&#xff0c;以及案例分析1题&#xff0c;25分。对应第二版教材2.3.3小节以及第6章&#xff0c;主要考点在第6章&#xff0c;这里一起合并到本章课程中。 3.1 数据库基本…...

SAP MDG —— MDG on S/4HANA 2023 FPS03 创新汇总

文章目录 MDG 基于SAP S/4HANA 2023 FPS03的创新BP/C/S&#xff1a;消息控制BP/C/S&#xff1a;手工分配数据控制者MDG-F&#xff1a;使用S/4扩展数据校验功能生成式AI可用于协助自定义对象的数据变更/同时可总结批量变更的内容 MDG 基于SAP S/4HANA 2023 FPS03的创新 由于从S…...

软考中级-数据库-3.2 数据结构-数组和矩阵

数组 一维数组是长度固定的线性表&#xff0c;数组中的每个数据元素类型相同。n维数组是定长线性表在维数上的扩张&#xff0c;即线性表中的元素又是一个线性表。 例如一维数组a[5][a1,a2,a3,a4,a5] 二维数组a[2][3]是一个2行2列的数组 第一行[a11,a12,a13] 第二行[a21,a22,a23…...

有符号数和无符号数的加减运算

一、无符号数的加减运算 加法 规则&#xff1a;直接按二进制逐位相加&#xff0c;若最高位产生进位&#xff08;即结果超出(2^n)范围&#xff09;&#xff0c;则结果对(2^n)取模&#xff08;(n)为位数&#xff09;。示例&#xff08;8位无符号数&#xff09;&#xff1a; (200 …...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…...