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

文献分享: ColXTR——将ColBERTv2的优化引入ColXTR

1. ColXTR \textbf{1. ColXTR} 1. ColXTR原理

1.1. ColBERTv2 \textbf{1.1. ColBERTv2} 1.1. ColBERTv2概述

1.1.1. \textbf{1.1.1. } 1.1.1. 训练优化

1️⃣难负样本生成

  1. 初筛:基于 BM-25 \text{BM-25} BM-25找到可能的负样本
  2. 重排:使用 KL \text{KL} KL散度将大型交叉编码器蒸馏进 MiniLM \text{MiniLM} MiniLM,再用 MiniLM \text{MiniLM} MiniLM保留负样本中的难负样本

2️⃣高效训练结构

  1. 多元组结构:从原来的结构 ⟨ q , d + , d – ⟩ \langle q, {d}^+,{d}^\text{–}\rangle q,d+,d,变成 ⟨ q , d w ⟩ = ⟨ q , d 1 + , d 2 – , . . . , d w – ⟩ \langle q, \textbf{d}_{w}\rangle\text{=}\langle q, {d}^+_{1},{d}^\text{–}_{2},...,{d}^\text{–}_{w}\rangle q,dw=q,d1+,d2,...,dw结构
  2. 批内负样本:除自身负样本外,还将批内其他查询的所有段落视为负样本,用来统一优化训练函数

3️⃣降噪训练优化:

  1. 样本刷新:定期用训练到一半的模型,重新生成训练样本
  2. 防过拟合:定期刷新训练样本,以防止陷入局部最优

1.1.2. \textbf{1.1.2. } 1.1.2. 整体流程

1️⃣残差压缩的原理

  1. 聚类:对全部段落全部向量的集合 { p j } \{p_j\} {pj}进行聚类,为每个向量 p j p_j pj分配了一个质心 C p j C_{p_j} Cpj
  2. 残差:就是 p j p_j pj与其质心 C p j C_{p_j} Cpj的距离 r = p j – C p j r\text{=}p_j\text{–}C_{p_j} r=pjCpj
  3. 压缩:将浮点数压缩为二进制表示,如[ r r r每个维度的连续分布 → 分割为 4 \xrightarrow{分割为}4 分割为 4个离散状态] ⇔ 对应 2 \xLeftrightarrow{对应}2 对应 2 bit \text{bit} bit所表示的四种状态
  4. 编码:将每个 p j p_j pj表示为质心 C p j + C_{p_j}\text{+} Cpj+压缩的残差,通过反向解压缩残差即可得到近似的 p j p_j pj

2️⃣离线索引流程

  1. 近似质心:抽取一部分段落 Token \text{Token} Token执行嵌入,再对部分的嵌入向量执行 n embeddings -Means \sqrt{n_{\text{embeddings}}}\text{-Means} nembeddings -Means聚类,得到 n embeddings \sqrt{n_{\text{embeddings}}} nembeddings 个质心
  2. 压缩编码:对所有的段落进行全精度嵌入(但是不存储),基于上一步得到的质心进行残差压缩(此时才对残差编码进行存储)
  3. 倒排索引:构建质心 → \text{→} 质心所包含的嵌入的 ID \text{ID} ID的列表,存储到磁盘中
    质心a -> 属于质心a的嵌入ID=a1, a2, a3, ...
    质心b -> 属于质心b的嵌入ID=b1, b2, b3, ...
    质心c -> 属于质心c的嵌入ID=c1, c2, c3, ...
    

3️⃣在线查询流程

  1. 查询嵌入:原始查询 Q → 预处理 ( 嵌入 ) BERT Q\xrightarrow[预处理(嵌入)]{\text{BERT}} QBERT 预处理(嵌入)多向量表示 { q 1 , q 2 , … , q n } \{q_1, q_2, \dots, q_n\} {q1,q2,,qn}
  2. 候选生成:查找与每个 q i q_i qi最近的 n probe ≥ 1 n_{\text{probe}}\text{≥}1 nprobe1个质心,收集每个质心下属的 { p j } \{p_j\} {pj}集合,再收集与 { p j } \{p_j\} {pj}有关的段落是为候选段落
  3. 初筛流程:解压 { p j } \{p_j\} {pj}中所有的向量,利用解压向量计算 Q Q Q与候选段落的近似距离,这个近似距离时则为一个下界
    👉举个简单例子Q: {q1, q2, q3}P: {p1, p2, p3, p4} → {pj}集合中仅有{p1, p2, p3}
    👉完整的距离计算Maxsim-1-full = Max{<q1,p1>,<q1,p2>,<q1,p3>,<q1,p4>}Maxsim-2-full = Max{<q2,p1>,<q2,p2>,<q2,p3>,<q2,p4>}Maxsim-3-full = Max{<q3,p1>,<q3,p2>,<q3,p3>,<q3,p4>}
    👉近似的距离计算Maxsim-1-part = Max{<q1,p1>,<q1,p2>,<q1,p3>} ≤ Maxsim-1-fullMaxsim-2-part = Max{<q2,p1>,<q2,p2>,<q2,p3>} ≤ Maxsim-2-fullMaxsim-3-part = Max{<q3,p1>,<q3,p2>,<q3,p3>} ≤ Maxsim-3-full
    👉所以一定是下界
    
  4. 重排流程:根据初筛结果选取若干最相似的段落,解压得到这些段落的全部向量,计算精确的相似度以得到最终结果

1.2. XTR \textbf{1.2. XTR} 1.2. XTR概述

1.2.1. \textbf{1.2.1. } 1.2.1. 研究的动机

1️⃣重新定义多向量相似度问题: ColBERT ( Q , P ) = 1 Z ∑ i = 1 n ∑ j = 1 m ( P ∘ A ) i j \displaystyle\text{ColBERT}(Q,P)\text{=}\frac{1}{Z} \sum_{i=1}^{n} \sum_{j=1}^{m}(\textbf{P}\text{∘}\textbf{A})_{ij} ColBERT(Q,P)=Z1i=1nj=1m(PA)ij

  1. 数据结构:
    • 评分矩阵 S \textbf{S} S:令查询 Q = { q 1 , q 2 , … , q n } Q\text{=}\left\{q_{1},q_2,\ldots,q_{n}\right\} Q={q1,q2,,qn}以及文档 P = { p 1 , p 2 , . . . , p m } P\text{=}\{p_1,p_2,...,p_m\} P={p1,p2,...,pm},记子内积为 s i j = q i ⊤ p j s_{ij}\text{=}{q}_{i}^{\top}{p}_{j} sij=qipj,由此构成 S ∈ R n × m \textbf{S}\text{∈}\mathbb{R}^{n\text{×}m} SRn×m
    • 对齐矩阵 A \textbf{A} A:让每个元素 a i j ∈ { 0 , 1 } a_{ij}\text{∈}\{0,1\} aij{0,1}来对 P \textbf{P} P中的元素进行不同强度的选择,由此构成 A ∈ R n × m \textbf{A}\text{∈}\mathbb{R}^{n\text{×}m} ARn×m
  2. ColBERT \text{ColBERT} ColBERT版本,通过调整对齐矩阵 A \textbf{A} A,让其选择评分矩阵 S \textbf{S} S每行最大的一个值,最后除以 Z Z Z归一化
    image-20250306233530006
  3. 传统的训练方式:最大化批内正样本 P + ∈ P 1 : B = [ P 1 , … , P B ] {P}^{+}\text{∈}{P}_{1:B}\text{=}\left\lbrack{{P}_{1},\ldots ,{P}_{B}}\right\rbrack P+P1:B=[P1,,PB]的得分,即最小化 L C E = – log ⁡ e ColBERT ( Q , P b ) ∑ b = 1 B e ColBERT ( Q , P b ) {\mathcal{L}}_{\mathrm{{CE}}}\textbf{= }–\log\cfrac{e^{\text{ColBERT}\left( {Q,{P}_{b}}\right)}}{\displaystyle{}\sum_{{b\textbf{=}1}}^{B}e^{\text{ColBERT}\left( {Q,{P}_{b}}\right)}} LCElogb=1BeColBERT(Q,Pb)eColBERT(Q,Pb)

2️⃣传统 ColBERT \text{ColBERT} ColBERT的流程

image-20250313215730217
  1. Token \text{Token} Token检索:用查询单向量集中每个 q i q_i qi检索 k ′ k^\prime k个段落 Token \text{Token} Token,最多产生 n × k ′ n\text{×}k^\prime n×k个候选 Token \text{Token} Token
  2. 收集向量:加载 n × k ′ n\text{×}k^\prime n×k个候选 Token \text{Token} Token所属的段落,收集这些段落中所有的 Token \text{Token} Token向量
  3. 评分与重排:对这些段落应用全精度的 ColBERT \text{ColBERT} ColBERT非线性相似度以进行重排

3️⃣ XTR \text{XTR} XTR的动机

  1. 传统 ColBERT \text{ColBERT} ColBERT面临的问题
    • 训练上:与推理不一致,传统 ColBERT \text{ColBERT} ColBERT的旨在优化最终 ColBERT \text{ColBERT} ColBERT评分,而推理过程旨在获得 Top- k \text{Top-}k Top-k Token \text{Token} Token
    • 开销上:收集 Top- k \text{Top-}k Top-k候选段落的多有 Token \text{Token} Token空间开销巨大,由此后续精确距离的计算成本也巨大
    • 泛化上: ColBERT \text{ColBERT} ColBERT的评分函数是非线性的,阻碍了使用 MIPS \text{MIPS} MIPS进行检索
  2. XTR \text{XTR} XTR的改进
    • 训练阶段:重新设计了训练目标函数,使得模型能优先检索出最有价值的段落 Token \text{Token} Token
    • 重排阶段:完全省去回溯(收集)步骤,直接只用检索到的段落 Token \text{Token} Token来构成
    • 缺失补充:只考虑检索到的 Token \text{Token} Token难免漏掉相关的 Token \text{Token} Token,故 XTR \text{XTR} XTR还会对缺失 Token \text{Token} Token进行自动评分

1.2.2. \textbf{1.2.2. } 1.2.2. 模型训练

1️⃣批内 Token \text{Token} Token检索的训练策略

  1. 给定一个查询 Q = { q 1 , . . . , q n } Q\text{=}\{q_1,...,q_n\} Q={q1,...,qn}和一批共 B B B个段落向量 P ( i ) = { p 1 ( i ) , . . . , p m ( i ) } P^{(i)}\text{=}\{p_1^{(i)},...,p_m^{(i)}\} P(i)={p1(i),...,pm(i)}
  2. 为每个 q i q_i qi在所有的段落向量集中执行 Top-K \text{Top-K} Top-K搜索,将每个 q i q_i qi Top-K \text{Top-K} Top-K段落向量相应位设为 1 1 1
  3. 将矩阵按段落拆分,就得到了段落的对齐矩阵
  4. 将每行被激活的子相似度的最大值相加,再除以归一化参数 Z Z Z(即有几行有被激活的相似度),得到最终的相似度评分
  5. 零处理机制:当一个段落所有 Token \text{Token} Token都没有足够高相似度(对齐矩阵全 0 0 0),会将归一化参数 Z Z Z设为很小的一个数避免除以 0 0 0

2️⃣与传统 ColBERT \text{ColBERT} ColBERT训练的对比:还是回到原来的例子

  1. ColBERT \text{ColBERT} ColBERT:不论 P + P^+ P+被选择与否,都会被给予很高的得分,导致模型最终无法正确选出 P + P^+ P+
  2. XTR \text{XTR} XTR:极端情况如 P + P^+ P+的每个 Token \text{Token} Token都不是 q i q_i qi Top-K \text{Top-K} Top-K,导致 P + P^+ P+被打零分造成高损失,迫使模型调整以能正确选择 P + P^+ P+

1.2.3. \textbf{1.2.3. } 1.2.3. 推理阶段

1️⃣获取候选文档:

  1. MIPS \text{MIPS} MIPS检索:对所有 n n n个查询向量 q i q_i qi执行 Top- k ′ \text{Top-}k^\prime Top-k检索,得到 k ′ k^\prime k个最相似的段落 Token \text{Token} Token
  2. 回溯(但不收集):回溯这 n k ′ nk^\prime nk Token \text{Token} Token所属的文档,确定 C C C个候选文档

2️⃣相似度填充:

  1. 排序:其检索 q i q_i qi Top- k \text{Top-}k Top-k p ( 1 ) , p ( 2 ) , . . . , p ( k ) p_{(1)},p_{(2)},...,p_{(k)} p(1),p(2),...,p(k),假设这些 Token \text{Token} Token q i q_i qi的相似度从高到低为 ⟨ q i , p ( 1 ) ⟩ , . . . , ⟨ q i , p ( k ) ⟩ \left\langle{q_i,p_{(1)}}\rangle,...,\langle{q_i,p_{(k)}}\right\rangle qi,p(1),...,qi,p(k)
  2. 填充:令被检索到的 Token \text{Token} Token中的相似度最低者为 m i = ⟨ q i , p ( k ) ⟩ m_i\text{=}\langle{q_i,p_{(k)}}\rangle mi=qi,p(k),直接用 m i m_i mi去填充一切其它(未被检索到 Token \text{Token} Token)的相似度
  3. 评分:填充后再取每个段落相似度矩阵每行相似度的最大值相加,然后除以行数归一化,避免了某一行贡献的相似度为 0 0 0
    image-20250323015940873

1.3. ColXTR \textbf{1.3. ColXTR} 1.3. ColXTR原理

1️⃣ ColXTR \text{ColXTR} ColXTR概述:集成 ColBERTv2 \text{ColBERTv2} ColBERTv2的优化来增强 XTR \text{XTR} XTR

  1. 训练阶段:
    • 保留 XTR \text{XTR} XTR训练目标:即仍然采用 Token \text{Token} Token检索级优化,而非段落级评分的优化
    • 增加降维投影层:训练过程中引入降维投影,试图降低每个 Token \text{Token} Token的向量的维度
  2. 推理阶段:
    • XTR \text{XTR} XTR:直接使用 ScaNN \text{ScaNN} ScaNN库存储精确的向量,不进行任何压缩,从而使得空间需求巨大
    • ColXTR \text{ColXTR} ColXTR:引入了 ColBERTv2 \text{ColBERTv2} ColBERTv2的残差压缩机制,大幅降低存储需求

2️⃣ ColXTR \text{ColXTR} ColXTR索引:全盘采纳 ColBERTv2 \text{ColBERTv2} ColBERTv2的三阶段索引,并用 T5 \text{T5} T5编码器(和 Aligner \text{Aligner} Aligner一样)嵌入

  1. 近似质心:抽取一部分段落 Token \text{Token} Token执行嵌入,再对部分的嵌入向量执行 n embeddings -Means \sqrt{n_{\text{embeddings}}}\text{-Means} nembeddings -Means聚类,得到 n embeddings \sqrt{n_{\text{embeddings}}} nembeddings 个质心
  2. 压缩编码:对所有的段落进行全精度嵌入(但是不存储),基于上一步得到的质心进行残差压缩(此时才对残差编码进行存储)
  3. 倒排索引:构建质心 → \text{→} 质心所包含的嵌入的 ID \text{ID} ID的列表,存储到磁盘中
    质心a -> 属于质心a的嵌入ID=a1, a2, a3, ...
    质心b -> 属于质心b的嵌入ID=b1, b2, b3, ...
    质心c -> 属于质心c的嵌入ID=c1, c2, c3, ...
    

3️⃣ ColXTR \text{ColXTR} ColXTR查询:假设查询 Q Q Q被编码为多向量表示 { q 1 , q 2 , . . . , q n } \{q_1,q_2,...,q_n\} {q1,q2,...,qn}

  1. 候选生成:原始 XTR \text{XTR} XTR直接对 { p j } \{p_j\} {pj}进行 MIPS \text{MIPS} MIPS搜索生成候选段落, ColXTR \text{ColXTR} ColXTR先对质心进行 MIPS \text{MIPS} MIPS搜索,再倒排索引回候选段落
    • 质心搜索:计算所有 q i q_i qi与所有质心 c j c_j cj的相似度,确定每个 q i q_i qi Top- k \text{Top-}k Top-k个质心,合并后得到候选质心集 { c j } \{c_j\} {cj}
    • 倒排索引:通过倒排索引,将候选质心回溯得到与每个质心有关的段落嵌入,是为候选向量集 { p j } \{p_j\} {pj}
    • 候选生成:找到所有与 { p j } \{p_j\} {pj}种向量有关的段落,从而构成候选段落集 { P 1 , P 2 , . . . , P N } \{P_1,P_2,...,P_N\} {P1,P2,...,PN}
  2. 内积计算:解压以获得 { p j } \{p_j\} {pj}中所有向量的全精度表示,让查询向量集 { q i } \{q_i\} {qi}和段落向量集 { p j } \{p_j\} {pj}中向量两两算内积 ⟨ q i , p j ⟩ \langle{q_i,p_j}\rangle qi,pj
  3. 相似填充:用每行最小的相似度值,填充每行剩余的相似度值,最终输出每个候选段落每行最大值的平均(即为近似相似度)
  4. 段落重排:选取若干近似评分最高的段落,解压其所有的向量从而计算精确的相似度,即可得到精确的最相似段落

2. \textbf{2. } 2. 实验及结果

1️⃣实验设置

  1. 模型设置:在 MS-MARCO \text{MS-MARCO} MS-MARCO上对 T5-base \text{T5-base} T5-base编码器进行微调,并在顶层设置一个 768→128 \text{768→128} 768→128的投影层
  2. 训练设置:设置 XTR \text{XTR} XTR中训练的 k = 320 k\text{=}320 k=320,一批样本 48 \text{48} 48个(其中难负样本由 BM25 \text{BM25} BM25挖掘出),训练 50K \text{50K} 50K
  3. 检索设置:让每个 q i q_i qi先探测 10 \text{10} 10个质心,对小索引设置倒排索引到 k = 500 k\text{=}500 k=500 p j / p_j/ pj/大索引则 k = 10000 k\text{=}10000 k=10000

2️⃣实验结果

  1. 性能上: ColXTR \text{ColXTR} ColXTR COlBERT \text{COlBERT} COlBERT XTR \text{XTR} XTR都要差,我不理解这篇文章为什么要重新训练 ColBERT \text{ColBERT} ColBERT,他妈性能当然比不过啊
  2. 开销上:你都他妈压缩了开销当然小啊,性能又打不过,这种文章还能发 COLING’25 \text{COLING'25} COLING’25奶奶的

3️⃣优化分析

  1. 这一部分内容也相当无聊
  2. 就是啊我们的优化,哎哟和 XTR \text{XTR} XTR一样降低了推理开销,那个和 ColBERTv2 \text{ColBERTv2} ColBERTv2一样降低了存储开销
  3. 所以 ColXTR \text{ColXTR} ColXTR性能连传统 ColBERT \text{ColBERT} ColBERT都不如,但我们就是牛逼

相关文章:

文献分享: ColXTR——将ColBERTv2的优化引入ColXTR

1. ColXTR \textbf{1. ColXTR} 1. ColXTR原理 1.1. ColBERTv2 \textbf{1.1. ColBERTv2} 1.1. ColBERTv2概述 1.1.1. \textbf{1.1.1. } 1.1.1. 训练优化 1️⃣难负样本生成 初筛&#xff1a;基于 BM-25 \text{BM-25} BM-25找到可能的负样本重排&#xff1a;使用 KL \text{KL} KL…...

【第21节】windows sdk编程:网络编程基础

目录 引言&#xff1a;网络编程基础 一、socket介绍(套接字) 1.1 Berkeley Socket套接字 1.2 WinSocket套接字 1.3 WSAtartup函数 1.4 socket函数 1.5 字节序转换 1.6 绑定套接字 1.7 监听 1.8 连接 1.9 接收数据 1.10 发送数据 1.11 关闭套接字 二、UDP连接流程…...

《深度剖析:BERT与GPT——自然语言处理架构的璀璨双星》

在自然语言处理&#xff08;NLP&#xff09;的广袤星空中&#xff0c;BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;与GPT&#xff08;Generative Pretrained Transformer&#xff09;系列模型宛如两颗最为耀眼的星辰&#xff0c;引领…...

景联文科技:以高质量数据标注推动人工智能领域创新与发展

在当今这个由数据驱动的时代&#xff0c;高质量的数据标注对于推动机器学习、自然语言处理&#xff08;NLP&#xff09;、计算机视觉等领域的发展具有不可替代的重要性。数据标注过程涉及对原始数据进行加工&#xff0c;通过标注特定对象的特征来生成能够被机器学习模型识别和使…...

LeetCode 30 —— 30.串联所有单词的子串

题目&#xff1a; 给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。 注意子串要与 words 中的单词完全匹配&#xff0c;中间不能有其他字符&#xff0c;但不需要考虑 words 中单词串联的顺序。 示例 1&#xff…...

【redis】主从复制:单点问题、配置详解、特点详解

文章目录 单点问题什么是主从复制主从模式能解决的问题并发量有限可用性问题 配置建立复制通过配置文件来指定端口配置主从查看集群结构 断开复制 特点安全性只读传输延迟 单点问题 分布式系统中&#xff0c;涉及到一个非常关键的问题&#xff1a;单点问题 某个服务器程序&…...

VSCode创建VUE项目(四)增加用户Session管理

将用户信息存储或者更新到Session sessionStorage.setItem("userID",loginform.value.username); sessionStorage.setItem(loginTime, Date.now()); 获取Session信息 const storedUserInfo sessionStorage.getItem(userID); const loginTime sessionStorage.get…...

Spring Boot(十六):拦截器Interceptor

拦截器的简介 拦截器&#xff08;Interceptor&#xff09;​是Spring框架中的概​念&#xff0c;它同样适​用于Spring Boot&#xff0c;​因为Spring Boot是基于Spring框架的。拦截器是​一种AOP&#xff08;面向切面编程&#xff09;​的轻量级实现方式&#xff0c;它允许我…...

考研复习之队列

循环队列 队列为满的条件 队列为满的条件需要特殊处理&#xff0c;因为当队列满时&#xff0c;队尾指针的下一个位置应该是队头指针。但是&#xff0c;我们不能直接比较 rear 1 和 front 是否相等&#xff0c;因为 rear 1 可能会超出数组索引的范围。因此&#xff0c;我们需…...

sql-labs

p1 sql注入的目的是为了破坏sql语句结构&#xff0c;有三种参数类型&#xff0c;字符型&#xff08;就是一个字符1或者a之类的&#xff09;&#xff0c;字符串&#xff08;“hellow之类的”&#xff09;型&#xff0c;数值型&#xff0c;前两个有闭合&#xff0c;注释符号有# …...

Java 集合框架:从数据结构到性能优化,全面解析集合类

Java 集合框架&#xff08;Java Collections Framework&#xff0c;JCF&#xff09;是 Java 语言中用于存储、操作和管理数据的标准库。它提供了一组通用的接口、类和方法&#xff0c;使开发者能够高效地操作不同类型的数据集合。 本文将结合 Java 集合框架类图&#xff0c;介…...

vulkanscenegraph显示倾斜模型(5.4)-相机操纵器

前言 在VSG&#xff08;Vulkan Scene Graph&#xff09;中&#xff0c;系统支持用户通过鼠标或触摸输入与三维场景进行交互&#xff0c;从而动态控制相机的位置和姿态&#xff0c;实现与三维场景的交互。VSG提供了多种相机操纵器&#xff0c;其中Trackball是一种常见的相机操作…...

两个还算好用的ppt转word和PDF转word的python脚本

PPT转word&#xff1a; import re from pptx import Presentation from docx import Document from docx.shared import Inches from io import BytesIO from PIL import Imagedef clean_text(text):# 使用正则表达式删除控制字符和NULL字节return re.sub(r[\x00-\x1F\x7F], ,…...

用PostgreSQL玩转俄罗斯方块:当SQL成为游戏引擎

当DBA开始摸鱼2025年某深夜&#xff0c;一位不愿透露姓名的DBA为了在监控大屏上隐藏游戏行为&#xff0c;竟用SQL实现了俄罗斯方块&#xff01;从此&#xff0c;SELECT成了方向键&#xff0c;UPDATE成了旋转指令&#xff0c;DELETE成了消除大招。本文将揭秘这个疯狂项目的技术内…...

基于WebAssembly的浏览器密码套件

目录 一、前言二、WebAssembly与浏览器密码套件2.1 WebAssembly技术概述2.2 浏览器密码套件的需求三、系统设计思路与架构3.1 核心模块3.2 系统整体架构图四、核心数学公式与算法证明4.1 AES-GCM加解密公式4.2 SHA-256哈希函数五、异步任务调度与GPU加速设计5.1 异步任务调度5.…...

手撕算法之`vector` 扩容、`string` 分割、链表翻转

手写常见操作:vector 扩容、string 分割、链表翻转 (一)vector扩容 在 C++ 中,vector 的扩容机制是动态数组实现的核心特性,直接关系到性能和内存使用效率。以下是深入剖析: 1. 扩容触发条件 vector<int> v; v.push_back(1); // 当 size() == capacity() 时触发…...

tauri2程序单例模式实现,二次点击桌面图标显示之前最小化的程序并聚焦

官方有这个单例的插件可以直接使用&#xff1a;单例 | Tauri&#xff0c;使用单实例插件确保 Tauri 应用程序在同一时间只运行单个实例。插件已经安装并初始化&#xff0c;应该可以立即正常运行。尽管如此&#xff0c;我们也可以使用 init() 方法来增强它的功能。插件的 init()…...

【AI学习笔记】Coze平台实现将Excel文档批量导入数据库全过程

背景前摇&原视频教程&#xff1a; 最近看到很多同学都在用Coze平台操作数据&#xff0c;我也想了解一下工作流的搭建和数据处理过程&#xff0c;但是一下子又看不懂太复杂的逻辑&#xff0c;于是上B站搜索相关的基础教程。 Coze官方教程&#xff1a; 之前有看过Coze平台…...

c++之迭代器

一.迭代器的基本概念 1.什么是迭代器 迭代器是一种对象&#xff0c;它提供了一种访问容器中各个元素的方法&#xff0c;同时隐藏了容器内部的实现细节。简单来说&#xff0c;迭代器就像是一个指针&#xff0c;它可以指向容器中的某个元素&#xff0c;并且能够通过一些操作&am…...

Elasticsearch 索引

一、简介 在 Elasticsearch 中&#xff0c;索引&#xff08;Index&#xff09;是存储相关文档的地方&#xff0c;类似于关系数据库中的数据库。索引是 Elasticsearch 中最重要的概念之一&#xff0c;用于组织和存储数据。 二、索引的基本概念 索引&#xff08;Index&#xf…...

Java EE(16)——网络原理——TCP协议解析二

4.滑动窗口(效率机制) 上篇博客讲到的确认应答/超时重传/连接管理都是安全机制&#xff0c;但也会降低传输效率。滑动窗口就是在保证可靠传输的基础上&#xff0c;尽可能地提高传输效率。 根据确认应答机制&#xff0c;客户端每发送一个请求都需要收到服务器的确认应答报文后才…...

解决address already in use报错:如何查看占用某个端口的程序并杀死

文章目录 问题背景解决策略概述端口占用诊断步骤 1&#xff1a;确认占用端口的进程步骤 2&#xff1a;确认进程的详细信息 解决端口占用问题方案 1&#xff1a;安全终止进程方案 2&#xff1a;修改应用配置 最佳实践与预防措施端口使用规范开发环境配置 进阶技巧批量处理端口占…...

linux 设置tomcat开机自启动

tomcat自启动配置 1.添加tomcat.service文件 vim /etc/systemd/system/tomcat.service 2.编辑文件内容&#xff0c;路径修改为自己的 [Unit] DescriptionTomcat8 Aftersyslog.target network.target remote-fs.target nss-lookup.target[Service] Typeoneshot ExecStart/us…...

如何配置本地git

配置本地 Git 主要包含设置用户信息、配置 SSH 密钥、设置 Git 仓库等步骤&#xff0c;以下是详细的配置过程&#xff1a; 1. 安装 Git 在开始配置之前&#xff0c;你需要先安装 Git。不同操作系统的安装方式有所不同&#xff1a; Windows&#xff1a;访问 Git 官方下载页面&a…...

VSCode 生成HTML 基本骨架

在VSCode 新建html文件中敲一个英文感叹号 ! <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…...

蓝桥杯备考:DFS暴搜之健康的荷斯坦奶牛

这道题数据量很小很小&#xff0c;我们可以用dfs暴搜来搜索 这是我们的决策树 #include <iostream> using namespace std; int n, m; const int N 45; int rq[N]; int g[N][N]; int cnt; int path; int ret 45; int st; bool check() {for (int i 1; i < n; i){in…...

android adjust 卸载与重装监测

想要洞察应用内用户的留存率,可以通过Adjust 的卸载与重装进行监测 名词解释: 卸载:集成完成后,卸载应用,安装状态为:卸载 重装:如果应用已经卸载,但一段时间后又进行安装,则会被视为重装。 📢📢📢:adjust 文件中说到24 小时后,可以再 adjust 控制台看安装…...

WPF Reactive 数据绑定

文章目录 Combox 绑定List-通过枚举绑定方法一:方法二:Button 绑定TextBlock绑定NumericUpDown绑定Expander绑定checkbox绑定NumericUpDownCombox 绑定List-通过枚举绑定 方法一: ViewControl using Avalonia; using Avalonia.Controls; using Avalonia.Markup.Xaml; usin…...

2.创建Collection、添加索引、加载内存、预览和搜索数据

milvus官方文档 milvus2.3.1的官方文档地址: https://milvus.io/docs/v2.3.x 使用attu创建collection collection必须要有一个主键字段、向量字段 确保字段类型与索引类型兼容 字符串类型&#xff08;VARCHAR&#xff09;通常需要使用 Trie 索引&#xff0c;而不是 AutoInd…...

yaffs

YAFFS&#xff08;Yet Another Flash File System&#xff09;是专为NAND闪存设计的日志结构文件系统&#xff0c;其核心原理围绕NAND闪存的特性优化数据管理。以下是其关键原理的详细说明&#xff1a; 1. NAND闪存适配 写入限制&#xff1a;NAND闪存需按页写入&#xff08;通…...

CMake-环境变量介绍

文章目录 作用域获取环境变量初始化查看特殊的环境变量 环境变量类似普通变量&#xff0c;但也有些不同&#xff0c;如下&#xff1a; 作用域 在一个CMake进程中环境变量具有全局作用域 获取环境变量 使用ENV操作符获取环境变量&#xff0c;例如$ENV{<name>}&#xff…...

wordpress表单插件CF7调用方式

Contact Form 7(CF7)是WordPress中非常流行的表单插件&#xff0c;以下是其常见的调用方式&#xff1a; 通过短代码调用 在页面或文章编辑器中添加&#xff1a;完成表单设置后&#xff0c;复制表单对应的短代码&#xff0c;然后在需要显示表单的页面或文章的编辑器中直接粘贴…...

小程序开发中的用户反馈收集与分析

我们在开发小程序的过程中根据开发过程中的代码及业务场景,以下是针对需求管理系统的用户反馈收集与分析方案设计: 需求管理系统用户反馈收集与分析方案 一、反馈数据模型设计 // 新增Feedback模型(app/admin/model/Feedback.php) namespace app\admin\model; use think\…...

【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解

【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解 &#xff08;图1-1&#xff09; 一、鸿蒙中App、HAP、HAR、HSP是什么&#xff1f; &#xff08;1&#xff09;App Pack&#xff08;Application Package&#xff09; 是应用发布的形态&#xff0c;上架应用市场是以App Pa…...

Linux:一些命令记录

netstat -antp|grep -i 27017 | awk {print $5}| cut -d: -f1 | sort | uniq -c | sort -n 查看磁盘大小 du -sh /usr/local/* 查看剩余内存&#xff1a; free -m linux下获取占用CPU资源最多的10个进程&#xff0c;可以使用如下命令组合&#xff1a; ps aux|head -1;ps aux|gr…...

Microsoft Edge浏览器的取证分析(基于Chromium)

概述 早在2019年&#xff0c;微软就用Chromium替换了EdgeHTML浏览器引擎&#xff0c;这是微软支持谷歌Chrome浏览器的一个开源项目。通过切换到Chromium&#xff0c;Edge与Chrome浏览器共享一个共同的架构&#xff0c;这意味着用于Chrome浏览器调查的取证技术也适用于Edge。 …...

Java面试黄金宝典6

1. 什么是 CAS 原理&#xff1a; CAS &#xff08;Compare-And-Swap&#xff09;是一种硬件级别的原子操作指令&#xff0c;在 Java 并发编程中常被用于实现无锁算法。其核心逻辑是&#xff1a;在进行数据更新时&#xff0c;会先将内存位置 V 的值与预期原值 A 进行比较&#x…...

【计算机网络】网络编程

文章目录 1. 客户端/服务器2. TCP/UDP协议3. 网络编程套接字-socket3.1 API的使用3.1 DatagramScoket类3.1 DatagramScoket类 4. 通过UDP实现回显服务器程序4.1 服务器代码4.2 客户端代码4.3 代码执行过程4.4 通过UDP实现翻译客户端 5. 通过TCP实现回显服务器5.1 服务器代码5.2…...

算法刷题整理合集(七)·【算法赛】

本篇博客旨在记录自已的算法刷题练习成长&#xff0c;里面注有详细的代码注释以及和个人的思路想法&#xff0c;希望可以给同道之人些许帮助。本人也是算法小白&#xff0c;水平有限&#xff0c;如果文章中有什么错误或遗漏之处&#xff0c;望各位可以在评论区指正出来&#xf…...

【开源宝藏】30天学会CSS - DAY6 第六课 流光文字动画

第 0 步&#xff1a;项目结构 lighting-text/├─ index.html└─ style.cssindex.html&#xff1a;包含列表 <ul>&#xff0c;其中每个 <li> 放一个字母或符号。style.css&#xff1a;设置背景、文字样式&#xff0c;以及关键帧动画&#xff08;lighting&#xf…...

C#与西门子PLC的六大通信库

C#与西门子PLC的六大通信库&#xff1a; 一、S7.NET S7.NET是一款开源的S7协议通信库&#xff0c;支持西门子S7通信。 二、Sharp7 Sharp7与S7.NET一样&#xff0c;是一款.NET版本的S7通信库。 三、Snap7 Snap7是一个开源的C通信库&#xff0c;支持西门子S7通信。 四、Prodave P…...

VScode

由于centos停止了维护 ,后面使用ubuntu 在Ubuntu中用vscode 充当记事本的作用 替代了centos中vim的作用 后面使用vscode编辑 vscode中继续使用makefile , xshell中的cgdb进行debug (半图形写 ,半命令行debug&&运行) 官网下载地址&#xff1a;https://code.visuals…...

Linux文件系统与磁盘管理

文件系统和磁盘管理是Linux系统管理的核心组成部分&#xff0c;直接影响系统的性能、数据安全性和存储效率。本文将从Linux文件系统的基本概念出发&#xff0c;深入探讨其架构、类型、管理工具以及实际操作技巧&#xff0c;帮助读者全面理解并掌握这一关键领域。 第一章&#x…...

【云馨AI-大模型】大模型的开发和应用中,Python、PyTorch和vLLM关系概括

说明 1. Python 定位&#xff1a;基础编程语言。作用&#xff1a;Python 是大模型生态系统的核心语言&#xff0c;几乎所有深度学习框架&#xff08;如 PyTorch、TensorFlow&#xff09;和工具链&#xff08;如 vLLM&#xff09;都通过 Python 接口提供服务。特点&#xff1a…...

AWS SAP学习笔记-概念

1、什么是ETL应用程序&#xff0c;举个例子说明&#xff1f; ETL&#xff08;Extract, Transform, Load&#xff09;应用程序是一种用于数据处理和迁移的工具或程序&#xff0c;它主要负责从多个数据源提取数据&#xff0c;对数据进行转换和清洗&#xff0c;然后将处理后的数据…...

kotlin知识体系(三) : Android Kotlin 中的函数式编程实践指南

前言 Kotlin以函数式编程革新了Android开发&#xff0c;通过高阶函数、扩展函数等特性&#xff0c;帮助开发者构建高可维护性代码。接下来我们来看一下Kotlin 中的函数式编程的各个特性。 1. 高阶函数与 Lambda 表达式&#xff1a;函数作为参数或返回值 在 Kotlin 中&#x…...

SpringBoot3+Vue3实战(Vue3快速开发登录注册页面并对接后端接口、表单项自定义校验规则、Hutool工具类)(4)

目录 一、SpringBoot3Vue3实现基本增删改查。前后端通信交互、配置后端跨域请求。数据批量删除。(博客链接) 二、SpringBoot3Vue3快速开发登录、注册页面并实现对接。 &#xff08;1&#xff09;操作数据表employee(员工信息表)。 <1>修改employee表的字段组成。 <2&g…...

OpenCV图像拼接项目指南

引言 图像拼接是计算机视觉领域中的一个重要应用&#xff0c;它可以将多张有重叠区域的图像拼接成一张全景图。这项技术广泛应用于虚拟现实、医学影像、卫星图像处理等领域。OpenCV作为一个强大的开源计算机视觉库&#xff0c;提供了丰富的工具和函数来实现图像拼接。本文将详…...

机器学习--DBSCAN聚类算法详解

目录 引言 1. 什么是DBSCAN聚类&#xff1f; 2. DBSCAN聚类算法的原理 3. DBSCAN算法的核心概念 3.1 邻域&#xff08;Neighborhood&#xff09; 3.2 核心点&#xff08;Core Point&#xff09; 3.3 直接密度可达&#xff08;Directly Density-Reachable&#xff09; 3…...

使用 Docker 构建 LangChain 开发环镜及 ChatOllama 示例

文章目录 Github官网简介Dockerfilerequirements.txt构建 LangChain 镜像ChatOllama 示例Ollama 示例模拟 tools Github https://github.com/langchain-ai/langchain 官网 https://python.langchain.com/docs/introduction/ 简介 LangChain 是一个用于构建 LLM 驱动的应用…...