作为我们自然语言处理(NLP)博客系列的一部分,我们将介绍一个使用文本生成文本内容来生成文本内容的向量的示例,并演示生成的矢量类似搜索的示例。并在Elasticsearch上可用的模型,并将其在进气管中使用文本文档生成。然后,我们将展示如何在矢量相似性搜索中使用这些嵌入式(嵌入)(嵌入)搜索以找到带有给定查询的语义相似文档。
向量相似性搜索,或通常称为语义搜索,超过传统关键字的搜索,允许用户找到可能没有任何通用关键词语义的文档,从而提供更广泛的结果。DECTOR相似性搜索操作密集的向量,并使用K -Nearest Qunigriem为了搜索类似的向量。为此,我们首先需要使用文本嵌入模型将文本表单的内容转换为其数字向量。
我们将使用MARCO通道排名任务中的公共数据集进行演示。它由Microsoft Bing搜索引擎中的真实问题和人为答案组成。此数据集是测试矢量相似性搜索的理想资源。首先,问答是向量搜索的最常见用例之一。其次,MS MARCO排名中的高级论文使用某种形式的矢量搜索。
在我们的示例中,我们使用此数据集的示例将文本生成文本,然后搜索其运行向量。我们还希望快速验证Vector Search.IN今天的显示器生成的结果的质量,我将使用Elastic Stack 8.2显示。
如果您尚未安装Elasticsearch和Kibana,请参阅以下文章以进行安装:
请注意文章中8.x的安装部分。由于Eland的上传模型是铂金版本或公司版本,在我们的演示中,我们需要启动铂金版本的试验功能:
您可以使用PIP从PYPI安装Eland:
您也可以使用Conda从Conda Forge安装Eland:
希望在不安装Eland的情况下使用它的用户可以构建Docker容器以仅运行可用脚本:
Eland将拥抱的面部转换器模型封装在Python方法中的Torchscript的转换和分割过程中;因此,这是推荐的导入方法。
第一步是安装文本嵌入式型号。对于我们的模型,我们使用拥抱Face的MSMARCO-DISTILBERT-BASE-TAS-B。这是一个句子转换模型,它反映了768维密度向量的句子或段落。该模型已针对语义搜索进行了优化,并专门为MS MARCO通道数据集进行了培训,以使其适合我们的任务。在此模型中,Elasticsearch还支持许多其他文本嵌入式模型。完整列表可以在此处找到。
我们使用我们在NER示例中构建的Eland Docker代理安装模型。将以下脚本用于导入我们的模型并部署它:
在顶部,请注意,您需要根据自己的情况替换上面的用户名和密码部分。您还需要修改相应的Elasticsearch地址。这里安装以避免SSL安全证书。为了加快推理的速度,您可以使用inperion_threads参数来增加推理线程的数量。
从上面的输出来看,我们可以看到该模型已成功上传。
我们可以通过在Kibana控制台中使用此示例来测试模型的成功部署:
结果,我们应该看到预测的密集矢量(密集矢量):
在上述操作之后,我们可以查看Kibana摄入量的模型:
如引言中所述,我们使用MARCO段落排名数据集。数据集非常大,包括超过800万段落。在我们的示例中,我们使用其中的子集,该子集用于2019 TREC深度学习的测试阶段跟踪。重新分组任务的数据集MSMARCO-PASSAGETEST2019-TOP1000.TSV包含200个查询。每个查询都是从一个简单的IR系统提取的简单文本段落中绘制的。从此数据集,我们将所有唯一段落提取了使用IDS,并将它们放入单独的TSV文件中,总计182,469段落。我们将此文件作为我们的文件。数据集。
我们使用Kibana的文件上传函数上传此数据集。Kibana文件上传使我们能够为字段提供自定义名称。我们称它们为ID类型的ID类型的段落ID和文本类型文本。索引名称是集合。上传后,我们可以看到一个称为Collection的索引,其中包含18,2469个文档。
从上面,我们可以看到182,469个文件是摄入量。
我们希望使用推理处理器处理初始数据,该数据将在每个段落中添加嵌入式(嵌入)。为了完成此目的,我们创建了一个嵌入进气管中的文本,然后使用管道重新索引我们的初始数据。
在Kibana控制台中,我们创建了一条用于文本嵌入的管道,并将其称为文本插入。这些段落位于字段中,称为文本。就像我们之前所做的那样,我们定义了一个field_map将文本映射到模型的Expection field_field的字段类似于ON_Failure处理程序,以将故障索引到不同的索引:
我们希望通过文本能量管道将文档推送到从集合索引重新索引到新的收藏索引索引,以便在嵌入在段落中的段落中的其他段落中使用,该段落嵌入了段落中的段落字段,-embeddings索引索引。EssenceBut在我们执行此操作之前,我们需要为目标索引创建和定义映射,尤其是对于进气处理器的字段来存储存储字段text_embedding.predict_value。被索引到常规的浮动点浮点场,不能用于向量相似性搜索。我们使用的模型将嵌入到768维矢量中,因此我们使用768个尺寸索引dense_vector字段类型,如下所示:如下:如下:如下:
最后,我们准备好重新index.在Rendex的时间中,需要一些时间来处理所有文档并推断它。我们在背景rendex中使用wait_for_completion = false徽标调用API:
以上返回任务ID。我们可以通过以下方式监视任务的进度:
另外,通过观察模型统计API或模型统计信息中的推断计数来跟踪进度。
当我们看到它达到了182469年之前的文档数量时,它表明它已经完成。
重新索引文档现在包括推理结果 - 矢量嵌入(Vetor嵌入)。例如,其中一个文档如下:
目前,我们在搜索请求期间不支持查询词的隐藏形成,因此我们的语义搜索被组织为两个步骤:
例如,要查询文本“牙买加的天气如何”,我们首先运行_infer API以获取密集的向量嵌入:
以上命令返回以下结果:
上面的预测d_value是一个768二维向量。在将密度向量(密度向量)插入_knn_search之后,如下所示:
结果,我们获得了最接近查询文档的前10个文档,并根据与查询的亲密程度进行排序:
由于我们仅使用MS MARCO数据集的子集,因此我们不能进行全面的评估。相反,我们可以做的是对某些查询进行简单的验证,以了解我们确实获得了相关结果,而不是一些随机的结果。根据TREC 2019深度学习曲目的段落排名任务的判断,我们选择了最后3个查询,将其提交给我们的矢量相似性搜索,获取前10个结果,并参考TREC判断,以查看我们接收到的结果是相关的。对于本文的排名任务,本文基于非相关(0),相关(文章主题但不回答问题)(1),高相关性(2)和完全相关(3)。
请注意,我们的验证不是严格的评估,它仅用于我们的快速演示。由于我们仅在与查询有关的段落上进行索引,它比原始部分的检索任务要容易得多。未来,我们计划计划严格评估MS MARCO数据集。
查询#1124210“气管是_____的一部分”提交给我们的搜索回到以下结果:
除某些血管(例如零壁)外,所有较高的植物中的所有较高植物中,船只或气管进行水传导功能。容器量很宽。气管纤维具有更高的社会二纤维(木纤维)和木质部实质(木质实质)血管(气管),木质部纤维(木纤维)和木质部实质(木质实质)。6541866 2-相关
,水通过牛流,如管道中,而不是通过细胞膜扩散。
是14.025 K(-259.125°C还是-434。85882223-完美相关的用户:氢的液体低于什么温度?A. 100摄氏度C. -183摄氏度-183度C B.253摄氏度c weeees c weeees c weeees c weeees c weeees:氧气的沸点?A. 100度C C.57华氏度cb。8度C D.183度C WEEEGY:氧的沸点为C. 4254811 3-完美相关的置信。氢通常以这种方式储存,因为液体氢在其正常气体形式下占用的球少于氢。LiquidResult
即使在冬季,最高温度也约为27/30°C(81/86°F),最小温度为27°fcelsius-29°Celsius)。幸运的是,牙买加的天气总是很友好。您几乎不会经历长时间的跌倒,比这几天凉爽得多,而且山区比全年低点。如我们所见,对于所有3个查询,Elasticsearch返回Tomost相关的结果,所有查询的所有第一个结果都是高度相关或完全相关的。
NLP是Elastic Stack中的一个强大功能,具有令人兴奋的路线图。通过在Elastic Cloud中构建群集,找到了新功能,并找到了最新的开发项目。立即进行免费试用,并在此博客中尝试示例。
原始:https://juejin.cn/post/7100879376404905991