Embedding(也稱為嵌入)可以將文本、圖片和音視頻等數據轉化成向量(數字序列)。向量之間的距離代表數據的相關性。距離越小,相關性越高;距離越大,相關性越低。
應用場景
推薦:根據輸入數據推薦相關條目。例如,根據用戶購買歷史和瀏覽記錄推薦相關商品。
聚類:按相關性對輸入數據進行分組。例如,將海量新聞按主題歸類為科技、體育、娛樂等。
搜索:將搜索結果按照與輸入數據的相關性進行排序。例如,文本向量模型可以根據用戶搜索詞語返回相關網頁,多模態向量模型可以實現以文搜圖。
異常檢測:識別出相關性較小的異常值。例如,從大量交易記錄中識別出異常交易模式。
支持的模型
通用文本向量
模型名稱 | 向量維度 | 最大行數 | 單行最大處理Token數 | 支持語種 | 單價 (每千Token) | 免費額度(注) |
text-embedding-v3 | 1024 768 512 | 6 | 8192 | 中文、英語、西班牙語、法語、葡萄牙語、印尼語、日語、韓語、德語、俄羅斯語等50+語種 | 0.0007元 | 50萬Token 有效期:百煉開通后180天內 |
text-embedding-v2 | 1536 | 25 | 2048 | 中文、英語、西班牙語、法語、葡萄牙語、印尼語、日語、韓語、德語、俄羅斯語 | ||
text-embedding-v1 | 中文、英語、西班牙語、法語、葡萄牙語、印尼語 | |||||
text-embedding-async-v2 | 100000 | 中文、英語、西班牙語、法語、葡萄牙語、印尼語、日語、韓語、德語、俄羅斯語 | 2000萬Token 有效期:百煉開通后180天內 | |||
text-embedding-async-v1 | 中文、英語、西班牙語、法語、葡萄牙語、印尼語 |
模型 | 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 |
模型 | 模型維度 | 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 |
語種擴充:text-embedding-v3模型對比text-embedding-v2模型擴展了意大利語、波蘭語、越南語、泰語等語種,支持語種數量增加到50+。
輸入長度擴展:支持編碼的輸入長度從2048擴展至8192,對text-embedding-v3,8192指文本輸入的最大token長度
可變輸出連續向量維度:相比text-embedding-v2模型的固定1536向量維度,text-embedding-v3支持用戶自定義連續向量的維度,目前可以選擇512,768和1024維度;同時為了進一步節省下游任務的使用成本,text-embedding-v3模型在不衰減效果的前提下將最大的向量維度降低至1024維。
不再區分Query/Document類型:text-embedding-v3模型在不降低模型效果的前提下不再區分輸入文本的類型,text_type參數無需指定輸入的文本是Query還是Document類型。
Sparse向量支持:text-embedding-v3模型同時支持連續向量表示(dense vector)和離散向量表示模型(sparse vector),用戶可以在接口參數中指定輸出連續向量、離散向量或者同時輸出。
效果提升:預訓練模型底座和SFT策略優化提升embedding模型整體效果,公開數據評測結果。
語種擴充:“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參考
通用文本向量
多模態向量