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

news2024/11/27 8:23:39

一、准备

系统: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:

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

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

结果:

拉到最下面,显示向量的维数是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}}"
      }
    }
  ]
}

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

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

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

四、向量检索

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

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

结果如下: 

把生成的向量作为查询的一部分,再利用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是返回的数目

结果符合预期:

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

其他

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

其他问题:

报错:

{
  "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"。

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

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

相关文章

享元模式:优化资源利用的高效策略

在面向对象的软件开发中&#xff0c;享元模式是一种结构型设计模式&#xff0c;旨在减少内存使用&#xff0c;通过共享尽可能多的相似对象来提高应用程序的效率。本文将详细介绍享元模式的定义、实现、应用场景以及优缺点。 1. 享元模式的定义 享元模式&#xff08;Flyweigh…

手写一个简单的 OrbitControls 轨道控制器

手写一个简单的 OrbitControls 轨道控制器 相信使用过THREE.JS的同学&#xff0c;都知道 OrbitControls 这个的轨道控制器&#xff0c;他是绕着一个观察点&#xff0c;来进行什么什么的… 反正就是那么个意思。 所以很明显OrbitControls的运动轨迹是一个球体&#xff0c;他是绕…

软件定义车队面临网络安全的曲折之路

当以色列 REE Automotive 设计其 P7 电动汽车底盘时&#xff0c;它是从软件开始工作的&#xff1a;扁平的车辆底盘完全可配置&#xff0c;每个轮胎附近有四个独立的模块&#xff0c;用于转向、制动、悬架和动力传动系统&#xff0c;每个模块均由电子驱动控制单元&#xff08;EC…

JavaEE初阶——多线程(二)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章延续上一篇文章,与大家分享Thread常见的方法以及线程的状态相关知识 其他内容我们下一篇再见! 如果有错误或不足请您指出!!! 目录 3.Thread类及常见方法3.1Thread常见的构造方法3.2Thread…

【小技巧】机器学习中可视化高维向量的两种方法PCA和t-SNE,以及其原理介绍和代码示例(附代码)

使用情景&#xff1a;比如说现在我有一批numpy的多维向量&#xff0c;比如说都是256维度的&#xff0c;X.shape(n, 256), 已知它们都是经过训练能够在256dim的超球面上实现分类或聚类的&#xff0c;现在我想把它们可视化出来看看各个簇在超球面上的分布是怎样的&#xff1f; 1…

C++的stack和queue类(三):适配所有容器的反向迭代器

目录 前言 list的反向迭代器 list.h文件 ReverseIterator.h文件 test.cpp文件 前言 迭代器按性质分类&#xff1a; 单向&#xff1a;forward_list双向&#xff1a;list随机&#xff1a;vector / deque 迭代器按功能分类&#xff1a; 正向反向const list的反向迭代器…

抽象工厂模式:深入探索面向对象设计的多样性

在软件开发中&#xff0c;正确地应用设计模式对于构建可扩展、可维护和高效的系统至关重要。抽象工厂模式作为创建型设计模式之一&#xff0c;提供了一个高层接口&#xff0c;用于创建一系列相关或依赖对象&#xff0c;而无需指定它们具体的类。本文将详细介绍抽象工厂模式的概…

【虚幻引擎】DTProjectSettings 蓝图获取基本项目配置插件使用说明 获取项目命名,项目版本,公司名,公司识别名,主页,联系方式

本插件可以使用蓝图获取到项目的一些基本配置&#xff0c;如获取&#xff1a;公司名、公司识别名、版权声明、描述、主页、许可条款、隐私政策、项目ID、项目命名、项目版本、支持联系方式、项目显示标题、项目调试标题信息、应保留窗口宽高比、使用无边框窗口、以VR启动、允许…

ASP.NET MVC企业级程序设计 (EF+MVP实现显示数据)

效果图 实现过程 1创建数据库 2创建项目文件 3创建控制器&#xff0c;右键添加&#xff0c;控制器 注意这里要写Home 创建成功 数据模型创建过程之前作品有具体过程 4创建视图&#xff0c;右键添加视图 5HomeController.cs代码 using System; using System.Collections.Gene…

JVM修炼之路【11】- 解决内存溢出、内存泄漏 以及相关案例

前面的10篇 都是基础的知识&#xff0c;包括类加载的过程 类加载的细节&#xff0c;jvm内存模型 垃圾回收 等等&#xff0c; 这一篇我们开始实战了解一下 各种疑难杂症&#xff1a;怎么监控 怎么发现 怎么解决 内存溢出 内存泄漏 这两个概念在垃圾回收器里面已经讲过了&#…

视频秒播优化实践

本文字数&#xff1a;2259字 预计阅读时间&#xff1a;10分钟 视频起播时间&#xff0c;即首帧时间&#xff0c;是视频类应用的一个重要核心指标&#xff0c;也是影响用户观看体验的核心因素之一。如果视频要加载很久才能开始播放&#xff0c;用户放弃播放甚至离开 App 的概率都…

React + three.js 实现人脸动捕与3D模型表情同步

系列文章目录 React 使用 three.js 加载 gltf 3D模型 | three.js 入门React three.js 3D模型骨骼绑定React three.js 3D模型面部表情控制React three.js 实现人脸动捕与3D模型表情同步 示例项目(github)&#xff1a;https://github.com/couchette/simple-react-three-facia…

【Godot4自学手册】第三十六节圆形移动或扇形移动的铁球

在第三十四节我实现了来回无限滚动的伤害铁刺球&#xff0c;这一节我准备实现一个圆形移动或扇形移动&#xff0c;并带有链条的铁球。效果如下&#xff1a; 一、实现原理 绕一点做圆周运动&#xff0c;简单的说就是&#xff1a; 每一帧根据旋转的角度计算出下一个位置的坐标…

R语言绘图:绘制横向柱状图

代码主要实现&#xff1a; 对数据进行排序&#xff0c;并且相同分组的数据会有相同的颜色。最后&#xff0c;绘制横向柱状图。 # 加载ggplot2包 library(ggplot2)# 示例数据&#xff0c;假设有三列&#xff1a;Group, Variable, Value data <- data.frame(Group factor(c(…

植被参数光学遥感反演方法(Python)及遥感与生态模型数据同化算法

传统的地面实测方法能够得到比较准确的植被参数&#xff08;如叶面积指数、覆盖度、生物量、叶绿素、干物质、叶片含水量、FPAR等&#xff09;&#xff0c;但其获取信息有限&#xff0c;难以满足大范围提取植被参数的需求&#xff0c;尤其在异质地表区域。遥感技术的发展为植被…

【PythonCode】力扣Leetcode11~15题Python版

【PythonCode】力扣Leetcode11~15题Python版 前言 力扣Leetcode是一个集学习、刷题、竞赛等功能于一体的编程学习平台&#xff0c;很多计算机相关专业的学生、编程自学者、IT从业者在上面学习和刷题。 在Leetcode上刷题&#xff0c;可以选择各种主流的编程语言&#xff0c;如C…

316_C++_xml文件解析成map,可以放到表格上 + xml、xlsx文件互相解析

xml文件例如&#xff1a; <?xml version"1.0" encoding"UTF-8" standalone"yes"?> <TrTable> <tr id"0" label"TR_PB_CH" text"CH%2"/> <tr id"4" label"TR_PB_CHN"…

[BT]BUUCTF刷题第16天(4.12)

第16天 Web [MRCTF2020]Ezpop 打开网站就是一段泄露的源代码&#xff1a; <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack…

Ollama、FastGPT大模型RAG结合使用案例

参考: https://ollama.com/download/linux https://doc.fastai.site/docs/intro/ https://blog.csdn.net/m0_71142057/article/details/136738997 https://doc.fastgpt.run/docs/development/custom-models/m3e/ Ollama作为后端大模型加载运行 FastGPT作为前端页面聊天集成RA…

Linux函数学习 select

1、Linux select 函数 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); nfds 最大文件fd 1 readfds 监听可读文件集合fd writefds 监听可写文件集合fd exceptfd 监听异常文件集…