1# 应用数据向量化 2 3## 场景介绍 4 5应用数据向量化,是指嵌入模型将非结构化的文本、图像等多模态数据,转换成具有语义的向量。在智慧化检索、RAG(检索增强生成)等场景中,嵌入模型扮演桥梁的角色,将离散的图文数据映射到同一向量空间,支撑跨模态的数据检索。向量化的主要应用场景如下: 6 7- 高效检索:通过向量的相似度计算,快速从向量数据库中召回与查询词最相关的文档片段。相比传统倒排索引,能识别语义隐含关联,提升召回内容的上下文适配性。 8- 检索增强生成:检索增强生成(RAG)是解决LLM大模型生成幻觉问题的主流方案,向量知识库是RAG技术的关键。RAG可检索出知识库中的精准上下文(Top-K相关向量对应文本)并作为提示输入生成模型,从而显著减少生成幻觉。 9 10## 基本概念 11 12### 多模态嵌入模型 13应用数据向量化,主要通过嵌入模型实现。当前支持多模态嵌入模型,能将文本和图像这两种不同数据模态转换到同一个向量空间,支持单模态(文搜文、图搜图)和跨模态(文搜图、图搜文)的语义表征能力。 14 15### 文本分块 16在进行数据向量化时,针对文本数据长度有限制,可通过AIP提供的分块接口,将输入文本按照指定的上限进行切分,从而高效实现数据向量化。 17 18## 运作机制 19应用数据向量化,是指将应用原数据进行向量化并进行存储的过程,向量化结果会存储在向量数据库中。 20 21## 约束限制 22- 模型推理单次可处理的文本长度上限为512个字符,支持中英文。 23- 模型推理单次可处理的图像大小<20MB。 24 25## 接口说明 26 27以下是智慧数据向量化功能的相关接口,更多接口及使用方式请见[智慧数据平台](../reference/apis-arkdata/js-apis-data-intelligence.md)。 28 29| 接口名称 | 描述 | 30| -------- | -------- | 31| getTextEmbeddingModel(config: ModelConfig): Promise<TextEmbedding> | 获取文本嵌入模型。 | 32| loadModel(): Promise<void> | 加载文本嵌入模型。 | 33| splitText(text: string, config: SplitConfig): Promise<Array<string>> | 获取文本的分块。 | 34| getEmbedding(text: string): Promise<Array<number>> | 获取给定文本的嵌入向量。 | 35| getEmbedding(batchTexts: Array<string>): Promise<Array<Array<number>>> | 获取给定批次文本的嵌入向量。 | 36| releaseModel(): Promise<void> | 释放文本嵌入模型。 | 37| getImageEmbeddingModel(config: ModelConfig): Promise<ImageEmbedding> | 获取图像嵌入模型。 | 38| loadModel(): Promise<void> | 加载图像嵌入模型。 | 39| getEmbedding(image: Image): Promise<Array<number>> | 获取给定图像的嵌入向量。 | 40| releaseModel(): Promise<void> | 释放图像嵌入模型。 | 41 42 43## 开发步骤 44 451. 导入模块。 46 47 ```ts 48 import { intelligence } from '@kit.ArkData'; 49 ``` 50 512. 获取文本嵌入模型。 52 53 ```ts 54 import { BusinessError } from '@kit.BasicServicesKit'; 55 56 let textConfig:intelligence.ModelConfig = { 57 version:intelligence.ModelVersion.BASIC_MODEL, 58 isNpuAvailable:false, 59 cachePath:"/data" 60 } 61 let textEmbedding:intelligence.TextEmbedding; 62 63 intelligence.getTextEmbeddingModel(textConfig) 64 .then((data:intelligence.TextEmbedding) => { 65 console.info("Succeeded in getting TextModel"); 66 textEmbedding = data; 67 }) 68 .catch((err:BusinessError) => { 69 console.error("Failed to get TextModel and code is " + err.code); 70 }) 71 ``` 72 733. 加载文本嵌入模型。 74 75 ```ts 76 textEmbedding.loadModel() 77 .then(() => { 78 console.info("Succeeded in loading Model"); 79 }) 80 .catch((err:BusinessError) => { 81 console.error("Failed to load Model and code is " + err.code); 82 }) 83 ``` 84 854. 获取文本的分块。当需要进行向量化的数据长度过长时,使用splitText()接口对其进行文本分块,然后再进行数据向量化。 86 87 ```ts 88 let splitConfig:intelligence.SplitConfig = { 89 size:10, 90 overlapRatio:0.1 91 } 92 let splitText = 'text'; 93 94 intelligence.splitText(splitText, splitConfig) 95 .then((data:Array<string>) => { 96 console.info("Succeeded in splitting Text"); 97 }) 98 .catch((err:BusinessError) => { 99 console.error("Failed to split Text and code is " + err.code); 100 }) 101 ``` 102 1035. 获取给定文本的嵌入向量。给定的文本数据可以为单个文本数据或者一个文本数据的集合。 104 105 ```ts 106 let text = 'text'; 107 textEmbedding.getEmbedding(text) 108 .then((data:Array<number>) => { 109 console.info("Succeeded in getting Embedding"); 110 }) 111 .catch((err:BusinessError) => { 112 console.error("Failed to get Embedding and code is " + err.code); 113 }) 114 ``` 115 116 ```ts 117 let batchTexts = ['text1','text2']; 118 textEmbedding.getEmbedding(batchTexts) 119 .then((data:Array<Array<number>>) => { 120 console.info("Succeeded in getting Embedding"); 121 }) 122 .catch((err:BusinessError) => { 123 console.error("Failed to get Embedding and code is " + err.code); 124 }) 125 ``` 126 1276. 释放文本嵌入模型。 128 129 ```ts 130 textEmbedding.releaseModel() 131 .then(() => { 132 console.info("Succeeded in releasing Model"); 133 }) 134 .catch((err:BusinessError) => { 135 console.error("Failed to release Model and code is " + err.code); 136 }) 137 ``` 138 1397. 获取图像嵌入模型。 140 141 ```ts 142 let imageConfig:intelligence.ModelConfig = { 143 version:intelligence.ModelVersion.BASIC_MODEL, 144 isNpuAvailable:false, 145 cachePath:"/data" 146 } 147 let imageEmbedding:intelligence.ImageEmbedding; 148 149 intelligence.getImageEmbeddingModel(imageConfig) 150 .then((data:intelligence.ImageEmbedding) => { 151 console.info("Succeeded in getting ImageModel"); 152 imageEmbedding = data; 153 }) 154 .catch((err:BusinessError) => { 155 console.error("Failed to get ImageModel and code is " + err.code); 156 }) 157 ``` 158 1598. 加载图像嵌入模型。 160 161 ```ts 162 imageEmbedding.loadModel() 163 .then(() => { 164 console.info("Succeeded in loading Model"); 165 }) 166 .catch((err:BusinessError) => { 167 console.error("Failed to load Model and code is " + err.code); 168 }) 169 ``` 170 1719. 获取给定图像的嵌入向量。 172 173 ```ts 174 let image = "file://<packageName>/data/storage/el2/base/haps/entry/files/xxx.jpg"; 175 imageEmbedding.getEmbedding(image) 176 .then((data:Array<number>) => { 177 console.info("Succeeded in getting Embedding"); 178 }) 179 .catch((err:BusinessError) => { 180 console.error("Failed to get Embedding and code is " + err.code); 181 }) 182 ``` 183 18410. 释放图像嵌入模型。 185 186 ```ts 187 imageEmbedding.releaseModel() 188 .then(() => { 189 console.info("Succeeded in releasing Model"); 190 }) 191 .catch((err:BusinessError) => { 192 console.error("Failed to release Model and code is " + err.code); 193 }) 194 ``` 195