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/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());
    }

 

 

Spring Boot 集成 Apache Tika 可以帮助我们在应用程序中轻松实现文件类型检测和内容提取功能。以下是集成步骤: 1. **添加依赖**: 首先,在你的 `pom.xml` 文件中添加 Apache Tika 的依赖: ```xml <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <version>2.4.1</version> </dependency> ``` 2. **创建配置类**: 创建一个配置类来初始化 Tika 实例: ```java import org.apache.tika.Tika; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TikaConfig { @Bean public Tika tika() { return new Tika(); } } ``` 3. **使用 Tika**: 在你的服务或控制器中注入 Tika 实例并使用它来检测文件类型和提取内容: ```java import org.apache.tika.Tika; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @Service public class FileService { @Autowired private Tika tika; public String detectFileType(MultipartFile file) throws Exception { return tika.detect(file.getBytes()); } public String extractContent(MultipartFile file) throws Exception { return tika.parseToString(file.getInputStream()); } } ``` 4. **创建控制器**: 创建一个控制器来处理文件上传请求: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @RestController @RequestMapping("/files") public class FileController { @Autowired private FileService fileService; @PostMapping("/upload") public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) { try { String fileType = fileService.detectFileType(file); String content = fileService.extractContent(file); return new ResponseEntity<>("File Type: " + fileType + "\nContent: " + content, HttpStatus.OK); } catch (Exception e) { return new ResponseEntity<>("Error: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } } } ``` 通过以上步骤,你就可以在 Spring Boot 应用中集成 Apache Tika 来实现文件类型检测和内容提取功能了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值