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

Elasticsearch:使用经过训练的 ML 模型理解稀疏向量嵌入

作者:来自 Elastic Dai Sugimori

了解稀疏向量嵌入,理解它们的作用/含义,以及如何使用它们实现语义搜索。

Elasticsearch 提供语义搜索功能,允许用户使用自然语言进行查询并检索相关信息。为此,目标文档和查询必须首先通过嵌入过程转换为向量表示,该过程由在 Elasticsearch 内部或外部运行的经过训练的机器学习 (ML) 模型处理。

由于选择好的机器学习模型对于大多数搜索用户来说并不容易,因此 Elastic 推出了一个名为 ELSER (Elastic Learned Sparse EncodeR) 的自制 ML 模型。它与 Elasticsearch 捆绑在一起,因此他们可以根据白金许可开箱即用(请参阅订阅页面)。它是一种广泛使用的实现语义搜索的模型。与许多其他生成 “密集向量” 的模型不同,ELSER 生成的是 “稀疏向量”,它们以不同的方式表示嵌入。

虽然稀疏向量模型在许多用例中都有效,但直到 Elasticsearch 和 Eland 8.16 版本,只有密集向量模型才能上传到 Elasticsearch。但是,从 8.17 版开始,你现在也可以使用 Eland 的 eland_import_hub_model CLI 上传稀疏向量模型。这意味着你可以使用 Hugging Face 中的模型(而不仅仅是 ELSER)生成稀疏向量嵌入。

在本文中,我想回顾一下稀疏向量与密集向量的比较,并介绍如何从外部上传它们以在 Elasticsearch 中使用。

什么是稀疏向量?

密集向量和稀疏向量有什么区别?让我们从密集向量开始,密集向量在当今的搜索中更常用。

密集向量 - dense vector

当文本嵌入为密集向量时,它看起来像这样:

[0.13586345314979553,-0.6291824579238892,0.32779985666275024,0.36690405011177063,...
]

密集向量的主要特征:

  • 向量具有固定维度。
  • 每个元素都是浮点数。
  • 每个元素都代表一些特征,但它们的含义不易被人类解释。
  • 大多数元素具有非零值。

如果输入文本的含义相似,ML 模型(尤其是基于 transformer 的模型)将产生几何相似的向量。相似度由一些不同的函数计算,例如余弦、l2_norm 等。

例如,如果我们嵌入单词 “cat” 和 “kitten”,它们的向量在向量空间中会彼此接近,因为它们具有相似的语义含义。相反,“car” 的向量会更远,因为它代表一个完全不同的概念。

Elasticsearch:语义搜索 - Semantic Search in python_python 语义查询 开源-CSDN博客

Elastic 有许多关于向量搜索的有趣文章。如果你有兴趣了解更多信息,请参考它们:

  • 向量搜索快速入门 - Elasticsearch Labs
  • 探索 Elastic 向量数据库 - Elasticsearch Labs
  • 向量相似度技术和评分 - Elasticsearch Labs

稀疏向量 - sparse vector

相比之下,稀疏向量具有不同的结构。它们不是为每个维度分配一个值,而是主要由零组成,只有少数非零值。稀疏向量表示如下所示:

{"f1":1.2,"f2":0.3,… }

稀疏向量的主要特征:

  • 向量中的大多数值都是零。
  • 它们通常存储为键值对,而不是固定长度的数组,其中只记录非零值。
  • 具有零值的特征永远不会出现在稀疏向量表示中。
  • 表示更具可解释性,因为每个键(特征)通常对应于一个有意义的术语或概念。

BM25 和稀疏向量表示

BM25 是一种著名的词汇搜索排名函数,它使用文本的稀疏向量表示,即术语向量。在此表示中,文档中的每个术语(称为标记或单词)都根据其在语料库(一组文档)中的频率和重要性分配权重。此方法通过将查询术语与文档术语匹配来实现高效检索。

更多阅读,请参阅 “Elasticsearch:分布式计分 - TF-IDF”。

词汇搜索 vs. 语义搜索

BM25 是词汇搜索的一个示例,其中匹配基于在文档中找到的精确术语。它依赖于从语料库的词汇中派生的稀疏向量表示。

另一方面,语义搜索超越了精确术语匹配。它使用向量嵌入来捕获单词和短语的含义,即使它们不包含精确的查询术语,也可以检索相关文档。

此外,Elasticsearch 可以做更多。你可以将这两个搜索合并为一个查询作为混合搜索。请参阅以下链接以了解更多信息。

  • 当混合搜索真正大放异彩时 - Elasticsearch Labs
  • 具有多个嵌入的混合搜索:有趣且毛茸茸的猫咪搜索! - Elasticsearch Labs
  • 混合搜索:结合全文和 kNN 结果 - Elasticsearch Labs
  • 混合搜索:结合全文和 ELSER 结果 - Elasticsearch Labs
  • 教程:使用 semantic_text 进行混合搜索 | Elasticsearch 指南 | Elastic

语义搜索中的密集和稀疏向量

语义搜索可以同时利用密集和稀疏向量:

  • 密集向量模型(例如基于 BERT 的模型)将语义含义编码为固定长度的向量,从而实现基于向量距离的相似性搜索。
  • 稀疏向量模型(例如 ELSER)在保留可解释性的同时捕获语义含义,通常利用基于术语的权重。

借助 Elasticsearch 8.17,你现在可以上传和使用密集和稀疏向量模型,从而让你能够更灵活地实施满足你需求的语义搜索。

为什么是稀疏向量?

稀疏向量在 Elasticsearch 中具有多种优势,在某些情况下,它们可以成为密集向量的有力替代品。例如,密集向量 (knn) 搜索要求使用用户正在使用的领域的良好/足够的语料库来学习模型。但要拥有适合你用例的模型并不总是那么容易,而对大多数用户来说,微调模型甚至更难。在这种情况下,稀疏向量模型将为你提供帮助。让我们来了解一下原因。

适合零样本学习

稀疏向量,尤其是由 ELSER 等模型生成的稀疏向量,可以很好地推广到新领域,而无需进行大量微调。与通常需要特定领域训练的密集向量模型不同,稀疏向量依赖于基于术语的表示,这使得它们更适合零样本检索 - 模型可以处理尚未明确训练的查询。

资源效率

稀疏向量本质上比密集向量更节省资源。由于它们主要包含零,并且仅将非零值存储为键值对,因此它们需要较少的内存和存储空间。

Elasticsearch 中的稀疏向量

Elasticsearch 最初使用 rank_features 查询支持稀疏向量搜索。但是,随着最近的进步,稀疏向量搜索现在可以通过 sparse_vector 查询原生实现,从而更好地与 Elasticsearch 的机器学习模型集成。

与 ML 模型集成

sparse_vector 查询旨在与在 Elasticsearch ML 节点上运行的经过训练的模型无缝协作。这允许用户动态生成稀疏向量嵌入并使用高效的相似性搜索检索相关文档。

利用 Lucene 的倒排索引

Elasticsearch 中稀疏向量的主要优势之一是它们利用 Lucene 的倒排索引 - 这与 Elasticsearch 快速且可扩展的搜索所采用的核心技术相同。

  • 资源效率:由于 Lucene 针对基于术语的索引进行了优化,因此稀疏向量可从高效的存储和检索中受益。
  • 成熟度:Elasticsearch 拥有完善且高度优化的索引系统,因此稀疏向量搜索非常适合其架构。

通过利用 Lucene 的索引功能,Elasticsearch 可确保稀疏向量搜索保持快速、可扩展且资源高效,使其成为实际搜索应用程序的不二之选。

使用 Hugging Face 中的首选模型实现稀疏嵌入

从 Elasticsearch 8.17 开始,只要使用受支持的标记化(tokenization)方法,你就可以使用 Hugging Face 中的任何稀疏向量模型。这可以更灵活地使用根据你的特定需求量身定制的模型来实现语义搜索。

Elasticsearch 目前支持以下稀疏和密集向量嵌入的标记化方法:

  • bert – 适用于 BERT 样式模型
  • deberta_v2 – 适用于 DeBERTa v2 和 v3 样式模型
  • mpnet – 适用于 MPNet 样式模型
  • roberta – 适用于 RoBERTa 样式和 BART 样式模型
  • xlm_roberta – 适用于 XLM-RoBERTa 样式模型
  • bert_ja – 适用于专门针对日语训练的 BERT 样式模型

有关受支持的标记化方法的完整列表,请参阅官方文档:Elasticsearch 参考:PUT 训练模型

如果你的模型的标记化可用,即使它不适用于非英语语言,你也可以选择它!以下是 Hugging Face 上可用的一些稀疏模型示例:

  • naver/splade-v3-distilbert
  • hotchpotch/japanese-splade-v2
  • aken12/splade-japanese-v3

使用 Hugging Face 稀疏向量模型的步骤

我们已经有一篇关于使用 ELSER 进行稀疏向量搜索的好文章。大部分步骤都相同,但如果你想使用 Hugging Face 的稀疏嵌入模型,则需要事先使用 Eland 将其上传到 Elasticsearch。

以下是在 Elasticsearch 上使用外部稀疏模型进行语义搜索的分步指南。

1. 找到一个稀疏向量模型

浏览 Hugging Face (huggingface.co) 以查找适合你用例的稀疏嵌入模型(sparse embedding model)。确保该模型使用上面列出的受支持的标记化方法之一。

让我们选择  “naver/splade-v3-distilbert” 模型作为稀疏嵌入模型的示例。

注意:Elastic 的 ELSER 模型深受 Naver 的 SPLADE 模型的启发。访问他们的网站以了解有关 SPLADE 的更多信息。

2. 将模型上传到 Elasticsearch

你需要安装 Eland,这是一个用于 Elasticsearch 中的 DataFrames 和机器学习的 Python 客户端和工具包。请注意,你需要 Eland 8.17.0 或更高版本才能上传稀疏向量模型。

python -m pip install eland

一旦在你的计算机上安装完毕,请使用 Eland 的 CLI 工具 (eland_import_hub_model) 将模型导入 Elasticsearch。

eland_import_hub_model \
--url "your.elasticsearch.host" \
--es-api-key "your_api_key" \
--hub-model-id naver/splade-v3-distilbert \
--task-type text_expansion \
--start

或者,如果你不想在本地安装 Eland,你可以对 Docker 执行相同的操作。

docker run -it --rm docker.elastic.co/eland/eland \
eland_import_hub_model \
--url "your.elasticsearch.host" \
--es-api-key "your_api_key" \
--hub-model-id naver/splade-v3-distilbert \
--task-type text_expansion \
--start

这里的关键点是,你需要将 text_expansion 设置为稀疏向量嵌入的任务类型,而不像将 text_embedding 设置为密集向量嵌入的任务类型。(仅供参考,有关于任务名称的讨论。)

3. 使用 sparse_vector 定义索引映射

创建一个具有 sparse_vector 字段的索引。

PUT sparse-test
{"mappings": {"properties": {"content_embedding": { "type": "sparse_vector" },"content": { "type": "text" }}}
}

需要注意的是,sparse_vector 字段类型以前称为 rank_features 字段类型。虽然它们之间没有功能差异,但为了清楚使用,你应该使用 sparse_vector 字段类型。

注意:Elastic 最近引入了一个 semantic_text 字段。它非常有用且易于实现的语义搜索。有关详细信息,请参阅本文。你可以将 semantic_text 字段用于相同目的,但为了专注于嵌入部分,我们现在使用 sparse_vector 字段。

4. 使用推理处理器创建摄取管道

文本信息需要先嵌入到稀疏向量中,然后再进行索引。这可以通过带有推理处理器的摄取管道来完成。

使用推理处理器创建摄取管道,该推理处理器引用你之前上传的模型。

PUT _ingest/pipeline/sparse-test-pipeline
{"processors": [{"inference": {"model_id": "naver__splade-v3-distilbert","input_output": [ {"input_field": "content","output_field": "content_embedding"}]}}]
}

5. 使用管道提取数据

使用我们创建的 “sparse-test-pipeline” 将文本数据提取到索引中,以便内容自动嵌入到稀疏向量表示中。

POST sparse-test/_doc/1?pipeline=sparse-test-pipeline
{"content": "Elasticsearch provides a semantic search feature that allows users to query in natural language and retrieve relevant information."
}

完成后,让我们检查一下它是如何被索引的。

GET sparse-test/_doc/1

它将像这样返回:

{"_index": "sparse-test","_id": "1","_source": {"content": "Elasticsearch provides a semantic search feature that allows users to query in natural language and retrieve relevant information.","content_embedding": {"software": 3.2601595,"web": 2.0722878,"browser": 1.8972412,"platform": 1.6211865,"java": 1.5984035,"sql": 1.5119768,"engine": 1.4900811,...},"model_id": "naver__splade-v3-distilbert"}
}

可以看到,输入文本 “Elasticsearch provides a semantic search feature that allows users to query in natural language and retrieve relevant information.” 嵌入为:

{"software": 3.2601595,"web": 2.0722878,"browser": 1.8972412,"platform": 1.6211865,"java": 1.5984035,"sql": 1.5119768,"engine": 1.4900811,...
}

如你所见,输入文本并未直接提及响应中列出的大多数单词,但它们在语义上看起来相关。这意味着,模型根据模型训练的语料库知道这些词的概念与输入文本相关。因此,这些稀疏嵌入的质量取决于你配置的 ML 模型。

使用语义查询进行搜索

现在,你可以使用 sparse_vector 查询对 “sparse-test” 索引执行语义搜索。我已将一些 Elastic 的博客内容导入到 sparse-test 索引中,让我们来测试一下。

GET sparse-test/_search
{"query":{"sparse_vector":{"field": "content_embedding","inference_id": "naver__splade-v3-distilbert","query": "How to implement semantic search?"}}
}

答复是:

{"hits": {"hits": [{"_index": "sparse-test","_id": "QYrHE5UB5umUPDxXt3YF","_score": 1.9065769,"_source": {"content": "In this article, we'll learn how to connect local models to the Elasticsearch inference model using Ollama and then ask your documents questions using Playground.","content_embedding": {"algorithms": 1.2229483,"modeling": 1.4566671,"inference": 1.4407207,"software": 1.3217216,"neural": 0.4337984,...},"model_id": "naver__splade-v3-distilbert"}},{"_index": "sparse-test","_id": "RorHE5UB5umUPDxXt3YF","_score": 1.4432585,"_source": {"content": "One of the main challenges that developers, SREs, and DevOps professionals face is the absence of an extensive tool that provides them with visibility to their application stack. Many of the APM solutions out on the market do provide methods to monitor applications that were built on languages and frameworks (i.e., .NET, Java, Python, etc.) but fall short when it comes to C++ applications.","content_embedding": {"code": 0.3599707,"software": 2.6935644,"developers": 0.4449697,"cad": 0.19158684,"##kit": 0.03371501,...},"model_id": "naver__splade-v3-distilbert"}},{"_index": "sparse-test","_id": "SorHE5UB5umUPDxXt3YF","_score": 1.2041138,"_source": {"content": "Elastic and Confluent are key technology partners and we're pleased to announce new investments in that partnership. Built by the original creators of Apache Kafka®, Confluent's data streaming platform is a key component of many Enterprise ingest architectures, and it ensures that customers can guarantee delivery of critical Observability and Security data into their Elasticsearch clusters. Together, we've been working on key improvements to how our products fit together. With Elastic Agent's new Kafka output and Confluent's newly improved Elasticsearch Sink Connectors it's never been easier to seamlessly collect data from the edge, stream it through Kafka, and into an Elasticsearch cluster.","content_embedding": {"server": 0.98200905,"software": 2.248463,"link": 0.37674126,"technology": 0.9098742,"networks": 0.8262937,...},"model_id": "naver__splade-v3-distilbert"}},...]}
}

如你所见,原始内容嵌入到稀疏向量表示中,因此你可以轻松理解模型如何确定这些文本的含义。第一个结果不包含查询文本中可以找到的大多数单词,但由于稀疏向量表示相似,因此相关性得分仍然很高。

为了获得更好的精度,你还可以尝试使用 RRF 进行混合搜索,以便你可以在一个查询中结合词汇和语义搜索。请参阅官方教程以了解更多信息。

结论

稀疏向量提供了一种强大而有效的方法来增强 Elasticsearch 中的搜索功能。与密集向量不同,稀疏向量具有关键优势,例如更好的零样本性能资源效率。它们与 Elasticsearch 的机器学习功能无缝集成,并利用 Lucene 成熟且优化的倒排索引,使其成为许多应用程序的实用选择。

从 Elasticsearch 8.17 开始,用户现在可以根据自己的特定需求在密集和稀疏向量模型之间进行更灵活的选择。无论你是在寻找可解释的表示可扩展的搜索性能还是高效的内存使用,稀疏向量都是现代搜索应用程序的一个引人注目的选择。

随着 Elasticsearch 的不断发展,稀疏向量搜索将在未来的信息检索中发挥越来越重要的作用。现在,你可以利用 ELSER 和其他 Hugging Face 模型来探索语义搜索的新可能性。

使用此自定进度的 Search AI 动手学习亲自尝试向量搜索。你现在可以开始免费的云试用或在本地机器上试用 Elastic。

原文:https://www.elastic.co/search-labs/blog/sparse-vector-embedding

相关文章:

Elasticsearch:使用经过训练的 ML 模型理解稀疏向量嵌入

作者:来自 Elastic Dai Sugimori 了解稀疏向量嵌入,理解它们的作用/含义,以及如何使用它们实现语义搜索。 Elasticsearch 提供语义搜索功能,允许用户使用自然语言进行查询并检索相关信息。为此,目标文档和查询必须首先…...

huggingface部署本地大模型DeepSeek-R1-Distill-Llama-70B使用streamlit构建交互式 Web 应用

文章目录 一、Streamlit介绍二、模型下载三 、模型部署四、效果展示 一、Streamlit介绍 Streamlit 是一个开源的 Python 库,专门用于快速构建和部署交互式 Web 应用程序,尤其适合数据科学和机器学习领域。以下是关于 Streamlit 的详细介绍: …...

中华人民共和国著作权法

目录 中华人民共和国著作权法 第一章 总则 第二章 著作权 第一节 著作权人及其权利 第二节 著作权归属 第三节 权利的保护期 第四节 权利的限制 第三章 著作权许可使用和转让合同 第四章 与著作权有关的权利 第一节 图书、报刊的出版 第二节 表  演 第…...

Maven 从下载到实战:一站式配置与使用指南

一、Maven 简介 Maven 是一款基于 POM(Project Object Model) 的 Java 项目管理工具,支持依赖管理、构建自动化、标准化项目结构等功能。其核心优势包括: 依赖管理:自动下载和管理第三方库(JAR 包&#xf…...

4部署kibana:5601

kibana 是一个基于浏览器页面的Elasticsearch前端展示工具,, 是一个开源和免费的工具 Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面, 可以帮你汇总、分析和搜索重要数据日志 1.安装-所有的es节点 # tar xf kibana-6.4.1-linux-x86_64.t…...

前端项目配置 Nginx 全攻略

在前端开发中,项目开发完成后,如何高效、稳定地将其部署到生产环境是至关重要的一步。Nginx 作为一款轻量级、高性能的 Web 服务器和反向代理服务器,凭借其出色的性能和丰富的功能,成为了前端项目部署的首选方案。本文将详细介绍在…...

Nmap网络安全审计

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 Nmap网络安全审计 什么是Nmap Nmap是由Gordon Lyon设计并实现的,于1997开始发布。最初设计Nmap的目的只是希望打造一款强大的端口扫描工具。但是随着…...

deepseek sse流式输出

链接 semi-ui-vue聊天组件 - 可以用这个组件优化界面 sse服务端消息推送 webflux&webclient Hi-Dream-Blog - 参考这个博客,可以在后台将markdown语法转为html 文章目录 链接效果代码pom.xmlDeepSeekControllerWebConfigDeepSeekClientAiChatRequestAiChatM…...

opencv(6): 形态学操作(二值化、自适应阈值、开闭、对比度)

如何在图片中识别出一些物体的位置。具体是什么不是形态学的范畴。 处理方法基本是对二进制图像进行处理。 卷积核决定着图像处理后的效果。 图像二值化 将图像的每个像素变成两种值, 如 0, 255。 全局二值化:全局按照某个阈值二值化 局部…...

P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值--完全 “二叉树” 不一定是 “满二叉树”

P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值 题目分析代码 题目 分析 我吧完全二叉树记成满二叉树了^^ 又卡我几分钟 代码 #include <iostream> #include <vector> #include <string> #include <algorithm> #include <math.h> #include <qu…...

Python驱动的餐饮企业智能数据分析:从数据清洗到可视化决策全流程实战

文章目录 Python驱动的餐饮企业智能数据分析:从数据清洗到可视化决策全流程实战引言一、案例背景1.1 需求分析1.2 数据准备1.2.1 模拟数据生成代码二、数据处理全流程2.1 数据清洗2.1.1 缺失值处理2.1.2 异常值检测2.2 核心指标计算2.2.1 营业额分析2.2.2 门店表现评估2.2.3 菜…...

深入理解IP子网掩码子网划分{作用} 以及 不同网段之间的ping的原理 以及子网掩码的区域划分

目录 子网掩码详解 子网掩码定义 子网掩码进一步解释 子网掩码的作用 计算总结表 子网掩码计算 子网掩码对应IP数量计算 判断IP是否在同一网段 1. 计算步骤 2. 示例 3. 关键点 总结 不同网段通信原理与Ping流程 1. 同网段通信 2. 跨网段通信 网段计算示例 3. P…...

Rust 中的内部可变性与 `RefCell<T>`

一、为什么需要内部可变性&#xff1f; 通常&#xff0c;Rust 编译器通过静态分析确保&#xff1a; 同一时刻只能存在一个可变引用&#xff0c;或任意多个不可变引用&#xff1b;引用始终保持有效。 这种严格的借用规则使得许多内存错误在编译阶段就能被捕获&#xff0c;但也…...

Android Audio实战——音频相关基础概念(附)

Android Audio 开发其实就是媒体源数字化的过程,通过将声波波形信号通过 ADC 转换成计算机支持的二进制的过程叫做音频采样 (Audio Sampling)。采样 (Sampling) 的核心是把连续的模拟信号转换成离散的数字信号。 一、声音的属性 1、响度 (Loudness) 响度是指人类可以感知到的…...

【Java项目】基于Spring Boot的教师人事档案管理系统

【Java项目】基于Spring Boot的教师人事档案管理系统 技术简介&#xff1a;采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介&#xff1a;此系统的功能分为教师和管理员模块&#xff1a; 1、教师后台功能模块包括&#xff1a;首页、个人中心、个人档案管理、奖惩信…...

MySQL 中表和视图的关系

MySQL 中表和视图的关系 在 MySQL 中&#xff0c;表&#xff08;Table&#xff09; 是数据库中的基本存储结构&#xff0c;实际存储数据。而 视图&#xff08;View&#xff09; 是基于表或其他视图的虚拟表&#xff0c;它不存储数据&#xff0c;而是存储一条 SQL 查询的定义&a…...

BigDecimal线上异常解决方案:避免科学计数法输出的坑

文章目录 问题背景为什么BigDecimal会输出科学计数法&#xff1f;线上异常场景场景1&#xff1a;数据传递异常场景2&#xff1a;日志记录异常场景3&#xff1a;数据存储异常 解决方案1. 使用toPlainString()方法2. 设置格式化输出3. 自定义工具类 代码示例总结 在Java开发中&am…...

网络运维学习笔记(DeepSeek优化版)004网工初级(HCIA-Datacom与CCNA-EI)Console管理台使用、登录认证、破解恢复密码

文章目录 Console管理台使用、登录认证、破解恢复密码一、Console管理台使用和登录认证1.1 思科设备配置1.1.1 基本配置流程1.1.2 验证配置 1.2 华为设备配置1.2.1 本地密码认证1.2.2 AAA认证配置 二、远程管理协议Telnet和SSH配置2.1 思科Telnet基本配置2.2 华为Telnet基本配置…...

vmware系统磁盘扩容

扩展磁盘 关闭系统 编辑虚拟机设置&#xff0c;点击磁盘进行扩展 若无法点击检查是否有快照&#xff0c;若报错“在部分链上无法执行所调用的函数&#xff0c;请打开父虚拟磁盘”可查看解决方案 内部挂载 扩展分区 fdisk /dev/sda输入p&#xff0c;打印当前分区表删除/dev/…...

数据结构(陈越,何钦铭) 第四讲 树(中)

4.1 二叉搜索树 4.1.1 二叉搜索树及查找 Position Find(ElementTyoe X,BinTree BST){if(!BST){return NULL;}if(X>BST->Data){return Find(X,BST->Right)}else if(X<BST->Data){return Find(X,BST->Left)}else{return BST;} } Position IterFind(ElementTyp…...

OpenGL进阶系列19 - OpenGL SuperBible - basicfbo 例子学习

一:概述 在超级宝典之前的例子中,程序执行的所有渲染操作都是针对一个窗口,或者可能是计算机的主显示屏。片元着色器(fragment shader)的输出进入后台缓冲区(back buffer),而这个缓冲区通常由操作系统或窗口系统管理,并最终显示给用户。 当我们为渲染上下文选择格式时…...

猿大师播放器:交通水利、公安消防Web端Vue网页播放20路RTSP H.265 1080P监控视频流

随着互联网技术的飞速发展&#xff0c;视频监控已成为各行各业不可或缺的一部分。无论是交通物流、公安消防&#xff0c;还是水利农业、园区校园&#xff0c;视频监控都扮演着至关重要的角色。然而&#xff0c;传统的视频监控解决方案往往依赖于特定的客户端软件&#xff0c;这…...

文件下载技术的终极选择:`<a>` 标签 vs File Saver.js

文件下载技术的终极选择&#xff1a;<a> 标签 vs File Saver.js 在 Web 开发中&#xff0c;文件下载看似简单&#xff0c;实则暗藏玄机。工作种常纠结于 <a> 标签的原生下载和 File Saver.js 等插件的灵活控制之间。本文将从原理、优缺点、场景对比到实战技巧&…...

IDE(集成开发环境)

IDE&#xff08;集成开发环境&#xff09; 1. IDE 的定义 全称&#xff1a;Integrated Development Environment&#xff08;集成开发环境&#xff09;。中文&#xff1a;集成开发环境。作用&#xff1a;为程序开发提供全面的开发环境&#xff0c;集成了多种工具和服务&#x…...

数据安全_笔记系列02:国密算法(商用密码算法)详解

数据安全_笔记系列02:国密算法&#xff08;商用密码算法&#xff09;详解 国密算法是中国国家密码管理局&#xff08;现国家密码管理局&#xff09;制定的一系列自主可控的密码算法标准&#xff0c;旨在保障国内信息安全&#xff0c;满足合规要求。以下从 算法类型、技术细节、…...

全面汇总windows进程通信(三)

在Windows操作系统下,实现进程间通信(IPC, Inter-Process Communication)有几种常见的方法,包括使用管道(Pipe)、共享内存(Shared Memory)、消息队列(Message Queue)、命名管道(Named Pipe)、套接字(Socket)等。本文介绍如下几种: RPC(远程过程调用,Remote Pr…...

Python爬虫-破解字体加密技术

前言 本文是该专栏的第77篇,后面会持续分享python爬虫干货知识,记得关注。 字体加密是一种常见的反爬虫技术,通过自定义字体文件和字符映射来保护网页内容,防止爬虫直接获取文本信息。 而本文,笔者将针对“如何解决目标平台的字体加密技术,并获取目标数据”,进行详细介…...

Pytorch实现论文:基于多尺度融合生成对抗网络的水下图像增强

简介 简介:提出了一种新型的水下图像增强算法,基于多尺度融合生成对抗网络,名为UMSGAN,以解决低对比度和颜色失真的问题。首先经过亮度的处理,将处理后的图像输入设计的MFFEM模块和RM模块生成图像。该算法旨在适应各种水下场景,提供颜色校正和细节增强。 论文题目:Und…...

【Python量化金融实战】-第1章:Python量化金融概述:1.1量化金融的定义与发展历程

本小节学习建议&#xff1a;掌握Python编程、统计学&#xff08;时间序列分析&#xff09;、金融学基础&#xff08;资产定价理论&#xff09;三者结合&#xff0c;是进入量化领域的核心路径。 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章目录 1.1 量化金…...

大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(3)

Paimon的下载及安装&#xff0c;并且了解了主键表的引擎以及changelog-producer的含义参考&#xff1a; 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1) 利用Paimon表做lookup join&#xff0c;集成mysql cdc等参考&#xff1a; 大数据组件(四)快速入门实时数据…...

【论文解读】《Training Large Language Models to Reason in a Continuous Latent Space》

论文链接 1. 背景与动机 语言空间与推理的矛盾 目前大多数大语言模型&#xff08;LLMs&#xff09;在解决复杂问题时采用链式思维&#xff08;Chain-of-Thought, CoT&#xff09;方法&#xff0c;即利用自然语言逐步推导出答案。然而&#xff0c;论文指出&#xff1a; 自然语言…...

Linux-CentOS 7安装

Centos 7镜像&#xff1a;https://pan.baidu.com/s/1fkQHYT64RMFRGLZy1xnSWw 提取码: q2w2 VMware Workstation&#xff1a;https://pan.baidu.com/s/1JnRcDBIIOWGf6FnGY_0LgA 提取码: w2e2 1、打开vmware workstation 2、选择主界面的"创建新的虚拟机"或者点击左上…...

【Web RCE 漏洞常见类型】

Web RCE 漏洞常见类型 1. 注入类漏洞2. 反序列化漏洞3. 文件处理漏洞4. 模板引擎漏洞5. 服务端请求伪造&#xff08;SSRF&#xff09;6. 框架/中间件漏洞7. 第三方组件漏洞8. 配置不当与协议滥用9. 其他边缘场景防御建议 以下是可以导致远程代码执行&#xff08;RCE&#xff09…...

【蓝桥杯单片机】第十三届省赛第二场

一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 2.编写LED函数&#xff08;led.c&#xff09; void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器 关闭锁存…...

【够用就好006】-PC桌面管理ECS服务器的实操步骤

背景介绍解决思路拓展知识 背景介绍 #够用就好#知其然知其所以然#aigc创意人左边 我计划搭建个人网站&#xff0c;计划格式化我的ECS服务器&#xff0c;但是里面有我之前的实践项目&#xff0c;我舍不得删除&#xff0c;我想要保存到本地。 通常我都是在vscode中用remotes ssh…...

Spring Boot 2/3.x 中 MultipartFile 接收问题深度解析与实战解决方案

文章目录 引言&#xff1a;文件上传的暗礁与应对一、核心机制解析1.1 多部分请求处理流程1.2 关键配置参数演进 二、典型问题排查与修复2.1 文件接收为null问题2.2 大文件上传内存溢出 三、版本差异陷阱3.1 Jakarta Servlet API迁移影响3.2 默认配置变更对比 四、高级问题解决方…...

MySQL的三种并发问题和四种隔离级别

阅读之前&#xff0c;请心里默念&#xff0c;脏读、不可重复读、幻读是三种常见的并发问题&#xff0c;隔离级别是应对并发问题的四种隔离级别&#xff0c;隔离级别和并发问题是两个东西&#xff0c;不要混淆。 在数据库事务中&#xff0c;脏读&#xff08;Dirty Read&#xff…...

【复习】Redis

数据结构 Redis常见的数据结构 String&#xff1a;缓存对象Hash&#xff1a;缓存对象、购物车List&#xff1a;消息队列Set&#xff1a;点赞、共同关注ZSet&#xff1a;排序 Zset底层&#xff1f; Zset底层的数据结构是由压缩链表或跳表实现的 如果有序集合的元素 < 12…...

【Docker】如何在Linux、Windows、MacOS中安装Docker

Linux安装Docker 在终端中执行一键安装脚本命令安装dockersudo curl -fsSL https://gitee.com/tech-shrimp/docker_installer/releases/download/latest/linux.sh | bash -s docker --mirror Aliyun1.1 配置docker镜像源 在终端执行 一行命令,编辑配置文件sudo tee /etc/docke…...

Linux System V - 消息队列与责任链模式

概念 消息队列是一种以消息为单位的进程间通信机制&#xff0c;允许一个或多个进程向队列中发送消息&#xff0c;同时允许一个或多个进程从队列中接收消息。消息队列由内核维护&#xff0c;具有以下特点&#xff1a; 异步通信&#xff1a;发送方和接收方不需要同时运行&#x…...

k2路由器登录校园网

教程1刷入Breed&#xff0c;并手动刷入Padavan固件&#xff1a;斐讯K1、K2、K2P 刷机、刷入Breed 辅助工具 | tb (tbvv.net) Padavan下载网址&#xff1a; 我用的是&#xff1a; Padavan 登录的网址是 192.168.123.1 Padavan配置教程&#xff1a; 先用网线连上校园网&#…...

Docker基础实践与应用举例

Docker 是一个轻量级容器化平台&#xff0c;通过将应用及其依赖打包到容器中&#xff0c;实现快速部署和环境一致性。以下是 Docker 的实践与应用场景举例&#xff0c;结合具体操作步骤&#xff1a; 一、基础实践 1. 快速启动一个容器 # 运行一个Nginx容器&#xff0c;映射宿…...

EndNote与Word关联:科研写作的高效助力

在科研领域&#xff0c;文献管理与论文写作是紧密相连的重要环节。EndNote作为一款强大的文献管理工具&#xff0c;与Word实现有效关联后&#xff0c;能极大地提升科研写作效率。本文将详细介绍EndNote与Word关联的方法、关联后的优势、常见问题及解决办法&#xff0c;助力科研…...

用PyTorch从零构建 DeepSeek R1:模型架构和分步训练详解

DeepSeek R1 的完整训练流程核心在于&#xff0c;在其基础模型 DeepSeek V3 之上&#xff0c;运用了多种强化学习策略。 本文将从一个可本地运行的基础模型起步&#xff0c;并参照其技术报告&#xff0c;完全从零开始构建 DeepSeek R1&#xff0c;理论结合实践&#xff0c;逐步…...

SOME/IP-SD -- 协议英文原文讲解2

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.2 S…...

Matlab——图像保存导出成好看的.pdf格式文件

点击图像的右上角&#xff0c;点击第一个保存按钮键。...

Mybatis常用动态 SQL 相关标签

1. <if> 用于条件判断&#xff0c;当满足条件时执行对应的 SQL 片段。 示例: <select id"findUser" resultType"User">SELECT * FROM usersWHERE 11<if test"name ! null and name ! ">AND name #{name}</if><if…...

计算机网络与通讯知识总结

计算机网络与通讯知识总结 基础知识总结 1)FTP:文件传输 SSH:远程登录 HTTP:网址访问 2)‌交换机 定义‌:一种基于MAC地址实现局域网(LAN)内数据高速转发的网络设备,可为接入设备提供独享通信通道‌。 -‌ 核心功能‌: 1.数据链路层(OSI第二层)工作,通过MAC地址…...

Redis 通用命令

Redis 通用命令 文章目录 Redis 通用命令 1. 启动redis 1.1 前台启动1.2 后台启动1.3 开机自启 2.Redis命令行客户端3. 常见命令 3.1 help3.2 KEYS3.3 DEL3.4 EXISTS3.5 EXPIRE&TTL 1. 启动redis 1.1 前台启动 在安装好redis后&#xff0c;我们可以在任意目录输入以…...

【idea问题排查技巧】

以下是针对 IDEA 中 日志打标(动态标记) 和 全链路追踪 功能的分步详解,结合具体场景和操作截图说明,帮助快速掌握实战技巧。 一、动态日志打标:不修改代码输出关键信息 1. 断点日志打印(非侵入式打标) 场景:在调试时,需要临时查看某个变量的值,但不想修改代码添加…...