O1 Embedder:让检索器思考后再行动
25年2月来自中科大和北京智源研究院的论文“O1 Embedder: Let Retrievers Think Before Action”。
大语言模型 (LLM) 的功能日益强大,彻底改变人们获取和利用信息的方式。值得注意的是,LLM 擅长执行细粒度数据表示,这有助于精确检索信息。它们还可以根据外部参考生成高质量的答案,从而产生有用的知识。最近推出的推理模型(如 OpenAI O1 和 DeepSeek R1)标志着又一次飞跃,凸显 LLM 在提供最终答案之前进行渐进式思考的能力。这一突破显著提高处理复杂任务(例如编码和数学证明)的能力。
本文旨在为检索模型开发类似的功能,这对解决该领域的关键挑战大有裨益,包括多任务检索、零样本检索以及需要对复杂关系进行深入推理的任务。基于此,提出 O1 Embedder,在对目标文档进行检索之前,会先为输入查询生成有用的想法。为了实现这一目标,首先设计一个数据合成工作流程,通过从 LLM 专家那里生成初步想法,然后使用一个检索委员会对其进行细化,为 O1 Embedder 创建训练信号。其次,优化训练过程,使预训练模型能够联合微调,通过行为克隆生成检索想法,并通过对比学习执行密集检索。该方法通过全面的实验进行评估,在 12 个流行数据集上取得实质性的改进,涵盖域内和域外场景。
信息检索 (IR) 是许多重要应用的基础,例如搜索引擎和问答系统 [23, 24]。最近,它引起更高的关注,因为它在用外部知识增强大语言模型 (LLM) 方面发挥着关键作用 [36, 67, 69],这种范例称为检索增强生成 (RAG) [12, 65, 66]。在过去十年中,IR 技术取得巨大进步。一个重要的突破是密集检索,其中可以通过向量搜索有效地检索相关数据。随着该领域开源模型的流行 [40, 55, 61],密集检索已成为现实中实现检索应用的首选。
密集检索
密集检索在基础模型和训练技术的进步推动下,在检索精度方面取得重大进展。早期的突破包括对密集检索的初步预训练模型(如 BERT 和 RoBERTa [8, 34])进行微调,这些模型已经表现出与 BM25 等传统方法相比具有竞争力的性能。同时,由于采用多语言 [4, 20] 和多模态预训练模型 [56, 68],密集检索的范围得到大幅扩展。更先进的训练策略的引入,如面向检索的自适应 [35, 53, 60]、难负样本挖掘 [62]、批次量扩展 [42] 和来自交叉编码器的知识蒸馏 [17],不断促进密集检索性能的提高。
除了提高检索准确率外,开发用于通用检索应用的多任务检索器,也越来越受到重视。最近的研究表明,通过扩大训练规模 [45] 和模型架构 [41] 可以大幅提升检索器的泛化能力。基于这些启发,人们对预训练和微调任务进行显著扩展,出现一系列流行的通用检索器,如 BGE、E5 和 GTE [33, 52]。同时,人们还引入大语言模型 (LLM) 作为检索器的骨干,带来了检索性能的显著提升。例如,RepLLaMA 通过直接微调预训练的 Llama [55] 提出一个强大的密集检索器。Llama2Vec 通过结合对预训练的 Llama 的无监督自适应进一步增强 RepLLaMA [28]。 Promptriver [58] 建立在 RepLLaMA 之上,为检索模型提供遵循指令的能力。NV-Embed 和 ICL-Embedder 等方法通过使用大量微调数据进行持续训练,实现进一步的改进 [26, 29]。如今,基于 LLM 的检索器几乎主导 IR 相关评估的所有主要基准测试。
尽管如此,密集检索在现阶段仍然受到许多限制。首先,现有方法在未见过的场景中难以完成零样本检索任务,这些场景与源域有很大不同。例如,来自一般数据集训练的嵌入模型在应用于专门问题(如医疗或法律案件检索)时容易出现性能受限的情况 [31, 39, 50]。其次,现有模型不足以区分复杂的关系,因为它们无法直接从语义含义中识别出来。例如,检索计算机程序的有用代码片段,或检索多跳推理问题的证据 [19, 27, 32, 63]。
上述挑战可以从先前的深度推理过程中受益,而不是直接判断相关性。最近,随着推理 LLM 的引入,例如 OpenAI O1、O3 和 DeepSeek R1 [14],在这个方向上取得显着的进步。具体来说,当出现复杂任务时,LLM 首先会被提示对问题产生长时思考。通过这一过程,LLM 可以逐步接近正确解决方案,从而最终产生高质量的答案。最近的研究将这一操作概念化为测试-时间规模化 [44],这推动解决复杂问题(例如编码和数学证明)的重大改进。
LLM 的推理能力
大语言模型 (LLM) 的推理能力已通过模拟类似人类的问题解决过程的技术得到显著增强。该领域的一个重大突破是思维链 (CoT) [57],它促使 LLM 通过将复杂问题分解为多个推理步骤来解决这些问题。在此基础上,自洽方法通过从 LLM 中抽取多条推理路径并通过多数表决选择最终答案来提高推理的鲁棒性 [9]。对于需要更多探索性推理的场景,思维树 (ToT) 方法 [64] 通过将问题解决过程构建为树来扩展 CoT。在每个节点,LLM 都会生成候选中间步骤,评估其可行性,并从死胡同回溯。进一步推进这一范式的是,思维图 (GoT) [2] 用有向无环图 (DAG) 取代树结构,使 LLM 能够根据需要合并或改进推理步骤。大语言模型 (LLM) 的推理能力或“三思而后行”工作流程代表了一种新范式,使其有别于传统语言模型。除了通常的扩展模型大小、数据集和训练计算的策略 [16, 22] 之外,推理计算规模化或测试-时间规模化[5, 43, 59] 成为推动 LLM 改进的另一个重要因素。最近具有推理能力的 LLM(例如 OpenAI 的 O1 和 O3、DeepSeek 的 R1 [14] 和 Gemini 2.03)显著增强并展示这种能力。这些模型在处理复杂问题时采用“慢思考”方法:它们不会立即提供答案,而是先生成冗长的结构化推理,然后再得出最终解决方案。这种方法使 LLM 在编码和数学证明等领域实现精英级的性能。
推理能力在应对传统检索方法带来的挑战方面也具有显著优势。然而,当前的嵌入模型主要侧重于生成有判别力的数据表示,这使得推理能力的开发在很大程度上尚未得到探索。
O1 Embedder,就是在目标文档检索中引入类似于 LLM 嵌入模型的慢速思考能力,如图所示:

密集检索基于查询和文档的嵌入相似性来衡量查询和文档之间的相关性。给定查询 𝑞 和文档 𝑑,使用嵌入模型(M)将它们编码为潜表示 𝒗_𝑞 和 𝒗_𝑑:𝒗_𝑞 ← M(𝑞),𝒗_𝑑 ← M(𝑑)。要从海量数据集 𝐷 中检索相关文档 𝑑∗,需要满足以下最近邻(NN)条件:𝑑∗ = argmax. {⟨𝒗_𝑞, 𝒗_𝑑⟩ | 𝑑 ∈ 𝐷}。
本文方法通过将思考操作引入嵌入模型来解决上述挑战。也就是说,嵌入模型 M 配备两个功能:思考 M.think(·) 和嵌入 M.embed(·)。对于输入查询 𝑞,嵌入模型首先生成满足查询信息需求的想法 (𝑡):𝑡_𝑖 ← M.think(𝑞),𝑖 = 1,…,𝑘。通过揭示与相关文档的关键语义匹配模式,生成的想法有望促进复杂查询的检索过程。在这里,总共针对查询独立生成 𝑘 个想法,这使得有用的模式能够得到全面覆盖。在嵌入模型 M 和聚合函数 Agg 的基础上,将查询及其想法联合转化为统一的嵌入,称为想法增强嵌入(𝒗ˆ_𝑞):𝒗ˆ_𝑞 ←Agg.(𝑞, {𝑡_𝑖}𝑘; M.embed)。
因此,使用想法增强嵌入来计算查询和文档之间的相关性:⟨𝒗ˆ_𝑞, 𝒗_𝑑 ⟩。最后,问题被表述为模型 M 思维和嵌入能力的联合训练,从而优化端到端的检索性能。
O1 Embedder 的训练涉及两种类型的数据。一种用于嵌入功能,由查询及其相关文档组成,即 q-doc 元组。另一种用于思考功能,包括查询及其想法,即 q-thought 元组。与广泛存在的 q-doc 元组不同,现实中没有可用的 q-thought 元组。为了解决这个问题,提出一个数据合成流水线,利用 LLM 现成的推理能力来生成此类数据集。该方法遵循“探索-细化”工作流程,如图所示。首先,用 LLM 来探索给定查询 𝑞 的候选想法。为了方便从 LLM 进行正确的生成,系统提示采用以下模板制定,其中结合指令和示例:Prompt = Task:{Ins};Example:{E};Query:{q} 。

指令用于明确声明思考任务的需求;例如,“思考一个合理的响应来处理查询”。同时引入示例来演示理想输出的形式。在这里,从 q-doc 数据集的训练集中随机选择 𝑚 个样本:E = {Query:𝑞_𝑖,Response:𝑑_𝑖}_𝑚。
注:尽管查询 𝑞 的相关文档 𝑑 看起来像是一个微不足道的解决方案,但它不适合用作想法。这是因为生成的想法将进一步用于嵌入任务,其目标是基于想法增强嵌入来区分相关文档 𝑑。如果使用 𝑑(或其任何重新表述的版本),训练过程将被规避,最终导致嵌入任务崩溃。
由于 LLM 可能产生幻觉,生成的想法可能并不总是能提高检索性能。为了确保包含有用的想法,探索过程会重复多次,为给定的输入查询生成几个独立的想法。为了识别最有用的想法,引入质量控制机制来过滤生成的候选。具体来说,使用一组多样化的检索器,表示为 𝑅。
对于每个检索器 𝑟 ∈ 𝑅,计算相关文档 𝑑 和想法 𝑡_𝑖 之间的相似度得分:𝜎^𝑟(𝑡_𝑖,𝑑)。每个检索器选择相似度得分最高的想法,即 𝑡_𝑟∗ ← argmax({𝜎^𝑟(𝑡_𝑖,𝑑)}_i = 1,…,k)。最后,进行多数投票过程以确定最有用的想法。从检索器获得最多提名的想法被选为最终结果:𝑡 ← voting{𝑡_𝑟∗}_𝑟 ∈ 𝑅。
通过将上述数据合成工作流程应用于现有的 q-doc 数据集:𝐷 = {(𝑞_𝑖,𝑑_𝑖)}_𝑁 ,可以获得由 q-thought-doc 三元组组成的想法增强数据集:𝐷ˆ = {(𝑞_𝑖, 𝑡_𝑖, 𝑑_𝑖)}_𝑁 ,它提供最佳检索效用的长时思考。
如下图是数据生产过程中概述的算法流程:对于数据集中的每个查询-文档对(𝑞_𝑖 ,𝑑_𝑖 ),算法首先从 𝐷 中采样 𝑚 个示例以创建提示,其中包含具体指令。然后,它通过使用采样示例格式化提示来生成 𝑘 个候选想法 𝑡_𝑗。接下来,对于每个检索模型 𝑟 ,它计算候选想法与文档 𝑑_𝑖 之间的相似度得分,选择得分最高的想法作为 𝑡_𝑟∗。最后,该算法通过多数投票机制,汇总这些顶级想法以确定最终想法 𝑡_𝑖 。然后构建增强数据集 𝐷ˆ,包括原始查询、生成的想法及其对应的肯定文档。

O1 embedder 建立在预训练的 LLM 之上,利用模型固有的生成和推理能力。此外,LLM 还显示出作为判别嵌入模型进行微调的强大潜力 [37, 70]。对预训练的 LLM 主干应用以下的多任务训练,该主干通过监督行为克隆建立其思维能力,并通过对比学习建立嵌入能力。
行为克隆。通过监督微调,训练基础模型为输入查询生成想法。给定 q-thought-doc 三元组的数据集:D^ = {(q_i, t_i, d_i)}_N,训练样本 x_i 用以下模板制定:x_i = q_i t_i ,其中 、、 分别是 token 查询、思想和生成完成的特殊 token。通过上述训练样本的制定,模型针对以下生成损失进行微调:

其中,从思考的开头开始,每个 token 的下一个 token 预测损失都最小化(即 𝑗 ≥ |𝑞_𝑖 |)。
对比学习。预训练的 LLM 也经过微调,根据其生成的嵌入将相关文档与查询区分开来。传统上,基于 LLM 的embedder 使用 token 进行文本嵌入。然而,在本文方法中, token 已被指定为指示生成过程的完成。因此,加入额外的嵌入任务可能会导致训练过程崩溃。为了避免两个并行训练任务之间的相互干扰,用另一个特殊 token 并将其附加到输入 𝑥 的末尾(在 之后)来计算文本嵌入:v_x ← LLM(𝑥; )[−1]。
这个简单的修改大大提高兼容性,这对于维持联合训练过程的成功运行至关重要。考虑到人们可能希望利用想法增强嵌入来处理复杂的检索任务,同时仍然依赖基本查询嵌入来处理简单的检索任务,并行生成两种形式的查询嵌入来识别相关文档 𝑑_𝑖。因此,执行以下复合对比学习,其中分别基于每个训练样本的查询和想法增强查询计算两个对比损失:

此处,𝑞ˆ_𝑖 表示想法增强查询:𝑞ˆ_𝑖 ← 𝑞_𝑖 + 𝑡_𝑖 ,而 𝐷′ 代表负样本集合,包括批次内负样本和由预训练 embedder 引入的难负样本。
联合训练。该模型经过训练以最小化生成损失和对比损失的线性组合。为了在下游场景中实现精确检索,必须使用较大的训练批次进行对比学习。然而,两个训练任务的本机并行运行需要大量 GPU 内存,这严重限制可实现的批次大小。为了应对这一挑战,提出一种内存高效的联合训练来处理这两项任务(如图所示)。具体来说,对于每个训练样本 𝑥_𝑖 = (𝑞_𝑖, 𝑡_𝑖, 𝑑_𝑖),对其进行一次编码,并在两个任务之间共享编码结果。生成损失是根据来自 𝑡_𝑖 token 的每个输出嵌入计算的;而对比损失是根据来自 token 的输出嵌入得出的。这使得生成任务在与对比学习任务一起训练时,几乎不消耗额外内存,从而能够大幅增加批量大小。

训练的 O1 embedder M 通过思考和嵌入应用于检索任务。首先,促使 O1 embedder 针对输入查询产生多个想法,全面揭示查询的隐藏信息需求:𝑡_𝑖 ←M.think(q), 𝑖 = 1,…,𝑘。接下来,对经过想法增强的查询进行独立编码和聚合。在这里,简单地采用均值池化作为聚合函数,它会产生以下经过想法增强的嵌入:

最后,根据与 𝒗ˆ_𝑞 的嵌入相似性检索前 N 个文档 𝐷∗:𝐷∗ ← top-N({⟨𝒗ˆ_𝑞, 𝒗_𝑑⟩|𝐷})。
数据集。O1 embedder 由从 MS MARCO(段落检索)数据集 [1] 创建的想法增强查询训练而成。训练的模型基于域内和域外数据集进行评估。对于域内评估,用 MS MARCO (dev)、TREC DL19 [7] 和 TREC DL20 [6] 数据集。对于域外评估,结合来自 BEIR [47] 以下八个问答数据集,包括 SciFact [51]、TREC-COVID [50]、DBpedia [15]、NQ [25]、HotPotQA [63]、FiQA [39]、Touche [3]、FEVER [48],以及一个流行的代码搜索数据集:CosQA [18]。所有这些数据集都包含非对称检索任务,其中查询和文档以非常不同的形式呈现。因此,通过适当的推理,可以更有效地识别查询和文档之间的关系。排除常见的解释数据集,例如 Quora,因为它们仅涉及简单的相似性比较。根据先前的研究 [38、58],用 MRR@10 和 Recall@1k 作为 MS MARCO 相关任务的指标,并使用 NDCG@10 作为其他数据集的指标。对 分布外(o.o.d. )数据集的评估严格遵守 BEIR 协议,该协议禁止针对特定任务进行微调。
基线。选择各种流行的检索器作为基线,例如常用的稀疏检索方法 BM25,以及 ANCE [62]、TAS-B [17]、coCondenser [10]、SimLM [53],它们使用 MS MARCO 数据集对基于 BERT 预训练模型进行微调。还介绍基于 LLM 的方法,包括 RepLLaMA [54] 和 Promptriver [58]。RepLLaMA 对 MS MARCO 上预训练的 LLM 进行微调,从而在各种下游任务中实现卓越的检索性能。而 Promptriever 则以 RepLLaMA 为基础,增强模型的指令跟随能力,从而在专门提示的基础上进一步提高检索性能。这两种基于 LLM 的方法都是从同一个预训练主干网络 (Llama-2-7B) 进行微调的,作为默认设置,从而确保在模型规模方面进行公平的比较。注:在评估中排除其他几种流行的检索器,包括 BGE [61]、E5 [52]、M3 [4] 和最近基于 LLM 的方法,如 E5-Mistral [55]、ICL-Embedder [30] 和 NV-Embed [26]。这些模型使用的训练数据远远超过 MS MARCO(本文方法和所包含基线使用的唯一训练数据集),其中许多与 BEIR 上的评估任务有很大的重叠。这种重叠使得难以评估分布外 (o.o.d.) 设置中的零样本检索性能。此外,这些方法依赖于不同的训练数据集,这使得无法进行公平的比较。
实施细节。在数据准备阶段,用强大的开源 LLM:Llama-3.1-70B-Instruct4 来生成候选想法。用 BM25、BGE-EN-large-v1.5、GTE-large 和 Stella-EN-1.5B-v5 为这个检索委员会服务。评估主要基于 Llama-2-7B 主干 [49],并在扩展研究中分析其他替代 LLM。训练过程遵循 RepLLaMA 的方案 [38],其中 LLM 的所有投影层 (q_proj k_proj v_proj o_proj gate_proj down_proj up_proj) 都通过 LoRA 进行微调,等级设置为 32,alpha 设置为 64。用 BF16 进行训练,学习率设置为 1 × 10−4。训练过程在 8xA800 GPU 上进行,批量大小设置为 64(每台设备 8 个)。为每个查询引入 15 个难负样本。最大查询长度设置为 32,最大段落长度设置为 192。最大 token 数设置为 256,用于想法生成。
相关文章:
O1 Embedder:让检索器思考后再行动
25年2月来自中科大和北京智源研究院的论文“O1 Embedder: Let Retrievers Think Before Action”。 大语言模型 (LLM) 的功能日益强大,彻底改变人们获取和利用信息的方式。值得注意的是,LLM 擅长执行细粒度数据表示,这有助于精确检索信息。它…...
【UCB CS 61B SP24】Lecture 4 - Lists 2: SLLists学习笔记
本文内容为重写上一节课中的单链表,将其重构成更易于用户使用的链表,实现多种操作链表的方法。 1. 重构单链表SLList 在上一节课中编写的 IntList 类是裸露递归的形式,在 Java 中一般不会这么定义,因为这样用户可能需要非常了解…...
Ubuntu系统3分钟本地部署DeepSeek-R1蒸馏模型,支持联网
本文提供Ubuntu ollama Page Assist,3步快速安装DeepSeek-R1蒸馏模型,支持联网,支持API。 目录 DeepSeek-R1安装分3步: Step 1, 安装ollama(已安装可忽略) Step 2, 下载DeepSeek-R1模型 Step 3, 从…...
Linux按照日期定时删除elasticsearch索引
使用sh脚本删除 searchIndexfilebeat elastic_url192.168.98.136 elastic_port9200 saveday7date2stamp () {date --utc --date "$1" %s }dateDiff (){case $1 in-s) sec1; shift;;-m) sec60; shift;;-h) sec3600; shift;;-d) sec86400; shift;;…...
谷粒商城—分布式高级②.md
认证服务 1. 环境搭建 创建gulimall-auth-server模块,导依赖,引入login.html和reg.html,并把静态资源放到nginx的static目录下 2. 注册功能 (1) 验证码倒计时 //点击发送验证码按钮触发下面函数 $("#sendCode").click(function () {//如果有disabled,说明最近…...
向量的点乘的几何意义
源自AI 向量的点乘(Dot Product)在几何和图形学中有重要的意义。它不仅是数学运算,还可以用来描述向量之间的关系。以下是点乘的几何意义及其应用: 1. 点乘的定义 对于两个向量 a 和 b,它们的点乘定义为:…...
Python Cookbook-2.2 写入文件
任务 写入文本或者二进制数据到文件中。 解决方案 下面是最方便的将一个长字符串写人文件的办法: open(thefile.txt,w).write(all_the_text)#写入文本到文本文件 open(abinfiler,wb).write(all_the_data)#写入数据到二进制文件不过,最好还是给文件对象指定个名字…...
机器学习,我们主要学习什么?
机器学习的发展历程 机器学习的发展历程,大致分为以下几个阶段: 1. 起源与早期探索(20世纪40年代-60年代) 1949年:Hebb提出了基于神经心理学的学习机制,开启了机器学习的先河1950年代:机器学习的…...
Unreal5从入门到精通之在编辑器中更新 UserWidgets
前言 在虚幻中创建越来越复杂和灵活的 UserWidget 蓝图时,一个问题是它们在编辑器中的外观与它们在游戏中的最终外观可能有很大不同。 库存面板示例 假设你想创建一个通用的库存显示小部件。我们可以在整个 UI 中使用它,无论我们需要在哪里显示某些内容。 标题,描述所显示…...
C语言-----操作符的分类
1. 操作符的分类 •算术操作符: 、- 、 * 、/、% 移位操作符:<< >> 位操作符: & | ^ 赋值操作符: / 、 % 、 、- 、 *、/、 %、 <<、 >>、&、| 、 ^ 单⽬操作符:!、 、- 、 & 、 * 、 、 …...
mac os设置jdk版本
打开环境变量配置文件 sudo vim ~/.bash_profile 设置不同的jdk版本路径 # 设置JAVA_HOME为jdk17路径 export JAVA_HOME$(/usr/libexec/java_home -v 17)# 设置JAVA_HOME为jdk8路径 export JAVA_HOME$(/usr/libexec/java_home -v 1.8) 设置环境变量 # 将jdk加入到环境变量…...
深入理解WebSocket接口:如何使用C++实现行情接口
在现代网络应用中,实时数据传输变得越来越重要。通过WebSocket,我们可以建立一个持久连接,让服务器和客户端之间进行双向通信。这种技术不仅可以提供更快的响应速度,还可以减少不必要的网络流量。本文将详细介绍如何使用C来实现We…...
PWM(脉宽调制)技术详解:从基础到应用实践示例
PWM(脉宽调制)技术详解:从基础到应用实践示例 目录 PWM(脉宽调制)技术详解:从基础到应用实践示例学前思考:一、PWM概述二、PWM的基本原理三、PWM的应用场景四、PWM的硬件配置与使用五、PWM的编程…...
Mybatis的#{}和${}
#{}:预编译语句,用?对参数位置进行一个占位的操作,在数据库生成一个模版,等待后续填充.也可以推测出#在生成模版后的性能是比$快的. ${}:即时语句,提前的吧参数填充进去,在MySQL里就是一个完整的SQL语句. 填充逻辑不同 #{}会给String类型的参数自动的加上双引号,而${}则是直…...
【零基础实战】STM32控制DRV8833电机驱动详解
系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 一、DRV8833模块简介二、STM32选型建议三、硬件连接详解1. 接线示意图2. 电源注意事项 四、核心控制原理1. PWM调速原…...
AI智能成长系统 | 应用探讨研究
研究背景 在现代家庭中,三岁宝宝的成长环境日益复杂。由于宝宝每天接触的人群多样,包括家庭成员、同龄小朋友以及可能的陌生人,其语言环境也相应地变得复杂多变。这种环境下,宝宝很容易接触到一些不适宜的语言,即俗称…...
java 网络安全感知 网络安全学java
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 实验五 java网络编程及安全 实验内容 1.掌握Socket程序的编写;2.掌握密码技术的使用;3.设计安全传输…...
VisionMaster4.4 python脚本 图像处理 转换函数 爱之初体验
最近有接触过一丢丢VM4.3的模块开发. 一直有把python图像处理部分模块移植进来的打算 不过时间不够没来得及折腾.偶尔发现4.4支持py脚本 于是拿来折腾.一下午. 发现4.4支持python脚本,好开心. 首先安装VM4.4 注意一定要是4.4 打开后拖了一个模块. 但是发现import numpy imp…...
Node.js 中的 fs 模块详解
fs(File System)模块是 Node.js 的核心模块之一,用于处理文件系统的操作,包括文件的读取、写入、删除、重命名等。它提供了同步和异步两种操作方式,适用于不同的场景。 1. 前置知识 1.1 文件系统 文件系统是操作系统…...
debezium专栏文章目录
debezium专栏文章目录 第一阶段:基础认知篇 CDC革命:为什么说Debezium改变了数据流动方式? 对比Log-Based/Trigger-Based/Query-Based CDC方案Debezium在数据管道中的战略价值 5分钟部署你的第一个Debezium连接器 使用Docker Compose快速搭…...
python-leetcode 40.二叉树的层序遍历
题目: 给定二叉树的根节点root,返回其节点值得层序遍历(即逐层从左到右访问所有节点) 方法:广度优先搜索 # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNon…...
蓝桥杯学习大纲
(致酷德与热爱算法、编程的小伙伴们) 在查阅了相当多的资料后,发现没有那篇博客、文章很符合我们备战蓝桥杯的学习路径。所以,干脆自己整理一篇,欢迎大家补充! 一、蓝桥必备高频考点 我们以此为重点学习…...
小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025)
小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025) 本文内容需要你有一定的 Linux 操作基础,最好是程序员那种,英文水平足够用才行。一般人不需要使用这么复杂的路由器操作系统,…...
Debezium 报错:“The db history topic is missing” 的处理方法
Debezium 报错:“The db history topic is missing” 的处理方法 一、引言 在使用 Debezium 进行数据同步时,可能会遇到一个常见的错误:“The db history topic is missing”。这个错误表明 Debezium 无法找到或访问其数据库历史记录主题(db history topic),这通常是由…...
水基试剂,湿式化学,清水,干式化学,干粉,卤烃清洁剂,二氧化碳灭火器UL8检测报告标准讲解:
水基试剂,湿式化学,清水,干式化学,干粉,卤烃清洁剂,二氧化碳灭火器UL检测报告标准讲解: 本政策涵盖的灭火器 水基试剂灭火器 水基试剂灭火器使用水基试剂带走燃烧三要素中的热量要素…...
YOLOv11-ultralytics-8.3.67部分代码阅读笔记-build.py
build.py ultralytics\data\build.py 目录 build.py 1.所需的库和模块 2.class InfiniteDataLoader(dataloader.DataLoader): 3.class _RepeatSampler: 4.def seed_worker(worker_id): 5.def build_yolo_dataset(cfg, img_path, batch, data, mode"train"…...
Windows隐藏窗口/开机自启动
目录 使用Start-Process命令控制窗口状态 设置程序开机自启动 使用Start-Process命令控制窗口状态 隐藏窗口运行程序 使用Start-Process命令时,可以通过-WindowStyle Hidden参数让程序在后台运行,窗口不可见。例如: Start-Process D:\note…...
汽车免拆诊断案例 | 2010 款路虎揽胜车空调偶尔出风异常
故障现象 一辆2010款路虎揽胜车,搭载5.0 L发动机,累计行驶里程约为16万km。车主反映,接通空调开关后,有时出风忽大忽小,有时不出风,有时要等2 min左右才出风;有时两三天出现一次,…...
文件IO(20250217)
1. 文件IO 系统调用Linux内核提供的文件操作接口 1. 打开文件 open 2. 读写文件 read/write 3. 关闭文件 close 1.1 open函数 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int open(const char *pathname, int flags); int ope…...
Mac arm架构使用 Yarn 全局安装 Vue CLI
dgqdgqdeMacBook-Pro spid-admin % vue --version zsh: command not found: vue要使用 Yarn 安装 Vue CLI,你可以执行以下命令: yarn global add vue/cli这个命令会全局安装 Vue CLI,让你可以使用 vue 命令创建、管理 Vue.js 项目。以下是一…...
