向量数据库技术系列四-FAISS介绍
一、前言
FAISS(Facebook AI Similarity Search)是由Facebook AI Research开发的一个开源库,主要用于高效地进行大规模相似性搜索和聚类操作。主要功能如下:
-
向量索引与搜索:FAISS提供了多种索引和搜索向量的方法,包括暴力搜索(Flat)、倒排索引(IVF)、分层可导航小世界图(HNSW)和乘积量化(PQ)等。这些方法可以根据应用场景在速度、准确性和内存使用之间进行权衡。
-
支持多种距离度量:FAISS支持多种距离度量方式,如L2距离(欧几里得距离)、余弦相似度和内积(点积),适用于不同的应用场景。
-
CPU和GPU支持:FAISS能够利用CPU和GPU加速索引和搜索过程,在大规模数据集上表现出色,尤其适合需要实时搜索的场景。
具有以下的特点:
-
高效性:FAISS针对大规模数据集进行了优化,能够快速处理数十亿向量。
-
可扩展性:FAISS设计用于处理大规模数据集,能够有效管理数十亿向量。
-
灵活性:FAISS允许用户根据应用需求调整索引和搜索参数,并且可以动态添加、更新和删除向量。
-
开源性:作为开源库,FAISS提供了广泛的定制化和集成能力。
二、基本操作
1、安装版本
faiss分为cpu和gpu两个版本,一般情况下,安装cpu版本就够用了。
# 安装CPU版本
pip install faiss-cpu# 安装GPU版本(需要CUDA支持)
pip install faiss-gpu
2、导入库并设置基本参数
import faiss
import numpy as np # 〇,基本参数设置
d = 64 # 向量维度
nb = 100000 # index向量库的数据量
nq = 1000 # 待检索query的数目
index_type = 'Flat' # index 类型
metric_type = faiss.METRIC_INNER_PRODUCT # 度量(相似度/距离)类型
引入numpy库是为了后续构造多维数组数据。我们先定义向量索引的主要参数,其说明如下:
- d(dimension),待构造向量的维度
- nb,待构造的向量库中的数据量。
- nq,待构造的检索向量的数据量。
- index_type,索引的类型,索引类型有很多种,可以参考这篇文章(Faiss(4):索引(Index)_faiss index-CSDN博客),主要类型如下:
1、Flat(暴力检索),该方法是Faiss所有index中最准确的,召回率最高的方法,但速度慢,占内存大,一般用于小于50万数据,且内存不紧张的场景中。
2、IVFx Flat(倒排暴力检索),通过倒排的思想,先聚类中心,通过减少搜索范围,提升搜索效率,相比Flat其速度大大提升,建议百万级向量可以使用。IVFx中的x是k-means聚类中心的个数,比如"IVF100,Flat"。
3、PQx(乘积量化),将一个向量的维度切成x段,进行检索在取交集,得出最后的Top-K,其速度很快,而且占用内存较小,召回率也相对较高。适用于内存及其稀缺,并且需要较快的检索速度,不那么在意召回率。Qx中的x为将向量切分的段数,如"PQ16"。
4、LSH(局部敏感哈希),局部敏感哈希依赖碰撞来进行分桶和聚类,聚类较近的归属同一个桶的概率很大。其index占内存很小,检索也比较快,但是召回率非常拉垮,适用于候选向量库非常大,离线检索,内存资源比较稀缺的情况。
5、HNSWx(分层导航),这是一种基于图检索的改进方法,检索速度极快,10亿级别秒出检索结果,召回率也非常惊人,但是内存占用极大,适用于于不在乎内存,并且有充裕的时间来构建index。HNSWx中的x为构建图时每个点最多连接多少个节点。
这里我们为了演示,选用简单的Flat模式。
- metric_type,相似度距离,主要有METRIC_L2(欧几里得距离,L2距离),METRIC_INNER_PRODUCT(余弦相似度)。这里我们选用余弦相似度。
3、准备向量数据构建库索引
由于FAISS没有默认的向量化模型,我们暂且直接使用向量数据来构建。首先使用numpy库创建向量数据。
# 一,准备向量库向量
print('============================== 1,base vector ==============================')
np.random.seed(1234) #设置种子
xb = np.random.random((nb, d)).astype('float32') #生成nb行,d列的数组,并转为float32类型
xb[:, 0] += np.arange(nb) / 1000. # 第一列添加唯一的偏移量
faiss.normalize_L2(xb) #对向量进行L2归一化
print('xb.shape = ',xb.shape,'\n')#============================== 1,base vector ==============================
#xb.shape = (100000, 64)
这里准备了100000行64维的向量数据。接下来就添加到库中,并构建索引。
# 二,构建向量库索引
print('============================== 2,create&train ==============================')
index = faiss.index_factory(d,index_type,metric_type) #通过ndex_factory构建索引,等价于 faiss.IndexFlatIP(d)
print('index.is_trained=',index.is_trained) # 输出为True,代表该类index不需要训练,只需要add向量进去即可
index.train(xb)
index.add(xb) # 将向量库中的向量加入到index中
print('index.ntotal=',index.ntotal,'\n') # 输出index中包含的向量总数,为100000 #============================== 2,create&train ==============================
#index.is_trained= True
#index.ntotal= 100000
4、准备查询向量数据并向量检索
有了数据后,就可以检索。这里准备10000行待检索的向量数据。
# 三,准备查询向量
print('============================== 3,query vector ==============================')
xq = np.random.random((nq, d)).astype('float32') #准备nq行,d维的查询向量数组
xq[:, 0] += np.arange(nq) / 1000. # 待检索的query向量
faiss.normalize_L2(xq)
print('xq.shape = ',xq.shape,'\n')
检索并返回前5个向量的最相似结果。
# 四,相似向量查询
print('============================== 4, search ==============================')
k = 4 # topK的K值
D, I = index.search(xq, k) # xq为待检索向量,返回的I为每个待检索query最相似TopK的索引list,D为其对应的距离print('nearest vector ids:\n',I[:5],'\n')
print('metric(distances/scores) to query:\n',D[-5:],'\n')#============================== 4, search ==============================
#nearest vector ids:
# [[ 207 381 1394 1019]
# [ 300 911 142 526]
# [ 838 1541 527 148]
# [ 196 359 184 466]
# [ 526 120 917 765]]#metric(distances/scores) to query:
# [[0.87687665 0.86128217 0.85667735 0.85451 ]
# [0.870294 0.8666884 0.8593493 0.852314 ]
# [0.86291504 0.8580746 0.8538497 0.84994483]
# [0.86920005 0.8660047 0.8647547 0.8634623 ]
# [0.85396254 0.8491496 0.84744585 0.8432566 ]]
5、新增和删除索引向量
对于现有的向量数据,可以通过add和remove_ids指令进行新增和删除。
# 五,增删索引向量
print('============================== 5, add&remove ==============================')
xa = np.random.random((10000, d)).astype('float32') #新增10000行
xa[:, 0] += np.arange(len(xa)) / 1000.
faiss.normalize_L2(xa)
index.add(xa)
print('after add, index.ntotal=',index.ntotal)
index.remove_ids(np.arange(1000,1111)) #删除1000-1111的向量
print('after remove, index.ntotal=',index.ntotal,'\n') #============================== 5, add&remove ==============================
#after add, index.ntotal= 110000
#after remove, index.ntotal= 109889
6、保存并加载索引
以上创建好的索引可以持久化保存到本地,并重新读取继续操作。
# 六,保存加载索引
print('============================== 6, write&read ==============================')
faiss.write_index(index, "large.index")
index_loaded = faiss.read_index('large.index')
print('index_loaded.ntotal=', index_loaded.ntotal)
三、案例实践
接下来,我们将一些短语,通过嵌入式模型向量化后,再通过FAISS进行检索。其输入和输出短语与上一篇一样。
首先安装sentence_transformers库,使用它加载预训练嵌入式模型,
pip install sentence_transformers
嵌入式模型使用all-MiniLM-L6-v2,与上篇保持一致。如果本地没有该模型,会自动从hungface上下载,如果网络的原因,要使用其国内的镜像。
import os
#使用hf的国内镜像,设置为环境变量
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'from sentence_transformers import SentenceTransformer
import faiss
import numpy as np# 加载预训练模型,使用ll-MiniLM-L6-v2最为embedding模型
model = SentenceTransformer("all-MiniLM-L6-v2")
对待加载以及待检索的短语进行向量化
# 待加载的短语
corpus = ["海内存知己,天涯若比邻","大漠孤烟直,长河落日圆","春眠不觉晓,处处闻啼鸟","会当凌绝顶,一览众山小","海上生明月,天涯共此时","举头望明月,低头思故乡","山重水复疑无路,柳暗花明又一村","不识庐山真面目,只缘身在此山中","采菊东篱下,悠然见南山","谁言寸草心,报得三春晖","忽如一夜春风来,千树万树梨花开","落霞与孤鹜齐飞,秋水共长天一色","青山遮不住,毕竟东流去","春江潮水连海平,海上明月共潮生","两岸猿声啼不住,轻舟已过万重山","问渠那得清如许?为有源头活水来","竹外桃花三两枝,春江水暖鸭先知","身无彩凤双飞翼,心有灵犀一点通","众里寻他千百度,蓦然回首,那人却在,灯火阑珊处","莫愁前路无知己,天下谁人不识君"
]
# 通过embedding模型将短语向量化
corpus_embeddings = model.encode(corpus)# 待查询短语
query = "明月几时有,把酒问青天"
# 通过embedding模型将查询短语向量化
query_embedding = model.encode([query])
初始化faiss索引,并将短句的向量数据添加到索引中
# 初始化 Faiss 索引
dimension = corpus_embeddings.shape[1] # 向量维度
print("dimension:", dimension)
index = faiss.IndexFlatL2(dimension) # 使用 L2 距离
index.add(corpus_embeddings) # 添加语料库向量到索引
检索待查询语句的相似语句,并返回前top5
# 检索与查询向量最接近的前 k 个结果
k = 5 # 返回前 5 个最相似的结果
distances, indices = index.search(query_embedding, k)# 打印检索结果
print("Query:", query)
print("Top K Results:")
for i, idx in enumerate(indices[0]):print(f"Rank {i+1}: {corpus[idx]} (Distance: {distances[0][i]:.4f})")
打印的结果如下:
Query: 明月几时有,把酒问青天
Top K Results:
Rank 1: 举头望明月,低头思故乡 (Distance: 0.4828)
Rank 2: 海上生明月,天涯共此时 (Distance: 0.5092)
Rank 3: 青山遮不住,毕竟东流去 (Distance: 0.5768)
Rank 4: 海内存知己,天涯若比邻 (Distance: 0.5937)
Rank 5: 莫愁前路无知己,天下谁人不识君 (Distance: 0.5976)
可以看到与前一篇的结果一致。
四、总结
本文介绍了FAISS的基本用法,并通过案例实践,演示了嵌入向量,创建索引以及检索的过程。
附件
向量数据库技术系列一-基本原理
向量数据库技术系列二-Milvus介绍
向量数据库技术系列三-Chroma介绍
向量数据库技术系列四-FAISS介绍
向量数据库技术系列五-Weaviate介绍
相关文章:
向量数据库技术系列四-FAISS介绍
一、前言 FAISS(Facebook AI Similarity Search)是由Facebook AI Research开发的一个开源库,主要用于高效地进行大规模相似性搜索和聚类操作。主要功能如下: 向量索引与搜索:FAISS提供了多种索引和搜索向量的方法&…...
【网络安全 | 漏洞挖掘】价值14981$的Google点击劫持漏洞
未经许可,不得转载。 文章目录 点击劫持前言漏洞1攻击场景漏洞2攻击场景漏洞3攻击场景漏洞4攻击场景漏洞5攻击场景漏洞6攻击场景点击劫持 点击劫持是一种恶意的用户界面攻击技术,也被称为 “UI 覆盖攻击” 或 “透明劫持”。 攻击者通过创建一个看似正常的网页,并在其中嵌…...
CMake 保姆级教程
CMake 是一个跨平台的构建工具,用于生成适合不同平台和编译器的构建系统文件(如 Makefile 或 Visual Studio 项目文件)。 在 Windows 下使用 CMake 构建项目时,CMake 会根据 CMakeLists.txt 文件生成适合 Windows 的构建系统文件&…...
IntelliJ IDEA 2023.3.1安装指南从下载到配置的完整教程(附资源下载)
安装 IntelliJ IDEA 2023.3.1 非常简单,以下是详细的安装步骤,适用于 Windows、macOS 和 Linux 系统。 1. 下载 IntelliJ IDEA IntelliJ IDEA下载链接:https://pan.quark.cn/s/3ad975664934 选择适合你的操作系统的版本: Ultimat…...
springboot树形结构 支持模糊查询,返回匹配节点和父节点,其他节点不返回
package com.me.meterdemo.ds; import java.util.ArrayList; import java.util.List;public class TreeNode {private Long id;private String name;private Long parentId;private List<TreeNode> children new ArrayList<>();// 构造方法public TreeNode(Long i…...
linux 命令 touch
Linux 的 touch 命令主要用于 创建空文件 或 修改文件的时间戳(访问时间、修改时间)。以下是其核心用法和实用示例: 基本语法 touch [选项] 文件名... 核心功能 1. 创建空文件 如果文件不存在,则创建空文件;如果存在…...
3.14-1列表
列表 一.列表的介绍和定义 1 .列表 类型: <class list> 2.符号:[] 3.定义列表: 方式1:[] 通过[] 来定义 list[1,2,3,4,6] print(type(list)) #<class list> 方式2: 通过list 转换 str2"12345" print(type(str2)) #<class str> list2lis…...
完整的模型验证套路
模型验证 0. 写在前面 经过之前的代码编写,我们已经建立了一套模型,下面就开始对我们编写的模型进行验证。 代码:代码链接 1. 验证模型 我们首先运行代码(epoch 20)得到结果如下: Files already down…...
python2和python3的区别
python2和python3的区别 核心区别Python 2 示例Python 3 示例通俗解释专业术语1. 打印方式print "Hello"print("Hello")Python 3必须加括号,像“按钮操作”;Python 2像“直接喊话”。print从语句变为函数,支…...
【时时三省】(C语言基础)用printf函数输出数据3
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 ( 5 ) e格式符。 用格式声明%e指定以指数形式输出实数。如果不指定输出数据所占的宽度和数字部分的小数位数,许多C编译系统(如VisualC)会自动给出数字部分…...
【差分约束】 P3275 [SCOI2011] 糖果|省选-
本文涉及知识点 差分约束 P3275 [SCOI2011] 糖果 题目描述 幼儿园里有 N N N 个小朋友, lxhgww \text{lxhgww} lxhgww 老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。但是小朋友们也有嫉妒心,总是会提出一些要求&…...
找第一个只出现一次的字符(信息学奥塞一本通-1130)
【题目描述】 给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。 【输入】 一个字符串,长度小于100000。 【输出】 输出第一个仅出现一次的字符,若没有则输出no。 【输入样例】 abcabd 【输出样…...
【MySQL】多表操作 —— 外键约束
目录 多表关系一对一关系一对多/多对一关系多对多关系 外键约束基本概念一对多/多对一创建外键约束外键约束下的数据操作数据插入数据删除 删除外键约束 多对多创建外键约束外键约束下的数据操作数据插入数据删除 删除外键约束 多表关系 MySQL 多表之间的关系可以概括为&#…...
自己动手打造AI Agent:基于DeepSeek-R1+websearch从零构建自己的Manus深度探索智能体AI-Research
第一章:AI Agent基础与DeepSeek-R1架构解析(1/10) 1.1 AI Agent技术演进与核心价值 人工智能代理(AI Agent)经历了从规则驱动到数据驱动的范式转移。早期基于专家系统的符号主义方法(如MYCIN医疗诊断系统…...
SpringSecurity配置(校验数据库用户信息)
文末有本篇文章的项目源码文件可供下载学习 通过SpringSecurity快速入门案例我们已经实现了基于内存的校验用户信息,但在实际项目中我们需要校验从数据库中获取的用户信息,这里我们主要是两步操作: 1.需要我们实现UserDetailsService的loadUserByUsername方法,在方法中以前端…...
中考语文的考点及相应的解题技巧
1 考点分布 1.1 作文(60 分左右) 考点:立意、选材、结构、语言表达等。要求立意深刻、新颖,选材真实、典型,结构清晰、完整,语言流畅、生动。 解题技巧:认真审题,理解题目要求和限…...
PackageManagerService
首语 PackageManagerService(以下简称PMS)是Android最核心的系统服务之一,它是应用程序包管理服务,管理手机上所有的应用程序,包括应用程序的安装、卸载、更新、应用信息的查询、应用程序的禁用和启用等。 职责 在Android系统启动过程中扫…...
基于大模型的智能客服搭建
引言:智能客服的范式转变 在数字经济浪潮中,客户服务正经历从"人力密集型"向"技术驱动型"的深刻转型。据IDC最新报告,全球智能客服市场规模预计将在2028年突破1200亿美元,年复合增长率达28.6%。这种增长背后…...
Vagrant+VMWare 安装Ubuntu24.04
背景介绍 对于众多 Windows 用户来说, 有时候需要用到 Linux 环境做一些开发或者测试. WSL 目前能覆盖到很大一部分使用场景, 但是仍然有一些场景需要用虚拟机才能解决. 开发者的痛点往往是对于虚拟机环境的配置和管理, 因为手动安装需要很长的时间, 并且每次安装完成之后需要…...
数字化转型 - 数据驱动
数字化转型 一、 数据驱动1.1 监控1.2 分析1.3 挖掘1.4 赋能 二、数据驱动案例2.1 能源工业互联网:绿色节能的数字化路径2.2 光伏产业的数字化升级2.3 数据中心的绿色转型2.4云迁移的质效优化2.5 企业数字化运营的实践2.6数字化转型的最佳实践 一、 数据驱动 从数…...
【软考-架构】11.3、设计模式-新
✨资料&文章更新✨ GitHub地址:https://github.com/tyronczt/system_architect 文章目录 项目中的应用设计模式创建型设计模式结构型设计模式行为型设计模式 💯考试真题题外话 项目中的应用 在实际项目中,我应用过多种设计模式来解决不同…...
leetcode0031 下一个排列-medium
1 题目: 下一个排列 官方标定难度:中等 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如,arr [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一…...
CmBacktrace的cmb_cfg.h
一:宏定义解析 #ifndef _CMB_CFG_H_ #define _CMB_CFG_H_#ifdef CMB_USER_CFG #include "cmb_user_cfg.h" #else /* print line, must config by user */ #define cmb_println(...) /* e.g., printf(__VA_ARGS__);printf("\r\n"…...
Redis监控:从睁眼瞎到千里眼的进化史
各位在Redis迷雾中摸黑的探险家们!今天我们要给Redis装上"天眼系统"——从连自己内存爆了都不知道的睁眼瞎,进化到连每秒哪个键被摸了几次都门儿清的监控狂魔!准备好迎接《Redisの楚门世界》了吗?👁️ 第一幕…...
mac利用“自动操作”扩展添加 Mac 访达右键菜单项
用惯了 Windows 的资源管理器,换到 Mac 的访达,最不习惯的就是不能通过右键菜单创建文件。 虽然 Mac 的 App Store 中有几个可以增加访达右键菜单的工具,但是居然都要收费(就这么一点点活都能卖钱,真是了不起…...
算法013——水果成篮
水果成篮(点击即可跳转) 这道题其实就是找到一个最长的子数组的长度,子数组中不超过两种类型的水果。 定义两个指针 left 与 right ,固定 left , 当 right 走到一个位置时,left 与 right 之间的种类 kind 2 , 当 ri…...
TCP/IP协议栈----通俗易懂(与OSI七层模型区别)
目录 一、概念 二、模型 对比 编辑(1)OSI的七层模型 (2)TCP/IP的四层模型 三、TCP/IP模型分层 (1)应用层 (2)传输层 (3)网络层 (4&…...
python中print函数的flush如何使用
在 Python 中,print 函数的 flush 参数是一个布尔值,默认值为 False。当设置为 True 时,它会强制将输出缓冲区的内容立即刷新到目标设备(通常是控制台),而不是等待缓冲区满或者程序结束时才输出。 要注意fl…...
python中有几种作用域
在 Python 中,作用域决定了变量的可见性和生命周期。Python 主要有以下四种作用域: 1. 局部作用域(Local Scope): - 在函数或方法内部定义的变量属于局部作用域。 - 这些变量只能在函数或方法内部访问。 def my_f…...
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_13可展开行的固定表头表格
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_13可展开行的固…...
【Java 优选算法】分治 - 快速排序
欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 分治算法就是将一个问题划分为多个相同类型的子问题,解决这些子问题即解决该类问题 颜色分类 题目链接 解法 利用三指针, i, left, right,将数组分为4个区间,如下图 …...
Kafka相关的面试题
以下是150道Kafka相关的面试题及简洁回答: Kafka基础概念 1. 什么是Kafka? Kafka是一个分布式、可扩展、容错的发布-订阅消息系统,最初由LinkedIn开发,现为Apache项目。它适用于高吞吐量的场景,如大数据处理和实时数据…...
Java基础面经
Java 基础 面试官:重写与重载的区别? 重载:发生在同一个类中,若多个方法之间方法名相同、参数列表不同,则它们构成重载的关系。重载与方法的返回值以及访问修饰符无关,即重载的方法不能根据返回类型进行…...
Let’s Build AI- 实用AI导航网站
Let’s Build AI Let’s Build AI是一个在线实用AI导航网站,由社区驱动的平台,致力于为 AI 爱好者和开发人员共享资源、工具和知识等等,通过GitHub编辑内容更新,目前包括数据库、模型、开发者工具、ChatGPT提示、图像生成、模型开…...
Spring Boot集成EasyExcel
1. 初始化Spring Boot项目 首先,使用Spring Initializr(https://start.spring.io/)生成一个基本的Spring Boot项目。选择以下依赖项: Spring WebLombok (用于减少样板代码)SLF4J (用于日志记录) 2. 添加依赖 在你的pom.xml文件…...
2024年12月CCF-GESP编程能力等级认证C++编程六级真题解析
CCF-GESP C++六级真题难度与考察范围深度解析 考试定位与整体难度 CCF-GESP C++六级认证属于高阶编程能力考核,难度显著高于五级,接近信息学竞赛提高组水平,重点考察复杂算法设计、面向对象编程(OOP)深度应用及高级数据结构实现能力。试题要求考生具备将数学建模与算法优化…...
网络VLAN技术详解:原理、类型与实战配置
网络VLAN技术详解:原理、类型与实战配置 1. 什么是VLAN? VLAN(Virtual Local Area Network,虚拟局域网) 是一种通过逻辑划分而非物理连接隔离网络设备的技术。它允许管理员将同一物理网络中的设备划分为多个独立的广播…...
深入探讨RAID 5的性能与容错能力:实验与分析(磁盘阵列)
前言—— 本实验旨在探讨 RAID 5 的性能和容错能力。通过创建 RAID 5 阵列并进行一系列读写性能测试及故障模拟,我们将观察 RAID 5 在数据冗余和故障恢复方面的表现,以验证其在实际应用中的可靠性和效率。 首先说明:最少三块硬盘, 使用 4 块…...
如何让ai问答机器人通人性?
领域专用的问答机器人,数据是灵魂。通用模型的问题在于,它们虽然知识广博,但对特定领域的深度理解不足。解决这个问题的第一步,就是构建一个高质量的领域知识库。 数据要精准且全面 想让机器人真正“懂”一个领域,数…...
最新版Chrome浏览器加载ActiveX控件技术--allWebPlugin中间件一键部署浏览器扩展
allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品,致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器,实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…...
重生之我在学Vue--第11天 Vue 3 高级特性
重生之我在学Vue–第11天 Vue 3 高级特性 文章目录 重生之我在学Vue--第11天 Vue 3 高级特性前言一、Teleport:打破组件层级的瞬移术1. 什么是Teleport?2. 核心用法3. 实战技巧 二、Suspense:异步组件的优雅过渡1. 为什么需要Suspense&#x…...
汽车无钥匙启动系统不使用传统机械钥匙启动汽车
汽车无钥匙启动系统 定义 汽车无钥匙启动系统(Keyless Start System),启动车辆时不用掏拧钥匙,只需把钥匙放在包内或口袋里,按下车内按键或拧动导板即可使发动机点火。它无需插入钥匙,通过点按按键或旋转…...
平安养老险深圳分公司积极开展2025年“3·15”金融消费者权益保护教育宣传活动
为深刻把握金融工作的政治性、人民性,帮助社会公众增强维护自身合法权益的意识和能力,平安养老险深圳分公司在2025年3月7日至3月15日期间,以“保障金融权益,助力美好生活”为口号,聚焦“维护权益”主题,全面…...
python 实现 A* 算法
A*算法是一种广泛使用的路径搜索算法,结合了启发式搜索和Dijkstra算法的优点。它通过评估每个节点的代价函数 ( f(n) g(n) h(n) ) 来选择最优路径,其中: ( g(n) ) 是从起点到当前节点的实际代价。( h(n) ) 是从当前节点到目标节点的启发式…...
MyBatis 如何创建 SqlSession 对象的?
MyBatis 创建 SqlSession 对象的过程主要由 SqlSessionFactory 接口及其实现类来完成。以下是详细步骤: 1. SqlSessionFactory 接口: SqlSessionFactory 是 MyBatis 的核心接口之一,它负责创建 SqlSession 对象。 你可以将 SqlSessionFactory 视为 Sql…...
微服务》》四个问题
客户端如何访问 API 网关 如 Core中 Ocelot技术 服务如何治理 服务注册与发现 如 Core中 的 consul技术 服务挂了怎么办 可以利用 重试机制、限流、熔断、降级等 服务之间通信问题 》》同步 1. Http 对外 跨防火墙 【 序列化、反序列化 2 ( 因为http是应用层…...
CockroachDB MCP -cursor适用
CockroachDB MCP 服务器 GitHub仓库置顶 这是一个用于 Cursor 的 CockroachDB MCP 服务器,基于 Model Context Protocol (MCP) 规范实现,可以让你在 Cursor 中直接与 CockroachDB 数据库交互。 功能 连接到 CockroachDB 数据库获取数据库中的所有表获…...
GOC学习
for(int i1;i<5;i){//这里的所有语句都会被执行 5 次 } int main(){pen.a(200,16,1,0).a(200,-16,1,0);pen.rt(16).fd(200).bk(200);pen.lt(32).fd(200).bk(200);///pen.rt(-32).fd(200).bk(200);for(int i1;i<5;i){pen.a(200,16,1,0).a(200,-16,1,0);pen.rt(16).fd(200)…...
【机器学习】基于t-SNE的MNIST数据集可视化探索
一、前言 在机器学习和数据科学领域,高维数据的可视化是一个极具挑战但又至关重要的问题。高维数据难以直观地理解和分析,而有效的可视化方法能够帮助我们发现数据中的潜在结构、模式和关系。本文以经典的MNIST手写数字数据集为例,探讨如何利…...
Vscode工具开发Vue+ts项目时vue文件ts语法报错-红波浪线等
Vscode工具开发Vuets项目时vue文件ts语法报错-红波浪线等 解决方案 问题如题描述,主要原因是开发工具使用的代码检查与项目的中的ts不一致导导致,解决办法,修改 vscode 中, 快捷键:command shift p, 输入ÿ…...