06-milvus-vector-rag RAG 基础:文档加载、切分、向量化与检索增强
LangChain4j 进阶实战:第 6 篇,Milvus 向量库实战,上传文档并完成 RAG 问答
1. 为什么要从 InMemory 升级到 Milvus
上一章的 RAG 使用了InMemoryEmbeddingStore,它适合学习,但不适合生产。
原因很直接:
- 服务重启后数据丢失。
- 多实例之间不能共享。
- 文档量大时内存压力高。
- 无法做长期索引管理。
- 很难做增量更新、删除和运维监控。
生产环境需要外部向量数据库。这里以 Milvus 为例,讲清楚配置、写入、检索、元数据和业务实体向量化的完整思路。
2. 配置 Milvus
基础配置通常长这样:
milvus:host:${MILVUS_HOST}port:${MILVUS_PORT}username:${MILVUS_USERNAME}password:${MILVUS_PASSWORD}database-name:kaleidocollection-name:testdimension:1536如果你的项目里还用了 Spring AI,配置形态也类似:
spring:ai:vectorstore:milvus:client:host:${MILVUS_HOST}port:${MILVUS_PORT}username:${MILVUS_USERNAME}password:${MILVUS_PASSWORD}database-name:kaleidocollection-name:kaleido_collectioninitialize-schema:trueembedding-dimension:1536indexType:IVF_FLATmetricType:COSINE这里有两个特别关键的参数:
dimension:必须和 embedding 模型输出维度一致。metricType:常见是COSINE,用于语义相似度。
3. 上传文档接口
文档上传接口可以这样设计:
@PostMapping("/upload")publicStringuploadDocument(@RequestParam("file")MultipartFilefile){if(file.isEmpty()){return"上传的文件为空";}uploadDocumentToMilvus(file);isDocumentUploaded=true;return"文档上传成功";}这是一条典型的文档入库链路:
MultipartFile -> Tika 解析 -> Document -> Split -> Embedding -> Milvus我的理解是:向量库不是用来存原始文档的,而是用来存“可被语义检索的文档片段”。原始文件最好仍然存对象存储,向量库存片段、向量和元数据。
4. 用 Apache Tika 解析文档
上传复杂文件时,可以用 Tika 解析:
try(InputStreaminputStream=file.getInputStream()){ApacheTikaDocumentParserparser=newApacheTikaDocumentParser();document=parser.parse(inputStream