集成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/postgres
username: postgres
password: postgres
配置类
@Configuration
public class PgVectorConfiguration {
@Bean
public 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。
- embedding_id:向量表的Id
- text:文本切分后的数据块
- embedding:存储的向量数据
- 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);
//对应数据表的Id
System.out.println("tableId:"+embeddingMatch.embeddingId());
//根据向量查询到的内容
System.out.println("text:"+embeddingMatch.embedded().text());
//表示查询向量与返回的相似文本片段之间的相似度得分。 得分越高表示两个向量之间的语义关系越相似。值越接近1表示相似度越高,值越接近0表示相似度越低
System.out.println("score:"+embeddingMatch.score());
}