Embedding(也称为嵌入)可以将文本、图片和音视频等数据转化成向量(数字序列)。向量之间的距离代表数据的相关性。距离越小,相关性越高;距离越大,相关性越低。

应用场景

  • 推荐:根据输入数据推荐相关条目。例如,根据用户购买历史和浏览记录推荐相关商品。

  • 聚类:按相关性对输入数据进行分组。例如,将海量新闻按主题归类为科技、体育、娱乐等。

  • 搜索:将搜索结果按照与输入数据的相关性进行排序。例如,文本向量模型可以根据用户搜索词语返回相关网页,多模态向量模型可以实现以文搜图。

  • 异常检测:识别出相关性较小的异常值。例如,从大量交易记录中识别出异常交易模式。

支持的模型

通用文本向量

模型名称

向量维度

最大行数

单行最大处理Token

支持语种

单价

(每千Token)

免费额度(注)

text-embedding-v3

1024

768

512

6

8192

中文、英语、西班牙语、法语、葡萄牙语、印尼语、日语、韩语、德语、俄罗斯语等50+语种

0.0007

50Token

有效期:百炼开通后180天内

text-embedding-v2

1536

25

2048

中文、英语、西班牙语、法语、葡萄牙语、印尼语、日语、韩语、德语、俄罗斯语

text-embedding-v1

中文、英语、西班牙语、法语、葡萄牙语、印尼语

text-embedding-async-v2

100000

中文、英语、西班牙语、法语、葡萄牙语、印尼语、日语、韩语、德语、俄罗斯语

2000Token

有效期:百炼开通后180天内

text-embedding-async-v1

中文、英语、西班牙语、法语、葡萄牙语、印尼语

v1、v2、v3模型的效果数据

模型

MTEB

MTEB(Retrieval task)

CMTEB

CMTEB (Retrieval task)

text-embedding-v1

58.30

45.47

59.84

56.59

text-embedding-v2

60.13

49.49

62.17

62.78

text-embedding-v3

63.39

55.41

68.92

73.23

v3模型三种维度的效果数据

模型

模型维度

MTEB

MTEB(Retrieval task)

CMTEB

CMTEB (Retrieval task)

text-embedding-v3

1024

63.39

55.41

68.92

73.23

text-embedding-v3

768

62.43

54.74

67.90

72.29

text-embedding-v3

512

62.11

54.30

66.81

71.88

v3模型相比v2的更新内容

  • 语种扩充:text-embedding-v3模型对比text-embedding-v2模型扩展了意大利语、波兰语、越南语、泰语等语种,支持语种数量增加到50+。

  • 输入长度扩展:支持编码的输入长度从2048扩展至8192,对text-embedding-v3,8192指文本输入的最大token长度

  • 可变输出连续向量维度:相比text-embedding-v2模型的固定1536向量维度,text-embedding-v3支持用户自定义连续向量的维度,目前可以选择512,7681024维度;同时为了进一步节省下游任务的使用成本,text-embedding-v3模型在不衰减效果的前提下将最大的向量维度降低至1024维。

  • 不再区分Query/Document类型:text-embedding-v3模型在不降低模型效果的前提下不再区分输入文本的类型,text_type参数无需指定输入的文本是Query还是Document类型。

  • Sparse向量支持:text-embedding-v3模型同时支持连续向量表示(dense vector)和离散向量表示模型(sparse vector),用户可以在接口参数中指定输出连续向量、离散向量或者同时输出。

  • 效果提升:预训练模型底座和SFT策略优化提升embedding模型整体效果,公开数据评测结果。

v2模型相比v1的更新内容

  • 语种扩充:“text-embedding-v2”模型对比“text-embedding-v1”模型扩展了日语、韩语、德语、俄罗斯语文本向量化的能力。

  • 效果提升:预训练模型底座和SFT策略优化提升embedding模型整体效果,公开数据评测结果。

  • 归一化处理:text-embedding-v2对输出向量结果默认归一化处理。

多模态向量

ONE-PEACE

多模态向量模型将文本、图像、语音转换成一组数字,适用于音视频分类、图像分类、图文检索等。

计费规则:按输入音频、图像和文本的加权条目数计费。加权条目数 = 音频数目 * 音频加权权重(2) + 图像张数 * 图像加权权重(1) + 文字条数 * 文字加权权重(1)

模型名称

数据类型

向量维度

单价

免费额度(注)

multimodal-embedding-one-peace-v1

float(32)

1536

目前仅供免费体验。

免费额度用完后不可调用,敬请关注后续动态。

10,000加权条目数

有效期:百炼开通后180天内

快速入门

您需要已获取API Key配置API Key到环境变量。如果通过SDK调用,还需要安装DashScope SDK

通用文本向量快速入门

同步调用示例

同步调用支持输入单条文本,对其进行处理返回结果。

import dashscope
from http import HTTPStatus


def embed_with_str():
    resp = dashscope.TextEmbedding.call(
        model=dashscope.TextEmbedding.Models.text_embedding_v1,
        input='衣服的质量杠杠的,很漂亮,不枉我等了这么久啊,喜欢,以后还来这里买')
    if resp.status_code == HTTPStatus.OK:
        print(resp)
    else:
        print(resp)


if __name__ == '__main__':
    embed_with_str()
import java.util.Arrays;
import java.util.concurrent.Semaphore;
import com.alibaba.dashscope.common.ResultCallback;
import com.alibaba.dashscope.embeddings.TextEmbedding;
import com.alibaba.dashscope.embeddings.TextEmbeddingParam;
import com.alibaba.dashscope.embeddings.TextEmbeddingResult;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;

public final class Main {
    public static void basicCall() throws ApiException, NoApiKeyException{
        TextEmbeddingParam param = TextEmbeddingParam
        .builder()
        .model(TextEmbedding.Models.TEXT_EMBEDDING_V1)
        .texts(Arrays.asList("风急天高猿啸哀", "渚清沙白鸟飞回", "无边落木萧萧下", "不尽长江滚滚来")).build();
        TextEmbedding textEmbedding = new TextEmbedding();
        TextEmbeddingResult result = textEmbedding.call(param);
        System.out.println(result);
    }

  public static void main(String[] args){
      try {
        basicCall();
    } catch (ApiException | NoApiKeyException e) {
        System.out.println(e.getMessage());
    }
    System.exit(0);
  }
}

同步调用输出

{
    "status_code": 200,
    "request_id": "617b3670-6f9e-9f47-ad57-997ed8aeba6a",
    "code": "",
    "message": "",
    "output": {
        "embeddings": [
            {
                "embedding": [
                    0.09393704682588577,
                    2.4155092239379883,
                    -1.8923076391220093,
                    .,
                    .,
                    .

                ],
                "text_index": 0
            }
        ]
    },
    "usage": {
        "total_tokens": 23
    }
}

多模态向量快速入门

import dashscope


def image_call():
    input = [{'image': 'https://dashscope.oss-cn-beijing.aliyuncs.com/images/256_1.png'},
             ]
    result = dashscope.MultiModalEmbedding.call(model=dashscope.MultiModalEmbedding.Models.multimodal_embedding_one_peace_v1,
                                      input=input,
                                      auto_truncation=True)
    print(result)

if __name__ == '__main__':
    image_call()
// Copyright (c) Alibaba, Inc. and its affiliates.

import com.alibaba.dashscope.embeddings.MultiModalEmbedding;
import com.alibaba.dashscope.embeddings.MultiModalEmbeddingItemImage;
import com.alibaba.dashscope.embeddings.MultiModalEmbeddingParam;
import com.alibaba.dashscope.embeddings.MultiModalEmbeddingResult;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;

import java.util.Arrays;

public class Main {
  public static void imageEmbedding() throws ApiException, NoApiKeyException, UploadFileException {
    MultiModalEmbedding embedding = new MultiModalEmbedding();
    MultiModalEmbeddingItemImage image =
        new MultiModalEmbeddingItemImage(
            "https://dashscope.oss-cn-beijing.aliyuncs.com/images/256_1.png");    
    MultiModalEmbeddingParam param =
        MultiModalEmbeddingParam.builder()
            .model(MultiModalEmbedding.Models.MULTIMODAL_EMBEDDING_ONE_PEACE_V1)
            .contents(Arrays.asList(image))
            .build();
    MultiModalEmbeddingResult result = embedding.call(param);
    System.out.print(result);
  }

  public static void main(String[] args){
      try {
        imageEmbedding();
      } catch (ApiException | NoApiKeyException | UploadFileException e) {
        System.out.println(e.getMessage());
      }
      System.exit(0);
  }
}
    
    

输出示例

{
    "status_code": 200,
    "request_id": "4fe2cde6-ba37-973f-9db8-2cd74a908a9f",
    "code": "",
    "message": "",
    "output": {
        "embedding": [ # The embedding vector
            -0.0200169887393713,
            .,
            .,
            .,
        ]
    },
    "usage": {
        "image": {
            "measure": 1,
            "weight": 1
        },
        "total_usage": 4,
        "audio": {
            "measure": 1,
            "weight": 2
        },
        "text": {
            "measure": 1,
            "weight": 1
        }
    }
}

使用示例

实现语义搜索

以下通过文本向量模型获取产品描述对应的向量,然后基于向量,计算评论与产品描述之间的余弦相似度,最终返回与产品描述最相关的评论。

1、导入库包

导入所需的库包,并设置API Key,为后续的数据处理和分析做准备。

import os
import pandas as pd
import numpy as np
from ast import literal_eval
import dashscope
from dashscope import TextEmbedding

# 设置DashScope的API Key
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")

2、读取CSV文件并处理嵌入数据

读取CSV文件fine_food_reviews.csv(其中包含评论和评论对应的向量),转换embedding列的字符串数据为NumPy数组以便后续处理。

# 读取CSV数据
datafile_path = "fine_food_reviews.csv"
df = pd.read_csv(datafile_path)

# 将embedding列的字符串数据转换为NumPy数组
df["embedding"] = df.embedding.apply(literal_eval).apply(np.array)

3、定义文本嵌入的函数

该函数将文本转换为向量,并根据输入类型的不同返回单个向量或向量列表。

# 定义文本嵌入的函数
def generate_embeddings(text):
    rsp = TextEmbedding.call(model=TextEmbedding.Models.text_embedding_v1, input=text)
    embeddings = [record['embedding'] for record in rsp.output['embeddings']]
    return embeddings if isinstance(text, list) else embeddings[0]

4、定义计算余弦相似度函数和搜索评论函数

利用余弦相似度度量文本之间的相似性,实现了一个基于内容的评论搜索功能。用户可以通过输入产品描述,检索与该产品描述最相关的评论。

# 定义计算余弦相似度函数
def cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

# 搜索特定产品的评论
def search_reviews(df, product_description, n=3, pprint=True):
    product_embedding = generate_embeddings(product_description)
    df["similarity"] = df.embedding.apply(lambda x: cosine_similarity(x, product_embedding))
    results = (
        df.sort_values("similarity", ascending=False)
        .head(n)
        .combined.str.replace("Title: ", "")
        .str.replace("; Content:", ": ")
    )
    if pprint:
        for r in results:
            print(r[:200])
            print()
    return results

5、测试搜索功能

测试搜索功能,调用search_reviews函数查找与宠物食品相关的评论,并返回2条相似评论。示例代码如下:

results = search_reviews(df, "pet food", n=2)

运行结果为:

This is so good!:  I purchased this after my sister sent a small bag to me in a gift box.  I loved it so much I wanted to find it to buy for myself and keep it around.  I always look on Amazon because

Sweet Perfection:  Not everything in this world is perfect, but this really is the perfect candy. Is delicious!!! I cannot have enough of it!

以下是其他测试代码供参考:

results = search_reviews(df, "delicious beans", n=3)
results = search_reviews(df, "whole wheat pasta", n=3)
results = search_reviews(df, "bad delivery", n=1)
results = search_reviews(df, "spoilt", n=1)

API参考