本文介绍如何使用 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());
}
}
}
}
该文章对您有帮助吗?