ElasticSearch中使用bge-large-zh-v1.5进行向量检索(一)

这篇具有很好参考价值的文章主要介绍了ElasticSearch中使用bge-large-zh-v1.5进行向量检索(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、准备

系统:MacOS 14.3.1

ElasticSearch:8.13.2

Kibana:8.13.2

BGE是一个常见的文本转向量的模型,在很多大模型RAG应用中常常能见到,但是ElasticSearch中默认没有。BGE模型有很多版本,本次采用的是bge-large-zh-v1.5。下载地址:

HuggingFace:https://huggingface.co/BAAI/bge-large-zh-v1.5

Modelscope:魔搭社区

将bge-large-zh-v1.5导入ElasticSearch详见:Eland上传bge-large-zh-v1.5向量化模型到ElasticSearch中-CSDN博客

二、向量化简单测试

启动ES和Kibana

在Kibana的【机器学习】->【已训练模型】找到模型bge-large-zh-v1.5:

bge-large-zh-v1.5,ElasticSearch,elasticsearch,向量检索,bge-large-zh

打开【开发工具】,简单测试:

POST _ml/trained_models/bge-large-zh-v1.5/_infer
{
  "docs": [
    {
      "text_field": "我的第一个向量化模型"
    }
  ]
}

结果:

bge-large-zh-v1.5,ElasticSearch,elasticsearch,向量检索,bge-large-zh

拉到最下面,显示向量的维数是1024,符合预期。

三、向量索引构建

我们直接基于ElasticSearch以及bge-large-zh-v1.5模型即时生成向量,因此核心主要分三步:

1. 创建原始文本索引

2. 创建原始文本索引对应的向量索引

3. 创建向量化的Pipeline并应用

创建原始文本索引

首先创建一个用于示例的原始文本类型索引article:

PUT /article
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "brief": {
        "type": "text"
      },
      "author": {
        "type": "keyword"
      },
      "content": {
        "type": "text"
      },
      "readNumber": {
        "type": "integer"
      }
    }
  }
}

写入3条测试数据

POST /article/_doc/001
{
  "title": "浙江丽水:住房公积金贷款最高限额拟提至100万元",
  "brief": "【浙江丽水:住房公积金贷款最高限额拟提至100万元】财联社3月21日电,浙江省丽水市住房公积金管理中心就《关于进一步完善住房公积金政策的通知(征求意见稿)》公开征求意见。",
  "author": "黄宁",
  "content": "【浙江丽水:住房公积金贷款最高限额拟提至100万元】财联社3月21日电,浙江省丽水市住房公积金管理中心就《关于进一步完善住房公积金政策的通知(征求意见稿)》公开征求意见,职工首次申请住房公积金贷款购买首套自住住房的,双缴存职工最高限额由80万元上调为100万元;单缴存职工最高限额由40万元上调为60万元。职工二次申请住房公积金贷款或购买第二套自住住房的,双缴存职工最高限额由60万元上调为80万元;单缴存职工最高限额由30万元上调为50万元。同一对夫妻符合国家政策生育二孩、三孩的职工家庭购买自住住房申请住房公积金贷款的,住房公积金贷款最高限额上浮20%。同一对夫妻符合国家政策生育二孩、三孩的职工家庭市场租赁自住住房的,提取限额上浮50%。在个人住房公积金贷款最高限额内,贷款申请人实际可贷额度由不超过贷款申请人夫妻双方近12月(含申请贷款当月)住房公积金账户月均余额的10倍调整为20倍。支持新市民、青年人贷款需求,全市住房公积金贷款保底额度调整为每户30万元。",
  "readNumber": "188"
}
POST /article/_doc/002
{
  "title": "今年新疆两口岸通行中欧(中亚)班列已突破4000列",
  "brief": "昨天(9日),一列满载汽车、机电产品、服装的中欧班列在办理完霍尔果斯海关放行手续后从霍尔果斯口岸出境,开往波兰马拉舍维奇。今年新疆霍尔果斯和阿拉山口口岸通行的中欧(中亚)班列已突破4000列。",
  "author": "央视新闻客户端",
  "content": """今年霍尔果斯铁路口岸通行中欧(中亚)班列数量达2031列,阿拉山口铁路口岸通行中欧(中亚)班列数量达2014列,双口岸中欧班列通行数量占全国的四成以上,越来越多的日用百货、机电设备、电子产品、农副产品等“中国制造”选择从新疆铁路口岸走向中亚、欧洲市场。
霍尔果斯站安全生产指挥中心调度员 杨利业:今年一季度,共计1.2万辆商品车搭载中欧班列出口到哈萨克斯坦、乌兹别克斯坦等国家,助力‘新三样’走俏海外。
霍尔果斯海关监管三科副科长 赵远凤:现在每天经霍尔果斯口岸通行的班列保持在20列以上。""",
  "readNumber": "208"
}
POST /article/_doc/003
{
  "title": "新疆巴州逾300万亩棉花机械化种植助力棉农节本增效",
  "brief": "2024年,新疆巴州棉花的种植面积预计达300万亩以上,播种时间将从4月初持续至5月初。",
  "author": "央视新闻客户端",
  "content": """中新网乌鲁木齐4月9日电 (刘雨珊 申凯龙 康兴平)进入四月,新疆巴州逾300万亩棉花正式进入春播阶段,田间地头处处都是一片热火朝天的春播景象。
在新疆巴州轮台县群巴克镇迪那尔村的高标准农田里,两台装有北斗卫星定位导航系统的大型棉花播种机正缓缓前行。(吐尔逊·吾斯曼拍 摄)
 4月9日,在新疆巴州轮台县群巴克镇迪那尔村的高标准农田里,两台装有北斗卫星定位导航系统的大型棉花播种机正缓缓前行,农民在进行棉花播种时借助北斗导航系统实现无人驾驶作业,可一次性完成铺膜、铺滴灌带、播种、覆土等工作,且播行端直、耕作精准,作业率高,也方便棉花成熟后机械化采收。""",
  "readNumber": "308"
}

创建向量索引

再创建一个新的包含向量的索引article_embeddings(相比于article新增text_embedding字段):

PUT /article_embeddings
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "brief": {
        "type": "text"
      },
      "author": {
        "type": "keyword"
      },
      "content": {
        "type": "text"
      },
      "readNumber": {
        "type": "integer"
      },
      "text_embedding": {
        "properties": {
          "model_id": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "predicted_value": {
            "type": "dense_vector",
            "dims": 1024,
            "index": true,
            "similarity": "cosine"
          }
        }
      }
    }
  }
}

其中text_embedding.predicted_value为文本转向量后的向量字段。dims指定向量的维数,必须与BGE模型中的保持一致。

创建向量化Pipeline

创建文本->向量的Pipeline,对article索引中的title标题字段进行向量化:

PUT _ingest/pipeline/article_embeddings_pipeline
{
  "description": "Article embeddings pipeline",
  "processors": [
    {
      "inference": {
        "model_id": "bge-large-zh-v1.5",
        "target_field": "text_embedding",
        "field_map": {
          "title": "text_field"
        }
      }
    }
  ],
  "on_failure": [
    {
      "set": {
        "description": "Index document to 'failed-<index>'",
        "field": "_index",
        "value": "failed-{{{_index}}}"
      }
    },
    {
      "set": {
        "description": "Set error message",
        "field": "ingest.failure",
        "value": "{{_ingest.on_failure_message}}"
      }
    }
  ]
}

bge-large-zh-v1.5,ElasticSearch,elasticsearch,向量检索,bge-large-zh

创建后对索引article执行article_embeddings_pipeline,将向量化后的数据放到索引article_embeddings上:

POST _reindex?wait_for_completion=false
{
  "source": {
    "index": "article"
  },
  "dest": {
    "index": "article_embeddings",
    "pipeline": "article_embeddings_pipeline"
  }
}

bge-large-zh-v1.5,ElasticSearch,elasticsearch,向量检索,bge-large-zh

成功后查看article_embeddings的数据,已经成功加上了向量字段:

bge-large-zh-v1.5,ElasticSearch,elasticsearch,向量检索,bge-large-zh

四、向量检索

假设要对用户query“中欧班列”进行向量化检索,先使用如下命令获得其BGE向量:

POST _ml/trained_models/bge-large-zh-v1.5/_infer
{
  "docs": [
    {
      "text_field": "中欧班列"
    }
  ]
}

结果如下: 

bge-large-zh-v1.5,ElasticSearch,elasticsearch,向量检索,bge-large-zh

把生成的向量作为查询的一部分,再利用ElasticSearch中的KNN向量相似度检索来搜索相似标题的文本:

GET article_embeddings/_search
{
  "query": {
    "knn": {
      "field": "text_embedding.predicted_value",
      "num_candidates": 10,
      "query_vector": [
        0.008829478174448013,
        -0.029355255886912346,
        -0.025615187361836433,
        此处省略
      ]
    }
  }
}

其中text_embedding.predicted_value是向量的字段,num_candidates是返回的数目

结果符合预期:

bge-large-zh-v1.5,ElasticSearch,elasticsearch,向量检索,bge-large-zh

参考:Elasticsearch:介绍 kNN query,这是进行 kNN 搜索的专家方法_elasticsearch knnquery-CSDN博客

其他

注意:目前高版本已经不支持_knn_search了:

bge-large-zh-v1.5,ElasticSearch,elasticsearch,向量检索,bge-large-zh

其他问题:

报错:

{
  "error": {
    "root_cause": [
      {
        "type": "x_content_parse_exception",
        "reason": "[5:7] [knn] unknown field [k]"
      }
    ],
    "type": "x_content_parse_exception",
    "reason": "[5:7] [knn] unknown field [k]"
  },
  "status": 400
}

原因:目前高版本已经不支持设置"k"了,无需设置"k"。

bge-large-zh-v1.5,ElasticSearch,elasticsearch,向量检索,bge-large-zh文章来源地址https://www.toymoban.com/news/detail-853746.html

到了这里,关于ElasticSearch中使用bge-large-zh-v1.5进行向量检索(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Elasticsearch】Elasticsearch中使用_id排序导致 data too large 问题

    Elasticsearch 一个弹性伸缩的搜索数据库,后文简称 :ES ,最近有一个ES 服务查询数据时候出现了数据 Hits 结果多次查询不一致的问题,而且这块代码已经很长时间没有修改,一直稳定运行了很长时间,用户翻译查询列表数据的时候又是出现1条,有时候出现2条或者3条。(再加上

    2024年02月03日
    浏览(29)
  • elasticsearch Data too large问题解决

    现象: 1、钉钉上收到es集群监控告警,集群变为yellow 2、kibana上没有数据,打开索引管理报以下错误: 解决: 1、修改config目录下jvm配置文件中关于jvm的参数 2、重启es集群 2.1 如果分片有副本的话,重启过程中,要临时关闭分片复制功能。 每个结点重启时,ElasticSearch集群的

    2024年02月07日
    浏览(32)
  • Elasticsearch:使用 Elasticsearch 进行语义搜索

    在数字时代,搜索引擎在通过浏览互联网上的大量可用信息来检索数据方面发挥着重要作用。 此方法涉及用户在搜索栏中输入特定术语或短语,期望搜索引擎返回与这些确切匹配的结果。 虽然搜索对于简化信息检索非常有价值,但它也有其局限性。 主要缺点之

    2024年02月08日
    浏览(38)
  • Elasticsearch:使用 Transformers 和 Elasticsearch 进行语义搜索

    什么语义搜索( semantic search )呢?根据搜索查询的意图和上下文含义(而不仅仅是)检索结果。语义/向量搜索是一种强大的技术,可以大大提高搜索结果的准确性和相关性。 与传统的基于的搜索方法不同,语义搜索使用单词的含义和上下文来理解查询背后的意

    2024年02月08日
    浏览(41)
  • 使用Elasticsearch进行全文挖掘

    全文挖掘(Full-text search)是一种搜索技术,它允许用户在大量文本数据中快速、准确地查找相关信息。Elasticsearch是一个分布式、实时的搜索引擎,它具有强大的全文搜索功能。在本文中,我们将探讨如何使用Elasticsearch进行全文挖掘,并讨论其优缺点。 全文挖掘是一种搜索技术

    2024年04月12日
    浏览(26)
  • Elasticsearch:使用 Gemini、Langchain 和 Elasticsearch 进行问答

    本教程演示如何使用 Gemini API创建 embeddings 并将其存储在 Elasticsearch 中。 我们将学习如何将 Gemini 连接到 Elasticsearch 中存储的私有数据,并使用 Langchian 构建问答功能。 如果你还没有安装好自己的 Elasticsearch 及 Kibana 的话,请参阅如下的文章来进行安装: 如何在 Linux,MacOS 及

    2024年01月24日
    浏览(37)
  • 使用Elasticsearch进行数据批量操作

    Elasticsearch是一个开源的搜索和分析引擎,基于Lucene库开发。它可以用来实现文本搜索、数据分析、实时数据处理等功能。在大数据时代,Elasticsearch成为了处理和分析大量数据的首选工具之一。 数据批量操作是Elasticsearch中的一种常见操作,它可以用来对大量数据进行创建、更

    2024年02月22日
    浏览(34)
  • 使用Elasticsearch进行实时位置服务

    Elasticsearch是一个开源的搜索和分析引擎,基于Lucene库,具有实时搜索、数据分析、集群管理等功能。它可以用于实时位置服务,实现对位置数据的实时查询、分析和可视化。 在现代社会,位置信息已经成为了一种重要的资源,被广泛应用于地理信息系统、导航、位置-基于的

    2024年02月22日
    浏览(34)
  • 使用Elasticsearch进行分组聚合统计

    要使用Elasticsearch进行分组聚合统计,可以使用聚合(aggregation)功能。聚合操作允许您根据指定的条件对文档进行分组,并计算每个分组的聚合结果。 针对普通类型的字段,DSL构建语法: aggs: aggregations的别名,代表着分组 agg_name: 这个是自定义的名字,可以针对你自己

    2024年02月15日
    浏览(33)
  • Django中使用Elasticsearch进行搜索

    Django是一个流行的Python Web框架,Elasticsearch是一个流行的开源搜索引擎。结合Django和Elasticsearch,可以构建一个强大的搜索引擎。 下面是如何在Django中使用Elasticsearch进行搜索的步骤: 安装Elasticsearch和elasticsearch-py 首先,需要在本地安装Elasticsearch和elasticsearch-py。可以通过官网

    2024年02月11日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包