Milvus 实践(1) --- 文本-图片交互式search搭建及原理

目录

背景

训练素材

download

torchvision 简介

python代码

执行结果

模型训练

模型训练参数

训练模型

注意事项

模型加载

录入vectorDB

使用预加载的模型参数对图片进行编码

录入milvus

查询效果

查询编码

milvus search

模型适用列表

总结


背景

应该说Milvus 在2.4以上版本提供了一个 collection 放多个 vector db 的功能,并在之上 query 时,可以结合多个不同的query weights 给出综合性得分。但是不是一定要用这个功能才可以完成图片与文本的交互式搜索?答案肯定是否定的。从CLIP的原理上来说,就是 txt 与 pic 映射到相同维度的一个向量空间,只要让 txt 与对应的 pic 的 similarity 足够小,与不mapping 的pic simlairty足够大就好,于是本着这个思路,我们看看怎么实现。

训练素材

download

首先下载 

pip install torchvision -i https://pypi.tuna.tsinghua.edu.cn/simple

torchvision 简介

Torchvision是Pytorch中一个开源的机器学习框架,专门为计算机视觉任务设计和优化。它提供了多种功能来支持计算机视觉项目的开发和实验。

简要来说有如下的功能:

数据加载与处理:

Torchvision提供了torchvision.datasets模块,其中包含了许多常用的计算机视觉数据集,如CIFAR-10、CIFAR-100、ImageN

### Milvus SDK Java 文本检索示例 为了展示如何利用 `milvus-sdk-java` 实现文本检索,以下是详细的说明和代码实例。 #### 安装依赖项 确保项目环境中已配置好所需的依赖项。对于 Maven 构建工具,在 `pom.xml` 文件中添加以下依赖: ```xml <dependency> <groupId>io.milvus</groupId> <artifactId>milvus-sdk-java</artifactId> <version>最新版本号</version> </dependency> ``` 对于 Gradle 用户,则应在 `build.gradle` 中加入相应的内容[^4]。 #### 初始化客户端连接 建立到 Milvus 数据库的服务端口链接,并初始化 RSocketClient 对象以便后续调用 API 方法。 ```java RSocketClient client = new SyncRSocketClient.Builder() .withHost("localhost") // 替换为实际服务器地址 .withPort(19530) // 默认端口号 .build(); MilvusServiceStub stub = MilvusServiceGrpc.newBlockingStub(client); ``` #### 创建集合与字段定义 设定用于存储嵌入向量和其他元数据信息的数据结构;此处假设已经有一个预训练好的模型生成了待索引的文本特征向量列表。 ```java CollectionSchema schema = CollectionSchema.newBuilder() .withAutoID(true) .addField(FieldSchema.newBuilder().withName("id").withDataType(DataType.Int64).isPrimaryKey(true)) .addField(FieldSchema.newBuilder().withName("embedding").withDataType(DataType.FloatVector)) .addField(FieldSchema.newBuilder().withName("text_content").withDataType(DataType.VarChar).withMaxLength(256)) // 根据实际情况调整最大长度 .build(); CreateCollectionRequest request = CreateCollectionRequest.newBuilder() .withDbName("") // 如果不需要指定数据库名称则留空字符串"" .withCollName("example_collection") .withSchema(schema.toProto()) .build(); stub.createCollection(request); ``` #### 插入文档及其对应的向量化表示形式 将要被搜索的文章内容转换成数值型数组后存入新建表单之中。 ```java List<Float> vectorData = Arrays.asList(/* ... */); // 此处应填入具体的浮点数序列作为输入样本 InsertRequest insertReq = InsertRequest.newBuilder() .withDbName("") .withCollName("example_collection") .addRowData(RowBasedEntity.newBuilder() .addFieldValues(EntityValue.newBuilder().setInt64Value(System.currentTimeMillis())) .addFieldValues(EntityValue.newBuilder().setFloatArray(vectorData.stream().mapToDouble(Float::doubleValue).toArray())) .addFieldValues(EntityValue.newBuilder().setVarChar("some text content")) ).build()); MutateResult result = stub.insert(insertReq); System.out.println(result.toString()); ``` #### 执行相似度匹配查询操作 最后一步就是根据给定关键词计算其最近邻节点集合作为最终返回结果的一部分。 ```java SearchVectorsParam searchParams = SearchVectorsParam.newBuilder() .withBaseSearchParams(BaseSearchParam.newBuilder() .withTopK(5) // 返回前五个最相近的结果 .withMetricType(MetricType.L2) // 或者选择其他距离测度方式如IP内积 ) .withDsl("{ \"bool\": {\"must\": [{\"range\": {\"timestamp\": {\"gte\": 0}}} ]} }") // 可选参数表达式过滤器 .withOutputFields(List.of("id","text_content")) // 输出哪些列名 .withVectors(Collections.singletonList(new Float[]{/*...*/})) // 待比较的目标向量 .withPartitionNames(null) // 不限分区范围 .build(); SearchResults response = stub.search(searchParams.build()); for (QueryResult r : response.getResults()) { System.out.printf("%d\t%s\n",r.getEntityIds(0),r.getStringExtraInfoMap().getOrDefault("text_content","")); } ``` 以上即是一个完整的基于 Milvus 的 Java SDK 开发环境下的文本检索流程介绍[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PhoenixAI8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值