1.利用docker搭建redis-stack
bash
docker pull redis-stack :latest
2.运行
bash
docker run -d \
--name redis-stack \
-p 6379:6379 \ # Redis服务端口(默认)
-p 8001:8001 \ # RedisInsight可视化工具端口(可选)
-v /root/redis-stack/data:/data \ # 挂载数据目录(持久化数据)
-v /root/redis-stack/config/redis.config:/etc/redis-stack/redis.conf \ # 挂载自定义配置
--restart always \ # 容器开机自启
redis/redis-stack:latest # 使用最新版redis-stack镜像
3.引入依赖
XML
<!--向量库redis-->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-advisors-vector-store</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-vector-store-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-transformers</artifactId>
</dependency>
<!--解析文档-->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-tika-document-reader</artifactId>
</dependency>
启动时会从github上拉取这个文件,直接下载到本地,就不用拉取了

前缀为spring:
ai:

填写存储的配置

配置redis连接。。。。。
4.自定义文档解析器,自定义如何解析文档
java
public class CustomTextSplitter extends TextSplitter {
@Override
protected List<String> splitText(String text) {
// 自定义文本分割逻辑
return List.of(split(text));
}
public String[] split(String text) {
return text.split("\\s*\\R\\s*\\R\\s*");
}
}
5.controller仅为参考
java
@RestController
@RequestMapping("rag")
@RequiredArgsConstructor
public class RagController {
private final ChatService chatService;
private final RagService ragService;
@PostMapping("uploadRagDoc")
public MikasResult doChat(@RequestParam("file")MultipartFile file){
String fileName=file.getOriginalFilename();
ragService.loadText(file.getResource(),fileName);
return MikasResult.ok();
}
}
6.service
resource是springai提供的一个读取文件的内容的
文本读取器TextReader读取划分为Documents对象
采用自定义的文本分割器按自己定义的划分流程来划分文档
redisVectorStore来存入数据库
java
@Service
@RequiredArgsConstructor
public class RagServiceImpl implements RagService {
private final RedisVectorStore redisVectorStore;
@Override
public void loadText(Resource resource, String fileName) {
//加载读取文档转换为Document对象
TextReader textReader = new TextReader(resource);
textReader.getCustomMetadata().put("fileName",fileName);
List<Document> documents = textReader.get();
//默认的文本分割器
/* TokenTextSplitter tokenTextSplitter = new TokenTextSplitter();
List<Document> apply = tokenTextSplitter.apply(documents);*/
//自定义文本分割器
CustomTextSplitter customTextSplitter = new CustomTextSplitter();
List<Document> apply = customTextSplitter.apply(documents);
//向量存储
redisVectorStore.add(apply);
}
}