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

Elasticsearch:使用 ELSER 进行语义搜索 - sparse_vector

Elastic Learned Sparse EncodeR(或 ELSER)是由 Elastic 训练的 NLP 模型,可让你使用稀疏向量表示执行语义搜索。语义搜索不是根据搜索词进行文字匹配,而是根据搜索查询的意图和上下文含义检索结果。

本教程中的说明向你展示了如何使用 ELSER 对数据执行语义搜索。

重要:有关在 Elastic Stack 中执行语义搜索的最简单方法,请参阅 semantic_text 端到端教程。

注意:使用 ELSER 进行语义搜索时,每个字段仅考虑前 512 个提取的标记。请参阅此页面了解更多信息。

要求

要使用 ELSER 执行语义搜索,你必须在集群中部署 NLP 模型。请参阅 ELSER 文档以了解如何下载和部署模型。

注意:如果关闭部署自动扩展功能,则在 Elasticsearch Service 中部署和使用 ELSER 模型所需的最小专用 ML 节点大小为 4 GB。建议启用自动扩展功能,因为它允许你的部署根据需求动态调整资源。通过使用更多分配或每个分配使用更多线程,可以获得更好的性能,这需要更大的 ML 节点。自动扩展功能会在需要时提供更大的节点。如果关闭自动扩展功能,你必须自行提供大小合适的节点。

如果你已经安装完毕并部署好,你可以在机器学习页面查看:

创建索引映射

首先,必须创建目标索引(包含模型根据你的文本创建的标记的索引)的映射。目标索引必须具有具有 sparse_vector 或 rank_features 字段类型的字段,才能索引 ELSER 输出。

注意:ELSER 输出必须被提取到具有 sparse_vector 或 rank_features 字段类型的字段中。否则,Elasticsearch 会将 token-weight 对解释为文档中的大量字段。如果你收到类似以下错误:“Limit of total fields [1000] has been exceeded while adding new fields”,则 ELSER 输出字段未正确映射,并且其字段类型与 sparse_vector 或 rank_features 不同。

  1. 包含生成的标记的字段的名称。下一步必须在推理管道配置中引用它。
  2. 包含标记的字段是 sparse_vector 字段。
  3. 创建稀疏向量表示的字段的名称。在此示例中,字段的名称为 content。下一步必须在推理管道配置中引用它。
  4. 字段类型,在此示例中为 text。

要了解如何优化空间,请参阅通过从文档源中排除 ELSER 标记来节省磁盘空间部分。

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

使用 ingest pipeline inference processor ingest pipeline 创建 ingest pipeline,以使用 ELSER 对管道中摄取的数据进行推理。

PUT _ingest/pipeline/elser-v2-test
{"processors": [{"inference": {"model_id": ".elser_model_2","input_output": [  /* 1 */{"input_field": "content","output_field": "content_embedding"}]}}]
}

配置对象定义推理过程的 input_field 和包含推理结果的 output_field。

加载数据

在此步骤中, 你将加载稍后在推理提取管道中使用的数据,以从中提取标记。

使用 msmarco-passagetest2019-top1000 数据集,它是 MS MARCO Passage Ranking 数据集的子集。它由 200 个查询组成,每个查询都附有相关文本段落列表。所有唯一段落及其 IDs 都已从该数据集中提取并编译成 tsv 文件。

重要:msmarco-passagetest2019-top1000 数据集未用于训练模型。它在本教程中仅用作易于访问的示例数据集以用于演示目的。你可以使用不同的数据集来测试工作流程并熟悉它。

下载文件并使用机器学习 UI 中的 Data Visualizer 将其上传到你的集群。将名称 id 分配给第一列,将内容分配给第二列。索引名称为 test-data。上传完成后,你可以看到一个名为 test-data 的索引,其中包含 182469 个文档。

我们可以通过如下的命令来查看 test_data 的映射:

GET test-data/_mapping
{"test-data": {"mappings": {"_meta": {"created_by": "file-data-visualizer"},"properties": {"content": {"type": "text"},"id": {"type": "long"}}}}
}

通过 inference ingest pipeline 采集数据

通过使用 ELSER 作为推理模型的推理管道重新索引数据,从文本中创建标记。

POST _reindex?wait_for_completion=false
{"source": {"index": "test-data","size": 50  /* 1 */},"dest": {"index": "my-index","pipeline": "elser-v2-test"}
}
  • 重新索引的默认批次大小为 1000。将大小减小到较小的数字可以加快重新索引过程的更新速度,从而使你能够密切跟踪进度并尽早发现错误。

该调用返回一个任务 ID 来监控进度:

GET _tasks/022z5o7HRqaGwOTjIMMZSw:897221

你还可以打开 Trained Models UI,选择 ELSER 下的 Pipelines 选项卡来跟踪进度。

等上面的 reindex 完毕后,我们可以查看:

GET my-index/_search

使用 sparse_vector 查询进行语义搜索

要执行语义搜索,请使用 sparse_vector 查询,并提供查询文本和与你的 ELSER 模型关联的推理 ID。以下示例使用查询文本 “How to avoid muscle soreness after running?”,content_embedding 字段包含生成的 ELSER 输出:

GET my-index/_search
{"query":{"sparse_vector":{"field": "content_embedding","inference_id": "my-elser-endpoint","query": "How to avoid muscle soreness after running?"}}
}

注意:在 8.15 之前的版本,我们使用 text expansion 来对数据进行搜索。text_expansion 已经是过时的了。不被推荐使用。

GET my-index/_search
{"query":{"text_expansion":{"content_embedding": {"model_id": ".elser_model_2","model_text": "How to avoid muscle soreness after running?"}}}
}

结果是 my-index 索引中与你的查询文本含义最接近的前 10 个文档,按相关性排序。结果还包含每个相关搜索结果的提取标记及其权重。标记是学习到的关联,用于捕捉相关性,它们不是同义词。要了解有关标记的更多信息,请参阅此页面。可以从源中排除标记,请参阅本节了解更多信息。

我们首先使用如下的命令来创建 my-elser-model inference id。

PUT _inference/sparse_embedding/my-elser-model
{"service": "elser","service_settings": {"num_allocations": 1,"num_threads": 1}
}

我们再使用如下的命令来进行搜索:

GET my-index/_search
{"query":{"sparse_vector":{"field": "content_embedding","inference_id": "my-elser-model","query": "How to avoid muscle soreness after running?"}}
}

将语义搜索与其他查询相结合

你可以将 sparse_vector 与复合查询中的其他查询相结合。例如,在 Boolean 或全文查询中使用过滤子句,查询文本与 sparse_vector 查询相同(或不同)。这样你就可以将两个查询的搜索结果结合起来。

sparse_vector 查询的搜索命中率往往高于其他 Elasticsearch 查询。可以使用 boost 参数增加或减少每个查询的相关性分数来规范这些分数。如果存在大量相关性较低的结果,sparse_vector 查询的召回率可能会很高。使用 min_score 参数来修剪那些相关性较低的文档。

GET my-index/_search
{"_source": {"exclude": ["content_embedding","id","model_id"]}, "query": {"bool": {  /* 1 */"should": [{"sparse_vector": {"field": "content_embedding","inference_id": "my-elser-model","query": "How to avoid muscle soreness after running?","boost": 1 /* 2 */ }},{"query_string": {"query": "toxins","boost": 4. /* 3 */ }}]}},"min_score": 10 /* 4 */
}

  • sparse_vector 和 query_string 查询均位于布尔查询的 should 子句中。
  • sparse_vector 查询的 boost 值为 1,这是默认值。这意味着此查询结果的相关性分数不会提高。
  • query_string 查询的 boost 值为 4。此查询结果的相关性分数会增加,从而使其在搜索结果中的排名更高。
  • 仅显示分数等于或高于 10 的结果。

通过从文档源中排除 ELSER 标记来节省磁盘空间

ELSER 生成的标记必须编入索引才能用于 sparse_vector 查询。但是,没有必要在文档源中保留这些术语。你可以使用 source exclude 映射从文档源中删除 ELSER 术语,从而节省磁盘空间。

警告:重新索引使用文档源来填充目标索引。一旦 ELSER 术语从源中排除,就无法通过重新索引来恢复它们。从源中排除标记是一种节省空间的优化,只有当你确定将来不需要重新索引时才应应用!仔细考虑这种权衡并确保从源中排除 ELSER 术语符合你的特定要求和用例非常重要。仔细查看禁用 _source 字段和从 _source 中包含/排除字段部分,以了解有关从 _source 中排除标记的可能后果的更多信息。

可以通过以下 API 调用创建从 _source 字段中排除 content_embedding 的映射:

PUT my-index
{"mappings": {"_source": {"excludes": ["content_embedding"]},"properties": {"content_embedding": {"type": "sparse_vector"},"content": {"type": "text"}}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 在pytorch中TensorBoard的使用
  • OpenCV c++ 实现图像马赛克效果
  • Magenta——利用深度学习生成音乐和艺术内容
  • 基于STM32的温湿度采集设计
  • npm install` 报错
  • 【软件测试面试题】WEB功能测试(持续更新)
  • 黑神话:悟空-配置推荐
  • catvod、TVBox源的解析过程分析和Spider参数覆盖问题解决
  • 【计算机网络】网络基础
  • Node.js自学速通---- 24-8-22 22-44
  • Java中的File类应用
  • Kubernetes Master节点:集群控制中心的解析
  • ARM——驱动——inmod加载内核模块
  • 微信小程序:点击事件(bindtap)传递参数
  • 新版本 | GreatSQL 8.0.32-26全新发布 增强“四高”诸多新特性
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • canvas绘制圆角头像
  • CentOS 7 防火墙操作
  • CSS中外联样式表代表的含义
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Laravel 实践之路: 数据库迁移与数据填充
  • October CMS - 快速入门 9 Images And Galleries
  • Promise面试题2实现异步串行执行
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • React的组件模式
  • REST架构的思考
  • TypeScript迭代器
  • XML已死 ?
  • 阿里云Kubernetes容器服务上体验Knative
  • 关于字符编码你应该知道的事情
  • 离散点最小(凸)包围边界查找
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 提醒我喝水chrome插件开发指南
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 你对linux中grep命令知道多少?
  • PostgreSQL之连接数修改
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • ######## golang各章节终篇索引 ########
  • #宝哥教你#查看jquery绑定的事件函数
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (12)Hive调优——count distinct去重优化
  • (Oracle)SQL优化技巧(一):分页查询
  • (poj1.2.1)1970(筛选法模拟)
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (论文阅读11/100)Fast R-CNN
  • (三)c52学习之旅-点亮LED灯
  • (十一)c52学习之旅-动态数码管
  • (十一)图像的罗伯特梯度锐化
  • (学习日记)2024.01.19
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。