SpringBoot 集成 LangChain4j RAG Redis 搜索

SpringBoot 集成 LangChain4j RAG Redis 搜索

  • [1 依赖](#1 依赖)
  • [2 配置](#2 配置)
  • [3 代码](#3 代码)
    • [1 RagConf](#1 RagConf)
    • [2 RagController](#2 RagController)
  • [4 测试](#4 测试)

1 依赖

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.xu</groupId>
    <artifactId>lang-chain-redis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>lang-chain-redis</name>

    <description>Demo project for Spring Boot</description>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>dev.langchain4j</groupId>
                <artifactId>langchain4j-bom</artifactId>
                <version>1.7.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>dev.langchain4j</groupId>
                <artifactId>langchain4j-community-bom</artifactId>
                <version>1.7.1-beta14</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <properties>
        <maven.compiler.source>25</maven.compiler.source>
        <maven.compiler.target>25</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>

        <!--Spring Boot 的 Web starter-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--LangChain4j 的 Spring Boot starter-->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-spring-boot-starter</artifactId>
        </dependency>

        <!--LangChain4j 对 redis 向量扩展(vector)的支持库-->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-community-redis-spring-boot-starter</artifactId>
        </dependency>

        <!-- 本地模型 -->
<!--        <dependency>-->
<!--            <groupId>dev.langchain4j</groupId>-->
<!--            <artifactId>langchain4j-embeddings-bge-small-zh-v15-q</artifactId>-->
<!--        </dependency>-->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-embeddings-all-minilm-l6-v2</artifactId>
        </dependency>

        <!-- 文档解析 -->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-document-parser-apache-tika</artifactId>
        </dependency>

        <!--Spring Boot 的开发工具,提供热部署、自动重启等功能,加速开发过程-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <!--简化 Java 代码的工具库-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--Spring Boot 的测试 starter-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </pluginRepository>
    </pluginRepositories>

</project>

2 配置

yml 复制代码
server:
  port: 8080
  servlet:
    context-path: /

spring:
  application:
    name: lang-chain-redis

logging:
  file:
    name: logs/ lang-chain-redis.log
  level:
    root: INFO
    com.xu: INFO

langchain4j:
  community:
    redis:
      host: localhost
      port: 6379
      user: langchain4j
      password: 123456
      indexName: langchain4j
      prefix: ":lc4j:"
      dimension: 384

3 代码

1 RagConf

java 复制代码
package com.xu.conf;

import dev.langchain4j.community.store.embedding.redis.RedisEmbeddingStore;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.embedding.onnx.allminilml6v2.AllMiniLmL6V2EmbeddingModelFactory;
import dev.langchain4j.store.embedding.EmbeddingStore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import redis.clients.jedis.JedisPooled;

@Configuration
public class RagConf {

    @Bean
    public EmbeddingModel embeddingModel() {
        return new AllMiniLmL6V2EmbeddingModelFactory().create();
        //return new BgeSmallZhV15QuantizedEmbeddingModelFactory().create();
    }

    @Bean
    @Primary
    public EmbeddingStore<TextSegment> embeddingStore() {
        return RedisEmbeddingStore.builder()
                .jedisPooled(new JedisPooled("127.0.0.1", 6379, "langchain4j", "123456"))
                .dimension(384)
                .build();
    }

}

2 RagController

java 复制代码
package com.xu.controller;

import dev.langchain4j.data.document.loader.FileSystemDocumentLoader;
import dev.langchain4j.data.document.parser.apache.tika.ApacheTikaDocumentParser;
import dev.langchain4j.data.document.splitter.DocumentByWordSplitter;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.store.embedding.EmbeddingSearchRequest;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping("/rag")
public class RagController {

    private final EmbeddingModel embeddingModel;

    private final EmbeddingStore<TextSegment> embeddingStore;

    /**
     * RAG数据入库
     *
     * @return 数量
     */
    @GetMapping("/save")
    public Object chat() {
        // 1️⃣ 使用 Tika 解析 docx/pdf 等文件
        var documents = FileSystemDocumentLoader.loadDocuments(
                "D:\\SourceCode\\简历",
                new ApacheTikaDocumentParser()
        );
        // 2️⃣ 定义自定义的文本拆分器 chunkSize=50 表示每段最大 50 tokens,overlap=10 表示重叠 10 tokens
        var splitter = new DocumentByWordSplitter(50, 10);
        // 3️⃣ 构建带自定义拆分器的 ingestor
        var ingestor = EmbeddingStoreIngestor.builder()
                .documentSplitter(splitter)
                .embeddingStore(embeddingStore)
                .embeddingModel(embeddingModel)
                .build();
        // 4️⃣ 执行嵌入生成与存储
        ingestor.ingest(documents);
        return documents.size();
    }

    /**
     * RAG数据查询
     *
     * @param query 查询
     * @return 结果
     */
    @GetMapping("/search")
    public Object search(@RequestParam String query) {
        // 添加日志输出查询内容
        System.out.println("查询内容: " + query);

        var embedding = embeddingModel.embed(TextSegment.from(query)).content();
        System.out.println("查询向量维度: " + embedding.dimension());

        var searchRequest = EmbeddingSearchRequest.builder()
                .queryEmbedding(embedding)
                .maxResults(5)
                .minScore(0.6)
                .build();

        var matches = embeddingStore.search(searchRequest).matches();
        System.out.println("匹配结果数量: " + matches.size());

        var results = matches.stream()
                .map(match -> {
                    Map<String, Object> map = new HashMap<>();
                    map.put("embeddingScore", match.score());
                    map.put("embeddingId", match.embeddingId());
                    // 添加文本内容以便调试
                    map.put("embedded", match.embedded().text());
                    return map;
                }).collect(Collectors.toList());

        return ResponseEntity.ok(results);
    }

}

4 测试


相关推荐
消失的旧时光-19433 小时前
Spring Boot 工程化进阶:统一返回 + 全局异常 + AOP 通用工具包
java·spring boot·后端·aop·自定义注解
StockTV4 小时前
印度股票实时数据 NSE和BSE的实时行情、K 线及指数数据
java·开发语言·spring boot·python
橘子海全栈攻城狮5 小时前
【最新源码】养老院系统管理A013
java·spring boot·后端·web安全·微信小程序
敖正炀5 小时前
反模式与排查宝典:Spring Boot 自动配置与核心机制的常见陷阱
spring boot
直奔標竿6 小时前
Java开发者AI转型第二十六课!Spring AI 个人知识库实战(五)——联网搜索增强实战
java·开发语言·人工智能·spring boot·后端·spring
吴爃7 小时前
Spring Boot 项目在 K8S 中的打包、部署与运维发布实践
运维·spring boot·kubernetes
a8a3027 小时前
Laravel8.x新特性全解析
java·spring boot·后端
白露与泡影8 小时前
Spring Boot 完整流程
java·spring boot·后端
小鲁蛋儿8 小时前
Dynamic + ShardingSphere整合
spring boot·shardingsphere·dynamic