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

Java-SpringBoot集成Langchain4j文本嵌入模型实现向量相似度查询

 集成Pg数据库并创建vector字段类型

运行pgvector容器 根据需要进行容器目录挂载

docker run --name pgvector \-e POSTGRES_PASSWORD=123456 \-p 5432:5432 \-d --platform linux/amd64 ankane/pgvector:latest

进入docker容器并创建vector字段类型

docker exec -it pgvector bash
psql -U postgres -c "CREATE EXTENSION IF NOT EXISTS vector;"

集成Langchain4j所需依赖

<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-spring-boot-starter</artifactId><version>0.30.0</version>
</dependency>
<!-- 主要用于查询向量数据库-->
<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-pgvector</artifactId><version>0.31.0</version>
</dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId><version>0.30.0</version>
</dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId><version>0.30.0</version>
</dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-hugging-face</artifactId><version>0.30.0</version>
</dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-vertex-ai</artifactId><version>0.30.0</version>
</dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-embeddings</artifactId><version>0.30.0</version>
</dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-embeddings-all-minilm-l6-v2</artifactId><version>0.30.0</version>
</dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-document-parser-apache-tika</artifactId><version>0.30.0</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version>
</dependency>
<dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.2</version>
</dependency>
<dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId>
</dependency>

SpringBoot连接Pg数据库以及配置向量连接

spring:datasource:url: jdbc:postgresql://localhost:5432/postgresusername: postgrespassword: postgres

配置类

@Configuration
public class PgVectorConfiguration {@Beanpublic PgVectorEmbeddingStore embeddingStore() {return PgVectorEmbeddingStore.builder()//指定主机地址.host("localhost")//指定端口.port(5432)//指定数据库名.database("postgres")//指定用户名.user("postgres")//指定密码.password("postgres")//指定向量数据所在表名.table("knowledge_vector")//指定向量维度.dimension(384).build();}
}

Java实体类配置

@TableName、@TableId以及@TableField集成MyBatis-plus根据自己ORM框架修改

@TableName("knowledge_vector")
@Data
public class KnowledgeVectorDO {@TableId(value = "embedding_id", type = IdType.ASSIGN_ID)private Long embeddingId;@TableField("knowledge_id")private Long knowledgeId;@TableField("text")private String text;@TableField("embedding")private List<Float> embedding;@TableField("metadata")private String metaData;
}

注:embedding_id、text、embedding、metadata是必备字段 字段名不能修改 如果embedding需要处理大量的向量数据,并且这些数据的精度要求不高,使用float会更高效,占用更少的存储空间。如果应用场景对数值精度要求较高,例如科学计算或金融应用,应该选择 double。

  1. embedding_id:向量表的Id
  2. text:文本切分后的数据块
  3. embedding:存储的向量数据
  4. metadata:元数据

业务代码

    /*** * @param text 匹配的内容*/public void getKnowledgeByText(String text){//它是一个使用 AllMiniLmL6V2 模型的实例。文本嵌入模型通常是由预训练的神经网络组成,用于将文本转换为高维向量表示,以捕捉文本之间的语义关系。EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();//将给定的文本 text 嵌入到高维向量空间中,返回一个表示该文本的嵌入向量Embedding queryEmbedding = embeddingModel.embed(text).content();//用于在嵌入向量空间中查找与给定查询向量最相似的文本片段。queryEmbedding 是我们之前嵌入的查询文本的向量表示,而参数 1 表示要返回与查询向量最相似的文本片段数量。List<EmbeddingMatch<TextSegment>> relevant = embeddingStore.findRelevant(queryEmbedding, 1);//从返回的相似文本片段列表 relevant 中获取第一个匹配结果,即与查询向量最相似的文本片段。这个结果被存储在 embeddingMatch 变量中,可以通过它来访问相似度分数和文本内容等信息。EmbeddingMatch<TextSegment> embeddingMatch = relevant.get(0);//对应数据表的IdSystem.out.println("tableId:"+embeddingMatch.embeddingId());//根据向量查询到的内容System.out.println("text:"+embeddingMatch.embedded().text());//表示查询向量与返回的相似文本片段之间的相似度得分。 得分越高表示两个向量之间的语义关系越相似。值越接近1表示相似度越高,值越接近0表示相似度越低System.out.println("score:"+embeddingMatch.score());}

 

 

http://www.lryc.cn/news/354662.html

相关文章:

  • 正宇软件:引领数字人大新纪元,开启甘肃人大代表履职新篇章
  • UniApp中,在页面显示时触发子组件的重新渲染
  • Linux(三)
  • 2024年郫都区区级农业生产社会化服务重点服务组织评定申报条件材料、程序要求
  • Java入门须知术语
  • Spring Boot中集成WebSocket
  • 18.多分类问题代码实现
  • 实时通信的方式——WebRTC
  • Android 使用 ActivityResultLauncher 申请权限
  • 如何将前端项目打包并部署到不同服务器环境
  • 什么样的展馆场馆才是科技满满?就差一张智慧场馆大屏
  • python核心编程(二)
  • 【wiki知识库】02.wiki知识库SpringBoot后端的准备
  • python tuple(元组)
  • opencv调用摄像头保存视频
  • STM32定时器四大功能之定时器编码接口
  • 全国各城市间驾车耗时和距离矩阵数据集(更新至2022年)
  • 推荐二轮电动车仪表盘蓝牙主芯片方案-HS6621CGC
  • 『香橙派』基于Orange Pi AIpro打造高效个人云存储解决方案
  • Sylvester矩阵、子结式、辗转相除法的三者关系(第二部分)
  • PyTorch的数据处理
  • 第14章-蓝牙遥控小车 手把手做蓝牙APP遥控小车 蓝牙串口通讯讲解
  • 【补充1】字节对齐
  • Java数据库连接(JDBC)
  • 记录一次cas单点登录的集成
  • 【吊打面试官系列】Java高并发篇 - 什么是乐观锁和悲观锁?
  • 机器学习之词袋模型
  • 【C++/STL】vector(常见接口、模拟实现、迭代器失效)
  • Spring Boot Web 开发:MyBatis、数据库连接池、环境配置与 Lombok 全面解析
  • 【UE5.1 多线程 异步】“Async Blueprints Extension”插件使用记录