集成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。

  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);

        //对应数据表的Id
        System.out.println("tableId:"+embeddingMatch.embeddingId());
        //根据向量查询到的内容
        System.out.println("text:"+embeddingMatch.embedded().text());
        //表示查询向量与返回的相似文本片段之间的相似度得分。 得分越高表示两个向量之间的语义关系越相似。值越接近1表示相似度越高,值越接近0表示相似度越低
        System.out.println("score:"+embeddingMatch.score());
    }

 

 

Logo

一站式 AI 云服务平台

更多推荐