检索Fusion模式Vectors(Java SDK V2)

更新时间:
复制 MD 格式

本文介绍如何使用 OSS Java SDK V2 调用 QueryVectorsFusion 接口对Fusion模式的向量索引进行检索,支持向量检索、全文检索以及多路召回融合。

说明

Fusion Mode 目前处于邀测阶段,仅在印度尼西亚(雅加达)地域提供。Standard 模式向量索引的检索请参见 检索Vectors(Java SDK V2)。

权限说明

阿里云账号默认拥有全部权限。阿里云账号下的 RAM 用户或 RAM 角色默认没有任何权限,需要阿里云账号或账号管理员通过 RAM Policy 或 Bucket Policy 授予操作权限。

API

Action

说明

QueryVectorsFusion

oss:QueryVectors和oss:GetVectors

检索Fusion模式的向量索引(Index)。

示例代码

import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.vectors.OSSVectorsClient;
import com.aliyun.sdk.service.oss2.vectors.models.Knn;
import com.aliyun.sdk.service.oss2.vectors.models.NormalizerType;
import com.aliyun.sdk.service.oss2.vectors.models.QueryVectorsFusionRequest;
import com.aliyun.sdk.service.oss2.vectors.models.QueryVectorsFusionResult;
import com.aliyun.sdk.service.oss2.vectors.models.QueryVectorsFusionSummary;
import com.aliyun.sdk.service.oss2.vectors.models.RetrieverComponent;
import com.aliyun.sdk.service.oss2.vectors.models.RrfRetriever;
import com.aliyun.sdk.service.oss2.vectors.models.SimpleRetriever;
import com.aliyun.sdk.service.oss2.vectors.models.WeightRetriever;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class QueryVectorsFusionSample {
    public static void main(String[] args) {
        CredentialsProvider provider = new EnvironmentVariableCredentialsProvider();

        try (OSSVectorsClient client = OSSVectorsClient.newBuilder()
                .region("cn-hangzhou")
                .accountId("1234567890")
                .credentialsProvider(provider)
                .build()) {

            String bucket = "examplebucket";
            String indexName = "exampleindex";

            // 构造向量检索请求
            Knn knn = Knn.newBuilder()
                    .field("vector_1")
                    .queryVector(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f))
                    .topK(10)
                    .build();

            // 构造全文检索查询条件
            Map<String, Object> titleQuery = new HashMap<>();
            titleQuery.put("title", new HashMap<String, Object>() {{
                put("$textMatch", new HashMap<String, Object>() {{
                    put("value", "hello world");
                    put("boost", 2.0f);
                }});
            }});

            // 模式 1(默认):单路向量检索
            QueryVectorsFusionRequest knnRequest = QueryVectorsFusionRequest.newBuilder()
                    .bucket(bucket)
                    .indexName(indexName)
                    .knn(knn)
                    .limit(10)
                    .returnMetadata(true)
                    .build();

            // 模式 2:RRF 多路召回融合
            RrfRetriever rrf = RrfRetriever.newBuilder()
                    .k(50)
                    .windowSize(100)
                    .retrievers(Arrays.asList(
                            RetrieverComponent.newBuilder()
                                    .retriever(knn)
                                    .weight(1.0f)
                                    .build(),
                            RetrieverComponent.newBuilder()
                                    .retriever(SimpleRetriever.newBuilder().query(titleQuery).build())
                                    .weight(2.0f)
                                    .build()))
                    .build();

            QueryVectorsFusionRequest rrfRequest = QueryVectorsFusionRequest.newBuilder()
                    .bucket(bucket)
                    .indexName(indexName)
                    .retriever(rrf)
                    .limit(10)
                    .returnMetadata(true)
                    .build();

            // 模式 3:Weight 加权融合
            WeightRetriever weight = WeightRetriever.newBuilder()
                    .windowSize(100)
                    .retrievers(Arrays.asList(
                            RetrieverComponent.newBuilder()
                                    .retriever(knn)
                                    .weight(0.7f)
                                    .normalizer(NormalizerType.MIN_MAX)
                                    .build(),
                            RetrieverComponent.newBuilder()
                                    .retriever(SimpleRetriever.newBuilder().query(titleQuery).build())
                                    .weight(0.3f)
                                    .normalizer(NormalizerType.MIN_MAX)
                                    .build()))
                    .build();

            QueryVectorsFusionRequest weightRequest = QueryVectorsFusionRequest.newBuilder()
                    .bucket(bucket)
                    .indexName(indexName)
                    .retriever(weight)
                    .limit(10)
                    .returnMetadata(true)
                    .build();

            // 以 RRF 模式为例执行查询
            QueryVectorsFusionResult result = client.queryVectorsFusion(rrfRequest);

            System.out.printf("Status code:%d, request id:%s%n",
                    result.statusCode(), result.requestId());

            List<QueryVectorsFusionSummary> vectors = result.vectors();
            for (int i = 0; i < vectors.size(); i++) {
                QueryVectorsFusionSummary vector = vectors.get(i);
                System.out.printf("Vector %d: key=%s, score=%s%n",
                        i + 1, vector.key(), vector.score());
            }

            if (result.nextToken() != null) {
                System.out.printf("Next token: %s%n", result.nextToken());
            }
        }
    }
}