埋め込みモデルは、テキスト、画像、動画などのデータをベクターに変換し、セマンティック検索、レコメンデーション、クラスタリング、テキスト分類、異常検知などの下流タスクで利用されます。
前提条件
API キーの取得とAPI キーを環境変数としてエクスポートを行います。OpenAI SDK または DashScope SDK を使用して API を呼び出す場合は、SDK のインストールが必要です。
埋め込みの取得
テキスト埋め込み
リクエストで埋め込み対象のテキストとモデル名を指定します。
OpenAI 互換 API
import os
from openai import OpenAI
input_text = "The quality of the clothes is excellent"
client = OpenAI(
# API キーはリージョンごとに異なります。API キーの取得方法については、「https://www.alibabacloud.com/help/en/model-studio/get-api-key」をご参照ください。
api_key=os.getenv("DASHSCOPE_API_KEY"), # 環境変数が設定されていない場合は、これを API キーに置き換えます。
# この base_url はシンガポール向けです。中国(北京)のモデルを使用する場合は、base_url を「https://dashscope.aliyuncs.com/compatible-mode/v1」に置き換えます。
base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)
completion = client.embeddings.create(
model="text-embedding-v4",
input=input_text
)
print(completion.model_dump_json())
const OpenAI = require("openai");
// OpenAI クライアントを初期化します。
const openai = new OpenAI({
// 環境変数が設定されていない場合は、これを API キーに置き換えます。
// API キーはリージョンごとに異なります。API キーの取得方法については、「https://www.alibabacloud.com/help/en/model-studio/get-api-key」をご参照ください。
apiKey: process.env.DASHSCOPE_API_KEY,
// この baseURL はシンガポール向けです。中国(北京)のモデルを使用する場合は、baseURL を「https://dashscope-intl.aliyuncs.com/compatible-mode/v1」に置き換えます。
baseURL: 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1'
});
async function getEmbedding() {
try {
const inputTexts = "The quality of the clothes is excellent";
const completion = await openai.embeddings.create({
model: "text-embedding-v4",
input: inputTexts,
dimensions: 1024 // ベクトル次元を指定します。このパラメーターは text-embedding-v3 および text-embedding-v4 のみでサポートされています。
});
console.log(JSON.stringify(completion, null, 2));
} catch (error) {
console.error('Error:', error);
}
}
getEmbedding();curl --location 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1/embeddings' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "text-embedding-v4",
"input": "The quality of the clothes is excellent"
}'DashScope
import dashscope
from http import HTTPStatus
# 中国(北京)向けのベース URL を使用する場合は、次の行を「https://dashscope.aliyuncs.com/api/v1」に置き換えます。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
input_text = "The quality of the clothes is excellent"
resp = dashscope.TextEmbedding.call(
model="text-embedding-v4",
input=input_text,
)
if resp.status_code == HTTPStatus.OK:
print(resp)import com.alibaba.dashscope.embeddings.TextEmbedding;
import com.alibaba.dashscope.embeddings.TextEmbeddingParam;
import com.alibaba.dashscope.embeddings.TextEmbeddingResult;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.utils.Constants;
import java.util.Collections;
public class Main {
static {
Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
// 中国(北京)向けには、「https://dashscope.aliyuncs.com/api/v1」に置き換えます。
}
public static void main(String[] args) {
String inputTexts = "The quality of the clothes is excellent";
try {
// リクエストパラメーターを構築します。
TextEmbeddingParam param = TextEmbeddingParam
.builder()
.model("text-embedding-v4")
// 入力テキスト。
.texts(Collections.singleton(inputTexts))
.build();
// モデルインスタンスを作成し、呼び出します。
TextEmbedding textEmbedding = new TextEmbedding();
TextEmbeddingResult result = textEmbedding.call(param);
// 結果を出力します。
System.out.println(result);
} catch (NoApiKeyException e) {
// 設定されていない API キーに関する例外をキャッチして処理します。
System.err.println("API 呼び出し中に例外が発生しました:" + e.getMessage());
System.err.println("API キーが正しく設定されているか確認してください。");
e.printStackTrace();
}
}
}# ======= 重要 =======
# 中国(北京)向けの URL を使用する場合は、「https://dashscope.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding」に置き換えます。
# === 実行前にこのコメントを削除してください ===
curl --location 'https://dashscope-intl.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "text-embedding-v4",
"input": {
"texts": [
"The quality of the clothes is excellent"
]
}
}'独立したマルチモーダルベクトル
テキスト、画像、動画など各モダリティに対して個別にベクトルを生成します。各コンテンツタイプを個別に処理する場合に最適です。
DashScope SDK を使用するか、API を直接呼び出して独立したマルチモーダルベクトルを生成します。この機能は OpenAI 互換インターフェイスおよびコンソールではサポートされていません。
Python
import dashscope
import json
import os
from http import HTTPStatus
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
# 上記の base_url はシンガポール向けです。中国(北京)のモデルを使用する場合は、base_url を「https://dashscope.aliyuncs.com/api/v1」に置き換えます。
# 入力には動画も使用できます。
# video = "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/en-US/20250107/lbcemt/new+video.mp4"
# input = [{'video': video}]
# または画像を使用できます。
image = "https://dashscope.oss-cn-beijing.aliyuncs.com/images/256_1.png"
input = [{'image': image}]
resp = dashscope.MultiModalEmbedding.call(
# 環境変数が設定されていない場合は、次の行を Model Studio API キー(例:api_key="sk-xxx")に置き換えます。
# API キーはリージョンごとに異なります。API キーの取得方法については、「https://www.alibabacloud.com/help/en/model-studio/get-api-key」をご参照ください。
api_key=os.getenv('DASHSCOPE_API_KEY'),
model="tongyi-embedding-vision-plus",
input=input
)
print(json.dumps(resp.output, indent=4))
Java
import com.alibaba.dashscope.embeddings.MultiModalEmbedding;
import com.alibaba.dashscope.embeddings.MultiModalEmbeddingItemImage;
import com.alibaba.dashscope.embeddings.MultiModalEmbeddingItemVideo;
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 com.alibaba.dashscope.utils.Constants;
import java.util.Collections;
public class Main {
static {
Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
// 中国(北京)向けには、「https://dashscope.aliyuncs.com/api/v1」に置き換えます。
}
public static void main(String[] args) {
try {
MultiModalEmbedding embedding = new MultiModalEmbedding();
// 入力には動画も使用できます。
// MultiModalEmbeddingItemVideo video = new MultiModalEmbeddingItemVideo(
// "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/en-US/20250107/lbcemt/new+video.mp4");
// または画像を使用できます。
MultiModalEmbeddingItemImage image = new MultiModalEmbeddingItemImage(
"https://dashscope.oss-cn-beijing.aliyuncs.com/images/256_1.png");
MultiModalEmbeddingParam param = MultiModalEmbeddingParam.builder()
// 環境変数が設定されていない場合は、Model Studio API キー(例:.apiKey("sk-xxx"))を追加します。
.model("tongyi-embedding-vision-plus")
.contents(Collections.singletonList(image))
.build();
MultiModalEmbeddingResult result = embedding.call(param);
System.out.println(result);
} catch (ApiException | NoApiKeyException | UploadFileException e) {
System.err.println("API 呼び出し中に例外が発生しました:" + e.getMessage());
e.printStackTrace();
}
}
}
マルチモーダル融合ベクトル
テキスト、画像、動画など異なるモダリティのコンテンツを単一の融合ベクトルに統合します。テキストによる画像検索、画像間検索、テキストによる動画検索、クロスモーダル検索などに適しています。
Python の DashScope SDK を使用するか、API を直接呼び出してマルチモーダル融合ベクトルを生成します。この機能は OpenAI 互換インターフェイス、Java の DashScope SDK、およびコンソールではサポートされていません。
-
qwen3-vl-embedding:融合ベクトルおよび独立ベクトルの両方を生成します。融合ベクトルを生成するには、ブール値パラメーターenable_fusionをtrueに設定します。 -
qwen2.5-vl-embedding:融合ベクトルのみを生成します。
Python
import dashscope
import json
import os
from http import HTTPStatus
# マルチモーダル融合ベクトル:テキスト、画像、動画を単一の融合ベクトルに統合します。
# クロスモーダル検索や画像検索などのユースケースに適しています。
text = "This is a test text used to generate a multimodal fused vector"
image = "https://dashscope.oss-cn-beijing.aliyuncs.com/images/256_1.png"
video = "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/en-US/20250107/lbcemt/new+video.mp4"
# 入力にはテキスト、画像、動画が含まれます。enable_fusion パラメーターを使用して融合ベクトルを生成します。
input_data = [
{"text": text},
{"image": image},
{"video": video}
]
# qwen3-vl-embedding を使用して融合ベクトルを生成します。
resp = dashscope.MultiModalEmbedding.call(
# 環境変数が設定されていない場合は、次の行を Model Studio API キー(例:api_key="sk-xxx")に置き換えます。
api_key=os.getenv("DASHSCOPE_API_KEY"),
model="qwen3-vl-embedding",
input=input_data,
enable_fusion=True,
# オプションパラメーター:ベクトル次元を指定します。有効な値:2560、2048、1536、1024、768、512、256。デフォルト値:2560。
# dimension = 1024
)
print(json.dumps(resp.output, indent=4))
Java(HTTP)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
// 環境変数が設定されていない場合は、次の行を Model Studio API キー(例:String apiKey = "sk-xxx")に置き換えます。
String apiKey = System.getenv("DASHSCOPE_API_KEY");
// マルチモーダル融合ベクトル:enable_fusion を使用して、テキスト、画像、動画を融合ベクトルに統合します。
String requestBody = "{"
+ "\"model\": \"qwen3-vl-embedding\","
+ "\"input\": {"
+ " \"contents\": ["
+ " {\"text\": \"This is a test text used to generate a multimodal fused vector\"},"
+ " {\"image\": \"https://dashscope.oss-cn-beijing.aliyuncs.com/images/256_1.png\"},"
+ " {\"video\": \"https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/en-US/20250107/lbcemt/new+video.mp4\"}"
+ " ]"
+ "},"
+ "\"parameters\": {"
+ " \"enable_fusion\": true"
+ "}"
+ "}";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://dashscope.aliyuncs.com/api/v1/services/embeddings/multimodal-embedding/multimodal-embedding"))
.header("Authorization", "Bearer " + apiKey)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(requestBody))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
モデル選択
使用するモデルは、入力データの種類およびユースケースによって異なります。
-
プレーンテキストまたはコードの場合:
text-embedding-v4を使用します。これは最高性能のモデルであり、タスク指示や疎ベクトルなどの高度な機能をサポートし、ほとんどのテキスト処理ユースケースに対応しています。 -
マルチモーダルコンテンツの場合:
-
融合埋め込み:クロスモーダル検索や画像検索など、単一モダリティまたは混合モダリティの入力を融合埋め込みとして表現する場合、
qwen3-vl-embeddingを使用します。たとえば、「より若々しいスタイルに似たものを検索」というテキスト指示とともにシャツの画像を入力すると、モデルは画像とタスク指示を単一の埋め込みに融合します。 -
独立埋め込み:
tongyi-embedding-vision-plus、tongyi-embedding-vision-flash、または汎用マルチモーダルモデルmultimodal-embedding-v1を使用して、画像とその対応するテキスト字幕など、各入力に対して個別の埋め込みを生成します。
-
-
大規模データの場合:リアルタイムでない大規模なテキストデータ処理には、
text-embedding-v4と OpenAI 互換バッチ API を併用してコストを削減します。
利用可能なすべての埋め込みモデルの仕様:
テキスト埋め込み
シンガポール
|
モデル |
埋め込み次元 |
バッチサイズ |
最大バッチトークン数(注) |
価格/100 万トークン |
言語 |
無料クォータ(注) |
|
text-embedding-v4 Qwen3-Embedding シリーズの一部 |
2,048、1,536、1,024(デフォルト)、768、512、256、128、64 |
10 |
8,192 |
$0.07 |
中国語、英語、スペイン語、フランス語、ポルトガル語、インドネシア語、日本語、韓国語、ドイツ語、ロシア語など 100 以上の主要言語 |
100 万トークン Model Studio の有効化後 90 日間有効 |
|
text-embedding-v3 |
1,024(デフォルト)、768、512 |
中国語、英語、スペイン語、フランス語、ポルトガル語、インドネシア語、日本語、韓国語、ドイツ語、ロシア語など 50 以上の主要言語 |
50 万トークン Model Studio の有効化後 90 日間有効 |
中国(北京)
|
モデル |
埋め込み次元 |
バッチサイズ |
最大バッチトークン数(注) |
価格/100 万トークン |
言語 |
|
text-embedding-v4 Qwen3-Embedding シリーズの一部 |
2,048、1,536、1,024(デフォルト)、768、512、256、128、64 |
10 |
8,192 |
$0.072 |
中国語、英語、スペイン語、フランス語、ポルトガル語、インドネシア語、日本語、韓国語、ドイツ語、ロシア語など 100 以上の主要言語および複数のプログラミング言語 |
中国(香港)
|
モデル |
埋め込み次元 |
バッチサイズ |
最大バッチトークン数(注) |
価格/100 万トークン |
言語 |
|
text-embedding-v4 Qwen3-Embedding シリーズの一部 |
2,048、1,536、1,024(デフォルト)、768、512、256、128、64 |
10 |
8,192 |
$0.07 |
中国語、英語、スペイン語、フランス語、ポルトガル語、インドネシア語、日本語、韓国語、ドイツ語、ロシア語など 100 以上の主要言語および複数のプログラミング言語 |
バッチサイズは、1 回の API 呼び出しで処理できるテキストの最大数です。たとえば、text-embedding-v4 のバッチサイズは 10 であるため、1 回のリクエストで最大 10 個のテキストを含めることができ、それぞれのテキストは 8,192 トークンを超えてはなりません。この制限は以下に適用されます。
-
文字列配列入力:配列には最大 10 個の要素を含めることができます。
-
ファイル入力:テキストファイルには最大 10 行を含めることができます。
マルチモーダル埋め込み
このモデルは、テキスト、画像、動画などの入力からベクトル埋め込みを生成します。これらの埋め込みは、動画分類、画像分類、画像・テキスト検索、テキストによる画像検索、テキストによる動画検索などに使用されます。
単一のテキストセグメント、画像、または動画ファイルをアップロードできます。また、API はテキストと画像など、複数の入力タイプの組み合わせもサポートしています。一部のモデルでは、複数の画像など、同一タイプの複数入力もサポートされています。詳細については、各モデルの制限事項をご参照ください。
シンガポール
|
モデル名 |
埋め込み次元 |
テキスト長制限 |
画像サイズ制限 |
動画サイズ制限 |
価格(100 万トークンあたり) |
無料クォータ(注) |
|
tongyi-embedding-vision-plus |
1152 |
1,024 トークン |
画像あたり最大 3 MB。最大 8 枚の画像をサポート。 |
動画ファイルあたり最大 10 MB |
画像/動画:$0.09 テキスト:$0.09 |
100 万トークン Model Studio の有効化後 90 日間有効 |
|
tongyi-embedding-vision-flash |
768 |
画像/動画:$0.03 テキスト:$0.09 |
中国(北京)
|
モデル名 |
埋め込み次元 |
テキスト長制限 |
画像サイズ制限 |
動画サイズ制限 |
価格(100 万トークンあたり) |
|
qwen3-vl-embedding |
2560(デフォルト)、2048、1536、1024、768、512、256 |
32,000 トークン |
最大 5 枚の画像、各画像最大 5 MB |
動画ファイルあたり最大 50 MB |
画像/動画:$0.258 テキスト:$0.1 |
|
multimodal-embedding-v1 |
1024 |
512 トークン |
最大 8 枚の画像、各画像 3 MB |
動画ファイルあたり最大 10 MB |
無料トライアル |
入力および言語制限
|
融合マルチモーダルモデル |
||||
|
モデル |
テキスト |
画像 |
動画 |
リクエスト制限 |
|
qwen3-vl-embedding |
中国語、英語、日本語、韓国語、フランス語、ドイツ語など 33 の主要言語をサポート。 |
JPEG、PNG、WEBP、BMP、TIFF、ICO、DIB、ICNS、SGI(URL または Base64 対応) |
MP4、AVI、MOV(URL のみ) |
1 回のリクエストあたり最大 20 個のコンテンツ要素(画像最大 5 個、動画最大 1 個)。 |
|
独立マルチモーダルモデル |
||||
|
モデル |
テキスト |
画像 |
動画 |
リクエスト制限 |
|
tongyi-embedding-vision-plus |
中国語および英語 |
JPG、PNG、BMP(URL または Base64 対応) |
MP4、MPEG、MOV、MPG、WEBM、AVI、FLV、MKV(URL のみ) |
コンテンツ要素数に制限はありません。入力トークン総数は、バッチ処理トークン制限を超えてはなりません。 |
|
tongyi-embedding-vision-flash |
||||
|
multimodal-embedding-v1 |
JPG、PNG、BMP(URL または Base64 対応) |
1 回のリクエストあたり最大 20 個のコンテンツ要素(テキストセグメント最大 20 個、画像最大 1 個、動画最大 1 個)。 |
||
主な機能
カスタムベクトル次元
text-embedding-v4、text-embedding-v3、tongyi-embedding-vision-plus、tongyi-embedding-vision-flash、qwen3-vl-embedding モデルは、カスタムベクトル次元をサポートしています。次元数が高いほど意味情報がより多く保持されますが、ストレージおよび計算コストも増加します。
-
一般的なユースケース(推奨):次元数 1024 は、パフォーマンスとコストのバランスが最適であり、ほとんどのセマンティック検索タスクに理想的です。
-
高精度シナリオ:高精度アプリケーションでは、次元数 1536 または 2048 を選択します。これにより精度が向上しますが、ストレージおよび計算負荷が大幅に増加します。
-
リソース制約のある環境:コストに敏感なシナリオでは、次元数 768 以下を選択します。これによりリソース消費量が大幅に削減されますが、一部の意味情報が失われる可能性があります。
OpenAI 互換 API
import os
from openai import OpenAI
client = OpenAI(
# API キーはリージョンごとに異なります。API キーの取得方法については、「https://www.alibabacloud.com/help/en/model-studio/get-api-key」をご参照ください。
api_key=os.getenv("DASHSCOPE_API_KEY"),
# これはシンガポール向けの URL です。中国(北京)リージョンのモデルを使用する場合は、`base_url` を「https://dashscope.aliyuncs.com/compatible-mode/v1」に置き換えます。
base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)
resp = client.embeddings.create(
model="text-embedding-v4",
input=["I like it and will buy from here again"],
# ベクトル次元を 256 に設定します。
dimensions=256
)
print(f"ベクトル次元:{len(resp.data[0].embedding)}")
DashScope
import dashscope
# 中国(北京)リージョン向けのベース URL を使用する場合は、「https://dashscope.aliyuncs.com/api/v1」に置き換えます。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
resp = dashscope.TextEmbedding.call(
model="text-embedding-v4",
input=["I like it and will buy from here again"],
# ベクトル次元を 256 に設定します。
dimension=256
)
print(f"ベクトル次元:{len(resp.output['embeddings'][0]['embedding'])}")
クエリとドキュメントテキスト(text_type)
このパラメーターは DashScope SDK および API のみで使用可能です。
検索関連タスクで最適な結果を得るには、コンテンツの役割に応じてベクトル化方法を変更する必要があります。text_type パラメーターはこの目的のために設計されています。
-
text_type: 'query':ユーザーのクエリテキストに使用します。モデルは「タイトルのような」ベクトルを生成し、より方向性を持ち、「質問」および「検索」に最適化されます。 -
text_type: 'document'(デフォルト):ドキュメントテキスト(ナレッジベースに保存されるテキスト)に使用します。モデルは「本文のような」ベクトルを生成し、より包括的な情報を含み、マッチングに最適化されます。
短いテキストと長いテキストを照合する場合、query と document を区別します。ただし、クラスタリングやテキスト分類など、すべてのテキストが同じ役割を持つタスクでは、このパラメーターを設定する必要はありません。
タスク指示(instruct)
このパラメーターは DashScope SDK および API のみで使用可能です。
特定の取得シナリオに応じて、text-embedding-v4 モデルのベクトル品質を最適化するために、明確な英語のタスク指示を提供します。この機能を使用する場合は、text_type パラメーターを query に設定します。
# シナリオ:検索エンジンのドキュメントベクトルを構築する場合、取得品質を最適化するための指示を追加できます。
resp = dashscope.TextEmbedding.call(
model="text-embedding-v4",
input="Research papers on machine learning",
text_type="query",
instruct="Given a research paper query, retrieve relevant research paper"
)
密ベクトルおよび疎ベクトル
このパラメーターは DashScope SDK および API のみで使用可能です。
text-embedding-v4 および text-embedding-v3 モデルは、異なる取得戦略に対応する 3 種類のベクトル出力タイプをサポートしています。
|
ベクトルタイプ(output_type) |
主な利点 |
主な制限事項 |
典型的なユースケース |
|
dense |
深い意味理解:類義語および文脈を認識し、より関連性の高い取得結果を実現します。 |
計算およびストレージコストが高くなる:キーワードの完全一致を保証しません。 |
セマンティック検索、AI 活用の Q&A、コンテンツレコメンデーション。 |
|
sparse |
高い計算効率:キーワードの完全一致に焦点を当て、高速なフィルタリングを可能にします。 |
意味理解ができない:類義語や文脈を処理できません。 |
ログ取得、製品 SKU 検索、正確な情報フィルタリング。 |
|
dense&sparse |
意味マッチングとキーワードマッチングを組み合わせることで、最適な検索結果を実現します。生成コストは変わらず、API 呼び出しのオーバーヘッドは単一ベクトルモードと同じです。 |
ストレージ容量をより多く必要とする、およびシステムアーキテクチャーと取得ロジックがより複雑になります。 |
高品質な本番運用向けハイブリッド検索エンジン。 |
サンプル
コードはデモンストレーション専用です。本番環境では、ベクトルをあらかじめベクトルデータベースに計算・保存してください。取得時には、クエリの埋め込みのみを生成すれば十分です。
セマンティック検索
クエリとドキュメントの埋め込み類似度を計算することで、正確なセマンティックマッチングを実現します。
import dashscope
import numpy as np
from dashscope import TextEmbedding
# 中国(北京)リージョンのモデルを使用する場合は、base_url を「https://dashscope.aliyuncs.com/api/v1」に置き換えます。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
def cosine_similarity(a, b):
"""余弦類似度を計算します。"""
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
def semantic_search(query, documents, top_k=5):
"""セマンティック検索を実行します。"""
# クエリの埋め込みを生成します。
query_resp = TextEmbedding.call(
model="text-embedding-v4",
input=query,
dimension=1024
)
query_embedding = query_resp.output['embeddings'][0]['embedding']
# ドキュメントの埋め込みを生成します。
doc_resp = TextEmbedding.call(
model="text-embedding-v4",
input=documents,
dimension=1024
)
# 類似度を計算します。
similarities = []
for i, doc_emb in enumerate(doc_resp.output['embeddings']):
similarity = cosine_similarity(query_embedding, doc_emb['embedding'])
similarities.append((i, similarity))
# 類似度順に並べ替え、上位 k 個の結果を返します。
similarities.sort(key=lambda x: x[1], reverse=True)
return [(documents[i], sim) for i, sim in similarities[:top_k]]
# 使用例
documents = [
"人工知能はコンピューターサイエンスの一分野です",
"機械学習は人工知能を実現するための重要な手法です",
"ディープラーニングは機械学習のサブフィールドです"
]
query = "AI とは何ですか?"
results = semantic_search(query, documents, top_k=2)
for doc, sim in results:
print(f"類似度:{sim:.3f}、ドキュメント:{doc}")
レコメンデーションシステム
ユーザーの行動履歴の埋め込みを分析し、興味を特定して類似アイテムをレコメンデーションします。
import dashscope
import numpy as np
from dashscope import TextEmbedding
# 中国(北京)リージョンのモデルを使用する場合は、base_url を「https://dashscope.aliyuncs.com/api/v1」に置き換えます。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
def cosine_similarity(a, b):
"""余弦類似度を計算します。"""
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
def build_recommendation_system(user_history, all_items, top_k=10):
"""レコメンデーションシステムを構築します。"""
# ユーザー履歴の埋め込みを生成します。
history_resp = TextEmbedding.call(
model="text-embedding-v4",
input=user_history,
dimension=1024
)
# ユーザープリファレンスの埋め込み(平均化)を計算します。
user_embedding = np.mean([
emb['embedding'] for emb in history_resp.output['embeddings']
], axis=0)
# 全アイテムの埋め込みを生成します。
items_resp = TextEmbedding.call(
model="text-embedding-v4",
input=all_items,
dimension=1024
)
# レコメンデーションスコアを計算します。
recommendations = []
for i, item_emb in enumerate(items_resp.output['embeddings']):
score = cosine_similarity(user_embedding, item_emb['embedding'])
recommendations.append((all_items[i], score))
# スコア順に並べ替え、レコメンデーション結果を返します。
recommendations.sort(key=lambda x: x[1], reverse=True)
return recommendations[:top_k]
# 使用例
user_history = ["SF", "アクション", "サスペンス"]
all_movies = ["未来世界", "宇宙冒険", "古代戦争", "ロマンスの旅", "スーパーヒーロー"]
recommendations = build_recommendation_system(user_history, all_movies)
for movie, score in recommendations:
print(f"レコメンデーションスコア:{score:.3f}、映画:{movie}")
テキストクラスタリング
埋め込み間の距離を分析することにより、類似したテキストを自動的にグループ化します。
# scikit-learn が必要です:pip install scikit-learn
import dashscope
import numpy as np
from sklearn.cluster import KMeans
# 中国(北京)リージョンのモデルを使用する場合は、base_url を「https://dashscope.aliyuncs.com/api/v1」に置き換えます。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
def cluster_texts(texts, n_clusters=2):
"""テキストのクラスタリングを実行します。"""
# 1. すべてのテキストの埋め込みを取得します。
resp = dashscope.TextEmbedding.call(
model="text-embedding-v4",
input=texts,
dimension=1024
)
embeddings = np.array([item['embedding'] for item in resp.output['embeddings']])
# 2. KMeans アルゴリズムを使用してクラスタリングします。
kmeans = KMeans(n_clusters=n_clusters, random_state=0, n_init='auto').fit(embeddings)
# 3. 結果を整理して返します。
clusters = {i: [] for i in range(n_clusters)}
for i, label in enumerate(kmeans.labels_):
clusters[label].append(texts[i])
return clusters
# 使用例
documents_to_cluster = [
"携帯電話会社 A が新製品を発表",
"検索エンジン会社 B が新しいシステムをリリース",
"ワールドカップ決勝:アルゼンチン vs フランス",
"中国がオリンピックで金メダルを獲得",
"企業が最新の AI チップをリリース",
"ヨーロッパカップ試合レポート"
]
clusters = cluster_texts(documents_to_cluster, n_clusters=2)
for cluster_id, docs in clusters.items():
print(f"--- クラスター {cluster_id} ---")
for doc in docs:
print(f"- {doc}")
テキスト分類
入力テキストと事前定義されたラベルとの埋め込み類似度を計算することで、ゼロショットテキスト分類を実行します。このアプローチでは、事前にラベル付けされた例を用意せずに、新しいカテゴリへの分類が可能です。
import dashscope
import numpy as np
# 中国(北京)リージョンのモデルを使用する場合は、base_url を以下に置き換えます:https://dashscope.aliyuncs.com/api/v1
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
def cosine_similarity(a, b):
"""余弦類似度を計算します。"""
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
def classify_text_zero_shot(text, labels):
"""ゼロショットテキスト分類を実行します。"""
# 1. 入力テキストおよびすべてのラベルの埋め込みを取得します。
resp = dashscope.TextEmbedding.call(
model="text-embedding-v4",
input=[text] + labels,
dimension=1024
)
embeddings = resp.output['embeddings']
text_embedding = embeddings[0]['embedding']
label_embeddings = [emb['embedding'] for emb in embeddings[1:]]
# 2. 各ラベルとの類似度を計算します。
scores = [cosine_similarity(text_embedding, label_emb) for label_emb in label_embeddings]
# 3. 最も高い類似度を持つラベルを返します。
best_match_index = np.argmax(scores)
return labels[best_match_index], scores[best_match_index]
# 使用例
text_to_classify = "The fabric of this dress is comfortable and the style is nice"
possible_labels = ["Digital Products", "Apparel & Accessories", "Food & Beverage", "Home & Living"]
label, score = classify_text_zero_shot(text_to_classify, possible_labels)
print(f"入力テキスト: '{text_to_classify}'")
print(f"最も一致するカテゴリ: '{label}' (類似度: {score:.3f})")異常検知
正常なサンプルの中心埋め込みと比較して、対象データの埋め込み類似度を計算することで異常を検出します。類似度スコアが低い場合、異常と判定されます。
サンプルコード内の threshold はデモンストレーション専用です。本番環境では、データの内容および分布に応じて類似度スコアが変動するため、汎用的なしきい値は存在しません。ご自身のデータセットでこの値を校正してください。import dashscope
import numpy as np
def cosine_similarity(a, b):
"""余弦類似度を計算します。"""
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
def detect_anomaly(new_comment, normal_comments, threshold=0.6):
# 1. すべての正常コメントおよび新しいコメントの埋め込みを生成します。
all_texts = normal_comments + [new_comment]
resp = dashscope.TextEmbedding.call(
model="text-embedding-v4",
input=all_texts,
dimension=1024
)
embeddings = [item['embedding'] for item in resp.output['embeddings']]
# 2. 正常コメントの中心埋め込み(平均)を計算します。
normal_embeddings = np.array(embeddings[:-1])
normal_center_vector = np.mean(normal_embeddings, axis=0)
# 3. 新しいコメントの埋め込みと中心埋め込みの類似度を計算します。
new_comment_embedding = np.array(embeddings[-1])
similarity = cosine_similarity(new_comment_embedding, normal_center_vector)
# 4. 異常かどうかを判定します。
is_anomaly = similarity < threshold
return is_anomaly, similarity
# 使用例
normal_user_comments = [
"本日のミーティングは成果を上げました",
"プロジェクトは順調に進んでいます",
"新バージョンは来週リリース予定です",
"ユーザーからのフィードバックは好意的です"
]
test_comments = {
"通常のコメント": "この機能は期待通りに動作しています",
"異常 - 意味のない文字化け": "asdfghjkl zxcvbnm"
}
print("--- 異常検知の例 ---")
for desc, comment in test_comments.items():
is_anomaly, score = detect_anomaly(comment, normal_user_comments)
result = "はい" if is_anomaly else "いいえ"
print(f"コメント:'{comment}'")
print(f"異常:{result}(正常サンプルとの類似度:{score:.3f})\n")
API リファレンス
-
汎用テキスト埋め込み
-
マルチモーダル埋め込み
エラーコード
モデル呼び出しが失敗しエラーメッセージが返された場合は、「エラーメッセージ」をご参照ください。
レート制限
レート制限については、「レート制限」をご参照ください。
モデル性能(MTEB/CMTEB)
評価ベンチマーク
-
MTEB(Massive Text Embedding Benchmark):分類、クラスタリング、取得などのタスクにおいて、テキスト埋め込みの汎用性能を包括的に評価するベンチマークです。
-
CMTEB(Chinese Massive Text Embedding Benchmark):中国語テキスト埋め込みを特化して評価する大規模ベンチマークです。
-
スコアは 0~100 の範囲で、数値が高いほど性能が優れています。
|
モデル |
MTEB |
MTEB(取得タスク) |
CMTEB |
CMTEB(取得タスク) |
|
text-embedding-v3(512 次元) |
62.11 |
54.30 |
66.81 |
71.88 |
|
text-embedding-v3(768 次元) |
62.43 |
54.74 |
67.90 |
72.29 |
|
text-embedding-v3(1024 次元) |
63.39 |
55.41 |
68.92 |
73.23 |
|
text-embedding-v4(512 次元) |
64.73 |
56.34 |
68.79 |
73.33 |
|
text-embedding-v4(1024 次元) |
68.36 |
59.30 |
70.14 |
73.98 |
|
text-embedding-v4(2048 次元) |
71.58 |
61.97 |
71.99 |
75.01 |