DashText- 快速开始

DashVector · · 108 次点击 · · 开始浏览    

快速开始 ===================== DashText,是向量检索服务DashVector推荐使用的稀疏向量编码器(Sparse Vector Encoder),DashText可通过BM25算法将原始文本转换为稀疏向量(Sparse Vector)表达,通过DashText可大幅度简化使用DashVector[关键词感知检索]能力。 **说明** 1. 需要使用您的api-key替换示例中的YOUR_API_KEY、您的Cluster Endpoint替换示例中的YOUR_CLUSTER_ENDPOINT,代码才能正常运行。 2. 本示例仅对Sparse Vector进行功能演示,请根据实际情况设置您的向量维度。简化起见,本文示例代码中将向量(Dense Vector)维度设置为4。 **Step1. 创建支持Sparse Vector的Collection** -------------------------------------------------------- Python示例 ```python import dashvector client = dashvector.Client(api_key='YOUR_API_KEY', endpoint='YOUR_CLUSTER_ENDPOINT') assert client ret = client.create('hybrid_collection', dimension=4, metric='dotproduct') assert ret collection = client.get('hybrid_collection') assert collection ``` Java示例 ```java import com.aliyun.dashvector.DashVectorClient; import com.aliyun.dashvector.DashVectorCollection; import com.aliyun.dashvector.models.requests.CreateCollectionRequest; import com.aliyun.dashvector.models.responses.Response; import com.aliyun.dashvector.proto.CollectionInfo; DashVectorClient client = new DashVectorClient("YOUR_API_KEY", "YOUR_CLUSTER_ENDPOINT"); CreateCollectionRequest request = CreateCollectionRequest.builder() .name("hybrid_collection") .dimension(4) .metric(CollectionInfo.Metric.dotproduct) .dataType(CollectionInfo.DataType.FLOAT) .build(); Response<Void> response = client.create(request); System.out.println(response); DashVectorCollection collection = client.get("hybrid_collection"); ``` **重要** 仅内积度量(`metric='dotproduct'`)支持Sparse Vector功能 **Step2. 创建SparseVectorEncoder** ------------------------------------------------- #### **使用内置Encoder** Python示例 ```python from dashtext import SparseVectorEncoder encoder = SparseVectorEncoder.default() ``` Java示例 ```java import com.aliyun.dashtext.encoder.SparseVectorEncoder; SparseVectorEncoder encoder = SparseVectorEncoder.getDefaultInstance(); ``` **说明** 内置Encoder使用[中文Wiki语料](https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2)进行训练,采用[Jieba](https://github.com/yanyiwu/cppjieba)进行中文分词 #### **基于自有语料创建Encoder** Python示例 ```python from dashtext import SparseVectorEncoder encoder = SparseVectorEncoder() # (全部)自有语料 corpus = [ "向量检索服务DashVector基于阿里云自研的高效向量引擎Proxima内核,提供具备水平拓展能力的云原生、全托管的向量检索服务", "DashVector将其强大的向量管理、向量查询等多样化能力,通过简洁易用的SDK/API接口透出,方便被上层AI应用迅速集成", "从而为包括大模型生态、多模态AI搜索、分子结构分析在内的多种应用场景,提供所需的高效向量检索能力", "简单灵活、开箱即用的SDK,使用极简代码即可实现向量管理", "自研向量相似性比对算法,快速高效稳定服务", "Schema-free设计,通过Schema实现任意条件下的组合过滤查询" ] # 基于自有语料训练Encoder encoder.train(corpus) ``` Java示例 ```java import com.aliyun.dashtext.encoder.SparseVectorEncoder; import java.util.*; SparseVectorEncoder encoder = new SparseVectorEncoder(); //(全部)自有语料 List<String> corpus = Arrays.asList( "向量检索服务DashVector基于阿里云自研的高效向量引擎Proxima内核,提供具备水平拓展能力的云原生、全托管的向量检索服务", "DashVector将其强大的向量管理、向量查询等多样化能力,通过简洁易用的SDK/API接口透出,方便被上层AI应用迅速集成", "从而为包括大模型生态、多模态AI搜索、分子结构分析在内的多种应用场景,提供所需的高效向量检索能力", "简单灵活、开箱即用的SDK,使用极简代码即可实现向量管理", "自研向量相似性比对算法,快速高效稳定服务", "Schema-free设计,通过Schema实现任意条件下的组合过滤查询" ); // 基于自有语料训练Encoder encoder.train(corpus); ``` **说明** 1. 内置Encoder可直接使用,无需使用原始语料进行训练,使用起来更加方便,同时泛化能力较强。但面对原始语料中专业术语较多等场景,准确性偏弱 2. 基于自有语料创建Encoder,需要预先根据(全部)原始语料进行训练,准确性较高,自有语料创建Encoder具体使用可参考进阶使用 3. 用户需根据自身业务场景和需求来选择Encoder,对于特定领域(大量专属词汇)的场景推荐基于自有语料创建Encoder **Step3. 插入带有Sparse Vector的Doc** ------------------------------------------------- Python示例 ```python from dashvector import Doc document = "向量检索服务DashVector基于阿里云自研的高效向量引擎Proxima内核,提供具备水平拓展能力的云原生、全托管的向量检索服务。" doc_sparse_vector = encoder.encode_documents(document) print(doc_sparse_vector) # 基于内置Encoder的output: # {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} collection.insert(Doc( id='A', vector=[0.1, 0.2, 0.3, 0.4], sparse_vector=doc_sparse_vector )) ``` Java示例 ```java String document = "向量检索服务DashVector基于达摩院自研的高效向量引擎Proxima内核,提供具备水平拓展能力的云原生、全托管的向量检索服务。"; Map<Long, Float> sparseVector = encoder.encodeDocuments(document); System.out.println(sparseVector); // 基于内置Encoder的output: // {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} Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build(); // 构建带有Sparse Vector的Doc Doc doc = Doc.builder() .id("28") .sparseVector(sparseVector) .vector(vector) .build(); // 插入带有Sparse Vector的Doc Response<Void> response = collection.insert(InsertDocRequest.builder().doc(doc).build()); ``` **Step4. 关键词感知的向量检索** -------------------------------------- Python示例 ```python query = "什么是向量检索服务?" sparse_vector = encoder.encode_queries(query) print(sparse_vector) # 基于内置Encoder的output: # {1169440797: 0.2947158712590364, 2045788977: 0.7052841287409635} docs = collection.query( vector=[0.1, 0.1, 0.1, 0.1], sparse_vector=sparse_vector ) ``` Java示例 ```java String query = "什么是向量检索服务?"; Map<Long, Float> sparseVector = encoder.encodeQueries(query); System.out.println(sparseVector); // 基于内置Encoder的output: // {1169440797: 0.2947158712590364, 2045788977: 0.7052841287409635} Vector vector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build(); // 构建QueryDocRequest QueryDocRequest request = QueryDocRequest.builder() .vector(vector) .sparseVector(sparseVector) .topk(100) .includeVector(true) .build(); Response<List<Doc>> response = collection.query(request); System.out.println(response); ``` **Step5. 基于权重的关键词+语义检索** ----------------------------------------- Python示例 ```python from dashtext import combine_dense_and_sparse query = "什么是向量检索服务?" sparse_vector = encoder.encode_queries(query) # 权重因子 alpha = 0.7 dense_vector = [0.1, 0.1, 0.1, 0.1] scaled_dense_vector, scaled_sparse_vector = combine_dense_and_sparse(dense_vector, sparse_vector, alpha) docs = collection.query( vector=scaled_dense_vector, sparse_vector=scaled_sparse_vector ) ``` Java示例 ```java String query = "什么是向量检索服务?"; Map<Long, Float> sparseVector = encoder.encodeQueries(query); System.out.println(sparse_vector); // 基于内置Encoder的output: // {1169440797: 0.2947158712590364, 2045788977: 0.7052841287409635} Vector denseVector = Vector.builder().value(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)).build(); // 通过alpha因子调整稠密向量和稀疏向量 float alpha = 0.1; sparse_vector.forEach((key, value) -> sparse_vector.put(key, value * (1 - alpha))); denseVector = Vector.builder().value( denseVector.getValue().stream().map(number -> number.floatValue() * alpha).collect(Collectors.toList()) ).build(); // 构建QueryDocRequest QueryDocRequest request = QueryDocRequest.builder() .vector(denseVector) .sparseVector(sparseVector) .topk(100) .includeVector(true) .build(); Response<List<Doc>> response = collection.query(request); System.out.println(response); ``` **说明** 参数alpha是控制稠密向量距离和稀疏向量距离加权的权重因子,alpha=0.0表示只采用稀疏向量进行距离度量,alpha=1.0表示只采用稠密向量进行距离度量。 **API参考** -------------------------- 更多DashText API详情可参考: * Python SDK:https://pypi.org/project/dashtext/

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

108 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传