闭源与开源嵌入模型比较以及提升语义搜索效果的技术探讨

news2024/10/1 11:29:44

上图为执行语义搜索前的聚类演示 ,嵌入技术是自然语言处理的核心组成部分。虽然嵌入技术的应用范围广泛,但在检索应用中的语义搜索仍是其最常见的用途之一。

尽管知识图谱等可以提升检索的准确率和效率,但标准向量检索技术仍然具有其实用价值。许多文章讨论了如何从语义搜索结果中过滤无关内容,这也是本文将要探讨的主题。我们将使用聚类和重新排序等技术来实现这一目标。

本文的另外一个主要重点比较不同规模的开源和闭源嵌入模型

我们将比较MTEB排行榜上排名靠前9种不同嵌入模型。这将帮助你了解大型模型与小型模型的性能差异,以及随着规模扩大可能产生的成本。

如果你曾使用过OpenAI的模型生成嵌入,你可能会好奇它与其他模型的效果对比到底如何呢?

对于不熟悉嵌入概念的读者,这里简要回顾一下:当我们为每段文本创建嵌入(一组向量数组)时,实际上是将文本转换为计算机可以理解的形式。

特别是在语义搜索中,我们比较不同文本的嵌入,以确定它们之间的语义相似度。这使我们能够使用查询进行一种模糊搜索——即搜索关系——而不是精确的关键词匹配。

在实际应用中,我们可能需要处理数百万用户的档案,但在本文中,我创建了6,900个合成LinkedIn档案作为示例。

这通常是一个相对简单的用例,因为我们不需要对大型文件中的文档进行分块处理;每个档案都可以作为一个整体处理。此外由于我们容易理解模型是否找到了正确的关系,所以对于可解释性方向也比其他的数据要好很多。

引言

在本文中,由于我们的样本档案数量有限所以可以使用聚类作为整个数据集的无监督分类方法。

以下是聚类的示意图:

聚类还能帮助我们理解不同模型如何感知相关联的关系。根据所选模型的不同,可以在执行聚类内的语义搜索之前先确定正确的组别。

将查询与正确聚类匹配的简化图示 ,这种方法应该能够帮助我们过滤掉不相关的结果,例如模型将产品经理与产品营销经理混淆的情况。

最后一步可以添加使用大语言模型(LLM)进行重新排序,以确保最相关的结果排在前列。

为了简化过程并降低成本,我已经为我们将要评估的每个模型在这个数据集中添加了嵌入,同时也为我们的查询(即匿名职位描述)创建了嵌入。

嵌入

如前所述,嵌入是文本的数值表示,它捕捉了文本的语义含义,使计算机能够处理和理解自然语言。

对于更现代的transformer模型,它们能够理解整个上下文,从而理解词语和句子的多重含义——这在几年前还是无法实现的。

我们可以通过将嵌入表示为几何空间中的点来在图上可视化嵌入。因此嵌入之间的语义关系转化为几何上的接近程度。

不同的模型是为不同的任务而设计的,但大多数较大的模型通用性足够强,可以执行各种任务,如检索聚类分类

语义搜索用于检索,它利用图上的这种接近度来确定查询与其他嵌入的匹配位置,即计算图上嵌入之间的距离。

为了计算语义搜索中嵌入之间的相似度,使用了几种方法,但余弦相似度是最常用的。

我们使用的模型将直接影响从语义搜索中获得的结果,这是模型训练方式的结果。模型的训练数据集、目标和架构至关重要,因为它们会影响模型理解和链接各种文本的能力。

另一方面,聚类将数据组织成组(或簇),其中同一组内的项目彼此更相似,而与其他组的项目不那么相似。它更擅长识别和匹配嵌入之间的相似性,使我们能够有效地隔离组。

对嵌入进行聚类以分组相似的档案并可视化查询的过程允许我们在执行语义搜索之前首先过滤掉任何不相关的匹配,从而起到降噪的作用。

但是其实并非所有模型都能以我们期望的方式使用聚类;有些模型会表现更好,有些则会表现更差,这取决于它们的构建方式。

嵌入模型

那么如何选择合适的模型呢?这就需要参考MTEB排行榜,它根据模型在各种任务中的表现对嵌入模型进行排名。

我为本文选择了一些模型,包括OpenAI的模型、经过微调的Mistral-7B,以及较小的新模型,如Mixedbread AI的Mxbai。

这些模型大多是在过去两年左右的时间里发布的。

如果你是开源模型的新手,可能会惊讶地发现许多开源模型的排名相当高。即使你不是第一次尝试这些模型,看看哪一个在这个任务中表现最好可能仍然很有趣。

请查看下面的表格,了解每个模型的大小、最大令牌数以及在检索和聚类方面的排名。

我们将使用的各种模型的MTEB排行榜指标 ,许多人使用过OpenAI的Ada-002,它在我们的列表中排名靠后。然而,OpenAI已经发布了text-embed-3的小型和大型版本,它们表现更好,而且成本更低。

那么,你可能会问,为什么有人会选择使用商业模型,而他们可以使用排行榜上排名靠前的开源模型呢?

开源模型的经济性分析

使用开源模型无疑有其优势,尤其是在隐私保护方面。许多开源模型在性能排行榜上表现出色,但在选择模型时,我们需要权衡托管模型与使用API的经济性。

我比较了在GPU上托管小型(约350M参数)和大型(7B参数)开源模型的成本,以及为几个流行的商业模型按令牌付费的成本。

处理10k、100k、1m和2.5m文本的计算成本

这里假设每个文本包含400个令牌,因此334M参数模型在单个L4 GPU上每秒可以处理多达103个文本,而7B参数模型在单个A100上每秒可以处理约40个文本。

从图表中可以看出,一旦开始处理数百万个文本,使用像text-embed-3-large或ada-002这样的模型的成本会急剧增加。

然而,使用小型模型(参数少于500M)通常是最合理的选择。如果可能你应该选择较小的开源模型,因为这可能会将成本降低高达95%。

我还计算了在单个GPU上托管小型和大型模型的处理时间。

需要注意的是,调用API也需要时间,而且API通常有推理限制。因此无论你选择哪种方式,都必须考虑完全嵌入整个数据集所需的时间。

对于开源模型,你可以使用更多的GPU来加速处理,但这给了我们一个启示:使用较小的模型可能更加节能高效。

而最终上线时的最佳实践是测试几个模型,看看哪个模型在你的特定任务中表现最佳,这也是我们接下来要做的。

量化技术

如前所述,使用较大的模型(如7B参数规模的模型)仍然相当昂贵且能源密集。我们只计算了250万个嵌入的成本,但一旦你开始进一步扩大规模,研究量化技术可能会变得很有价值。

量化是通过使用较少的位来表示数据来压缩模型,从而减小模型的大小。这种技术的目的是使用4位和8位量化等方法,使得较大的模型能够在通常无法处理如此大规模模型的硬件上运行。

一些研究者尝试测量量化模型在各种指标上的性能下降;我记得最近看到的一项研究认为整体性能下降了约12%。

这是一个值得深入研究的话题,因为对于嵌入和生成对于量化来说是非常不同的,所以我们这里忽略掉量化,直接进入正题,开始测试模型。

数据导入

第一步就是数据导入

 # 带有嵌入的合成LinkedIn档案  
 dataset=load_dataset("ilsilfverskiold/linkedin_profiles_synthetic")  
 profiles=dataset['train']  
   
 # 带有嵌入的匿名职位描述  
 dataset=load_dataset("ilsilfverskiold/linkedin_recruitment_questions_embedded")  
 applications=dataset['train']

这两个数据集将允许我们比较6,900个生成的LinkedIn档案的不同嵌入模型。

合成数据毕竟是人工生成的,所以在解释结果时需要谨慎。这些数据是使用Llama 3.1创建的,它们确实存在一些良好的对齐,但也使用了"结果导向"、"经验丰富"和"敬业"等常见描述词来描述档案。

嵌入已经被添加到数据集中,你可以在’profiles’中看到这一点。

 # profiles数据集  
 Dataset({  
     features: [...,'embeddings_nv-embed-v1', 'embeddings_nv-embedqa-e5-v5', 'embeddings_bge-m3', 'embeddings_arctic-embed-l', 'embeddings_mistral-7b-v2', 'embeddings_gte-large-en-v1.5', 'embeddings_text-embedding-ada-002', 'embeddings_text-embedding-3-small', 'embeddings_voyage-3', 'embeddings_mxbai-embed-large-v1 '],  
     num_rows: 6904  
 })

注意:embeddings_gte-large-en-v1.5 不可用。我尝试托管它但未能为其设置所有嵌入,因此请不要使用它。

接下来选择你感兴趣的职位描述,以与档案进行匹配。

查看以下代码;我选择了第二个应用,但你可以设置其他数字。

 application=applications[1] # 选择第二个应用 - 一个产品营销经理职位   
 application_text=application['natural_language']  
 print("application we're looking for: ",application_text)

如果你觉得直接在Hugging Face上查看数据集更方便,也可以这样做。

在这一步,你可以决定使用哪个嵌入模型。我已经测试了大多数模型,所以在这次运行中我将使用

embeddings_mxbai-embed-large-v1

这是一个334M参数的开源模型,如果你查看之前的表格,你会发现它在检索和聚类方面都表现出色。

如果你想尝试不同的模型,只需设置另一个模型名称。查看上面提到的数据集,了解你可以使用哪些模型。

 # 获取特定嵌入模型的查询嵌入 - 这里我们选择mxbai-embed-large-v1  
 query_embedding_vector=np.array(application['embeddings_mxbai-embed-large-v1'])  
   
 embeddings_list= [np.array(emb) forembinprofiles['embeddings_mxbai-embed-large-v1 ']] # 注意额外的空格  
 texts=profiles['text']

语义搜索实现

在尝试聚类之前,首先可以测试语义搜索;这允许我们在引入其他技术之前评估其基本性能。

为了计算档案和我们的查询(职位申请)之间的语义相似度,可以执行以下代码:

 # 首先尝试计算余弦相似度(不使用聚类)
 defcosine_similarity(a, b):  
     a=np.array(a)  
     b=np.array(b)  
     returnnp.dot(a, b) / (np.linalg.norm(a) *np.linalg.norm(b))  
   
 similarities= []  
 foridx, embinenumerate(embeddings_list):  
     sim=cosine_similarity(query_embedding_vector, emb)  
     similarities.append(sim)

然后,我们可以按相似度降序排列结果,并显示前30个结果:

 results=list(zip(range(1, len(texts) +1), similarities, texts))  
 sorted_results=sorted(results, key=lambdax: x[1], reverse=True)  
   
 # 显示结果
 print("\nSimilarity Results (sorted from highest to lowest):")
 foridx, sim, textinsorted_results[:30]:  # 可以调整显示数量
     percentage= (sim+1) /2*100  
     text_preview=' '.join(text.split()[:10])  
     print(f"Text {idx} similarity: {percentage:.2f}% - Preview: {text_preview}...")

执行上述代码后,结果可能如下所示(具体取决于你选择的应用):

 Similarity Results (sorted from highest to lowest):
 Text 3615 similarity: 89.59% - Preview: Product Marketing Manager | Building Go-to-Market Strategies for Growth Results-driven...
 Text 6299 similarity: 89.56% - Preview: Product Marketing Manager | Driving Growth & Customer Engagement Results-driven...
 Text 3232 similarity: 89.09% - Preview: Product Marketing Manager | Driving Product Growth through Data-Driven Strategies...
 Text 5959 similarity: 88.90% - Preview: Product Marketing Manager | Data-Driven Growth Expert Results-driven Product Marketing...
 Text 5635 similarity: 88.84% - Preview: Product Marketing Manager | Driving Growth through Data-Driven Marketing Strategies...
 Text 5835 similarity: 88.74% - Preview: Product Marketing Manager | Cloud-Based SaaS Results-driven Product Marketing Manager...
 Text 139 similarity: 88.66% - Preview: Product Marketing Manager | Scaling Growth through Data-Driven Strategies Experienced...
 Text 6688 similarity: 88.48% - Preview: Product Marketing Manager | Driving Business Growth through Data-Driven Insights...

使用mxbai嵌入模型(以及许多其他模型)时,我们可以清楚地看到结果会同时返回产品营销经理和产品经理,这并不是我们期望的结果。

让我们引入聚类技术,看看是否能改善这一情况。

聚类实现

对档案嵌入进行聚类就需要决定聚类的数量。

本例中,我选择了10个聚类:

 embeddings_array=np.array(embeddings_list)  
   
 num_clusters=10# 你可以选择其他数量
   
 kmeans=KMeans(n_clusters=num_clusters, random_state=42)  
 kmeans.fit(embeddings_array)  
 cluster_labels=kmeans.labels_  
   
 pca=PCA(n_components=2)  
 reduced_embeddings=pca.fit_transform(embeddings_array)

接下来,我们需要确定查询(或职位申请)应该属于哪个聚类:

 # 现在看看查询如何适应聚类
 query_embedding_array=np.array(query_embedding_vector).reshape(1, -1)  
 reduced_query_embedding=pca.transform(query_embedding_array)  
   
 # 预测查询应该属于哪个聚类
 query_cluster_label=kmeans.predict(query_embedding_array)[0]  
 print(f"The query belongs to cluster {query_cluster_label}")

完成这些步骤后,可以在二维图上可视化聚类结果。聚类已经被压缩到二维空间,因此可能会出现重叠。

你可以悬停在不同的嵌入点上以查看具体档案信息。

还可以在图上单独标出查询点(用X表示),以查看模型认为它属于哪个聚类。

从结果中我们可以清楚地看到,模型正确地将营销相关职位归为一个聚类,包括SEO专家和增长黑客在内,同时将Office产品经理和产品经理排除在外。

这是一个令人鼓舞的结果,我们可以结合聚类和语义搜索来获得更精确的结果。

建议尝试不同的模型,观察它们的表现差异;你会发现较大的模型通常在分组相似档案方面表现更好,但一些较小的模型也能达到令人满意的效果。

结合聚类和语义搜索

既然我们已经确认模型能够将查询正确地分配到相应的聚类中,我们可以结合这两种方法来优化搜索结果。

 # 现在我们只在正确的聚类中进行语义搜索
 cluster_indices=np.where(cluster_labels==query_cluster_label)[0]  
   
 cluster_embeddings=embeddings_array[cluster_indices]  
 cluster_texts= [texts[i] foriincluster_indices]  
   
 similarities_in_cluster= []  
 foridx, embinzip(cluster_indices, cluster_embeddings):  
     sim=cosine_similarity(query_embedding_vector, emb)  
     similarities_in_cluster.append((idx, sim))  
   
 similarities_in_cluster.sort(key=lambdax: x[1], reverse=True)  
   
 top_n=40  # 可以调整此数字以显示更多匹配结果
 top_matches=similarities_in_cluster[:top_n]  
   
 print(f"\nTop {top_n} similar texts in the same cluster as the query:")
 foridx, simintop_matches:  
     percentage= (sim+1) /2*100  
     text_preview=' '.join(texts[idx].split()[:10])  
     print(f"Text {idx+1} similarity: {percentage:.2f}% - Preview: {text_preview}...")

执行上述代码后,我们可以看到结果中不再包含产品经理,而是返回了更相关的营销经理职位,这通常是更准确的匹配:

 Top 40 similar texts in the same cluster as the query:
 Text 3615 similarity: 89.59% - Preview: Product Marketing Manager | Building Go-to-Market Strategies for Growth Results-driven...
 Text 3232 similarity: 89.09% - Preview: Product Marketing Manager | Driving Product Growth through Data-Driven Strategies...
 Text 5959 similarity: 88.90% - Preview: Product Marketing Manager | Data-Driven Growth Expert Results-driven Product Marketing...
 Text 5635 similarity: 88.84% - Preview: Product Marketing Manager | Driving Growth through Data-Driven Marketing Strategies...
 Text 5835 similarity: 88.74% - Preview: Product Marketing Manager | Cloud-Based SaaS Results-driven Product Marketing Manager...
 Text 139 similarity: 88.66% - Preview: Product Marketing Manager | Scaling Growth through Data-Driven Strategies Experienced...
 Text 6688 similarity: 88.48% - Preview: Product Marketing Manager | Driving Business Growth through Data-Driven Insights...
 Text 6405 similarity: 88.27% - Preview: Product Marketing Manager | Scaling SaaS Products for Global Markets...
 Text 5183 similarity: 87.86% - Preview: Product Marketing Manager | B2B SaaS Experienced Product Marketing Manager...

本例的主要目的是让你比较不同的模型,特别是较小的模型与较大的模型,以评估在追求更快、更经济的推理过程中可以接受的质量损失程度。除非确实有必要,否则不要仅仅因为模型规模大就选择它。

如果你想继续评估模型性能,可以使用RAGAs(检索增强生成评估)来评估基于不同模型的检索应用程序的表现。

模型性能分析

为了评估模型性能,我选择了一个具体的指标:模型在区分产品经理和产品营销经理方面的能力。

研究发现,较大的模型在聚类之前通常能提供更准确的结果,但它们最初都存在将这两个角色分开的困难。

Ada-002,可能由于其较大的规模,在聚类之前表现良好,而OpenAI的较小和较新的模型text-embed-3-small表现相对较差。

一些模型在正确聚类档案方面也存在困难。比如经过微调的7B Mistral模型和E5在这方面表现不佳。这可能是由于它们的训练方式和架构特点导致的。

其余模型对于这个特定的职位档案表现大致相同。

值得注意的是,mxbai模型的表现令人惊讶,尽管它只有335M的参数规模;这表明对于较简单的任务,较大的模型可能存在过度拟合的问题。

需要强调的是这只是针对一个特定任务的评估;建议你根据自己的具体需求,考虑其他方面来全面评估模型性能。

接下来,我们可以继续探讨如何进一步优化结果,例如使用重新排序等策略,以提供给大语言模型(LLM)最佳的评估输入。

重新排序技术

在检索增强生成(RAG)管道中,有多种策略可以用来纠正不相关的结果;重新排序是其中之一。

重新排序的基本思想是重新安排结果的顺序,使更相关的结果排在前面。实现这一目标的一种方法是使用成对排序。

具体操作是,将一对结果提供给模型(可能是大语言模型),并要求它根据职位描述对两个档案的相关性进行排序。

在实际应用中,你需要根据具体用例结合多种方法来优化性能。

总结

对于嵌入技术的新手,希望本文能为你提供有价值的见解。对于已经熟悉这一领域的读者,希望本文关于使用较小与较大嵌入模型的经济性分析能够带来新的思考。

值得注意的是,在大型语言模型(LLM)领域,许多闭源模型正在领先;但在嵌入模型方面,情况并非如此。

本文的一个重要结论是:不要忽视较小的、计算效率更高的模型。它们可能在特定任务中表现出色,同时提供更高的成本效益。

本文的Colab笔记本可以在以下链接找到:

https://avoid.overfit.cn/post/38350e175fa0424b8c988ad98930ff94

作者:Ida Silfverskiöld

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM的农产品仓库管理系统【附源码】

基于SSM的农产品仓库管理系统(源码L文说明文档) 目录 4 系统设计 4.1 系统概要设计 4.2 系统功能结构设计 4.3 数据库设计 4.3.1 数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1 管理员功能介绍 5.1.1 用户管…

CSS外边距

元素的外边距(margin)是围绕在元素边框以外(不包括边框)的空白区域,这片区域不受 background 属性的影响,始终是透明的。 为元素设置外边距 默认情况下如果不设置外边距属性,HTML 元素就是不会…

通信工程学习:什么是MAC媒体接入控制

MAC:媒体接入控制 MAC(Medium Access Control),即媒体接入控制,是计算机网络中数据链路层的一个重要组成部分,负责协调多个发送和接收站点对一个共享传输媒体的占用。以下是关于MAC的详细解释: …

括号序列C++

题目: 样例解释: 如下几种方案是符合规范的: (**)*() (**(*)) (*(**)) (*)**() (*)(**) 思路: 首先肯定是区间dp,令 dpi,jdpi,j​ 表示从位置 ii 到位置 jj 一共的合法序列总情况数量。 但是不同的形态可能会有不同的转…

【开源项目】CException 为C语言提供简洁高效的异常处理机制

CException:为C语言提供简洁高效的异常处理机制 在C语言中进行异常处理并不像C中那样方便。为了实现高效的异常处理,很多开发者选择了CException,一个基于C标准库 setjmp 和 longjmp 的轻量级异常处理框架。本文将带你了解 CException 的特点…

【Power Query】M函数-List.Sum

M函数-List 列表求和 &#xff08;List.Sum&#xff09;&#xff1a;1&#xff09;横向求和2&#xff09;列求和★思路★</font>★实操★</font> 3&#xff09;求总和4&#xff09;求部分占总体的比重★横向★</font>★竖向★</font> 列表求和 &#x…

C++和OpenGL实现3D游戏编程【连载12】——游戏中音效的使用

1、游戏中音效的使用 前面我们实现了图片纹理的显示功能,是不是感觉到非常的简单。那么今天我们就继续说下游戏声音的实现。音效也是游戏的灵魂,只有搭配了美妙动听的音效以后,游戏才能令人耳目一新,与玩家产生良好的效果。 音效文件最常用的可分为两种,分别为.wav和.mp3…

基于SSM的线上旅行信息管理系统【附源码】

基于SSM的线上旅行信息管理系统&#xff08;源码L文说明文档&#xff09; 目录 4.1 系统概述 4.2 数据库E-R图设计 4.3 数据库表设计 5 系统的实现 5.1 管理员功能模块的实现 5.1.1管理员登录界面 5.1.2用户管理界面 5.1.3景点分类管理界面 5.1.4…

(最新已验证)stm32 + 新版 onenet +dht11+esp8266/01s + mqtt物联网(含微信小程序)上报温湿度和控制单片机(保姆级教程)

物联网实践教程&#xff1a;微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总 前言 之前在学校获得了一个新玩意&#xff1a;ESP-01sWIFI模块&#xff0c;去搜了一下这个小东西很有玩点&#xff0c;远程控制LED啥的&#xff0c;然后我就想…

【Linux】【操作】Linux操作集锦系列之七——Linux环境下如何查看CPU使用情况(利用率等)

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;Linux技术&…

Air201资产定位模组LuatOS:录音播放录音功能的操作方法

一直有小伙伴们问&#xff0c;迷你小巧的合宙Air201虽然有很多优点&#xff0c;超低功耗、精准定位&#xff0c;那么它是否支持录音、播放录音功能&#xff1f; 那必须能&#xff01;高集成化设计的Air201自带了ES8311音频解码芯片&#xff08;Audio Codec&#xff09;及MIC麦…

Could not retrieve https://npm.taobao.org/mirrors/node/index.json. 报错解决

Could not retrieve https://npm.taobao.org/mirrors/node/index.json. 报错解决 1.问题原因及解约 今天使用nvm下载不同版本的nodejs的时候报错了 C:\Users\1> nvm list availableCould not retrieve https://npm.taobao.org/mirrors/node/index.json.提示无法检索地址&…

ARM Process state -- CPSR

Holds PE status and control information. 保存PE状态和控制信息。 N, bit [31] Negative condition flag. Set to bit[31] of the result of the last flag-setting instruction. If the result is regarded as a twos complement signed integer, then N is set to 1 if…

AtCoder ABC371 A-D题解

省流&#xff1a;赛场上不会 C。 比赛链接:ABC371 Problem A: Sol if 暴力判断即可。 Code #include <bits/stdc.h> using namespace std; int main(){char SAB,SAC,SBC;cin>>SAB>>SAC>>SBC;if(SAB> && SBC>)cout<<"b&…

【Unity踩坑】使用内购时获取Google Play license key

在Unity中使用了IAP&#xff08;内购&#xff09;后&#xff0c;需要设置Google Play license key。 这个key需要在Google Play Console中&#xff08;https://play.google.com/console&#xff09;&#xff0c;找到相应的应用&#xff0c;在左侧“创收设置”里可以找到license…

堆【数据结构C语言版】【 详解】

目录-笔记整理 一、思考二、堆概念与性质三、堆的构建、删除、添加1. 构建2. 删除3. 添加 四、复杂度分析4.1 时间复杂度4.2 空间复杂度 五、总结 一、思考 设计一种数据结构&#xff0c;来存放整数&#xff0c;要求三个接口&#xff1a; 1&#xff09;获取序列中的最值&#…

AI面试指南:AI工具总结评测,助力求职季

AI面试指南&#xff1a;AI工具总结评测&#xff0c;助力求职季 摘要&#xff1a; 在竞争激烈的AI领域秋招季&#xff0c;准备充分并借助高效工具是提升面试通过率的关键。本文主要介绍一些针对秋招的AI面试工具和学习资源&#xff0c;分为简历优化、面试助手、手撕代码练习三个…

Thinkphp/Laravel旅游景区预约系统的设计与实现

目录 技术栈和环境说明具体实现截图设计思路关键技术课题的重点和难点&#xff1a;框架介绍数据访问方式PHP核心代码部分展示代码目录结构解析系统测试详细视频演示源码获取 技术栈和环境说明 采用PHP语言开发&#xff0c;开发环境为phpstudy 开发工具notepad并使用MYSQL数据库…

ue4多个面重叠闪烁

描述&#xff1a;当多个面重叠的时候&#xff0c;出现闪烁。比如有三个面ABC&#xff0c;A在最底下&#xff0c;B在中间&#xff0c;C在最上面。 解决方案&#xff1a; 方案一&#xff1a; 方法&#xff1a;调整位置&#xff0c;A的Z为0&#xff0c;B的Z为0.01&#xff0c;C的…

2021、2022、2023年江苏省“领航杯”_CTF竞赛_MISC/WEB—部分WP

文章目录 一、前言工具及附件分享 二、MICS1、MICS-小明的困惑2、MICS-流量分析3、MISC-神奇的压缩4、MICS-SecertData5、MISC-我要这key有何用6、MICS-黑客流量分析7、MISC-女儿的秘密8、MICS-snow9、MICS-jsfuck 三、WEB1、WEB- ctf_xxe2、WEB- ctf_uuunserialize3、WEB-ctf_…