5. 基于Embedding实现超越elasticsearch高级搜索
Embedding介绍
Embedding是向量的意思,向量可以理解为平面坐标中的一个坐标点(x,y),在编程领域,一个二维向量就是一个大小为float类型的数组。也可以用三维坐标系中的向量表示一个空间中的点。在机器学习中,向量通常用于表示数据的特征。
向量分数越高,代表位置越接近,匹配的数据越相似。
文本向量化
而文本向量化是指,利用大模型可以吧一个字,一个词或一段话映射为一个多维向量,比如我们可以直接在LangChain4j中调用向量模型来对一句话进行向量化。
案例代码:
public class EmbeddingDemo{public static void main(String[] args) {OpenAiEmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder().baseUrl("http://langchain4j.dev/demo/openai/v1").apiKey("demo").build();Response<Embedding> embed = embeddingModel.embed("你好,我叫gorgor");System.out.println(embed.content().toString());System.out.println(embed.content().vector().length);}
}
代码执行结果为:
Embedding { vector = [-0.019351093, -0.02137422...] }
1536
从结果可以知道“你好,我叫gorgor”这句话经过大模型向量化之后,得到一个长度为1536的float数组。注意,1536是固定的,不会随着句子长度而变化。
那么我们通过这种向量模型得到一句话对应的向量有什么作用呢?非常有用,因为我们可以基于向量来判断两句话之间的相似度,进而可以实现超越elasticsearch的高级搜索。
向量相似度
我们可以使用余弦相似度来计算向量的相似度,余弦相似度是一种用于衡量向量之间相似度的指标,可以用于文本向量之间的相似度,在计算机中用来判断文本之间的距离。
例如:
"机器学习"表示为 [1,2,3]
"深度学习"表示为[2,3,3]
"英雄联盟"表示为[9,1,3]
示例代码(余弦相似度):
package com.gorgor.langchain4j.embedding;import java.util.*;public class CosineSimilarity {// 计算两个向量的点积public static double dotProduct(double[] vectorA, double[] vectorB) {double dotProduct = 0;for (int i = 0; i < vectorA.length; i++) {dotProduct += vectorA[i] * vectorB[i];}return dotProduct;}// 计算向量的模public static double vectorMagnitude(double[] vector) {double magnitude = 0;for (double component : vector) {magnitude += Math.pow(component, 2);}return Math.sqrt(magnitude);}// 计算余弦相似度public static double cosineSimilarity(double[] vectorA, double[] vectorB) {double dotProduct = dotProduct(vectorA, vectorB);double magnitudeA = vectorMagnitude(vectorA);double magnitudeB = vectorMagnitude(vectorB);if (magnitudeA == 0 || magnitudeB == 0) {return 0; // 避免除以零} else {return dotProduct / (magnitudeA * magnitudeB);}}public static void main(String[] args) {// 示例向量//机器学习double[] vectorA = {1, 2, 3};//深度学习double[] vectorB = {2,3,3};//英雄联盟double[] vectorC = {9,1,3};// 计算余弦相似度//机器学习”与“深度学习”的距离:double similarityAB = cosineSimilarity(vectorA, vectorB);System.out.println("Cosine SimilarityAB: " + similarityAB);//"机器学习”与“英雄联盟“的距离":double similarityAC = cosineSimilarity(vectorA, vectorC);System.out.println("Cosine SimilarityAB: " + similarityAC);}
}
代码执行结果:
Cosine SimilarityAB: 0.9686648999069225
Cosine SimilarityAB: 0.5603318146805258
结论:“机器学习”与“深度学习”两个文本之间的余弦相似度更高,表示它们在语义上更相似。
文本向量算法
文本向量算法是指将文本数据转化为向量表示的具体算法,通常包括以下几个步骤:
- 分词:将文本划分成一个个单词或短语。
- 构建词汇表:将分词后的单词或短语建立词汇表,并为每个单词或短语赋予一个唯一的编号。
- 计算词嵌入:使用预训练的模型或自行训练的模型,将每个单词或短语映射到向量空间中。
- 计算文本嵌入:将文本中每个单词或短语的向量表示取平均或加权平均,得到整个文本的向量表示。
常见的文本向量算法包括 Word2Vec、GloVe、FastText 等。这些算法通过预训练或自行训练的方式,将单词或短语映射到低维向量空间中,从而能够在计算机中方便地处理文本数据。当然这中间最关键的就是向量模型,因为向量是它生成的,向量模型也是经过大量机器学习训练之后产生的,向量模型效果越好,就表示它对于自然语言理解的程度越好,同时也就表示它生成出来的向量越准确,越能反映出语义的相似度。
文本向量用途
文本嵌入用于测量文本字符串的相关性,通常用于:
- 搜索(结果按与查询字符串的相关性排序)
- 聚类(其中文本字符串按相似性分组)
- 推荐(推荐具有相关文本字符串的项目)
- 异常检测(识别出相关性很小的异常值)
- 多样性测量(分析相似性分布)
- 分类(其中文本字符串按其最相似的标签分类)
向量数据库
LangChain4j支持的向量数据库:
| 向量数据库名称 | 保存 | 过滤 | 删除 |
|---|---|---|---|
| In-memory | ✅ | ✅ | ✅ |
| Astra DB | ✅ | ||
| Azure AI Search | ✅ | ✅ | |
| Azure CosmosDB Mongo vCore | ✅ | ||
| Azure CosmosDB NoSQL | ✅ | ||
| Cassandra | ✅ | ||
| Chroma | ✅ | ||
| Elasticsearch | ✅ | ✅ | ✅ |
| Infinispan | ✅ | ||
| Milvus | ✅ | ✅ | ✅ |
| MongoDB Atlas | ✅ | ||
| Neo4j | |||
| OpenSearch | ✅ | ||
| PGVector | ✅ | ✅ | ✅ |
| Pinecone | |||
| Qdrant | ✅ | ||
| Redis | ✅ | ||
| Vearch | ✅ | ||
| Vespa | |||
| Weaviate | ✅ | ✅ |
EmbeddingStore表示向量数据库,它有20个实现类:
- AstraDbEmbeddingStore
- AzureAiSearchEmbeddingStore
- CassandraEmbeddingStore
- ChromaEmbeddingStore
- ElasticsearchEmbeddingStore
- InMemoryEmbeddingStore
- InfinispanEmbeddingStore
- MemoryIdEmbeddingStore
- MilvusEmbeddingStore
- MinimalEmbeddingStore
- MongoDbEmbeddingStore
- Neo4jEmbeddingStore
- OpenSearchEmbeddingStore
- PgVectorEmbeddingStore
- PineconeEmbeddingStore
- QdrantEmbeddingStore
- RedisEmbeddingStore
- VearchEmbeddingStore
- VespaEmbeddingStore
- WeaviateEmbeddingStore
其中我们熟悉的有Elasticsearch、MongoDb、Pg、Redis,令人惊喜的是MySQL 9.0也开始支持面向Ai的向量数据库了。
案例实现
下面案例就以redis来演示对于向量的增删改查
引入redis依赖
<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-redis</artifactId><version>${langchain4j.version}</version>
</dependency>
然后需要注意的是,普通的Redis是不支持向量存储和查询的,需要额外的redisearch模块,我这边是直接使用docker来运行一个带有redisearch模块的redis容器的,命令为:
docker run -p 6379:6379 redis/redis-stack-server:latest
注意端口6379不要和你现有的Redis冲突了。
然后就可以使用以下代码把向量存到redis中了:
public class EmbeddingDemo {public static void main(String[] args) {OpenAiEmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder().baseUrl("http://langchain4j.dev/demo/openai/v1").apiKey("demo").build();RedisEmbeddingStore embeddingStore = RedisEmbeddingStore.builder().host("127.0.0.1").port(6379).dimension(1536).build();TextSegment textSegment1 = TextSegment.textSegment("机器学习");TextSegment textSegment2 = TextSegment.textSegment("深度学习");TextSegment textSegment3 = TextSegment.textSegment("英雄联盟");// 生成向量Response<Embedding> embed1 = embeddingModel.embed("机器学习");Response<Embedding> embed2 = embeddingModel.embed("深度学习");Response<Embedding> embed3 = embeddingModel.embed("英雄联盟");// 存储向量embeddingStore.add(embed1.content(),textSegment1);embeddingStore.add(embed2.content(),textSegment2);embeddingStore.add(embed3.content(),textSegment3);// 生成向量Response<Embedding> embed = embeddingModel.embed("学习");// 查询List<EmbeddingMatch<TextSegment>> result = embeddingStore.findRelevant(embed.content(), 5);for (EmbeddingMatch<TextSegment> embeddingMatch : result) {System.out.println(embeddingMatch.embedded().text() + ",分数为:" + embeddingMatch.score());}}
}
代码执行结果为
深度学习,分数为:0.94541862607
机器学习,分数为:0.943170130253
英雄联盟,分数为:0.9012748003005
从这就更容易看出向量的好处,能够基于向量快速的得到和文本相似的文本,这样就能非常适合用来做RAG,也就是检索增强生成。
相关文章:
5. 基于Embedding实现超越elasticsearch高级搜索
Embedding介绍 Embedding是向量的意思,向量可以理解为平面坐标中的一个坐标点(x,y),在编程领域,一个二维向量就是一个大小为float类型的数组。也可以用三维坐标系中的向量表示一个空间中的点。在机器学习中,向量通常用于表示数据的特征。 向量…...
探索Docker网络配置和管理
目录 1.docker网络类型有几种? 2.自定义网络管理 1.查看网络信息 2.查看网络的详细信息 3.创建四种网络容器 3.none类型 1.验证 4.host类型 1.验证 5. bridge类型 1.验证 2.设备对 6. container类型 1.验证 2.详解 7.科普下docker的网络名称空间 “…...
【数据库】 mysql数据库管理工具 Navicat平替工具 免费开源数据库管理工具
一、数据库分享 本次分享针对mysql的数据库管理工具 全部为开源免费工具 1、beekeeper-studio 可以从github或者官方下载 1.1、官方网址 官方地址:https://www.beekeeperstudio.io/ 1.2、Github 网址 Github地址:https://github.com/beekeeper-studio…...
信息系统项目管理师(高项)—学习笔记二
第一章 以下是上一篇(信息系统项目管理师(高项)—学习笔记)的续写,因为是之前记录的,这一篇还是细致到每一个小节的内容,有些过于复杂了,后续会简化~ 1.3 现代化创新发展 党的十九…...
【Vue】 style中的scoped
一、什么是scoped,为什么要用 在vue文件中的style标签上,有一个特殊的属性:scoped。 当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,通过该属性,可以使得组件之间的样式不互相污染…...
maven项目容器化运行之2-maven中使用docker插件调用远程docker构建服务并在1Panel中运行
一.背景 公司主机管理小组的同事期望我们开发的maven项目能够在1Panel管理的docker容器部署。上一篇写了先开放1Panel中docker镜像构建能力maven项目容器化运行之1-基于1Panel软件将docker镜像构建能力分享给局域网-CSDN博客。这一篇就是演示maven工程的镜像构建、容器运行、运…...
电影购票小程序论文(设计)开题报告
一、课题的背景和意义 随着互联网技术的不断发展,人们对于购票的需求也越来越高。传统的购票方式存在着排队时间长、购票流程繁琐等问题,而网上购票则能够有效地解决这些问题。电影购票小程序是网上购票的一种新型应用,它能够让用户随时随地…...
IP风险画像 金融行业的安全盾牌
在当今数字化时代,金融行业面临着前所未有的安全挑战。随着在线交易和数字银行业务的迅猛发展,欺诈和网络攻击的威胁也在不断增加。金融机构需要高效、可靠的安全解决方案来保护客户的资产和个人信息,防止各种形式的欺诈行为。 IP风险画像是…...
探索老年综合评估实训室的功能与价值
一、引言 随着人口老龄化的加剧,老年健康问题日益受到关注。老年综合评估实训室作为专门为老年人健康服务而设立的场所,具有独特的功能和重要的价值。 二、老年综合评估实训室的功能 (一)健康评估功能 1、身体功能评估 通过专业设…...
视频剪辑软件如何选?FCPX和PR更适合新手呢
随着抖音、快手等短视频平台的迅速兴起,短视频数量急剧增加。想要发布一款简单、高质量的短视频,运用剪辑软件至关重要。目前比较流行的有Adobe家的Premiere,以及Final Cut Pro X,经常有用户在二者间,不知如何选择&…...
解决第三方模块ts声明文件编译错误问题
最近小卷在用vite脚手架学习vue组件开发,使用的语言框架是typescript。在搭建vitepress在线文档服务时,用到了vitepress-demo-preview模块来展示vue组件示例和源代码。 发现import相关依赖时,会有这样的编译错误: 也就是没找到第…...
数据结构小测试:排序算法
目录 1、请简述数据结构八大排序算法的思路。 2、常用排序算法手写 冒泡排序: 选择排序: 快速排序: 归并排序: 堆排序: 3、额外再加一个二分查找吧 1、请简述数据结构八大排序算法的思路。 冒泡排序ÿ…...
电脑远程开关机
1. 远程开机 参考:https://post.smzdm.com/p/664774/ 1.1 Wake On LAN - 局域网唤醒(需要主板支持,一般都支持) 要使用远程唤醒,有几种方式:使用类似向日葵开机棒(很贵)、公网ip&…...
# Redis 入门到精通(四)-- linux 环境安装 redis
Redis 入门到精通(四)-- linux 环境安装 redis 一、linux 环境安装 redis – 基于 Linux 安装 redis 1、基于 Center 0S7 或者 unbunt-18.04 安装 Redis 1)下载安装包wget http://download.redis.io/releases/redis-?.?.?.tar.gz 如&…...
SQL进阶技巧:如何按照固定尺寸(固定区间)对数据进行打分类标签?
目录 0 问题引入 应用案例1 应用案例2 小结 0 问题引入 在日常数据分析中,经常会遇到数据产品经理或数据分析师提出这样的需求,比如按照某一给定的区间或数据范围对数据进行分类标签,而遇到这样的问题,好多同学感觉SQL做起来有点困难或无从下手,其实面对这样的问题笔者…...
数学建模·灰色关联度
灰色关联分析 基本原理 灰色关联分析可以确定一个系统中哪些因素是主要因素,哪些是次要因素; 灰色关联分析也可以用于综合评价,但是由于数据预处理的方式不同,导致结果 有较大出入 ,故一般不采用 具体步骤 数据预处理…...
EMQX开源版安装
一、EMQX是什么 EMQX 是一款开源的大规模分布式 MQTT 消息服务器,功能丰富,专为物联网和实时通信应用而设计。EMQX 5.0 单集群支持 MQTT 并发连接数高达 1 亿条,单服务器的传输与处理吞吐量可达每秒百万级 MQTT 消息,同时保证毫秒…...
R语言进行集成学习算法:随机森林
# 10.4 集成学习及随机森林 # 导入car数据集 car <- read.table("data/car.data",sep ",") # 对变量重命名 colnames(car) <- c("buy","main","doors","capacity","lug_boot","safety"…...
虚拟机的状态更新
文章目录 虚拟机的更新一、检查虚拟机的配置1.已连接状态2. 保证镜像源挂载 二、进行更新三、其余事项 虚拟机的更新 虚拟机的更新是确保系统软件包和库的更新,以获得最新的修复和改进;如果长期没有打开单机或者集群,可以考虑先进行一次更新…...
基于hive数据库的泰坦尼克号幸存者数据分析
进入 ./beeline -u jdbc:hive2://node2:10000 -n root -p 查询 SHOW TABLES; 删除 DROP TABLE IF EXISTS tidanic; 上传数据 hdfs dfs -put train.csv /user/hive/warehouse/mytrain.db/tidanic 《泰坦尼克号幸存者数据分析》 1、原始数据介绍 泰坦尼克号是当时世界上…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
