掘金 人工智能 08月18日
如何通过Java SDK分组检索Doc
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文档详细介绍了如何使用Java SDK在DashVector Collection中执行按分组进行的相似性检索。文章提供了详细的接口定义,包括同步和异步方法,并给出了多个使用示例。这些示例涵盖了基于向量的分组检索、基于主键的分组检索、带过滤条件的分组检索以及支持稀疏向量的分组检索。用户需要替换API-KEY和Cluster Endpoint以运行代码,并且可以根据需求调整检索参数,如groupCount和groupTopk,以及指定输出字段,以获得更精确和高效的检索结果。

🚀 **分组相似性检索接口**: DashVector的Java SDK提供了`queryGroupBy`同步和异步接口,允许用户在Collection中根据指定的字段对相似的文档进行分组检索。用户可以通过`QueryDocGroupByRequest`对象来配置检索参数,包括查询向量、分组字段、分组数量(groupCount)和每个分组返回的最大文档数(groupTopk)。

🎯 **基于向量的分组检索**: 该示例展示了如何构建一个`QueryDocGroupByRequest`,指定查询向量、分组字段(如“document_id”)、期望的分组数量和每个分组内的文档数量。通过调用`collection.queryGroupBy()`方法,可以根据向量的相似度将文档归类到不同的组,并返回最相关的分组及其文档。

🔑 **基于主键的分组检索**: 除了基于向量,还可以通过文档的ID(主键)进行分组相似性检索。通过在`QueryDocGroupByRequest`中设置`id`参数,并指定`groupByField`,系统会查找与该ID向量相似的其他文档,并按指定字段进行分组,同时可以指定返回的字段和是否包含向量信息。

💡 **带过滤条件的分组检索**: 为了提高检索的精确度,可以为分组相似性检索添加过滤条件。通过`filter`参数,可以指定一个逻辑表达式(例如“age > 18”),只有满足该条件的文档才会被纳入相似性计算和分组过程中,从而实现更精细化的数据筛选。

✨ **稀疏向量支持**: DashVector的Java SDK支持稀疏向量,这对于需要结合关键词信息进行向量检索的场景非常有用。通过在`QueryDocGroupByRequest`中提供`sparseVector`参数,可以实现带关键词感知能力的向量检索,进一步提升检索的准确性和相关性。

本文介绍如何通过Java SDK在Collection中按分组进行相似性检索。

前提条件

接口定义

Java(JSP)

// class DashVectorCollection// 同步接口public Response<List<Group>> queryGroupBy(QueryDocGroupByRequest queryDocGroupByRequest);// 异步接口public ListenableFuture<Response<List<Group>>> queryGroupByAsync(QueryDocGroupByRequest queryDocGroupByRequest)

使用示例

**说明

    需要使用您的api-key替换示例中的YOUR_API_KEY、您的Cluster Endpoint替换示例中的YOUR_CLUSTER_ENDPOINT,代码才能正常运行。

根据向量进行分组相似性检索

Java示例:

package com.aliyun.dashvector;import com.aliyun.dashvector.models.Doc;import com.aliyun.dashvector.models.Group;import com.aliyun.dashvector.models.Vector;import com.aliyun.dashvector.models.requests.CreateCollectionRequest;import com.aliyun.dashvector.models.requests.InsertDocRequest;import com.aliyun.dashvector.models.requests.QueryDocGroupByRequest;import com.aliyun.dashvector.models.responses.Response;import com.aliyun.dashvector.proto.CollectionInfo;import com.aliyun.dashvector.proto.FieldType;import java.util.Arrays;import java.util.Collections;import java.util.HashMap;import java.util.List;public class Main {    public static void main(String[] args) {        DashVectorClientConfig config =                DashVectorClientConfig.builder()                        .apiKey("YOUR_API_KEY")                        .endpoint("YOUR_CLUSTER_ENDPOINT")                        .timeout(30f)                        .build();        DashVectorClient client = new DashVectorClient(config);        CreateCollectionRequest request = CreateCollectionRequest.builder()                .name("group_demo")                .dimension(4)                .metric(CollectionInfo.Metric.dotproduct)                .dataType(CollectionInfo.DataType.FLOAT)                .filedSchema("document_id", FieldType.STRING)                .filedSchema("chunk_id", FieldType.INT)                .build();        Response<Void> createResponse = client.create(request);        assert createResponse.isSuccess();        DashVectorCollection collection = client.get("group_demo");        assert collection.isSuccess();        List<Doc> docs = new ArrayList<>();        for (int i = 0; i < 6; i++) {            int finalI = i;            docs.add(                    Doc.builder()                            .id(Integer.toString(i+3))                            .vector(Vector.builder().value(Collections.nCopies(4, (float) i+3)).build())                            .fields(                                    new HashMap<String, Object>() {                                        {                                            put("document_id", "paper" + finalI % 3);                                            put("chunk_id", finalI);                                        }                                    }                            )                            .build());        }        InsertDocRequest insertRequest = InsertDocRequest.builder().docs(docs).build();        Response<Void> insertResponse = collection.insert(insertRequest);        assert insertResponse.isSuccess();        // 构建Vector        Vector queryVector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();        // 构建 QueryDocGroupByRequest        QueryDocGroupByRequest queryDocGroupByRequest =                QueryDocGroupByRequest.builder().includeVector(true).vector(queryVector)                        .groupByField("document_id")                        .groupCount(2)                        .groupTopk(3)                        .build();        // 进行分组Doc检索        Response<List<Group>> response = collection.queryGroupBy(queryDocGroupByRequest);        // 判断是否成功        assert response.isSuccess();        System.out.println(response);        // example output:        // {        //     "code": 0,        //     "message": "Success",        //     "requestId": "47404048-6f40-47ad-9d62-2675704afb26",        //     "output": [        //         {        //             "groupId": "paper2",        //             "docs": [        //                 {        //                     "id": "8",        //                     "vector": {        //                         "value": [        //                             8.0,        //                             8.0,        //                             8.0,        //                             8.0        //                         ]        //                     },        //                     "fields": {        //                         "document_id": "paper2",        //                         "chunk_id": 5        //                     },        //                     "score": 8.0,        //                     "sparseVector": {        //        //                     }        //                 },        //                 {        //                     "id": "5",        //                     "vector": {        //                         "value": [        //                             5.0,        //                             5.0,        //                             5.0,        //                             5.0        //                         ]        //                     },        //                     "fields": {        //                         "document_id": "paper2",        //                         "chunk_id": 2        //                     },        //                     "score": 5.0,        //                     "sparseVector": {        //        //                     }        //                 }        //             ]        //         },        //         {        //             "groupId": "paper1",        //             "docs": [        //                 {        //                     "id": "7",        //                     "vector": {        //                         "value": [        //                             7.0,        //                             7.0,        //                             7.0,        //                             7.0        //                         ]        //                     },        //                     "fields": {        //                         "document_id": "paper1",        //                         "chunk_id": 4        //                     },        //                     "score": 7.0,        //                     "sparseVector": {        //        //                     }        //                 },        //                 {        //                     "id": "4",        //                     "vector": {        //                         "value": [        //                             4.0,        //                             4.0,        //                             4.0,        //                             4.0        //                         ]        //                     },        //                     "fields": {        //                         "document_id": "paper1",        //                         "chunk_id": 1        //                     },        //                     "score": 4.0,        //                     "sparseVector": {        //        //                     }        //                 }        //             ]        //         }        //     ]        // }    }}

根据主键(对应的向量)进行分组相似性检索

Java示例:

        // 构建QueryDocGroupByRequest        QueryDocGroupByRequest request = QueryDocGroupByRequest.builder()                .groupByField("age")                          .id("1")                .groupCount(10)  // 返回10个分组                .groupTopk(10)   // 每个分组最多返回10个doc                .outputFields(Arrays.asList("name", "age")) // 仅返回name、age这2个Field                .includeVector(true)                .build();        // 根据主键(对应的向量)进行分组相似性检索        Response<List<Group>> response2 = collection.queryGroupBy(request);        // 判断检索是否成功        assert response2.isSuccess();

带过滤条件的分组相似性检索

Java示例:

        Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();        // 构建QueryDocGroupByRequest        QueryDocGroupByRequest request = QueryDocGroupByRequest.builder()                .groupByField("age")                          .vector(vector)                .filter("age > 18") // 条件过滤,仅对age > 18的Doc进行相似性检索                .outputFields(Arrays.asList("name", "age")) // 仅返回name、age这2个Field                .includeVector(true)                .build();        // 根据向量或者主键进行分组相似性检索 + 条件过滤        Response<List<Group>> response = collection.queryGroupBy(request);        // 判断检索是否成功        assert response.isSuccess();

带有Sparse Vector的分组向量检索

**说明

Sparse Vector(稀疏向量)可用于关键词权重表示,实现带关键词感知能力的向量检索

Java示例:

        Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();        // 构建QueryDocGroupByRequest        QueryDocGroupByRequest request = QueryDocGroupByRequest.builder()                .groupByField("age")                          .vector(vector)                .sparseVector(                        new Map<Integer, Float>() {                            {                                put(1, 0.4f);                                put(10000, 0.6f);                                put(222222, 0.8f);                            }                        }) // 稀疏向量                .build();        //根据向量进行分组相似性检索 + 稀疏向量        Response<List<Group>> response = collection.queryGroupBy(request);        // 判断检索是否成功        assert response.isSuccess();

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Java SDK DashVector 相似性检索 分组检索 向量数据库
相关文章