找回密码
 立即注册
首页 业界区 安全 DashText-快速开始

DashText-快速开始

琴丁辰 2025-6-10 16:22:08
快速开始

DashText,是向量检索服务DashVector推荐使用的稀疏向量编码器(Sparse Vector Encoder),DashText可通过BM25算法将原始文本转换为稀疏向量(Sparse Vector)表达,通过DashText可大幅度简化使用DashVector[关键词感知检索]能力。
说明

  • 需要使用您的api-key替换示例中的YOUR_API_KEY、您的Cluster Endpoint替换示例中的YOUR_CLUSTER_ENDPOINT,代码才能正常运行。
  • 本示例仅对Sparse Vector进行功能演示,请根据实际情况设置您的向量维度。简化起见,本文示例代码中将向量(Dense Vector)维度设置为4。
Step1. 创建支持Sparse Vector的Collection

Python示例
  1. import dashvector
  2. client = dashvector.Client(api_key='YOUR_API_KEY', endpoint='YOUR_CLUSTER_ENDPOINT')
  3. assert client
  4. ret = client.create('hybrid_collection', dimension=4, metric='dotproduct')
  5. assert ret
  6. collection = client.get('hybrid_collection')
  7. assert collection
复制代码
Java示例
  1. import com.aliyun.dashvector.DashVectorClient;
  2. import com.aliyun.dashvector.DashVectorCollection;
  3. import com.aliyun.dashvector.models.requests.CreateCollectionRequest;
  4. import com.aliyun.dashvector.models.responses.Response;
  5. import com.aliyun.dashvector.proto.CollectionInfo;
  6. DashVectorClient client =
  7.   new DashVectorClient("YOUR_API_KEY", "YOUR_CLUSTER_ENDPOINT");
  8. CreateCollectionRequest request = CreateCollectionRequest.builder()
  9.             .name("hybrid_collection")
  10.             .dimension(4)
  11.             .metric(CollectionInfo.Metric.dotproduct)
  12.             .dataType(CollectionInfo.DataType.FLOAT)
  13.             .build();
  14.       
  15. Response<Void> response = client.create(request);
  16. System.out.println(response);
  17. DashVectorCollection collection = client.get("hybrid_collection");
复制代码
重要
仅内积度量(metric='dotproduct')支持Sparse Vector功能
Step2. 创建SparseVectorEncoder

使用内置Encoder

Python示例
  1. from dashtext import SparseVectorEncoder
  2. encoder = SparseVectorEncoder.default()
复制代码
Java示例
  1. import com.aliyun.dashtext.encoder.SparseVectorEncoder;
  2. SparseVectorEncoder encoder = SparseVectorEncoder.getDefaultInstance();
复制代码
说明
内置Encoder使用中文Wiki语料进行训练,采用Jieba进行中文分词
基于自有语料创建Encoder

Python示例
  1. from dashtext import SparseVectorEncoder
  2. encoder = SparseVectorEncoder()
  3. # (全部)自有语料
  4. corpus = [
  5.     "向量检索服务DashVector基于阿里云自研的高效向量引擎Proxima内核,提供具备水平拓展能力的云原生、全托管的向量检索服务",
  6.     "DashVector将其强大的向量管理、向量查询等多样化能力,通过简洁易用的SDK/API接口透出,方便被上层AI应用迅速集成",
  7.     "从而为包括大模型生态、多模态AI搜索、分子结构分析在内的多种应用场景,提供所需的高效向量检索能力",
  8.     "简单灵活、开箱即用的SDK,使用极简代码即可实现向量管理",
  9.     "自研向量相似性比对算法,快速高效稳定服务",
  10.     "Schema-free设计,通过Schema实现任意条件下的组合过滤查询"
  11. ]
  12. # 基于自有语料训练Encoder
  13. encoder.train(corpus)
复制代码
Java示例
  1. import com.aliyun.dashtext.encoder.SparseVectorEncoder;
  2. import java.util.*;
  3. SparseVectorEncoder encoder = new SparseVectorEncoder();
  4. //(全部)自有语料
  5. List<String> corpus = Arrays.asList(
  6.   "向量检索服务DashVector基于阿里云自研的高效向量引擎Proxima内核,提供具备水平拓展能力的云原生、全托管的向量检索服务",
  7.   "DashVector将其强大的向量管理、向量查询等多样化能力,通过简洁易用的SDK/API接口透出,方便被上层AI应用迅速集成",
  8.   "从而为包括大模型生态、多模态AI搜索、分子结构分析在内的多种应用场景,提供所需的高效向量检索能力",
  9.   "简单灵活、开箱即用的SDK,使用极简代码即可实现向量管理",
  10.   "自研向量相似性比对算法,快速高效稳定服务",
  11.   "Schema-free设计,通过Schema实现任意条件下的组合过滤查询"
  12. );
  13. // 基于自有语料训练Encoder
  14. encoder.train(corpus);
复制代码
说明

  • 内置Encoder可直接使用,无需使用原始语料进行训练,使用起来更加方便,同时泛化能力较强。但面对原始语料中专业术语较多等场景,准确性偏弱
  • 基于自有语料创建Encoder,需要预先根据(全部)原始语料进行训练,准确性较高,自有语料创建Encoder具体使用可参考进阶使用
  • 用户需根据自身业务场景和需求来选择Encoder,对于特定领域(大量专属词汇)的场景推荐基于自有语料创建Encoder
Step3. 插入带有Sparse Vector的Doc

Python示例
  1. from dashvector import Doc
  2. document = "向量检索服务DashVector基于阿里云自研的高效向量引擎Proxima内核,提供具备水平拓展能力的云原生、全托管的向量检索服务。"
  3. doc_sparse_vector = encoder.encode_documents(document)
  4. print(doc_sparse_vector)
  5. # 基于内置Encoder的output:
  6. # {380823393: 0.7262431704356519, 414191989: 0.7262431704356519, 565176162: 0.7262431704356519, 904594806: 0.7262431704356519, 1005505802: 0.7262431704356519, 1169440797: 0.8883757984694465, 1240922502: 0.7262431704356519, 1313971048: 0.7262431704356519, 1317077351: 0.7262431704356519, 1490140460: 0.7262431704356519, 1574737055: 0.7262431704356519, 1760434515: 0.7262431704356519, 2045788977: 0.8414146776926797, 2141666983: 0.7262431704356519, 2509543087: 0.7262431704356519, 3180265193: 0.7262431704356519, 3845702398: 0.7262431704356519, 4106887295: 0.7262431704356519}
  7. collection.insert(Doc(
  8.     id='A',
  9.     vector=[0.1, 0.2, 0.3, 0.4],
  10.     sparse_vector=doc_sparse_vector
  11. ))
复制代码
Java示例
  1. String document = "向量检索服务DashVector基于达摩院自研的高效向量引擎Proxima内核,提供具备水平拓展能力的云原生、全托管的向量检索服务。";
  2. Map<Long, Float> sparseVector = encoder.encodeDocuments(document);
  3. System.out.println(sparseVector);
  4. // 基于内置Encoder的output:
  5. // {380823393: 0.7262431704356519, 414191989: 0.7262431704356519, 565176162: 0.7262431704356519, 904594806: 0.7262431704356519, 1005505802: 0.7262431704356519, 1169440797: 0.8883757984694465, 1240922502: 0.7262431704356519, 1313971048: 0.7262431704356519, 1317077351: 0.7262431704356519, 1490140460: 0.7262431704356519, 1574737055: 0.7262431704356519, 1760434515: 0.7262431704356519, 2045788977: 0.8414146776926797, 2141666983: 0.7262431704356519, 2509543087: 0.7262431704356519, 3180265193: 0.7262431704356519, 3845702398: 0.7262431704356519, 4106887295: 0.7262431704356519}
  6. Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();
  7. // 构建带有Sparse Vector的Doc
  8. Doc doc = Doc.builder()
  9.   .id("28")
  10.   .sparseVector(sparseVector)
  11.   .vector(vector)
  12.   .build();
  13. // 插入带有Sparse Vector的Doc
  14. Response<Void> response = collection.insert(InsertDocRequest.builder().doc(doc).build());
复制代码
Step4. 关键词感知的向量检索

Python示例
  1. query = "什么是向量检索服务?"
  2. sparse_vector = encoder.encode_queries(query)
  3. print(sparse_vector)
  4. # 基于内置Encoder的output:
  5. # {1169440797: 0.2947158712590364, 2045788977: 0.7052841287409635}
  6. docs = collection.query(
  7.     vector=[0.1, 0.1, 0.1, 0.1],
  8.     sparse_vector=sparse_vector
  9. )
复制代码
Java示例
  1. String query = "什么是向量检索服务?";
  2. Map<Long, Float> sparseVector = encoder.encodeQueries(query);
  3. System.out.println(sparseVector);
  4. // 基于内置Encoder的output:
  5. // {1169440797: 0.2947158712590364, 2045788977: 0.7052841287409635}
  6. Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();
  7.              
  8. // 构建QueryDocRequest
  9. QueryDocRequest request = QueryDocRequest.builder()
  10.   .vector(vector)
  11.   .sparseVector(sparseVector)
  12.   .topk(100)
  13.   .includeVector(true)
  14.   .build();
  15. Response<List<Doc>> response = collection.query(request);
  16. System.out.println(response);
复制代码
Step5. 基于权重的关键词+语义检索

Python示例
  1. from dashtext import combine_dense_and_sparse
  2. query = "什么是向量检索服务?"
  3. sparse_vector = encoder.encode_queries(query)
  4. # 权重因子
  5. alpha = 0.7
  6. dense_vector = [0.1, 0.1, 0.1, 0.1]
  7. scaled_dense_vector, scaled_sparse_vector = combine_dense_and_sparse(dense_vector, sparse_vector, alpha)
  8. docs = collection.query(
  9.     vector=scaled_dense_vector,
  10.     sparse_vector=scaled_sparse_vector
  11. )
复制代码
Java示例
  1. String query = "什么是向量检索服务?";
  2. Map<Long, Float> sparseVector = encoder.encodeQueries(query);
  3. System.out.println(sparse_vector);
  4. // 基于内置Encoder的output:
  5. // {1169440797: 0.2947158712590364, 2045788977: 0.7052841287409635}
  6. Vector denseVector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build();
  7. // 通过alpha因子调整稠密向量和稀疏向量
  8. float alpha = 0.1;
  9. sparse_vector.forEach((key, value) -> sparse_vector.put(key, value * (1 - alpha)));
  10. denseVector = Vector.builder().value(
  11.             denseVector.getValue().stream().map(number -> number.floatValue() * alpha).collect(Collectors.toList())
  12.     ).build();
  13. // 构建QueryDocRequest
  14. QueryDocRequest request = QueryDocRequest.builder()
  15.   .vector(denseVector)
  16.   .sparseVector(sparseVector)
  17.   .topk(100)
  18.   .includeVector(true)
  19.   .build();
  20. Response<List<Doc>> response = collection.query(request);
  21. System.out.println(response);
复制代码
说明
参数alpha是控制稠密向量距离和稀疏向量距离加权的权重因子,alpha=0.0表示只采用稀疏向量进行距离度量,alpha=1.0表示只采用稠密向量进行距离度量。
API参考

更多DashText API详情可参考:

  • Python SDK:https://pypi.org/project/dashtext/

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册