Elasticsearch:使用 ELSER 释放语义搜索的力量:Elastic Learned Sparse EncoderR

问题陈述

在信息过载的时代,根据上下文含义和用户意图而不是精确的关键字匹配来查找相关搜索结果已成为一项重大挑战。 传统的搜索引擎通常无法理解用户查询的语义上下文,从而导致相关性较低的结果。

解决方案:ELSER

Elastic 通过其检索模型 Elastic Learned Sparse EncodeR (ELSER) 引入了该问题的解决方案。 ELSER 是由 Elastic 训练的检索模型,使你能够执行语义搜索以检索更相关的搜索结果。 此搜索类型为你提供基于上下文含义和用户意图的搜索结果,而不是精确的关键字匹配。

ELSER 是一种域外(out-of-domain)模型,这意味着它不需要对你自己的数据进行微调,使其能够开箱即用地适应各种用例。 它将索引和搜索的段落扩展为术语集合,这些术语在不同的训练数据集中经常同时出现。 这些扩展术语不是搜索术语的同义词; 他们是 learned association。

架构

ELSER 使用 Elasticsearch 排名 rank-feature 类型在索引时存储术语和权重,并在以后进行搜索。 要使用 ELSER,你必须具有适当的语义搜索订阅级别或激活试用期。更多关于订阅的信息,请参阅网站 订阅 | Elastic Stack 产品和支持 | Elastic。

如果关闭部署自动扩展,则 Elasticsearch Service 中用于部署和使用 ELSER 模型的最小专用 ML 节点大小为 4 GB。 建议打开自动缩放,因为它允许你的部署根据需求动态调整资源。

KNN 与 ELSER:

Elasticsearch 的 k 最近邻 (KNN) 搜索和 ELSER (Elastic Learned Sparse EncodeR) 都提供强大的搜索功能,但它们是针对不同类型的搜索任务而设计的,并且以根本不同的方式工作。

Elasticsearch 中的 KNN 搜索

Elasticsearch 中的 KNN 搜索功能使你能够在高维空间中查找给定向量的 “最近邻居(nearest neigbors)”。 这对于图像搜索、产品推荐和异常检测等用例特别有用,在这些用例中,你可以将项目表示为矢量,并且希望查找矢量空间中相似的其他项目。

KNN 搜索的工作原理是对每个矢量进行索引,然后使用距离函数(例如 Euclidean 距离或余弦相似度)来查找最接近给定向量的向量。 这是相似性搜索的一种形式,其目标是查找与给定项目相似的项目。

Elasticsearch 中的 ELSER

另一方面,ELSER 是由 Elastic 训练的检索模型,使你能够执行语义搜索以检索更相关的搜索结果。 此搜索类型为您提供基于上下文含义和用户意图的搜索结果,而不是精确的关键字匹配。

ELSER 是一种域外(out-of-domain)模型,这意味着它不需要对你自己的数据进行微调,使其能够开箱即用地适应各种用例。 它将索引和搜索的段落扩展为术语集合,这些术语在不同的训练数据集中经常同时出现。 这些扩展术语不是搜索术语的同义词; 他们是 learned association。

比较

虽然 KNN 和 ELSER 都可用于提高搜索结果的相关性,但它们是针对不同类型的数据和用例而设计的。 KNN 最适合以下用例:你可以将条目表示为矢量,并且你希望根据其矢量表示找到相似的条目。 另一方面,ELSER 专为你想要查找与给定查询语义相关的搜索结果的用例而设计,即使它们不共享精确的关键字匹配。

在性能方面,KNN 搜索可能是计算密集型的,尤其是在高维空间中,并且可能需要大量资源来提供快速搜索结果。 另一方面,ELSER 使用学习模型来扩展搜索词,这可以更有效,但可能需要合适的订阅级别或试用期激活。

总之,KNN 和 ELSER 之间的选择取决于您的用例的具体要求和数据的性质。

代码示例

在 Kibana 中,你可以从 Machine Learning > Trained Models、Enterprise Search > Indices 或使用开发控制台下载和部署 ELSER。你可以参考文章 “Elasticsearch:部署 ELSER - Elastic Learned Sparse EncoderR” 来在自己的电脑上部署 ELSER 模型。

使用开发控制台

在 Kibana 中,导航到开发控制台并通过运行以下 API 调用来创建 ELSER 模型配置:

PUT _ml/trained_models/.elser_model_1
{
  "input": {
    "field_names": [
      "text_field"
    ]
  }
}

上述命令返回:

{
  "model_id": ".elser_model_1",
  "model_type": "pytorch",
  "model_package": {
    "packaged_model_id": "elser_model_1",
    "model_repository": "https://ml-models.elastic.co",
    "minimum_version": "8.8.0",
    "size": 438123276,
    "sha256": "95f645a3ab8dc66a33de7892391a41ef4fc609a74d21d7b3f7fdd973d58dfe06",
    "metadata": {},
    "tags": [],
    "vocabulary_file": "elser_model_1.vocab.json"
  },
  "created_by": "api_user",
  "version": "8.8.2",
  "create_time": 1690432777746,
  "model_size_bytes": 0,
  "estimated_operations": 0,
  "license_level": "platinum",
  "description": "Elastic Learned Sparse EncodeR v1 (Tech Preview)",
  "tags": [
    "elastic"
  ],
  "metadata": {},
  "input": {
    "field_names": [
      "text_field"
    ]
  },
  "inference_config": {
    "text_expansion": {
      "vocabulary": {
        "index": ".ml-inference-native-000001"
      },
      "tokenization": {
        "bert": {
          "do_lower_case": true,
          "with_special_tokens": true,
          "max_sequence_length": 512,
          "truncate": "first",
          "span": -1
        }
      }
    }
  },
  "location": {
    "index": {
      "name": ".ml-inference-native-000001"
    }
  }
}

使用带有部署 ID 的启动训练模型 deployment API 来部署模型:

POST _ml/trained_models/.elser_model_1/deployment/_start?deployment_id=for_search

上述命令返回:

{
  "assignment": {
    "task_parameters": {
      "model_id": ".elser_model_1",
      "deployment_id": "for_search",
      "model_bytes": 438123276,
      "threads_per_allocation": 1,
      "number_of_allocations": 1,
      "queue_capacity": 1024,
      "cache_size": "438123276b",
      "priority": "normal"
    },
    "routing_table": {
      "Gbl69vadQgK1nOqxUT8LaQ": {
        "current_allocations": 1,
        "target_allocations": 1,
        "routing_state": "started",
        "reason": ""
      }
    },
    "assignment_state": "started",
    "start_time": "2023-07-27T04:40:19.531125Z",
    "max_assigned_allocations": 1
  }
}

部署完成后,我们可以通过 Kibana 来查看部署的结果:

ELSER 就可以在摄取管道或 text_expansion 查询中使用来执行语义搜索。

在摄取管道中使用 ELSER:

PUT _ingest/pipeline/my_pipeline
{
  "description": "ELSER pipeline",
  "processors": [
    {
      "inference": {
        "model_id": ".elser_model_1",
        "target_field": "ml",
        "field_map": {},
        "inference_config": {
          "text_expansion": {
            "results_field": "tokens"
          }
        }
      }
    }
  ]
}

使用管道索引文档。设置管道后,你可以使用它索引文档:

PUT my_index
{
  "mappings": {
    "properties": {
      "ml.tokens": {
        "type": "rank_features" 
      },
      "text_field": {
        "type": "text" 
      }
    }
  }
}

PUT my_index/_doc/1?pipeline=my_pipeline
{
  "text_field": "This is a sample document for ELSER."
}

PUT my_index/_doc/2?pipeline=my_pipeline
{
  "text_field": "Elastic is a great company"
}

最后,你可以使用匹配查询来查询索引文档:

GET my_index/_search
{
  "_source":false,
  "fields": [
    "text_field"
  ], 
  "query": {
    "text_expansion": {
      "ml.tokens": {
        "model_id": ".elser_model_1",
        "model_text": "Sample"
      }
    }
  }
}

上面的搜索结果为:

{
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": 5.2040906,
    "hits": [
      {
        "_index": "my_index",
        "_id": "1",
        "_score": 5.2040906,
        "fields": {
          "text_field": [
            "This is a sample document for ELSER."
          ]
        }
      },
      {
        "_index": "my_index",
        "_id": "2",
        "_score": 0.028514616,
        "fields": {
          "text_field": [
            "Elastic is a great company"
          ]
        }
      }
    ]
  }
}

我们再做一次搜索:

GET my_index/_search
{
  "_source":false,
  "fields": [
    "text_field"
  ], 
  "query": {
    "text_expansion": {
      "ml.tokens": {
        "model_id": ".elser_model_1",
        "model_text": "Elastic Stack"
      }
    }
  }
}

上面显示的结果为:

{
  "took": 73,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 13.001609,
    "hits": [
      {
        "_index": "my_index",
        "_id": "2",
        "_score": 13.001609,
        "fields": {
          "text_field": [
            "Elastic is a great company"
          ]
        }
      }
    ]
  }
}

我们再做一次搜索:

GET my_index/_search
{
  "_source":false,
  "fields": [
    "text_field"
  ], 
  "query": {
    "text_expansion": {
      "ml.tokens": {
        "model_id": ".elser_model_1",
        "model_text": "ELK"
      }
    }
  }
}

上面的搜索结果为:

{
  "took": 48,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.054624833,
    "hits": [
      {
        "_index": "my_index",
        "_id": "2",
        "_score": 0.054624833,
        "fields": {
          "text_field": [
            "Elastic is a great company"
          ]
        }
      }
    ]
  }
}

最后一个搜索:

GET my_index/_search
{
  "_source":false,
  "fields": [
    "text_field"
  ], 
  "query": {
    "text_expansion": {
      "ml.tokens": {
        "model_id": ".elser_model_1",
        "model_text": "demo doc"
      }
    }
  }
}

结果为:

{
  "took": 56,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": 4.6410522,
    "hits": [
      {
        "_index": "my_index",
        "_id": "1",
        "_score": 4.6410522,
        "fields": {
          "text_field": [
            "This is a sample document for ELSER."
          ]
        }
      },
      {
        "_index": "my_index",
        "_id": "2",
        "_score": 0.09583376,
        "fields": {
          "text_field": [
            "Elastic is a great company"
          ]
        }
      }
    ]
  }
}

商业用例

ELSER(Elastic 的学习稀疏编码器)可以有效地用于以语义理解和上下文相关性为关键的各种用例。 这里有一些例子:

  1. 信息检索:在大型数据库或文档存储库中,ELSER 可用于检索与给定查询在语义上相关的文档,即使它们不共享精确的关键字匹配。 这在精确的信息检索至关重要的法律、学术或企业环境中特别有用。
  2. 电子商务搜索:电子商务平台可以使用 ELSER 来改进其搜索功能。 当客户搜索产品时,ELSER 可以根据搜索查询的语义上下文提供更相关的结果,从而改善购物体验并有可能增加销售额。
  3. 客户支持:ELSER 可用于客户支持系统,以更好地了解客户查询并提供更相关的解决方案。 例如,客户描述问题的方式可能与支持数据库中的措辞不完全匹配。 ELSER 可以帮助弥合这一差距并找到最相关的支持文档。
  4. 内容推荐:媒体平台可以使用 ELSER 来推荐与用户正在查看或已经查看的内容在语义上相关的内容。 这可以通过提供更多符合用户兴趣的内容来帮助保持用户的参与度。
  5. 社交媒体监控:公司可以使用 ELSER 监控社交媒体并了解有关其品牌的讨论背景。 这可以提供有关客户情绪和新兴趋势的宝贵见解。
  6. 语义 SEO(Search Engine Optimization):ELSER 可用于理解 Web 内容的语义上下文并针对搜索引擎进行优化。 这可以通过将网站内容与相关搜索查询的语义上下文更紧密地结合起来,帮助提高网站的搜索引擎排名。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue elementui table去掉滚动条与实现表格自动滚动且无滚动条

当table内容列过多时,可通过height属性设置table高度以固定table高度、固定表头,使table内容可以滚动。 现在需求是右侧滚动条不好看,需要去除滚动条,并隐藏滚动条所占列的位置。让他可以滚动但是不出现滚动条,不然即时隐藏了滚动…

Mybatis学习笔记

Mybatis 文章目录 Mybatis搭建环境创建Maven工程将数据库中的表转换为对应的实体类配置文件核心配置文件mybatis-config.xml创建Mapper接口映射文件xxxMapper.xmllog4j日志功能 Mybatis操纵数据库示例及要点说明获取参数的两种方式${}#{} 各种类型的参数处理单个字面量参数多个…

keil官网下载MDK的STM32芯片pack包

背景 最近重装了电脑系统,重新安装了MDK所以导致MDK芯片包需要重新下载,软件内下载又太慢,所以趁现在找到了官网下载方法把方法分享出来供大家参考。 1、在浏览器中输入网址:www.keil.arm.com进入如下界面,然后点击&am…

Mock-MOCO使用过程

一、jar包下载:https://github.com/dreamhead/moco 二、准备mock的json文件 data.json内容: ####GET请求 [{"description": "response使用Content-Type为charsetGBK编码格式来查看返回信息为中文的内容","request": {&q…

Tensorflow预训练模型ckpt与pb两种文件类型的介绍

我们在 Tensorflow无人车使用移动端的SSD(单发多框检测)来识别物体及Graph的认识 熟悉了Graph计算图以及在 Tensorflow2.0中function(是1.0版本的Graph的推荐替代)的相关知识介绍 这个tf.function的用法,了解到控制流与计算图的各自作用,无论使用哪种方…

Linux基本指令操作

登陆指令(云服务器版) 当我们获取公网IP地址后,我们就可以打开xshell。 此时会有这样的界面,我们若是想的登陆,则需要输入以下的指令 ssh 用户名公网IP地址 然后会跳出以下的窗口 接着输入密码——密码便是先前定好…

利用小波包对一维信号进行降噪或压缩(MATLAB)

function [ output_args ] example4_12( input_args ) %EXAMPLE4_12 Summary of this function goes here % Detailed explanation goes here clc; clear; % 设置信噪比和随机数的初始值 snr 3; init 2055615866; % 生成一个原始信号xref和含高斯白噪声的信号x [xref,x] …

微服务契约测试框架-Pact

契约测试 契约测试的思想就是将原本的 Consumer 与 Provider 间同步的集成测试,通过契约进行解耦,变成 Consumer 与 Provider 端两个各自独立的、异步的单元测试。 契约测试的优点: 契约测试与单元测试以及其它测试之间没有重复&#xff0c…

零的奇幻漂移:解密数组中的神秘消失与重生

本篇博客会讲解力扣“283. 移动零”的解题思路,这是题目链接。 思路1 这道题目很有意思。虽然是简单题,其蕴含的玄机还是很多的。正常来讲,这种题目一般都会原地操作(不开辟额外的数组,空间复杂度是O(1))&…

计算机组成原理(2)- 浮点数的存储

1、浮点数的表示方法 假设有以下小数,它表示的十进制数是多少呢? 00000000 00000000 00000000 1010.10101*2^3 1*2^1 1*2^-1 1*2^-3 10.625 1010.1010可以用科学计数法来表示为1.0101010 * 2^3。关于科学计数法再举个例子0.10101用科学计数法表示…

uni-app:模态框的实现(弹窗实现)

效果图 代码 标签 <template><view><!-- 按钮用于触发模态框的显示 --><button click"showModal true">显示模态框</button><!-- 模态框组件 --><view class"modal" v-if"showModal"><view cla…

网红项目AutoGPT源码内幕及综合案例实战(三)

AutoGPT on LangChain PromptGenerator等源码解析 本节阅读AutoGPT 的prompt_generator.py源代码,其中定义了一个PromptGenerator类和一个get_prompt函数,用于生成一个提示词信息。PromptGenerator类提供了添加约束、命令、资源和性能评估等内容的方法,_generate_numbered_l…

线性表之顺序表

在计算机科学中&#xff0c;数据结构是非常重要的基础知识之一。数据结构为我们提供了组织和管理数据的方法和技巧&#xff0c;使得我们可以高效地存储、检索和操作数据。而顺序表作为数据结构中最基本、最常用的一种存储结构&#xff0c;也是我们学习数据结构的第一步。 本文将…

QT: 完成服务器的实现

1> 思维导图 2> 手动完成服务器的实现&#xff0c;并具体程序要注释清楚 Widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QMessageBox> //…

jMeter使用随记

参数化BodyData 先制作参数文件 再设置一个csv data set config 最后在body data里面写上参数${xxxxx}

Stable diffusion 和 Midjourney 怎么选?

通过这段时间的摸索&#xff0c;我将和你探讨&#xff0c;对普通人来说&#xff0c;Stable diffusion 和 Midjourney 怎么选&#xff1f;最重要的是&#xff0c;学好影视后期制作对 AI 绘画创作有哪些帮助&#xff1f;反过来&#xff0c;AI 绘画对影视后期又有哪些帮助&#xf…

【docker】docker部署nginx

目录 一、步骤二、示例 一、步骤 1.搜索nginx镜像 2.拉取nginx镜像 3.创建容器 4.测试nginx 二、示例 1.搜索nginx镜像 docker search nginx2.拉取nginx镜像 docker pull nginx3.创建容器&#xff0c;设置端口映射、目录映射 # 在root目录下创建nginx目录用于存储nginx数据…

error:0308010C:digital envelope routines::unsupported(Vue2报错)

原因:node.js版本过高&#xff0c; 解决方案&#xff0c;在终端输入以下命令 set NODE_OPTIONS--openssl-legacy-provider 然后再package.json里面添加一行 "dev_t": "set NODE_OPTIONS\"--openssl-legacy-provider\" & npm run dev\n" 然后…

【Linux命令200例】用ln创建链接文件

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜活的实操案例对各个命令进行深入…

windows 删除无法删除的文件

有两种原因&#xff1a; 文件被占用文件无权限 解决方案 通用解决方案是进入安全模式进行删除 安全模式&#xff1a; 不会启动非必要的进程有最高的系统权限 进入系统配置 安全引导&#xff0c;重启 删除文件 修改系统配置为正常启动 重启