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

向量数据库FAISS之四:向量检索和 FAISS

来自 YouTube

1.相似度搜索的传统方法(Jaccard, w-shingling, Levenshtein)

1.Jaccard 距离

  1. 公式

    Jaccard ( A , B ) = 1 − ∣ A ∩ B ∣ ∣ A ∪ B ∣ \text{Jaccard}(A, B) = 1 - \frac{|A \cap B|}{|A \cup B|} Jaccard(A,B)=1ABAB

    其中, A 和 B 是两个集合。Jaccard 距离用于衡量两个集合的相似性,值在 0 到 1 之间,0 表示完全相同,1 表示完全不同。

  2. 使用场景

    • 文本比较:计算两个文档中词汇的相似度。
    • 聚类:用于计算文档、图像等对象的相似性。

2.w-shingling

  1. 定义

    w-shingling是一种将文本划分为重叠子字符串(或n-grams)的方法,w 代表子字符串的长度。

    例如,对于字符串 “abcde” 和 w = 3 ,可以得到 shingle 集合 {abc, bcd, cde}。

  2. 使用场景

    • 通常结合 Jaccard 相似度衡量不同的文本相似性
    • 文本相似度:通过生成w-shingles,然后计算Jaccard相似度来判断文本的相似度。
    • 近似重复文档检测。

3.Levenshtein 距离(编辑距离)

  1. 定义

    Levenshtein距离计算两个字符串之间通过插入、删除或替换操作变成相同字符串所需的最小操作次数。

  2. 使用场景

    • 拼写检查:判断两个字符串(单词)之间的编辑距离。
    • DNA序列比对:分析生物序列的相似性。

2.基于向量的相似度搜索(TF-IDF, BM25, SBERT)

在这里插入图片描述

1.TF-IDF

  1. 公式

    • TF(词频):某词 t 在文档 d 中出现的次数除以文档总词数:

      TF ( t , d ) = 词  t 在文档  d 中出现的次数 文档  d 的总词数 \text{TF}(t, d) = \frac{\text{词 } t \text{ 在文档 } d \text{ 中出现的次数}}{\text{文档 } d \text{ 的总词数}} TF(t,d)=文档 d 的总词数 t 在文档 d 中出现的次数

    • IDF(逆文档频率):词 t 在文档集合 D 中出现的频率的倒数:

      IDF ( t , D ) = log ⁡ ( ∣ D ∣ ∣ { d ∈ D : t ∈ d } ∣ ) \text{IDF}(t, D) = \log \left( \frac{|D|}{|\{d \in D : t \in d\}|} \right) IDF(t,D)=log({dD:td}D)

    • TF-IDF

      TF-IDF ( t , d , D ) = TF ( t , d ) × IDF ( t , D ) \text{TF-IDF}(t, d, D) = \text{TF}(t, d) \times \text{IDF}(t, D) TF-IDF(t,d,D)=TF(t,d)×IDF(t,D)

  2. 解决的问题

    • 衡量某个词在单个文档中的重要性,常用于文本检索和关键词提取
    • 通过IDF,减少在大多数文档中普遍出现的词(如“the”,“and”)的权重。
  3. 不足

    • 没有考虑词的位置、词序关系以及文档长度的影响
    • 对于长文档,TF-IDF会产生偏差,因为词频可能更高,但未必意味着其重要性更大。(比如有一篇文章专门讨论狗,狗出现的很多,但是未必重要)
    • 只能衡量词和文档的静态相关性,无法考虑用户查询的动态需求。

2.BM25

  1. 公式

    BM25 是 TF-IDF 的改进

    BM25 ( t , d ) = IDF ( t ) × TF ( t , d ) ⋅ ( k 1 + 1 ) TF ( t , d ) + k 1 ⋅ ( 1 − b + b ⋅ ∣ d ∣ avgdl ) \text{BM25}(t, d) = \text{IDF}(t) \times \frac{\text{TF}(t, d) \cdot (k_1 + 1)}{\text{TF}(t, d) + k_1 \cdot \left(1 - b + b \cdot \frac{|d|}{\text{avgdl}}\right)} BM25(t,d)=IDF(t)×TF(t,d)+k1(1b+bavgdld)TF(t,d)(k1+1)

    • TF ( t , d ) \text{TF}(t, d) TF(t,d) 是词 t t t 在文档 d d d 中的词频。
    • IDF ( t ) = log ⁡ ( N − n ( t ) + 0.5 n ( t ) + 0.5 ) \text{IDF}(t) = \log \left( \frac{N - n(t) + 0.5}{n(t) + 0.5} \right) IDF(t)=log(n(t)+0.5Nn(t)+0.5) 是词 t t t 的逆文档频率,其中 N N N 是总文档数, n ( t ) n(t) n(t) 是包含词 t t t 的文档数。
    • ∣ d ∣ |d| d 是文档 d d d 的长度, avgdl \text{avgdl} avgdl 是所有文档的平均长度。
    • k 1 k_1 k1 b b b 是调节参数,通常 k 1 ∈ [ 1.2 , 2.0 ] k_1 \in [1.2, 2.0] k1[1.2,2.0] b ≈ 0.75 b \approx 0.75 b0.75
  2. 解决的问题

    • 在TF-IDF 的基础上,BM25 加入了文档长度归一化的机制,避免了长文档在词频上的不公平优势。
    • BM25 是一种平衡频率和文档长度的动态模型,适用于实际的文档检索。
  3. 不足

    尽管在信息检索中表现优越,但对于词序、词义关系等更复杂的语义问题处理能力有限。

3.SBERT

  1. SBERT(Sentence-BERT) 是基于 BERT 模型的一种变体,专门用于生成句子的向量表示,以便更好地进行句子间的相似度计算和语义搜索

  2. 原理

    SBERT的主要目标是通过预训练的 BERT 模型,结合句子对比学习策略,生成高质量的句子嵌入(sentence embeddings),并在向量空间中表示这些句子的语义。

    原始 BERT 只能处理单个句子的方式不同SBERT 能高效计算句子相似度

  3. 步骤

    1. 句子嵌入生成:通过双塔结构(Siamese Network),输入的句子对分别通过共享权重的BERT编码器生成句子的嵌入向量
    2. 相似度计算:SBERT 使用余弦相似度、欧几里得距离等来衡量句子嵌入之间的相似性。
    3. 训练方式:SBERT 使用对比损失(Contrastive Loss)、**三元组损失(Triplet Loss)**或者基于自然语言推理(NLI)的数据集训练,以优化嵌入质量。

    双塔结构
    是一种神经网络结构,通常用于计算两个输入之间的相似性。它的核心思想是通过共享权重的两个子网络分别对两个输入进行编码,然后比较它们的输出向量来评估相似性

    工作原理

    1. 输入 → 两个文本或图像等

    2. 共享权重编码器

      两个子网络(塔)是共享参数的,即 他们使用完全相同的网络权重。

      对于输入 A 和 B,得到向量表示 E A E_A EA E B E_B EB

    3. 相似度计算

      E A E_A EA E B E_B EB 计算相似性,可以用余弦相似度欧几里得距离曼哈顿距离等度量方式来衡量两个输入在向量空间中的接近程度。

    4. 损失函数

      训练时,使用 对比损失(Contrastive Loss)或 三元组损失(Triplet Loss)来让相似输入的嵌入向量更接近,不相似输入的嵌入向量远离。

    5. 共享权重的优势

      通过共享参数,双塔结构保证了两个输入被同样处理,这避免了输入之间的不对称处理问题。

  4. 解决的问题

    • 句子相似度计算:BERT 只能处理句子对的相似度,而 SBERT 可以通过向量计算高效地处理大量句子的相似度问题,极大加速了计算过程。
    • 语义搜索:SBERT 可以将文本数据转化为语义向量,通过快速的余弦相似度计算,实现语义层面的搜索
    • 嵌入聚类:通过生成高质量的句子向量,SBERT 可以用于句子的聚类分析
  5. 不足

    • 计算开销:SBERT 在生成句子嵌入时仍然依赖于BERT模型,计算成本相对较高,尤其在处理长文本时。
    • 上下文依赖性不足:SBERT 生成的句子嵌入是固定的,缺乏对上下文动态变化的建模能力
    • 无法处理词序关系:SBERT 主要关注句子级别的语义嵌入,对于词序或细粒度的信息捕捉能力有限
  6. 代码

    在这里插入图片描述

3.faiss-相似度搜索介绍与如何选择索引

在这里插入图片描述

不同的索引在不同向量数量的查询时间对比。注意,纵轴是对数时间

  • 数据集

    import shutil
    import urllib.request as request
    from contextlib import closing# first we download the Sift1M dataset
    with closing(request.urlopen('ftp://ftp.irisa.fr/local/texmex/corpus/sift.tar.gz')) as r:with open('sift.tar.gz', 'wb') as f:shutil.copyfileobj(r, f)import tarfile# the download leaves us with a tar.gz file, we unzip it
    tar = tarfile.open('sift.tar.gz', "r:gz")
    tar.extractall()import numpy as np# now define a function to read the fvecs file format of Sift1M dataset
    def read_fvecs(fp):a = np.fromfile(fp, dtype='int32')d = a[0]return a.reshape(-1, d + 1)[:, 1:].copy().view('float32')# data we will search through
    xb = read_fvecs('./sift/sift_base.fvecs')  # 1M samples
    # also get some query vectors to search with
    xq = read_fvecs('./sift/sift_query.fvecs')
    # take just one query (there are many in sift_learn.fvecs)
    xq = xq[0].reshape(1, xq.shape[1])
    

    在这里插入图片描述

1.Flat Indexes

在这里插入图片描述

除此之外,也有 IndexFlatIP(**IP, Inner Product,**内积)

在这里插入图片描述

质量很高,但是速度很慢

d = 128
k = 10import faissindex = faiss.IndexFlatIP(d)
index.add(xb)%%time
D, I = index.search(xq, k)'''
CPU times: user 16.2 ms, sys: 2.14 ms, total: 18.4 ms
Wall time: 21.8 ms
'''
baseline = I[0].tolist()

2.LSH(局部敏感哈希)

在这里插入图片描述

与字典(尽量最小化碰撞)不同,LSH 尝试最大化碰撞。然后将搜索范围限制在一个桶内

nbits = d*4index = faiss.IndexLSH(d, nbits)
index.add(xb)%%time
D, I = index.search(xq, k)
'''
CPU times: user 3.3 ms, sys: 2.47 ms, total: 5.76 ms
Wall time: 5.37 ms
'''
np.in1d(baseline, I)
'''
array([ True,  True,  True,  True, False, False,  True, False, False,True])
'''

可以用 nbits 在速度与准确率直接找平衡

在这里插入图片描述

nibts 越高,召回率越高

在这里插入图片描述

但是,nbits 越高,速度越慢

3.HNSW

在这里插入图片描述

这是一个NSW图,图中两个顶点的距离为 4 跳。

以此类推,下面是 HNSW

在这里插入图片描述

同样需要四跳

M = 16 # 每个顶点的连接数
ef_search = 8 # 搜索的深度
ef_construction = 64 # 构建时的扩展因子,决定了在构建图时为每个点找到最近邻的搜索深度index = faiss.IndexHNSWFlat(d, M)index.hnsw.efSearch = ef_search
index.hnsw.efConstruction = ef_constructionindex.add(xb)%%time
D, I = index.search(xq, k)
'''
CPU times: user 366 μs, sys: 261 μs, total: 627 μs
Wall time: 1.27 ms
'''
np.in1d(baseline, I)
'''
array([ True,  True, False, False, False,  True, False, False,  True,True])
'''
# 以上不太准,调整 M 和 ef_search
M = 32 # 每个顶点的连接数
ef_search = 32 # 搜索的深度
ef_construction = 64 # 构建时的扩展因子,决定了在构建图时为每个点找到最近邻的搜索深度......
%%time
D, I = index.search(xq, k)
'''
CPU times: user 345 μs, sys: 133 μs, total: 478 μs
Wall time: 375 μs
'''
np.in1d(baseline, I)
'''
array([ True,  True, False,  True,  True,  True,  True, False,  True,True])
''

在这里插入图片描述

对比不同的 M、efConstruction 和 efSearch 组合的召回率

可以发现,

  • M 的大小对效果提升最明显
  • 其次是 efSearch
  • 最后是 efConstruction
  • 总结,efConstruction 最后大一些,M在 32-64 以上就可以了,efSearch = 32 是中位数,最好和 M 一起调节

在这里插入图片描述

不同的 M、efSearch 对查找时间的对比

  • 可以发现,efSearch = 32, M=32 就不错

4.IVF

在这里插入图片描述

其实这个算法就像聚类,通过调整 探针 nprobe 来权衡准确率是查找时间

nlist = 128 # 质心数量quantizer = faiss.IndexFlatIP(d)
index = faiss.IndexIVFFlat(quantizer, d, nlist)index.train(xb) # 需要训练!index.add(xb)index.nprobe = 1%%time
D, I = index.search(xq, k)
'''
CPU times: user 928 μs, sys: 305 μs, total: 1.23 ms
Wall time: 576 μs
'''
np.in1d(baseline, I)
'''
array([ True, False, False,  True,  True, False, False,  True, False,True])
'''
# 把探针改成 2
index.nprobe = 2
%%time
D, I = index.search(xq, k)
'''
CPU times: user 2.78 ms, sys: 2.16 ms, total: 4.93 ms
Wall time: 5.13 ms
'''
np.in1d(baseline, I)
'''
array([ True,  True,  True,  True,  True, False,  True,  True,  True,True])     
'''

在这里插入图片描述

不同探针和质心下的召回率和搜索时间

在这里插入图片描述

不同质心下的索引大小

相关文章:

向量数据库FAISS之四:向量检索和 FAISS

来自 YouTube 1.相似度搜索的传统方法(Jaccard, w-shingling, Levenshtein) 1.Jaccard 距离 公式 Jaccard ( A , B ) 1 − ∣ A ∩ B ∣ ∣ A ∪ B ∣ \text{Jaccard}(A, B) 1 - \frac{|A \cap B|}{|A \cup B|} Jaccard(A,B)1−∣A∪B∣∣A∩B∣​ 其中, A 和 …...

Flume日志采集系统的部署,实现flume负载均衡,flume故障恢复

目录 安装包 flume的部署 负载均衡测试 故障恢复 安装包 在这里给大家准备好了flume的安装包 通过网盘分享的文件:apache-flume-1.9.0-bin.tar.gz 链接: https://pan.baidu.com/s/1DXMA4PxdDtUQeMB4J62xoQ 提取码: euz7 --来自百度网盘超级会员v4的分享 ----…...

行列式的理解与计算:线性代数中的核心概念

开发领域:前端开发 | AI 应用 | Web3D | 元宇宙 技术栈:JavaScript、React、ThreeJs、WebGL、Go 经验经验:6 年 前端开发经验,专注于图形渲染和 AI 技术 开源项目:github 简智未来、数字孪生引擎、前端面试题 大家好&a…...

DimensionX:单图生成任意的3d/4d视图

DimensionX:单图生成任意的3d/4d视图 通俗易懂的来说 在我们的方法中,关键是如何从一张图片生成动态的3D和4D场景。我们使用一个叫做ST-Director的工具,它可以分开处理空间(3D)和时间(4D)两个方面。想象一…...

k8s上面的Redis集群链接不上master的解决办法

问题描述 之前在k8s上面部署了一台node,然后创建了6个redis的pod,构建了一个redis的集群,正常运行。 最近添加了一台slave node,然后把其中的几个redis的pod调度到了slave node上面,结果集群就起不来了,…...

芯片之殇——“零日漏洞”(文后附高通64款存在漏洞的芯片型号)

芯片之殇——“零日漏洞”(文后附高通64款存在漏洞的芯片型号) 本期是平台君和您分享的第113期内容 前一段时间,高通公司(Qualcomm)发布安全警告称,提供的60多款芯片潜在严重的“零日漏洞”,芯片安全再一次暴露在大众视野。 那什么是“零日漏洞”?平台君从网上找了一段…...

《线性代数的本质》

之前收藏的一门课,刚好期末复习,顺便看一看哈哈 课程链接:【线性代数的本质】合集-转载于3Blue1Brown官方双语】 向量究竟是什么 线性代数中最基础、最根源的组成部分就是向量,需要先明白什么是向量 不同专业对向量的看法 物理专…...

计算机视觉 1-8章 (硕士)

文章目录 零、前言1.先行课程:python、深度学习、数字图像处理2.查文献3.环境安装 第一章:概论1.计算机视觉的概念2.机器学习 第二章:图像处理相关基础1.图像的概念2.图像处理3.滤波器4.卷积神经网络CNN5.图像的多层表示:图像金字…...

SpringMVC

七、SpringMVC (1)SpringMVC简介 SpringMVC概述 SpringMVC技术与Servlet技术功能等同,均属于web层开发技术,web程序大都基于三层架构实现 如果所有的处理都交给Servlet来处理的话,所有的东西都耦合在一起&#xff0c…...

使用llama.cpp进行量化和部署

git clone https://github.com/ggerganov/llama.cpp cd llama.cpp 🖥️ CPU 版本 cmake -B build_cpu cmake --build build_cpu --config Release 🖥️ CUDA 版本 cmake -B build_cuda -DLLAMA_CUDAON cmake --build build_cuda --config Release -j …...

iOS构建版本以及Hbuilder打iOS的ipa包全流程

目录 Hbuilder打ipa包 打包之前进行应用配置 应用版本号设置 使用广告标识设置 iOS-云打包 下载并转移安装包 使用Transporter提交版本 应用简介 下载应用 账号登录 提交安装包到apple store connect 在apple开发者平台上确认 总结 本篇文章详细的介绍了使用Hbuil…...

DB-GPT V0.6.2 版本更新:牵手libro社区、GraphRAG图谱构建能力增强等

DB-GPT V0.6.2版本现已上线,快速预览新特性: 新特性 1、DB-GPT 社区和 libro 社区共同发布 AWEL Notebook 功能 libro:灵活定制、轻松集成的 Notebook 产品方案。 社区地址:https://github.com/difizen/libro 使用教程&#xf…...

Chrome 浏览器 131 版本新特性

Chrome 浏览器 131 版本新特性 一、Chrome 浏览器 131 版本更新 1. 在 iOS 上使用 Google Lens 搜索 自 Chrome 126 版本以来,用户可以通过 Google Lens 搜索屏幕上看到的任何图片或文字。 要使用此功能,请访问网站,并点击聚焦时出现在地…...

数据结构初识

目录 1.初识 2.时间复杂度 常见时间复杂度举例: 3.空间复杂度 4.包装类&简单认识泛型 4.1装箱和拆箱 5.泛型 6.泛型的上界 7.泛型方法 8.List接口 1.初识 1.多画图 2.多思考 3.多写代码 4.多做题 牛客网-题库/在线编程/剑指offer 算法篇&#xff1a…...

[ 应急响应进阶篇-2 ] Linux创建后门并进行应急处置-1:超级用户帐号后门

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...

设计模式:4、命令模式(双重委托)

目录 0、定义 1、命令模式包括四种角色 2、命令模式的UML类图 3、代码示例 0、定义 将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 1、命令模式包括四种角色 接…...

第27天 安全开发-PHP应用TP 框架路由访问对象操作内置过滤绕过核心漏洞

时间轴 演示案例 TP 框架-开发-配置架构&路由&MVC 模型 TP 框架-安全-不安全写法&版本过滤绕过 TP 框架-开发-配置架构&路由&MVC 模型 参考: https://www.kancloud.cn/manual/thinkphp5_1 1、配置架构-导入使用 去thinkphp官网可以看到&…...

[数组双指针] 0167. 两数之和 II - 输入有序数组

文章目录 1. 题目链接2. 题目大意3. 示例4. 解题思路5. 参考代码 1. 题目链接 167. 两数之和 II - 输入有序数组 - 力扣(LeetCode) 2. 题目大意 描述:给定一个下标从 1 开始计数、升序排列的整数数组:numbers 和一个目标值 targ…...

常用数据结构详解

文章目录 线性数据结构稀疏数组链表单向链表双向链表约瑟夫问题 栈栈实现中缀表达式栈实现后缀表达式中缀表达式转后缀表达式 队列哈希表 非线性数据结构二叉树二叉树的遍历及查找二叉树的删除顺序存储二叉树线索化二叉树 哈夫曼树二叉排序树平衡二叉树多路查找树2-3树B树B树B*…...

css iframe标签使用

<iframe> 标签用于在网页中嵌入另一个 HTML 页面。它非常灵活&#xff0c;可用于嵌入内容&#xff0c;比如其他网站、视频、地图等。以下是有关 <iframe> 的详细介绍及使用方法&#xff1a; 基本语法 <iframe src"URL" width"宽度" height…...

NVR管理平台EasyNVR多品牌NVR管理工具的流媒体视频融合与汇聚管理方案

随着信息技术的飞速发展&#xff0c;视频监控已经成为现代社会安全管理和业务运营不可或缺的一部分。无论是智慧城市、智能交通、还是大型企业、校园安防&#xff0c;视频监控系统的应用都日益广泛。NVR管理平台EasyNVR&#xff0c;作为功能强大的流媒体服务器软件&#xff0c;…...

GISBox VS QGIS:你更倾向于易用性还是追求开源及高度定制化

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;随着技术的进步和应用场景的多样化&#xff0c;越来越多的GIS软件出现在市场上&#xff0c;为用户提供多样化的选择。对于企业和个人开发者来说&#xff0c;选择最适合自己的GIS软件至关重要。本文将从多个角度对比G…...

OpenCV与AI深度学习|16个含源码和数据集的计算机视觉实战项目(建议收藏!)

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;分享&#xff5c;16个含源码和数据集的计算机视觉实战项目 本文将分享16个含源码和数据集的计算机视觉实战项目。具体包括&#xff1a; 1. 人…...

联通光猫(烽火通信设备)改桥接教程

一、获得超级密码 1.打开telnet连接权限 http://192.168.1.1/telnet?enable1&key9070D3BECD70&#xff08;MAC地址&#xff09;2.连接光猫获取密码 telnet 192.168.1.1 用户名&#xff1a;admin 密码&#xff1a;Fh9070D3BECD70连接成功后 load_cli factory show admin_…...

12 —— Webpack中向前端注入环境变量

需求&#xff1a;开发模式下打印语句生效&#xff0c;生产模式下打印语句失效 使用Webpack内置的DefinePlugin插件 const webpack require(webpack) module.exports { plugins: [ new webpack.DefinePlugin({ process.env.NODE_ENV:JSON.stringify(process.env.NODE_ENV) }…...

Azure Kubernetes Service (AKS)资源优化策略

针对Azure Kubernetes Service (AKS)的资源优化策略&#xff0c;可以从多个维度进行考虑和实施&#xff0c;以提升集群的性能、效率和资源利用率。以下是一些关键的优化策略&#xff1a; 一、 Pod资源请求和限制 设置Pod请求和限制&#xff1a;在YAML清单中为所有Pod设置CPU和…...

根据返回字段名进行查询数据的方法

在Java后端开发中&#xff0c;根据前端返回的字段名动态查询数据库是一种常见的需求。这种需求通常通过使用反射和动态SQL来实现。下面是一个完整的代码示例&#xff0c;它展示了如何根据前端返回的字段名动态查询数据库中的数据。 一、根据前端返回的字段名动态查询数据库中的…...

使用ENSP实现静态路由

一、双路由器静态路由 1.项目拓扑 2.项目实现 (1)路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为1.1.1.1/24 ip address 1.1.1.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为192.168.1.1/24 ip ad…...

SpringBoot3+Vue3开发图书馆管理系统

1 项目介绍 图书馆管理系统&#xff0c;管理图书、用户、借书、还书、实时监测归还是否逾期&#xff0c;逾期未归还会生成违规记录。违规状态不可借阅图书。需缴纳罚金&#xff0c;消除违规记录。可动态设置图书最多累计借阅数量上限和最长借阅天数上限&#xff0c;当用户满足…...

常见的 git 提交备注类型

在 Git 提交中&#xff0c;常见的提交备注&#xff08;commit message&#xff09;遵循一定的约定&#xff0c;这有助于代码管理、版本控制以及团队协作。fix 和 feat 是常见的提交类型&#xff0c;下面是这两个的含义&#xff0c;以及其他常见的提交类型。 常见的 Git 提交备…...

Redis 的代理类注入失败,连不上 redis

在测试 redis 是否成功连接时&#xff0c;发现 bean 没有被创建成功&#xff0c;导致报错 根据报错提示&#xff0c;需要我们添加依赖&#xff1a; <dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>&l…...

Hook 技术:修改 Android 系统属性,提升应用调试和定制化能力

Hook 技术&#xff1a;修改 Android 系统属性&#xff0c;提升应用调试和定制化能力 我知道很多小伙伴&#xff0c;尤其是玩 Android 的开发者&#xff0c;都会有这种需求&#xff1a; 想修改设备的 系统属性&#xff0c;比如 设备型号、API 版本、屏幕分辨率 或 密度&#x…...

Excel如何把两列数据合并成一列,4种方法

Excel如何把两列数据合并成一列,4种方法 参考链接:https://baijiahao.baidu.com/s?id=1786337572531105925&wfr=spider&for=pc 在Excel中,有时候需要把两列或者多列数据合并到一列中,下面介绍4种常见方法,并且提示一些使用注意事项,总有一种方法符合你的要求:…...

英文版本-带EXCEL函数的数据分析

一、问题&#xff1a; 二、表格内容 三、分析结果 四、具体的操作步骤&#xff1a; 销售工作表公式设计与数据验证 类别&#xff08;Category&#xff09;列公式&#xff1a; 在Category列&#xff08;假设为D列&#xff09;&#xff0c;根据ProductCode在Catalogue工作表中查找…...

LangChain入门

LangChain入门 &#xff5c; 豆包MarsCode AI 刷题 本篇文章为《LangChain 实战课》前三节课的总结性文章&#xff0c;主要内容包含内容梳理与总结&#xff0c;学习记录&#xff0c;以及一些思考。 01开篇词&#xff5c;带你亲证AI应用开发的“奇点”时刻 内容 这篇文章介绍…...

STM32-- 串口介绍

rs485、rs232、rs422 rs485使用&#xff1a; max3485&#xff1a;3.3v左右驱动 max485&#xff1a;5v左右驱动&#xff0c;不过有时候3.3v驱动也可以使用&#xff0c;具体有什么问题或者通过电路规避问题还没有了解过。 rs485和rs422有相同的地方&#xff0c;485满足422的规…...

【Python TensorFlow】进阶指南(续篇三)

在前几篇文章中&#xff0c;我们探讨了TensorFlow的高级功能&#xff0c;包括模型优化、分布式训练、模型解释等多个方面。本文将进一步深入探讨一些更具体和实用的主题&#xff0c;如模型持续优化的具体方法、异步训练的实际应用、在线学习的实现细节、模型服务化的最佳实践、…...

仓颉——申请内测、环境搭建、编译测试

2024年6月21日&#xff0c;华为仓颉正式公开发布。 不少同学看过仓颉白皮书后&#xff0c;都在找SDK从哪下载&#xff0c;HelloWorld怎么跑。仓颉公众号也及时发布了内测的方式&#xff0c;我也亲自走了一遍整个流程&#xff0c; 一&#xff0c;申请内测 关注“仓颉编程语言…...

C语言教程指针笔记整理(二)

https://www.bilibili.com/video/BV1cx4y1d7Ut?spm_id_from333.788.videopod.episodes&vd_sourcee8984989cddeb3ef7b7e9fd89098dbe8&p107 本篇为贺宏宏老师C语言教程指针部分笔记整理 //8-19 一维数组和二维数组 // int arr[4] [][][][] //含义&#xff1a; //1.arr…...

3.无重复字符的最长子串 python

无重复字符的最长子串 题目描述示例 1:示例 2:示例 3:提示&#xff1a;题目链接 解题思路Python 实现详细解释 题目描述 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的最长 子串的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子…...

NIST 发布后量子密码学转型战略草案

美国国家标准与技术研究所 (NIST) 发布了其初步战略草案&#xff0c;即内部报告 (IR) 8547&#xff0c;标题为“向后量子密码标准过渡”。 该草案概述了 NIST 从当前易受量子计算攻击的加密算法迁移到抗量子替代算法的战略。该草案于 2024 年 11 月 12 日发布&#xff0c;开放…...

高危,Laravel参数注入漏洞安全风险通告

今日&#xff0c;亚信安全CERT监控到安全社区研究人员发布安全通告&#xff0c;披露了Laravel 参数注入漏洞(CVE-2024-52301)。在受影响的版本中&#xff0c;Application.php 文件的 detectEnvironment 函数直接使用了 $_SERVER[argv]&#xff0c;但没有检查运行环境是否为 CLI…...

【漏洞复现】|智互联SRM智联云采系统quickReceiptDetail SQL注入漏洞

漏洞描述 智互联(深圳)科技有限公司SRM智联云采系统针对企业供应链管理难题&#xff0c;及智能化转型升级需求&#xff0c;智联云采依托人工智能、物联网、大数据、云等技术&#xff0c;通过软硬件系统化方案&#xff0c;帮助企业实现供应商关系管理和采购线上化、移动化、智能…...

【Visual Studio系列教程】如何在 VS 上编程?

上一篇博客中&#xff0c;我们介绍了《什么是 Visual Studio&#xff1f;》。本文&#xff0c;我们来看第2篇《如何在 VS 上编程&#xff1f;》。阅读本文大约10 分钟。我们会向文件中添加代码&#xff0c;了解 Visual Studio 编写、导航和了解代码的简便方法。 本文假定&…...

Pytest-Bdd-Playwright 系列教程(12):步骤参数 parsers参数解析

Pytest-Bdd-Playwright 系列教程&#xff08;12&#xff09;&#xff1a;步骤参数 & parsers参数解析 前言一、什么是步骤参数&#xff1f;二、pytest-bdd 的步骤参数用法2.1 简单字符串解析2.2 自定义正则表达式解析2.3 参数类型转换 三、案例&#xff1a;基于 pytest-bdd…...

java 增强型for循环 详解

Java 增强型 for 循环&#xff08;Enhanced for Loop&#xff09;详解 增强型 for 循环&#xff08;也称为 “for-each” 循环&#xff09;是 Java 从 JDK 5 开始引入的一种便捷循环语法&#xff0c;旨在简化对数组或集合类的迭代操作。 1. 基本语法 语法格式 for (类型 变量…...

RUST学习教程-安装教程

文章目录 参考文档安装教程更新卸载 参考文档 https://course.rs/first-try/installation.html 安装教程 Linux或者mac安装教程 curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh安装完成&#xff0c;当出现command not found的时候&#xff0c;需要source一下…...

第十六届蓝桥杯模拟赛(第一期)-c++/c

c/c蓝桥杯模拟赛题解&#xff0c;非常详细 质因数 1、填空题 【问题描述】 如果一个数 p 是个质数&#xff0c;同时又是整数 a 的约数&#xff0c;则 p 称为 a 的一个质因数。 请问 2024 有多少个质因数。 【答案提交】 这是一道结果填空的题&#xff0c;你只需要算出结果后提…...

使用uniapp编写APP的文件上传

使用uniapp插件文件选择、文件上传组件&#xff08;图片&#xff0c;视频&#xff0c;文件等&#xff09; - DCloud 插件市场 实用效果&#xff1a; 缺陷是只能一个一个单独上传...

Go语言从入门到精通

go相关命令 //对go源码进行编译&#xff0c;生成.exe文件 go build go文件名//直接运行go源码&#xff08;生成.exe文件执行后&#xff0c;又删除.exe文件&#xff09; go run go文件名go中的package和import /*package&#xff1a;用来声明这个文件是属于哪个包的*/ package…...