文献分享: 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都不如,但我们就是牛逼

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38628.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Altium Designer数模电学习笔记

模电 电容 **退耦&#xff1a;**利用通交阻直&#xff0c;将看似直流的信号中的交流成分滤除 &#xff08;一般用在给MPU供电&#xff0c;尽量小一些&#xff0c;10nf~100nf~1uf以下&#xff09; **滤波&#xff1a;**也可以理解为给电容充电&#xff0c;让电容在电平为低时…

从指令集鸿沟到硬件抽象:AI 如何重塑手机与电脑编程语言差异——PanLang 原型全栈设计方案与实验性探索1

AI 如何跨越指令集鸿沟&#xff1f;手机与电脑编程语言差异溯源与统一路径——PanLang 原型全栈设计方案与实验性探索1 文章目录 AI 如何跨越指令集鸿沟&#xff1f;手机与电脑编程语言差异溯源与统一路径——PanLang 原型全栈设计方案与实验性探索1前言一、手机与电脑编程语言…

python 实现一个简单的window 任务管理器

import tkinter as tk from tkinter import ttk import psutil# 运行此代码前&#xff0c;请确保已经安装了 psutil 库&#xff0c;可以使用 pip install psutil 进行安装。 # 由于获取进程信息可能会受到权限限制&#xff0c;某些进程的信息可能无法获取&#xff0c;代码中已经…

C之(15)cppcheck使用介绍

C之(15)cppcheck使用介绍 Author: Once Day Date: 2025年3月23日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可查看专栏: Linux实践记录_Once_day的博客-CS…

Ant Design Vue Select 选择器 全选 功能

Vue.js的组件库Ant Design Vue Select 选择器没有全选功能&#xff0c;如下图所示&#xff1a; 在项目中&#xff0c;我们自己实现了全选和清空功能&#xff0c;如下所示&#xff1a; 代码如下所示&#xff1a; <!--* 参数配置 - 风力发电 - 曲线图 * 猴王软件学院 - 大强 …

CaiT (Class-Attention in Image Transformers):深度图像Transformer的创新之路

CaiT (Class-Attention in Image Transformers)&#xff1a;深度图像Transformer的创新之路 近年来&#xff0c;Transformers 模型在自然语言处理领域的成功逐渐扩展到了计算机视觉领域&#xff0c;尤其是图像分类任务中&#xff0c;Vision Transformer (ViT) 的提出打破了卷积…

Qt之MVC架构MVD

什么是MVC架构&#xff1a; MVC模式&#xff08;Model–view–controller&#xff09;是软件工程中的一种软件架构模式&#xff0c;把软件系统分为三个基本部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controll…

数组,指针 易混题解析(二)

目录 一.基础 1. 2. 二.中等 1. 坑 2. 3.指针1到底加什么 三.偏难 1.&#xff08;小端 x86&#xff09; 2.通过数组指针进行偏移的时候怎么偏移 3. 大BOSS &#xff08;1&#xff09;**cpp &#xff08;2&#xff09;*-- * cpp 3 &#xff08;3&#xff09;*c…

数据建模流程: 概念模型>>逻辑模型>>物理模型

数据建模流程 概念模型 概念模型是一种高层次的数据模型&#xff0c;用于描述系统中的关键业务概念及其之间的关系。它主要关注业务需求和数据需求&#xff0c;而不涉及具体的技术实现细节。概念模型通常用于在项目初期帮助业务人员和技术人员达成共识&#xff0c;确保对业务需…

spring-security原理与应用系列:建造者

目录 1.构建过程 AbstractSecurityBuilder AbstractConfiguredSecurityBuilder WebSecurity 2.建造者类图 SecurityBuilder ​​​​​​​AbstractSecurityBuilder ​​​​​​​AbstractConfiguredSecurityBuilder ​​​​​​​WebSecurity 3.小结 紧接上一篇文…

结合代码理解Spring AOP的概念(切面、切入点、连接点等)

前情回顾 对AOP的理解 我这篇文章介绍了为什么要有AOP&#xff08;AOP解决了什么问题&#xff09;以及如何实现AOP。但在实现AOP的时候&#xff0c;并未探讨AOP相关概念&#xff0c;例如&#xff1a;切面、切入点、连接点等。因此&#xff0c;本篇文章希望结合代码去理解Spring…

【AI大模型】搭建本地大模型GPT-NeoX:详细步骤及常见问题处理

搭建本地大模型GPT-NeoX:详细步骤及常见问题处理 GPT-NeoX是一个开源的大型语言模型框架,由EleutherAI开发,可用于训练和部署类似GPT-3的大型语言模型。本指南将详细介绍如何在本地环境中搭建GPT-NeoX,并解决过程中可能遇到的常见问题。 1. 系统要求 1.1 硬件要求 1.2 软…

Copilot提示词库用法:调整自己想要的,记住常用的,分享该共用的

不论你是 Microsoft 365 Copilot 的新用户还是熟练运用的老鸟&#xff0c;不论你是使用copilot chat&#xff0c;还是在office365中使用copilot&#xff0c;copilot提示词库都将帮助你充分使用copilot这一划时代的产品。它不仅可以帮助你记住日常工作中常用的prompt提示词&…

Spring:AOP

一、AOP概念的引入 为了更好地介绍AOP&#xff0c;我们以登录作为示例。 首先&#xff0c;我们先来看一下登录的原理&#xff1a; 如图所示&#xff0c;这是一个基本的登录原理图&#xff0c;但是如果我们想要在这个登录过程上再添加一些新的功能&#xff0c;比如权限校验&am…

Ubuntu实时读取音乐软件的音频流

文章目录 一. 前言二. 开发环境三. 具体操作四. 实际效果 一. 前言 起因是这样的&#xff0c;我需要在Ubuntu中&#xff0c;实时读取正在播放音乐的音频流&#xff0c;然后对音频进行相关的处理。本来打算使用的PipewireHelvum的方式实现&#xff0c;好处是可以直接利用Helvum…

CUDA 学习(4)——CUDA 编程模型

CPU 和 GPU 由于结构的不同&#xff0c;具有不同的特点&#xff1a; CPU&#xff1a;擅长流程控制和逻辑处理&#xff0c;不规则数据结构&#xff0c;不可预测存储结构&#xff0c;单线程程序&#xff0c;分支密集型算法GPU&#xff1a;擅长数据并行计算&#xff0c;规则数据结…

前端会话控制技术:cookie/session/token

目录 前端中的 Cookie、Session 和 Token&#xff1a;详解与应用1. Cookie1.1 什么是 Cookie&#xff1f;1.2 Cookie 的工作原理1.3 Cookie 的特点1.4 Cookie 的用途1.5 Cookie 的安全性 2. Session2.1 什么是 Session&#xff1f;2.2 Session 的工作原理2.3 Session 的特点2.4…

MATLAB实现基于“蚁群算法”的AMR路径规划

目录 1 问题描述 2 算法理论 3 求解步骤 4 运行结果 5 代码部分 1 问题描述 移动机器人路径规划是机器人学的一个重要研究领域。它要求机器人依据某个或某些优化原则 (如最小能量消耗&#xff0c;最短行走路线&#xff0c;最短行走时间等)&#xff0c;在其工作空间中找到一…

Shopify Checkout UI Extensions

结账界面的UI扩展允许应用开发者构建自定义功能&#xff0c;商家可以在结账流程的定义点安装&#xff0c;包括产品信息、运输、支付、订单摘要和Shop Pay。 Shopify官方在去年2024年使用结账扩展取代了checkout.liquid&#xff0c;并将于2025年8月28日彻底停用checkout.liquid…

电阻的阻值识别

电阻买回来是有偏差的&#xff0c;不同的电阻种类&#xff0c;它的偏差大小会不一样&#xff0c;偏差越小的肯定越贵 主要看要求的精度要求是否越高 色环电阻或者说插件电阻 用来读数的几个色环它是比较靠近的&#xff0c;精度的色环跟用来读数的几个色环的间距会大一点点。 间…