• 已删除用户
陈永强
陈永强
发布于 2026-06-03 / 1 阅读
0

SpringBoot LangChain4j RAG知识库(四)

SpringBoot LangChain4j RAG知识库(四)

4、上传接口

提前配置好使用的嵌入模型,向量数据库连接参数

上传接口

/**
 * 上传文件并向量化
 * @param file
 * @param id
 * @return
 * @throws IOException
 */
@PostMapping("/addFile")
public AjaxResult addFile(@RequestParam("file") MultipartFile file, @RequestParam("id") String id) throws IOException {

    String contentType = file.getContentType();
    //文件名
    String fileName = file.getOriginalFilename();
    //文件后缀
    RagConfigFile boFile = new RagConfigFile();
    boFile.setRagConfigId(Long.valueOf(id));
    boFile.setOriginalName(fileName);
    boFile.setFileSuffix(Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf(".") + 1));
    ragConfigFileService.insertRagConfigFile(boFile);
    //保存到向量库
    FileUploadDocument fileUploadDocument = new FileUploadDocument();
    List<Document> document = fileUploadDocument.processUploadedFile(file);
    RagConfig ragConfig = ragConfigService.selectRagConfigById(Long.valueOf(id));
    if(!StringUtils.isNull(ragConfig)) {
        //向量模型 配置
        RagEmbeddingUseConfig ragEmbeddingUseConfigVo = ragEmbeddingUseConfigService.selectRagEmbeddingUseConfigById(ragConfig.getEmbeddingUseConfigId());
        RagEmbeddingConfig ragEmbeddingConfigVo = ragEmbeddingConfigService.selectRagEmbeddingConfigById(ragEmbeddingUseConfigVo.getEmbeddingConfigId());
        ragConfig.setRagEmbeddingConfig(ragEmbeddingConfigVo);
        ragConfig.setRagEmbeddingUseConfig(ragEmbeddingUseConfigVo);
    }
    RagConfigTool.getEmbeddingStoreIngestorFile(ragConfig,document);
    return success(contentType);
}

保存测试

聊天接口测试

@GetMapping("/chat")
public String test(String msg) {
    HttpClientBuilder httpClientBuilder = new SpringRestClientBuilder();
    if (assistant == null) {
        ChatModel ollamaChatModel = OllamaChatModel.builder()
                .baseUrl("http://192.168.2.136:11434")
                .modelName("qwen3:8b")
                .httpClientBuilder(httpClientBuilder)
                .logRequests(true)
                .logResponses(true)
                .build();
        //RAG 知识库
        RagConfig vo = ragConfigService.selectRagConfigById(1L);
        if(!StringUtils.isNull(vo)) {
            //向量模型 配置
            RagEmbeddingUseConfig ragEmbeddingUseConfigVo = ragEmbeddingUseConfigService
                    .selectRagEmbeddingUseConfigById(vo.getEmbeddingUseConfigId());
            RagEmbeddingConfig ragEmbeddingConfigVo = ragEmbeddingConfigService
                    .selectRagEmbeddingConfigById(ragEmbeddingUseConfigVo.getEmbeddingConfigId());
            vo.setRagEmbeddingConfig(ragEmbeddingConfigVo);
            vo.setRagEmbeddingUseConfig(ragEmbeddingUseConfigVo);
        }

        ContentRetriever contentRetriever = RagConfigTool.getContentRetriever(vo);
        assistant = AiServices.builder(Assistant.class)
                .chatModel(ollamaChatModel)
                .chatMemoryProvider(getChatMemoryProvider("12345"))
                .contentRetriever(contentRetriever)
                .build();

    }
    String chat = assistant.chat("12345", msg);
    return chat;
}

返回数据中包含向量数据库中的数据

RAG 总结

使用milvus 作为RAG的存储引擎,将文本数据保存到向量数据库中时需要使用Langchain4j中的文档解析器将文本文件解析为document,使用向量嵌入模型多document进行向量化入库操作将所需的只是进行保存,在在调用时将向量数据放入到agent中就可以优先使用知识库的知识进行问答,