一、LangChain4j 集成 Milvus 的核心实现(完整流程)
Milvus 是一款云原生、高性能的分布式向量数据库,LangChain4j 提供了官方适配层,集成核心分为「环境准备→配置连接→核心操作」三步。
1. 前置条件(环境 + 依赖)
(1)Milvus 环境准备
- 验证部署:访问 Milvus 控制台(默认端口 8080),或通过
milvus_cli确认服务可用。
部署 Milvus:推荐用 Docker Compose 快速部署(适合开发/测试),生产环境用 K8s 集群:
# 下载 Milvus Docker Compose 配置
wget https://github.com/milvus-io/milvus/releases/download/v2.4.3/milvus-standalone-docker-compose.yml -O docker-compose.yml
# 启动 Milvus
docker-compose up -d
(2)Java 依赖引入
在 pom.xml 中添加 LangChain4j-Milvus 适配库及核心依赖:
<dependencies>
<!-- LangChain4j 核心 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-core</artifactId>
<version>0.32.0</version>
</dependency>
<!-- LangChain4j Milvus 适配库 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-milvus</artifactId>
<version>0.32.0</version>
</dependency>
<!-- Milvus Java SDK(适配层依赖) -->
<dependency>
<groupId>io.milvus</groupId>
<artifactId>milvus-sdk-java</artifactId>
<version>2.4.3</version>
</dependency>
<!-- 嵌入模型(可选,用于生成向量) -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-embeddings-all-minilm-l6-v2</artifactId>
<version>0.32.0</version>
</dependency>
</dependencies>
2. 核心配置与初始化
LangChain4j 通过 MilvusEmbeddingStore 封装 Milvus 的操作,核心配置包括连接信息、集合(表)参数、索引策略等:
import dev.langchain4j.store.embedding.milvus.MilvusEmbeddingStore;
import dev.langchain4j.store.embedding.milvus.MilvusEmbeddingStoreConfiguration;
import io.milvus.param.IndexType;
import io.milvus.param.MetricType;
public class MilvusConfig {
public static MilvusEmbeddingStore createMilvusStore() {
// 1. 构建 Milvus 配置
MilvusEmbeddingStoreConfiguration config = MilvusEmbeddingStoreConfiguration.builder()
// 连接配置
.host("localhost") // Milvus 服务地址
.port(19530) // Milvus 默认端口
.databaseName("default") // 数据库名(Milvus 2.x 支持多库)
.collectionName("document_embeddings") // 向量集合名(类似表)
// 向量参数
.dimension(384) // 向量维度(与嵌入模型匹配,AllMiniLmL6V2 为 384)
.metricType(MetricType.COSINE) // 距离计算方式:COSINE/IP/L2
// 索引配置(核心,影响检索性能)
.indexType(IndexType.IVF_FLAT) // 索引类型:IVF_FLAT(平衡性能/精度)
.indexParam("nlist=100") // 索引参数:nlist=数据量平方根(如 10 万条设 100)
// 其他配置
.createCollectionIfNotExists(true) // 自动创建集合
.dropCollectionIfExists(false) // 启动时不删除已有集合
.build();
// 2. 创建 Milvus 向量存储实例
return new (config);
}
}
3. 核心操作(增、查、删)
LangChain4j 统一了向量存储的操作接口,Milvus 的使用方式与其他向量库(如 pgvector)完全一致:
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.embedding.EmbeddingMatch;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.embedding.AllMiniLmL6V2EmbeddingModel;
import java.util.List;
public class MilvusOperations {
public static void main(String[] args) {
// 1. 初始化 Milvus 存储和嵌入模型
MilvusEmbeddingStore vectorStore = MilvusConfig.createMilvusStore();
AllMiniLmL6V2EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();
// 2. 新增向量:文本→嵌入向量→存储
String text1 = "LangChain4j 支持 Milvus、Chroma、pgvector 等多种向量存储";
String text2 = "Milvus 是分布式向量数据库,适合大规模向量检索";
Embedding embedding1 = embeddingModel.embed(text1).content();
Embedding embedding2 = embeddingModel.embed(text2).content();
TextSegment segment1 = TextSegment.from(text1);
TextSegment segment2 = TextSegment.from(text2);
// 批量新增(推荐,性能更高)
vectorStore.addAll(List.of(embedding1, embedding2), List.of(segment1, segment2));
// 3. 相似性检索:按查询向量找最相似结果
;
embeddingModel.embed(query).content();
List<EmbeddingMatch<TextSegment>> matches = vectorStore.findRelevant(queryEmbedding, , );
(EmbeddingMatch<TextSegment> match : matches) {
System.out.println( + match.score());
System.out.println( + match.embeddedObject().text());
}
}
}
4. 生产环境优化
- 索引调优:大规模数据(千万级+)推荐用
HNSW索引(IndexType.HNSW),参数设M=16, efConstruction=200,检索性能比 IVF_FLAT 提升 10 倍以上; - 分片与副本:生产环境为 Milvus 集合配置分片(shards)和副本(replicas),提升并发和可用性;
- 连接池:Milvus Java SDK 内置连接池,可通过
MilvusClientConfig调整连接数(默认 10); - 数据过期:利用 Milvus 的 TTL 特性,为向量设置过期时间,自动清理无效数据。
二、Milvus 与 Chroma 的核心区别(选型关键)
Milvus 和 Chroma 是 LangChain4j 中最常用的两款向量存储,但定位、架构、适用场景差异显著,面试中需重点说明选型逻辑:
| 对比维度 | Milvus | Chroma |
|---|---|---|
| 架构类型 | 分布式、云原生向量数据库(独立服务) | 轻量级、嵌入式向量存储(库/进程内) |
| 部署形态 | 需独立部署(Docker/K8s),支持集群化 | 无需独立部署,可嵌入 Java 进程,或轻量服务部署 |
| 数据规模 | 支持亿级 + 向量检索,水平扩展能力强 | 适合百万级以内向量,大规模性能下降明显 |
| 性能特性 | 分布式索引、GPU 加速,高并发/高吞吐 | 单机索引,轻量查询快,高并发弱 |
| 功能丰富度 | 支持多索引、TTL、数据分片、权限控制、监控 | 功能极简,仅核心向量增删查,无高级特性 |
| 运维成本 | 中高(需维护集群、索引、监控) | 极低(嵌入使用无运维,轻量服务仅需基础监控) |
| LangChain4j 适配 | 官方适配,支持全量操作 | 官方适配,操作更简单,配置更少 |
| 适用场景 | 生产环境、大规模向量检索、高并发场景 | 开发/测试、小规模应用、嵌入式场景 |
| 存储依赖 | 依赖 ETCD(元数据)、MinIO(对象存储) | 支持内存/本地文件/SQLite,无外部依赖 |
三、选型建议(面试高频考点)
- 选 Milvus 的场景:
- 生产环境部署,向量数据量超百万级;
- 需要高并发、高可用、水平扩展能力;
- 需高级特性(如 TTL、权限控制、GPU 加速)。
- 选 Chroma 的场景:
- 开发/测试阶段快速验证,无需独立部署服务;
- 小规模应用(十万/百万级向量),追求极简集成;
- 嵌入式/轻量应用(如桌面端、边缘设备),无运维资源。
- 过渡方案:
开发阶段用 Chroma 快速实现功能,生产环境无缝切换为 Milvus(LangChain4j 统一接口,代码无需大幅修改)。
总结
LangChain4j 集成 Milvus 及与 Chroma 对比的核心要点:
- Milvus 集成核心:部署 Milvus 服务→配置连接/索引参数→通过
MilvusEmbeddingStore调用统一向量操作接口,生产环境重点调优索引和分布式配置; - 核心区别:Milvus 是分布式高性能向量数据库,适合大规模生产场景;Chroma 是轻量级嵌入式存储,适合小体量/快速开发场景;
- 选型逻辑:按数据规模、并发需求、运维成本决策,利用 LangChain4j 统一接口可实现无缝切换。


