• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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&lt;TextEmbedding&gt; | 获取文本嵌入模型。 |
32| loadModel(): Promise&lt;void&gt; | 加载文本嵌入模型。 |
33| splitText(text: string, config: SplitConfig): Promise&lt;Array&lt;string&gt;&gt; | 获取文本的分块。 |
34| getEmbedding(text: string): Promise&lt;Array&lt;number&gt;&gt; | 获取给定文本的嵌入向量。 |
35| getEmbedding(batchTexts: Array&lt;string&gt;): Promise&lt;Array&lt;Array&lt;number&gt;&gt;&gt; | 获取给定批次文本的嵌入向量。 |
36| releaseModel(): Promise&lt;void&gt; | 释放文本嵌入模型。 |
37| getImageEmbeddingModel(config: ModelConfig): Promise&lt;ImageEmbedding&gt; | 获取图像嵌入模型。 |
38| loadModel(): Promise&lt;void&gt; | 加载图像嵌入模型。 |
39| getEmbedding(image: Image): Promise&lt;Array&lt;number&gt;&gt; | 获取给定图像的嵌入向量。 |
40| releaseModel(): Promise&lt;void&gt; | 释放图像嵌入模型。 |
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