SpringAI + RagFlow的火花
嗨嗨嗨,时隔多日,喵喵又来更新了,为什么过了这么久才来补上SpringAI的Rag捏,因为项目更改方向了,用DIFY来构建智能体,操作确实简单,但是拓展上还是有一些局限的,所以到现在才来更新,这次更新直接上硬核的,两个不同的框架如何兼容
首先,RagFlow是什么,RAGFlow 是一款基于深度文档理解构建的开源 RAG(Retrieval-Augmented Generation)引擎。RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程,结合大语言模型(LLM)针对用户各类不同的复杂格式数据提供可靠的问 答以及有理有据的引用。 本文用到的仅限于使用其中的知识库功能
 开始
 SpringAI添加Rag功能
根据SpringAI的官方文档,我是用ES作为Rag驱动的向量数据库
 添加依赖
| <dependency><groupId>org.springframework.ai</groupId>
 <artifactId>spring-ai-elasticsearch-store-spring-boot-starter</artifactId>
 </dependency>
 <dependency>
 <groupId>co.elastic.clients</groupId>
 <artifactId>elasticsearch-java</artifactId>
 <version>8.13.3</version>
 </dependency>
 
 | 
 配置ES
| spring:elasticsearch:
 uris: <elasticsearch instance URIs>
 username: <elasticsearch username>
 password: <elasticsearch password>
 ai:
 vectorstore:
 elasticsearch:
 initialize-schema: true
 index-name: custom-index
 dimensions: 1536
 similarity: cosine
 batching-strategy: TOKEN_COUNT
 
 | 
更多参数以及参数说明详见上面的官方文档
 将数据语料进行向量化
直接上代码
| @Autowired
 private VectorStore vectorStore;
 
 public void initializeVectorStore() {
 
 String content = """
 代码与月光在此停泊,而思想的潮汐仍向未知奔涌。所有深夜的变量、断点与重构,终将风化成长卷边角的注脚。
 此刻合页,如同拾起一片落叶的纹路——那些 曾令人窒息的庞杂逻辑,原不过是万物递归的寻常一瞬。
 长夏倾尽,算法归于星群,而答案永远流浪在下一个春天。
 """;
 
 
 vectorStore.add(List.of(new Document(content)));
 }
 
 | 
 将向量化的语料查询出来
| List<Document> vectorStoreResult =vectorStore.similaritySearch(SearchRequest.builder().topK(5).similarityThreshold(0.0).query(userInput).build());
 String documents = vectorStoreResult.stream()
 .map(Document::getFormattedContent).collect(Collectors.joining());
 log.info("知识库查询结果:{}", documents);
 chatClient.prompt("你是智能助手,请根据提供的知识库回答问题,以下是知识库"+documents)
 .user(userInput)
 .stream().content();
 
 | 
恭喜你,最简单的Rag被你实现了,那么我们开始正题
 Link To RagFlow
 修改连接配置
我们假设你已经安装并且部署好了RagFlow
修改配置文件为RagFlow提供的ES地址
| spring:elasticsearch:
 uris: <elasticsearch instance URIs>
 username: elastic
 password: infini_rag_flow(可以在RagFlow的Docker文件中找到)
 ai:
 vectorstore:
 elasticsearch:
 initialize-schema: true
 index-name: ragflow_xxxxx(可以连接上RagFlow的ES来查看)
 dimensions: 1536
 similarity: cosine
 batching-strategy: TOKEN_COUNT
 filedName: q_1024_vec(重点!!!这个是我自己定义的)
 
 | 

 修改spring-ai-elasticsearch的源码
目录结构

我们要做的就是复写这两个类
- 包名 org.springframework.ai.vectorstore.elasticsearch
  
  
- 包名org.springframework.ai.document
  
那为什么要换成content_with_weight和q_1024_vec呢
打开ES我们就能看到

这样我们就能使用RagFlow喂语料,使用SpringAI查询检索了
 进阶改法
直接干源码,不做过多讨论 LINK

 总结
这种改法只适合玩玩,我刚刚看到了有人在SpringAI提交了PR,我相信社区肯定会将这些功能全都加入进去的。