应用数据向量化

场景介绍

应用数据向量化,是指嵌入模型将非结构化的文本、图像等多模态数据,转换成具有语义的向量。在智慧化检索、RAG(检索增强生成)等场景中,嵌入模型扮演桥梁的角色,将离散的图文数据映射到同一向量空间,支撑跨模态的数据检索。向量化的主要应用场景如下:

  • 高效检索:通过向量的相似度计算,快速从向量数据库中召回与查询词最相关的文档片段。相比传统倒排索引,能识别语义隐含关联,提升召回内容的上下文适配性。
  • 检索增强生成:检索增强生成(RAG)是解决LLM大模型生成幻觉问题的主流方案,向量知识库是RAG技术的关键。RAG可检索出知识库中的精准上下文(Top-K相关向量对应文本)并作为提示输入生成模型,从而显著减少生成幻觉。

基本概念

多模态嵌入模型

应用数据向量化,主要通过嵌入模型实现。当前支持多模态嵌入模型,能将文本和图像这两种不同数据模态转换到同一个向量空间,支持单模态(文搜文、图搜图)和跨模态(文搜图、图搜文)的语义表征能力。

文本分块

在进行数据向量化时,针对文本数据长度有限制,可通过AIP提供的分块接口,将输入文本按照指定的上限进行切分,从而高效实现数据向量化。

运作机制

应用数据向量化,是指将应用原数据进行向量化并进行存储的过程,向量化结果会存储在向量数据库中。

约束限制

  • 模型推理单次可处理的文本长度上限为512个字符,支持中英文。
  • 模型推理单次可处理的图像大小<20MB。

接口说明

以下是智慧数据向量化功能的相关接口,更多接口及使用方式请见智慧数据平台

接口名称 描述
getTextEmbeddingModel(config: ModelConfig): Promise<TextEmbedding> 获取文本嵌入模型。
loadModel(): Promise<void> 加载文本嵌入模型。
splitText(text: string, config: SplitConfig): Promise<Array<string>> 获取文本的分块。
getEmbedding(text: string): Promise<Array<number>> 获取给定文本的嵌入向量。
getEmbedding(batchTexts: Array<string>): Promise<Array<Array<number>>> 获取给定批次文本的嵌入向量。
releaseModel(): Promise<void> 释放文本嵌入模型。
getImageEmbeddingModel(config: ModelConfig): Promise<ImageEmbedding> 获取图像嵌入模型。
loadModel(): Promise<void> 加载图像嵌入模型。
getEmbedding(image: Image): Promise<Array<number>> 获取给定图像的嵌入向量。
releaseModel(): Promise<void> 释放图像嵌入模型。

开发步骤

  1. 导入模块。

    import { intelligence } from '@kit.ArkData';
    
  2. 获取文本嵌入模型。

    import { BusinessError } from '@kit.BasicServicesKit';
    
    let textConfig:intelligence.ModelConfig = {
      version:intelligence.ModelVersion.BASIC_MODEL,
      isNpuAvailable:false,
      cachePath:"/data"
    }
    let textEmbedding:intelligence.TextEmbedding;
    
    intelligence.getTextEmbeddingModel(textConfig)
      .then((data:intelligence.TextEmbedding) => {
        console.info("Succeeded in getting TextModel");
        textEmbedding = data;
      })
      .catch((err:BusinessError) => {
        console.error("Failed to get TextModel and code is " + err.code);
      })
    
  3. 加载文本嵌入模型。

    textEmbedding.loadModel()
      .then(() => {
        console.info("Succeeded in loading Model");
      })
      .catch((err:BusinessError) => {
        console.error("Failed to load Model and code is " + err.code);
      })
    
  4. 获取文本的分块。当需要进行向量化的数据长度过长时,使用splitText()接口对其进行文本分块,然后再进行数据向量化。

    let splitConfig:intelligence.SplitConfig = {
      size:10,
      overlapRatio:0.1
    }
    let splitText = 'text';
    
    intelligence.splitText(splitText, splitConfig)
      .then((data:Array<string>) => {
        console.info("Succeeded in splitting Text");
      })
      .catch((err:BusinessError) => {
        console.error("Failed to split Text and code is " + err.code);
      })
    
  5. 获取给定文本的嵌入向量。给定的文本数据可以为单个文本数据或者一个文本数据的集合。

    let text = 'text';
    textEmbedding.getEmbedding(text)
      .then((data:Array<number>) => {
        console.info("Succeeded in getting Embedding");
      })
      .catch((err:BusinessError) => {
        console.error("Failed to get Embedding and code is " + err.code);
      })
    
    let batchTexts = ['text1','text2'];
    textEmbedding.getEmbedding(batchTexts)
      .then((data:Array<Array<number>>) => {
        console.info("Succeeded in getting Embedding");
      })
      .catch((err:BusinessError) => {
        console.error("Failed to get Embedding and code is " + err.code);
      })
    
  6. 释放文本嵌入模型。

    textEmbedding.releaseModel()
      .then(() => {
        console.info("Succeeded in releasing Model");
      })
      .catch((err:BusinessError) => {
        console.error("Failed to release Model and code is " + err.code);
      })
    
  7. 获取图像嵌入模型。

    let imageConfig:intelligence.ModelConfig = {
      version:intelligence.ModelVersion.BASIC_MODEL,
      isNpuAvailable:false,
      cachePath:"/data"
    }
    let imageEmbedding:intelligence.ImageEmbedding;
    
    intelligence.getImageEmbeddingModel(imageConfig)
      .then((data:intelligence.ImageEmbedding) => {
        console.info("Succeeded in getting ImageModel");
        imageEmbedding = data;
      })
      .catch((err:BusinessError) => {
        console.error("Failed to get ImageModel and code is " + err.code);
      })
    
  8. 加载图像嵌入模型。

    imageEmbedding.loadModel()
      .then(() => {
         console.info("Succeeded in loading Model");
      })
      .catch((err:BusinessError) => {
         console.error("Failed to load Model and code is " + err.code);
      })
    
  9. 获取给定图像的嵌入向量。

    let image = "file://<packageName>/data/storage/el2/base/haps/entry/files/xxx.jpg";
    imageEmbedding.getEmbedding(image)
      .then((data:Array<number>) => {
        console.info("Succeeded in getting Embedding");
      })
      .catch((err:BusinessError) => {
        console.error("Failed to get Embedding and code is " + err.code);
      })
    
  10. 释放图像嵌入模型。

    imageEmbedding.releaseModel()
      .then(() => {
        console.info("Succeeded in releasing Model");
      })
      .catch((err:BusinessError) => {
        console.error("Failed to release Model and code is " + err.code);
      })