OpenAI 与开源多语言嵌入模型

原文地址:OpenAI vs Open-Source Multilingual Embedding Models

选择最适合您的数据的模型

2024 年 2 月 25 日

OpenAI最近发布了他们的新一代embedding模型,称为embeddingv3,他们描述是他们性能最好的embedding模型,具有更高的多语言性能。这些模型分为两类:较小的称为text-embeddings-3-small,较大且功能更强大的称为text-embeddings-3-large

有关这些模型的设计和训练方式的信息披露得很少。正如他们之前发布的embedding模型(2022年12月与ada-002模型类)一样,OpenAI再次选择了一种闭源方法,其中模型只能通过付费API访问。

但这些性能真的值得花钱去看吗?

这篇文章的动机是将这些新模型与开源模型的性能进行实证比较。我们将依赖于一个数据检索工作流,在这个工作流中,必须根据用户查询找到语料库中最相关的文档。

我们的语料库将是欧洲人工智能法案,该法案目前处于验证的最后阶段。这个语料库除了是世界上第一个关于人工智能的法律框架外,还有一个有趣的特点,那就是它有24种语言版本。这使得比较不同语言族的数据检索的准确性成为可能。

这篇文章将通过以下两个主要步骤:

  • 从多语言文本语料库生成自定义合成问题/答案数据集
  • 在此自定义数据集上比较OpenAI和最先进的开源embedding模型的准确性。 重现本文中呈现的结果的代码和数据可以在这个Github存储库中获得。请注意,本文以欧盟人工智能法案为例,本文所采用的方法可以适用于其他数据语料库。

生成自定义Q/A数据集

让我们首先从生成自定义数据的问答(Q/ a)数据集开始,该数据集将用于评估不同embedding模型的性能。生成自定义Q/ a数据集的好处是双重的。首先,它通过确保数据集没有成为embedding模型训练的一部分来避免偏差,这可能发生在参考基准上,如MTEB。其次,它允许将评估调整为特定的数据语料库,这可能与检索增强应用程序(RAG)等情况相关。

我们将遵循LlamaIndex在他们的文档中建议的简单流程。语料库首先被分成一组块。然后,对于每个分块,通过大型语言模型(large language model, LLM)生成一组合成问题,使答案位于相应的分块中。这个过程说明如下:

img

为您的数据生成问题/答案数据集,方法来自LlamaIndex

使用Llama Index之类的LLM数据框架实现此策略非常简单。可以使用高级函数方便地加载语料库和分割文本,如下面的代码所示。

1
2
3
4
5
6
7
8
9
10
from llama_index.readers.web import SimpleWebPageReader
from llama_index.core.node_parser import SentenceSplitterlanguage = "EN"
url_doc = "https://eur-lex.europa.eu/legal-content/"+language+"/TXT/HTML/?uri=CELEX:52021PC0206"documents = SimpleWebPageReader(html_to_text=True).load_data([url_doc])parser = SentenceSplitter(chunk_size=1000)
nodes = parser.get_nodes_from_documents(documents, show_progress=True)

在这个例子中,语料库是欧盟人工智能法案的英文版本,直接取自Web,使用这个官方URL。我们使用2021年4月的草案版本,因为最终版本尚未适用于所有欧洲语言。在这个版本中,可以用其他23种欧盟官方语言中的任何一种语言替换URL中的英语,以检索不同语言的文本(BG表示保加利亚语,ES表示西班牙语,CS表示捷克语,等等)。

img

下载欧盟24种官方语言的欧盟人工智能法案链接(来自欧盟官方网站)

我们使用SentenceSplitter对象将文档分成每1000个令牌的块。对于英语来说,这导致大约100个块。

然后将每个块作为上下文提供给以下提示符(Llama Index库中建议的默认提示符):

1
2
3
4
5
6
7
8
9
10
11
12
13
prompts={}
prompts["EN"] = """\
Context information is below.---------------------
{context_str}
---------------------Given the context information and not prior knowledge, generate only questions based on the below query.You are a Teacher/ Professor. Your task is to setup {num_questions_per_chunk} questions for an upcoming quiz/examination.
The questions should be diverse in nature across the document. Restrict the questions to the context information provided."
"""

提示旨在生成关于文档块的问题,就好像老师正在准备即将到来的测验一样。要为每个数据块生成的问题数量作为参数num_questions_per_chunk传递,我们将其设置为2。然后可以通过调用LlamaIndex库中的generate_qa_embedding_pairs来生成问题:

1
2
3
4
5
6
7
8
9
from llama_index.llms import OpenAI
from llama_index.legacy.finetuning import generate_qa_embedding_pairsqa_dataset = generate_qa_embedding_pairs(llm=OpenAI(model="gpt-3.5-turbo-0125",additional_kwargs={'seed':42}),nodes=nodes,qa_generate_prompt_tmpl = prompts[language],num_questions_per_chunk=2
)

我们依靠OpenAI的GPT-3.5-turbo-0125模式来完成这项任务,该模式是OpenAI该系列的旗舰模型,支持16K上下文窗口并针对对话进行了优化(https://platform.openai.com/docs/models/gpt-3-5-turbo。

结果对象’ qa_dataset ‘包含问题和答案(块)对。作为生成问题的示例,以下是前两个问题的结果(其中“答案”是文本的第一部分):

  1. 根据解释性备忘录,制定人工智能协调规则(人工智能法案)的法规提案的主要目标是什么?
  2. 如上下文信息所述,人工智能法规提案如何旨在解决与使用人工智能相关的风险,同时促进欧盟对人工智能的采用?

Chunks和问题的数量取决于语言,英语大约有100个chunks和200个问题,匈牙利语有200个chunks和400个问题。

OpenAI embedding模型的评价

我们的评估函数遵循LlamaIndex文档,由两个主要步骤组成。首先,所有答案(文档chunks)的嵌入都存储在VectorStoreIndex中,以便有效检索。然后,评估函数循环遍历所有查询,检索前k个最相似的文档,并根据MRR评估检索的准确性(Mean Reciprocal Rank)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
def evaluate(dataset, embed_model, insert_batch_size=1000, top_k=5):# Get corpus, queries, and relevant documents from the qa_dataset objectcorpus = dataset.corpusqueries = dataset.queriesrelevant_docs = dataset.relevant_docs# Create TextNode objects for each document in the corpus and create a VectorStoreIndex to efficiently store and retrieve embeddingsnodes = [TextNode(id_=id_, text=text) for id_, text in corpus.items()]index = VectorStoreIndex(nodes, embed_model=embed_model, insert_batch_size=insert_batch_size)retriever = index.as_retriever(similarity_top_k=top_k)# Prepare to collect evaluation resultseval_results = []# Iterate over each query in the dataset to evaluate retrieval performancefor query_id, query in tqdm(queries.items()):# Retrieve the top_k most similar documents for the current query and extract the IDs of the retrieved documentsretrieved_nodes = retriever.retrieve(query)retrieved_ids = [node.node.node_id for node in retrieved_nodes]# Check if the expected document was among the retrieved documentsexpected_id = relevant_docs[query_id][0]is_hit = expected_id in retrieved_ids  # assume 1 relevant doc per query# Calculate the Mean Reciprocal Rank (MRR) and append to resultsif is_hit:rank = retrieved_ids.index(expected_id) + 1mrr = 1 / rankelse:mrr = 0eval_results.append(mrr)# Return the average MRR across all queries as the final evaluation metricreturn np.average(eval_results)

Embedding模型通过embed_model参数传递给评估函数,对于OpenAI模型,该参数是一个用模型名称和模型维度初始化的OpenAI Embedding对象。

1
2
3
4
from llama_index.embeddings.openai import OpenAIEmbeddingembed_model = OpenAIEmbedding(model=model_spec['model_name'],dimensions=model_spec['dimensions'])

dimensions API参数可以缩短嵌入(即从序列的末尾删除一些数字),而不会失去embedding的概念表示属性。例如,OpenAI建议在他们的公告中,在MTEB基准测试中,embedding可以缩短到256的大小,同时仍然优于未缩短的1536大小的text-embedt-ada-002embedding。

我们在四种不同的OpenAIembedding模型上运行评估函数:

  • 两个版本的text-embeddings-3-large:一个具有最低可能维度(256),另一个具有最高可能维度(3072)。它们被称为OAI-large-256OAI-large-3072
  • OAI-small:text-embedding-3-small embedding模型,维度为1536。
  • OAI-ada-002:传统的text-embedding-ada-002模型,维度为1536。

每个模型在四种不同的语言上进行评估:英语(EN),法语(FR),捷克语(CS)和匈牙利语(HU),分别涵盖日耳曼语,罗曼语,斯拉夫语和乌拉尔语的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
embeddings_model_spec = {
}embeddings_model_spec['OAI-Large-256']={'model_name':'text-embedding-3-large','dimensions':256}
embeddings_model_spec['OAI-Large-3072']={'model_name':'text-embedding-3-large','dimensions':3072}
embeddings_model_spec['OAI-Small']={'model_name':'text-embedding-3-small','dimensions':1536}
embeddings_model_spec['OAI-ada-002']={'model_name':'text-embedding-ada-002','dimensions':None}results = []languages = ["EN", "FR", "CS", "HU"]# Loop through all languages
for language in languages:# Load datasetfile_name=language+"_dataset.json"qa_dataset = EmbeddingQAFinetuneDataset.from_json(file_name)# Loop through all modelsfor model_name, model_spec in embeddings_model_spec.items():# Get modelembed_model = OpenAIEmbedding(model=model_spec['model_name'],dimensions=model_spec['dimensions'])# Assess embedding score (in terms of MRR)score = evaluate(qa_dataset, embed_model)results.append([language, model_name, score])df_results = pd.DataFrame(results, columns = ["Language" ,"Embedding model", "MRR"])

所得的MRR精度报告如下:

img

OpenAI模型的性能总结

正如预期的那样,对于大型模型,embedding尺寸3072越大,性能越好。与小型和遗留的Ada模型相比,大型模型比我们预期的要小。为了比较,我们还在下面报告了OpenAI模型在MTEB基准测试上获得的性能。

img

OpenAI embedding模型的性能,详见官方公告

有趣的是,与MTEB基准测试相比,大型、小型和Ada模型之间的性能差异在我们的评估中远没有那么明显,这反映了这样一个事实,即在大型基准测试中观察到的平均性能不一定反映在定制数据集上获得的性能。

开源embedding模型的评估

围绕嵌入的开源研究相当活跃,并且定期发布新的模型。了解最新发布的模型的一个好地方是hug Face..MTEB排行榜。

为了在本文中进行比较,我们选择了最近发表的(2024)四个embedding模型。选择的标准是他们在MTEB排行榜上的平均得分和他们处理多语言数据的能力。所选模型的主要特性摘要如下。

Embedding modelEmbedding sizeContext sizeSize (GB)MTEB Rank (Feb 24)Release date
e5-mistral-7b-instruct40963276814404/01/2024
multilingual-e5-large-instruct10245141.121008/02/2024
BGE-M3102481922.27NA29/01/2024
nomic-embed-text-v176881920.552210/02/2024

选择开源embedding模型

  • *E5- mistral-7b- instruction * (E5-mistral-7b):微软的E5embedding模型是从Mistral-7B-v0.1初始化的,并在多语言数据集的混合上进行微调。该型号在MTEB排行榜上表现最好,但也是迄今为止最大的(14GB)。
  • *multilingual- E5-large - directive * (ML-E5-large):微软的另一个E5模型,旨在更好地处理多语言数据。它从xlm-roberta-large初始化,并在多语言数据集的混合上进行训练。它比E5-Mistral小得多(10倍),但上下文大小也小得多(514)。
  • *BGE-M3*:该模型由北京人工智能研究院设计,是他们最先进的多语言数据embedding模型,支持100多种工作语言。截至2024年2月22日,它还没有进入MTEB排行榜。
  • *** Nomic- embed-text-v1*** (Nomic- embed):该模型由Nomic设计,声称性能优于OpenAI Ada-002和text- embeding3 -small,而大小仅为0.55GB。有趣的是,该模型是第一个完全可复制和可审计的(开放数据和开源训练代码)。

用于评估这些开源模型的代码类似于用于OpenAI模型的代码。主要的变化在于模型规范,其中必须指定诸如最大上下文长度和池类型之类的附加细节。然后,我们对四种语言中的每一种模型进行评估:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
embeddings_model_spec = {
}embeddings_model_spec['E5-mistral-7b']={'model_name':'intfloat/e5-mistral-7b-instruct','max_length':32768, 'pooling_type':'last_token', 'normalize': True, 'batch_size':1, 'kwargs': {'load_in_4bit':True, 'bnb_4bit_compute_dtype':torch.float16}}
embeddings_model_spec['ML-E5-large']={'model_name':'intfloat/multilingual-e5-large','max_length':512, 'pooling_type':'mean', 'normalize': True, 'batch_size':1, 'kwargs': {'device_map': 'cuda', 'torch_dtype':torch.float16}}
embeddings_model_spec['BGE-M3']={'model_name':'BAAI/bge-m3','max_length':8192, 'pooling_type':'cls', 'normalize': True, 'batch_size':1, 'kwargs': {'device_map': 'cuda', 'torch_dtype':torch.float16}}
embeddings_model_spec['Nomic-Embed']={'model_name':'nomic-ai/nomic-embed-text-v1','max_length':8192, 'pooling_type':'mean', 'normalize': True, 'batch_size':1, 'kwargs': {'device_map': 'cuda', 'trust_remote_code' : True}}results = []languages = ["EN", "FR", "CS", "HU"]# Loop through all models
for model_name, model_spec in embeddings_model_spec.items():print("Processing model : "+str(model_spec))# Get modeltokenizer = AutoTokenizer.from_pretrained(model_spec['model_name'])embed_model = AutoModel.from_pretrained(model_spec['model_name'], **model_spec['kwargs'])if model_name=="Nomic-Embed":embed_model.to('cuda')# Loop through all languagesfor language in languages:# Load datasetfile_name=language+"_dataset.json"qa_dataset = EmbeddingQAFinetuneDataset.from_json(file_name)start_time_assessment=time.time()# Assess embedding score (in terms of hit rate at k=5)score = evaluate(qa_dataset, tokenizer, embed_model, model_spec['normalize'], model_spec['max_length'], model_spec['pooling_type'])# Get duration of score assessmentduration_assessment = time.time()-start_time_assessmentresults.append([language, model_name, score, duration_assessment])df_results = pd.DataFrame(results, columns = ["Language" ,"Embedding model", "MRR", "Duration"])

以MRR表示的结果准确性报告如下。

img

开源模型的性能总结

BGE-M3的性能最好,其次是ML-E5-Large、E5-mistral-7b和Nomic-Embed。BGE-M3模型尚未在MTEB排行榜上进行基准测试,我们的结果表明它可能比其他模型排名更高。值得注意的是,虽然BGE-M3针对多语言数据进行了优化,但它在英语方面的表现也比其他模型更好。

我们还在下面报告了每个embedding模型的处理时间。

img

以秒为单位浏览英文问答数据集的处理时间

E5-mistral-7b比其他型号大10倍以上,毫无疑问是迄今为止最慢的型号。

结论

让我们把八个测试型号的性能并排放在一个数字中。

img

八个测试模型的性能总结

这些结果的主要观察结果是:

  • 采用开源模型获得最佳性能。由北京人工智能研究院开发的BGE-M3模型成为表现最好的模型。该模型具有与OpenAI模型相同的上下文长度(8K),大小为2.2GB。
  • OpenAI范围内的一致性。大型(3072)、小型和传统OpenAI模型的性能非常相似。然而,减少大型模型(256)的embedding大小会导致性能的下降。
  • 语言敏感性。几乎所有型号(ML-E5-large除外)在英语上表现最好。在捷克语和匈牙利语等语言中,人们的性能存在显著差异。

因此,你是应该付费订阅OpenAI,还是托管一个开源embedding模型?

OpenAI最近的价格调整使得他们的API变得更加实惠,现在每百万代币的成本为0.13美元。因此,每月处理一百万个查询(假设每个查询涉及大约1K令牌)的成本约为130美元。因此,根据您的用例,租用和维护您自己的embedding服务器可能不符合成本效益。

然而,成本效益并不是唯一的考虑因素。可能还需要考虑延迟、隐私和对数据处理工作流的控制等其他因素。开源模型提供了完全数据控制的优势,增强了隐私性和定制性。另一方面,OpenAI的API也存在延迟问题,有时会导致响应时间延长。

总之,在开源模型和像OpenAI这样的专有解决方案之间做出选择并不是一个简单的答案。开源嵌入提供了一个引人注目的选择,它将性能与对数据的更好控制结合在一起。相反,OpenAI的产品可能仍然会吸引那些优先考虑便利性的人,特别是如果隐私问题是次要的。

引用

  • Companion Github repository: GitHub - Yannael/multilingual-embeddings
  • Everything you wanted to know about sentence embeddings (and maybe a bit more)
  • OpenAI blog announcement: New embedding models and API updates
  • Embeddings: OpenAI guide
  • MTEB: Massive Text Embedding Benchmark and Hugging Face MTEB leaderboard
  • Text Embeddings: Comprehensive Guide
  • A Practitioners Guide to Retrieval Augmented Generation (RAG)
  • How to Find the Best Multilingual Embedding Model for Your RAG

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

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

相关文章

企业微信主体怎么转让给别人?

企业微信变更主体有什么作用?当我们的企业因为各种原因需要注销或已经注销,或者运营变更等情况,企业微信无法继续使用原主体继续使用时,可以申请企业主体变更,变更为新的主体。企业微信变更主体的条件有哪些&#xff1…

Zookeeper启动报错排查

前言:生产linux部署的zookeeper,执行启动脚本后,还是无法使用,故进行重启排查 在zookeeper的bin目录下执行 ./zkServer.sh start-foreground 可实时查看启动日志排查问题 根据上面的日志可以看出,是zoo.cfg配置文件里…

绿幕背景抠图SDK解决方案

随着影像技术的日益发展和普及,视频制作和图像处理已经成为众多行业不可或缺的一环。美摄科技,作为业内领先的影像技术提供商,针对企业需求,推出了全新的绿幕背景抠图SDK解决方案,旨在为企业提供更加高效、精准的影像处…

Java技术发展历程中的六大春天:从Web开发到大数据战略

Java技术发展历程中的六大春天:从Web开发到大数据战略 Six Springs in the Development Journey of Java Technology: From Web Development to Big Data Strategy 自Java诞生以来,其发展历程中出现了多个关键的“春天”时刻,每一段历程都伴随…

flashback to timestamp 耗时

flashback pluggable database XX to timestamp to_date(2024-02-26 13:11:56,yyyy-mm-dd hh24:mi:ss); 1TB 花费2小时,如果做了还原点好像很快 select trunc( a.FIRST_TIME,HH24),count(*) from v$flashback_database_logfile a group by trunc( a.FIRST_TIME,…

ADC制剂生产过程中的微粒控制-隧道烘箱在线粒子监测系统 中邦兴业

ADC制剂生产过程中的污染和交叉污染控制需要从多个方面入手,包括生产环境、设备、原辅料、生产过程、人员卫生和培训以及微生物监控等。只有全面、有效地实施这些控制措施,才能确保ADC制剂的质量和安全性。 ADC制剂生产过程中的微粒控制 ADC制剂生产中的…

StarRocks之监控管理(内含DashBoard模板)

先看下最终效果图 架构 Prometheus 是一个拥有多维度数据模型的、灵活的查询语句的时序数据库。它可以通过 Pull 或 Push 采集被监控系统的监控项,存入自身的时序数据库中。并且通过丰富的多维数据查询语言,满足用户的不同需求。 Grafana 是一个开源的 Metric 分析及可视化系…

右值引用的意义 以及 move函数,forward完美转发

文章目录 右值引用的意义move 函数forward 完美转发 右值引用的意义 直观意义: 为临时变量续命,也就是为右值续命,因为右值在表达式结束后就消亡了,如果想继续使用右值,那就会动用昂贵的拷贝构造函数。(关…

k8s 进阶实战笔记 | NFS 动态存储类的部署与使用

文章目录 NFS 动态存储类的部署与使用演示环境说明NFS subdir external provisioner准备 NFS 服务器手动部署 NFS Subdir External Provisioner部署 StorageClass验证使用更多信息 NFS 动态存储类的部署与使用 演示环境说明 演示环境信息:单机K3s 1.28.2 操作系统…

配置用户通过IPv6方式上网

组网需求 运营商为企业分配了WAN侧的IPv6地址1111:2222:A0EE:6::2/64和LAN侧的IPv6地址1111:3333:E840:2::1/64,企业通过运营商提供的IPv6地址配置上网。 图1 配置用户通过IPv6方式上网 操作步骤 1、在IPS上的配置 interface GigabitEthernet0/0/4 ipv6 enable…

代码随想录Leetcode377. 组合总和 Ⅳ

题目&#xff1a; 代码(首刷看解析 2024年2月27日&#xff09;&#xff1a; class Solution { public:// 思路&#xff1a;动态规划int combinationSum4(vector<int>& nums, int target) {// 1条件判断:无// 2定义dp 初始化 总和为target的数量vector<int> dp…

.NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】

设计模式是软件工程中常用的解决特定问题的通用设计方法。它们提供了经过验证的解决方案&#xff0c;可用于解决在软件开发过程中经常遇到的一些常见问题。设计模式不是一种具体的编程语言特性或语法&#xff0c;而是一种通用的设计思想或模板&#xff0c;可以帮助开发人员设计…

【数电符号】9 Selectable Functions

1 AND 与门 2 OR 或门 3 NOT(Inverted) 非门 4 NAND 与非门 5 NOR 或非门 6 NANDOR 与或非门 … 7 XNOR 同或门 相同为1&#xff0c;不同为0 8 XOR 异或门 不同为1&#xff0c;相同为0 9 Buffer 缓冲器 也有不带施密特触发器的 //-----------Example---------------------…

基于springboot+vue的抗疫物资管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

c++数据结构算法复习基础--1

一、大体复习内容 复习思路&#xff1b; 二、数据结构算法-常见复杂度汇总介绍-性能对比-图表展示 数据结构: 相互之间存在一种或者多种特定关系的数据元素的集合。在逻辑上可以分为线性结构&#xff0c;散列结构、树形结构&#xff0c;图形结构等等。 数据结构说的是组织…

kubectl使用及源码阅读

目录 概述实践样例yaml 中的必须字段 kubectl 代码原理kubectl 命令行设置pprof 抓取火焰图kubectl 中的 cobra 七大分组命令kubectl createcreateCmd中的builder模式createCmd中的visitor访问者模式外层VisitorFunc分析 结束 概述 k8s 版本 v1.24.16 kubectl的职责 1.主要的…

vue基础概念(1)

1. 前言 此项目基于vue2开发 1.1. vue组件 1.2. 文本插值表达式 用于返回data方法中的对象属性 也可以用于数据判断例如{{age >xx ? 老年 &#xff1a;青年}} 1.3. 属性绑定 v-bind :xxx 一般用于input输入框等 1.4. 事件绑定 v-on 1.5. 双向绑定 v-model 表单输入项…

UTONMOS元宇宙游戏发展趋势是什么?

UTONMOS元宇宙游戏的发展趋势包括以下几个方面&#xff1a; 更加真实的体验&#xff1a;随着技术的进步&#xff0c;UTONMOS元宇宙游戏将提供更加逼真的视觉、听觉和触觉体验&#xff0c;让玩家更加身临其境。 社交互动&#xff1a;UTONMOS元宇宙游戏将越来越注重社交互动&am…

记录一次主机不能登录的异常现象解决的问题

故障现象:客户5台云主机不能root登录,提示认证失败。 发现每次都会在/etc/host.deny 文件夹里面出现&#xff56;&#xff50;&#xff4e;的内网地址 经过仔细排查发现&#xff1a; 客户在进行等保整改的时候&#xff0c;修改了&#xff0f;&#xff45;&#xff54;&…

算法竞赛备赛之斜率优化的DP问题

目录 1.任务安排1 2.任务安排2 3.任务安排3 4.运输小猫 在处理下图的最小截距问题上面&#xff0c;我们该如何在维护的凸包中找到战距最小的点&#xff1f; 相当于在一个单调的队列中&#xff0c;找到第一个大于某一个数的点。 斜率单调递增&#xff0c;新加的点的横坐标也…