1# 应用数据向量化 (ArkTS) 2<!--Kit: ArkData--> 3<!--Subsystem: DistributedDataManager--> 4<!--Owner: @my-2024; @cuile44; @pancodax--> 5<!--Designer: @fysun17; @AnruiWang; @xd_94--> 6<!--Tester: @yippo; @logic42--> 7<!--Adviser: @ge-yafang--> 8 9## 场景介绍 10 11在数字化向智能化演进的关键阶段,构建智慧化服务已成为应用开发者提升产品竞争力的必然选择。 12 13当前,系统提供ArkData智慧数据平台(ArkData Intelligence Platform,AIP),提供端侧数据智慧化构建,使应用数据向量化,通过嵌入模型将非结构化的文本、图像等多模态数据,转换成具有语义的向量。 14 15从API version 15开始,支持应用数据向量化。 16 17## 基本概念 18 19在智慧化数据构建过程中,涉及以下基本概念,请先了解相关含义。 20 21### 向量化 22向量化主要是指通过嵌入模型将高维非结构化数据(如文字、图像)映射为低维连续向量的嵌入技术。嵌入技术通过模型捕捉数据之间的语义关系,将抽象概念转化为可计算的数学表示,使计算机能够理解非结构化数据。目前,嵌入技术广泛应用于自然语言处理(语义搜索)、图像识别(特征提取)、推荐系统(用户/物品表征)等领域。 23 24### 多模态嵌入模型 25应用数据向量化,主要通过嵌入模型实现。当前支持多模态嵌入模型,能将文本和图像这两种不同数据模态转换到同一个向量空间,支持单模态(文搜文、图搜图)和跨模态(文搜图、图搜文)的语义表征能力。 26 27### 文本分块 28数据向量化时,文本数据长度受限,可通过AIP分块接口切分文本,高效实现数据向量化。 29 30## 实现机制 31 32应用可借助智慧数据平台能力,实现智慧化数据的构建,将应用数据转化为可计算的向量,相关能力均运行在应用进程内,数据不出应用,保证隐私安全。 33 34## 运作机制 35应用数据向量化,将应用原数据向量化并存储在向量数据库中。 36 37## 约束限制 38- 考虑到数据向量化处理的计算量和资源占用较大,当前仅支持在2in1设备上使用。 39- 嵌入模型的推理过程可使用NPU加速。与NPU计算相比,纯CPU的计算在时延和功耗上都有较大差距,建议采用NPU加速。 40- 模型推理单次可处理的文本长度上限为512个字符,支持中英文。 41- 模型推理单次可处理的图像大小小于20MB。 42 43## 接口说明 44 45以下是智慧数据向量化功能的相关接口。更多接口及使用方式请见[智慧数据平台](../reference/apis-arkdata/js-apis-data-intelligence.md)。 46 47| 接口名称 | 描述 | 48| -------- | -------- | 49| getTextEmbeddingModel(config: ModelConfig): Promise<TextEmbedding> | 获取文本嵌入模型。 | 50| loadModel(): Promise<void> | 加载文本嵌入模型。 | 51| splitText(text: string, config: SplitConfig): Promise<Array<string>> | 获取文本的分块。 | 52| getEmbedding(text: string): Promise<Array<number>> | 获取给定文本的嵌入向量。 | 53| getEmbedding(batchTexts: Array<string>): Promise<Array<Array<number>>> | 获取给定批次文本的嵌入向量。 | 54| releaseModel(): Promise<void> | 释放文本嵌入模型。 | 55| getImageEmbeddingModel(config: ModelConfig): Promise<ImageEmbedding> | 获取图像嵌入模型。 | 56| loadModel(): Promise<void> | 加载图像嵌入模型。 | 57| getEmbedding(image: Image): Promise<Array<number>> | 获取给定图像的嵌入向量。 | 58| releaseModel(): Promise<void> | 释放图像嵌入模型。 | 59 60## 文本向量化开发步骤 61 621. 导入模块。 63 64 ```ts 65 import { intelligence } from '@kit.ArkData'; 66 ``` 67 682. 获取文本嵌入模型。 69 调用getTextEmbeddingModel方法,获取文本嵌入模型。示例代码如下所示: 70 71 ```ts 72 import { BusinessError } from '@kit.BasicServicesKit'; 73 74 let textConfig:intelligence.ModelConfig = { 75 version:intelligence.ModelVersion.BASIC_MODEL, 76 isNpuAvailable:false, 77 cachePath:"/data" 78 } 79 let textEmbedding:intelligence.TextEmbedding; 80 81 intelligence.getTextEmbeddingModel(textConfig) 82 .then((data:intelligence.TextEmbedding) => { 83 console.info("Succeeded in getting TextModel"); 84 textEmbedding = data; 85 }) 86 .catch((err:BusinessError) => { 87 console.error("Failed to get TextModel and code is " + err.code); 88 }) 89 ``` 90 913. 加载文本嵌入模型。 92 调用loadModel方法,加载文本嵌入模型。示例代码如下所示: 93 94 ```ts 95 textEmbedding.loadModel() 96 .then(() => { 97 console.info("Succeeded in loading Model"); 98 }) 99 .catch((err:BusinessError) => { 100 console.error("Failed to load Model and code is " + err.code); 101 }) 102 ``` 103 1044. 获取文本的分块。当数据长度超过限定时,使用splitText()接口将其分块,然后再进行数据向量化。 105 调用splitText方法,获取文本的分块结果。示例代码如下所示: 106 107 ```ts 108 let splitConfig:intelligence.SplitConfig = { 109 size:10, 110 overlapRatio:0.1 111 } 112 let splitText = 'text'; 113 114 intelligence.splitText(splitText, splitConfig) 115 .then((data:Array<string>) => { 116 console.info("Succeeded in splitting Text"); 117 }) 118 .catch((err:BusinessError) => { 119 console.error("Failed to split Text and code is " + err.code); 120 }) 121 ``` 122 1235. 获取给定文本的嵌入向量。给定的文本数据可以是单个文本或文本集合。 124 调用getEmbedding方法,获取给定单个文本或文本集合的嵌入向量。示例代码如下所示: 125 126 ```ts 127 let text = 'text'; 128 textEmbedding.getEmbedding(text) 129 .then((data:Array<number>) => { 130 console.info("Succeeded in getting Embedding"); 131 }) 132 .catch((err:BusinessError) => { 133 console.error("Failed to get Embedding and code is " + err.code); 134 }) 135 ``` 136 137 ```ts 138 let batchTexts = ['text1','text2']; 139 textEmbedding.getEmbedding(batchTexts) 140 .then((data:Array<Array<number>>) => { 141 console.info("Succeeded in getting Embedding"); 142 }) 143 .catch((err:BusinessError) => { 144 console.error("Failed to get Embedding and code is " + err.code); 145 }) 146 ``` 147 1486. 释放文本嵌入模型。 149 调用releaseModel方法,释放文本嵌入模型。示例代码如下所示: 150 151 ```ts 152 textEmbedding.releaseModel() 153 .then(() => { 154 console.info("Succeeded in releasing Model"); 155 }) 156 .catch((err:BusinessError) => { 157 console.error("Failed to release Model and code is " + err.code); 158 }) 159 ``` 160 161## 图像向量化开发步骤 162 1631. 导入模块。 164 165 ```ts 166 import { intelligence } from '@kit.ArkData'; 167 ``` 168 1692. 获取图像嵌入模型。 170 调用getImageEmbeddingModel方法,获取图像嵌入模型。示例代码如下所示: 171 172 ```ts 173 let imageConfig:intelligence.ModelConfig = { 174 version:intelligence.ModelVersion.BASIC_MODEL, 175 isNpuAvailable:false, 176 cachePath:"/data" 177 } 178 let imageEmbedding:intelligence.ImageEmbedding; 179 180 intelligence.getImageEmbeddingModel(imageConfig) 181 .then((data:intelligence.ImageEmbedding) => { 182 console.info("Succeeded in getting ImageModel"); 183 imageEmbedding = data; 184 }) 185 .catch((err:BusinessError) => { 186 console.error("Failed to get ImageModel and code is " + err.code); 187 }) 188 ``` 189 1903. 加载图像嵌入模型。 191 调用loadModel方法,加载图像嵌入模型。示例代码如下所示: 192 193 ```ts 194 imageEmbedding.loadModel() 195 .then(() => { 196 console.info("Succeeded in loading Model"); 197 }) 198 .catch((err:BusinessError) => { 199 console.error("Failed to load Model and code is " + err.code); 200 }) 201 ``` 202 2034. 获取给定图像的嵌入向量。 204 调用getEmbedding方法,获取给定图像的嵌入向量。示例代码如下所示: 205 206 ```ts 207 let image = "file://<packageName>/data/storage/el2/base/haps/entry/files/xxx.jpg"; 208 imageEmbedding.getEmbedding(image) 209 .then((data:Array<number>) => { 210 console.info("Succeeded in getting Embedding"); 211 }) 212 .catch((err:BusinessError) => { 213 console.error("Failed to get Embedding and code is " + err.code); 214 }) 215 ``` 216 2175. 释放图像嵌入模型。 218 调用releaseModel方法,释放图像嵌入模型。示例代码如下所示: 219 220 ```ts 221 imageEmbedding.releaseModel() 222 .then(() => { 223 console.info("Succeeded in releasing Model"); 224 }) 225 .catch((err:BusinessError) => { 226 console.error("Failed to release Model and code is " + err.code); 227 }) 228 ``` 229