milvus
- 下载 docker-compose,本地启动 milvus 服务
sh
# Download the configuration file
$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.6/milvus-standalone-docker-compose.yml -O docker-compose.yml
# Start Milvus
$ sudo docker compose up -d
attu 可视化界面
sh
docker run -p 8000:3000 -e MILVUS_URL={milvus server IP}:19530 zilliz/attu:v2.5
集合的状态
集合的基本属性包括名称、创建时间和状态,状态分为未加载、已加载和已释放。 副本用于提高可靠性、查询性能和负载均衡,默认情况下只有一个副本。 集合需要加载到内存中才能创建和使用索引,因为Milvus采用内存计算架构。 索引类似于书的目录,帮助快速查找数据,自动选择最适合的索引类型。 度量类型有余弦相似度、欧几里德距离、内积和汉明距离,用于计算向量相似性。
-
必须先加载load集合到内存中才能使用
- 采用了内存计算的加载
- 数据存在磁盘上
- 但是搜索和索引I需要要内存中进行
- 加载操作就是把集台数据从磁盘读取内存
-
集合的生命周期
- 已创建但未加载 :数据在磁盘中、不可以进行搜索操作不占用内存资源
- 已加载数据在内存中、可以进行所有的操作占用内存资源
- 已释放集合数据从内存中释放回到未加载的状态释放内存资源
索引
向量搜索
- 支持向量搜索,通过输入向量或实体ID进行搜索,结果按匹配程度排序。
- 搜索参数包括TopK(返回最相似的条数)、一致性模式、字段过滤和分组功能。
- 一致性包括
-
强一致性(Strong Consistency)
- 机制:通过同步复制(所有副本写入完成才返回成功)和分布式事务保证数据的强一致性。
- 特点:确保任何写入操作完成后,后续读取都能立即获取最新数据,但可能增加延迟。
- 适用场景:金融、实时推荐等对数据准确性要求极高的场景。
-
有界一致性(Bounded Staleness)【一般选择】
- 机制:允许数据在一定时间或版本范围内存在短暂不一致,但保证最终一致。
- 特点:通过设置"可容忍的陈旧时间/版本数"平衡性能与一致性。例如,允许数据最多落后 5 秒。
- 适用场景:高并发写入但允许短暂延迟的场景,如社交媒体的动态推送。
-
会话一致性(Session Consistency)
- 机制:确保同一会话(客户端连接)内的操作能读取到自身写入的最新数据,跨会话可能不一致。
- 特点:适用于需要用户级一致性的场景,如用户个人数据的实时更新。
-
最终一致性(Eventually Consistent)
- 机制:不保证写入后立即可读,依赖异步复制逐步同步数据。
- 特点:延迟低但可能读取到旧数据,适合大规模数据分析等对实时性要求不高的场景。
-
- 向量搜索的参数设置包括Level(搜索级别)和Radius(搜索半径),影响搜索的精细程度和结果数量。
- Level 越小,速度越快,但是损失相似搜索质量
- Range filter(范围过滤器)用于进一步筛选搜索结果,结合Radius使用可以查找特定范围内的结果
LangChain 封装 Milvus
- LangChain 封装的 milvus 还不够完善,建议增删改,用原生的 Milvus 的api。想要检索查询,集成到 chain中,可以用封装的
js
import { MilvusClient } from '@zilliz/milvus2-sdk-node';
this.milvusClient = new MilvusClient({
address: 'localhost:19530',
timeout: 5000,
});
/**
* 向量插入
*/
async insert() {
await this.milvusClient.useDatabase({ db_name: 'test' });
const data = [
{
name: '今天天气真好,大太阳',
name_vector: await this.embeddingsModel.embedQuery(
'今天天气真好,大太阳',
),
},
];
const res = await this.milvusClient.insert({
collection_name: 'art',
fields_data: data,
});
console.log('=>(study.milvus.service.ts 146) res', res);
// 落库
// await this.milvusClient.flush({
// collection_names: ['art'],
// });
}
/**
* 插入数据后的搜索
*/
async searchAfterInsert() {
await this.milvusClient.useDatabase({ db_name: 'test' });
const result = await this.milvusClient.search({
collection_name: 'art',
// db_name: this.db_name,
vector: await this.embeddingsModel.embedQuery('你怎样'),
limit: 2,
anns_field: 'name_vector',
output_fields: ['name', 'id'],
});
console.log('=>(study.milvus.service.ts 124) result', result);
}
- langchain 封装的 milvus
js
import { Milvus } from '@langchain/community/vectorstores/milvus';
/**
* 使用LangChain Milvus搜索
*/
async searchWithLangchainMilvus() {
const vectorStore = new Milvus(this.embeddingsModel, {
collectionName: 'art',
vectorField: 'name_vector',
textField: 'name',
clientConfig: {
address: 'localhost:19530',
timeout: 5000,
database: 'test',
},
indexCreateOptions: {
index_type: 'IVF_HNSW',
metric_type: 'COSINE',
},
});
const res = await vectorStore.similaritySearchWithScore('你怎么样', 2);
console.log('=>(study.milvus.service.ts 190) res', res);
}
ps:如果大家有疑惑的地方,可以私信咨询我哦~旨在帮助前端er入门生产级别的AI编程