Qwen-OCR モデルを使用して、画像からテキスト、構造化データ、およびキー情報を抽出します。Qwen-OCR は、OpenAI 互換 API と DashScope API の 2 つの API プロトコルをサポートしています。
ユースケースとクイックスタートガイダンスについては、「テキスト抽出 (Qwen-OCR)」をご参照ください。
OpenAI 互換 API
エンドポイント
|
リージョン |
SDK |
HTTP エンドポイント |
|
シンガポール |
|
|
|
米国 (バージニア) |
|
|
|
中国 (北京) |
|
|
Model Studio は、中国 (北京) およびシンガポールリージョン向けにワークスペース固有のドメインをリリースしました。新しい専用ドメインは、推論リクエストに対して優れたパフォーマンスと高い安定性を提供します。新しいドメインへの移行を推奨します:
-
中国 (北京):
https://dashscope.aliyuncs.comからhttps://{WorkspaceId}.cn-beijing.maas.aliyuncs.comへ -
シンガポール:
https://dashscope-intl.aliyuncs.comからhttps://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.comへ
{WorkspaceId} は、Model Studio コンソールの [ワークスペース詳細] ページで確認できるワークスペース ID です。既存のドメインも引き続き完全に機能します。
前提条件
API キーを取得し、環境変数として設定します。 OpenAI SDK を使用する場合は、SDK をインストールします。
クイックスタート
OpenAI 互換のチャット補完エンドポイントを使用して、イメージ URL とテキストプロンプトを含む user メッセージを送信します。モデルはテキストを抽出し、choices[0].message.content でそれを返します。
非ストリーミング
Python
from openai import OpenAI
import os
PROMPT_TICKET_EXTRACTION = """
列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。
キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。
データを次の JSON 形式で返してください: {'invoice_number': 'xxx', 'departure_station': 'xxx', 'arrival_station': 'xxx', 'departure_date_and_time':'xxx', 'seat_number': 'xxx','ticket_price':'xxx', 'id_card_number': 'xxx', 'passenger_name': 'xxx'},
"""
try:
client = OpenAI(
# 環境変数が設定されていない場合は、api_key="sk-xxx" に置き換えます
api_key=os.getenv("DASHSCOPE_API_KEY"),
# シンガポールリージョン。米国 (バージニア) の場合は https://dashscope-us.aliyuncs.com/compatible-mode/v1 を使用します
# 中国 (北京) の場合は https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1 を使用します
base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
model="qwen-vl-ocr-2025-11-20",
messages=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {"url":"https://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg"},
# 最小ピクセル数。これより小さい画像はアップスケールされます。
"min_pixels": 32 * 32 * 3,
# 最大ピクセル数。これより大きい画像はダウンスケールされます。
"max_pixels": 32 * 32 * 8192
},
# カスタムプロンプト。これがない場合、モデルは「画像からテキストコンテンツのみを出力し、追加の説明やフォーマットは含めないでください」を使用します。
{"type": "text",
"text": PROMPT_TICKET_EXTRACTION}
]
}
])
print(completion.choices[0].message.content)
except Exception as e:
print(f"Error message: {e}")
Node.js
import OpenAI from 'openai';
const PROMPT_TICKET_EXTRACTION = `
列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。
キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。
データを次の JSON 形式で返してください: {'invoice_number': 'xxx', 'departure_station': 'xxx', 'arrival_station': 'xxx', 'departure_date_and_time':'xxx', 'seat_number': 'xxx','ticket_price':'xxx', 'id_card_number': 'xxx', 'passenger_name': 'xxx'}
`;
const client = new OpenAI({
// 環境変数が設定されていない場合は、apiKey: "sk-xxx" に置き換えます
apiKey: process.env.DASHSCOPE_API_KEY,
// 中国 (北京) の場合は https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1 を使用します
baseURL: 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1',
});
async function main() {
const response = await client.chat.completions.create({
model: 'qwen-vl-ocr-2025-11-20',
messages: [
{
role: 'user',
content: [
{ type: 'text', text: PROMPT_TICKET_EXTRACTION},
{
type: 'image_url',
image_url: {
url: 'https://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg',
},
// 最小ピクセル数。これより小さい画像はアップスケールされます。
"min_pixels": 32 * 32 * 3,
// 最大ピクセル数。これより大きい画像はダウンスケールされます。
"max_pixels": 32 * 32 * 8192
}
]
}
],
});
console.log(response.choices[0].message.content)
}
main();
curl
curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-vl-ocr-2025-11-20",
"messages": [
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {"url":"https://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg"},
"min_pixels": 3072,
"max_pixels": 8388608
},
{"type": "text", "text": "列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。データを次の JSON 形式で返してください: {\'invoice_number\': \'xxx\', \'departure_station\': \'xxx\', \'arrival_station\': \'xxx\', \'departure_date_and_time\':\'xxx\', \'seat_number\': \'xxx\',\'ticket_price\':\'xxx\', \'id_card_number\': \'xxx\', \'passenger_name\': \'xxx\'}"}
]
}
]
}'
ストリーミング
stream を true に設定すると、モデルが結果を生成するたびに増分的に結果を受け取ることができます。
Python
import os
from openai import OpenAI
PROMPT_TICKET_EXTRACTION = """
列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。
キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。
データを次の JSON 形式で返してください: {'invoice_number': 'xxx','departure_station': 'xxx', 'arrival_station': 'xxx', 'departure_date_and_time':'xxx', 'seat_number': 'xxx','ticket_price':'xxx', 'id_card_number': 'xxx', 'passenger_name': 'xxx'},
"""
client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
model="qwen-vl-ocr-2025-11-20",
messages=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {"url":"https://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg"},
"min_pixels": 32 * 32 * 3,
"max_pixels": 32 * 32 * 8192
},
{"type": "text","text": PROMPT_TICKET_EXTRACTION}
]
}
],
stream=True,
stream_options={"include_usage": True}
)
for chunk in completion:
print(chunk.model_dump_json())
Node.js
import OpenAI from 'openai';
const PROMPT_TICKET_EXTRACTION = `
列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。
キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。
データを次の JSON 形式で返してください: {'invoice_number': 'xxx', 'departure_station': 'xxx', 'arrival_station': 'xxx', 'departure_date_and_time':'xxx', 'seat_number': 'xxx','ticket_price':'xxx', 'id_card_number': 'xxx', 'passenger_name': 'xxx'}
`;
const openai = new OpenAI({
apiKey: process.env.DASHSCOPE_API_KEY,
baseURL: 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1',
});
async function main() {
const response = await openai.chat.completions.create({
model: 'qwen-vl-ocr-2025-11-20',
messages: [
{
role: 'user',
content: [
{ type: 'text', text: PROMPT_TICKET_EXTRACTION},
{
type: 'image_url',
image_url: {
url: 'https://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg',
},
"min_pixels": 32 * 32 * 3,
"max_pixels": 32 * 32 * 8192
}
]
}
],
stream: true,
stream_options:{"include_usage": true}
});
let fullContent = ""
console.log("Streaming output content:")
for await (const chunk of response) {
if (chunk.choices[0] && chunk.choices[0].delta.content != null) {
fullContent += chunk.choices[0].delta.content;
console.log(chunk.choices[0].delta.content);
}
}
console.log(`Full output content: ${fullContent}`)
}
main();
curl
curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-vl-ocr-2025-11-20",
"messages": [
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {"url":"https://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg"},
"min_pixels": 3072,
"max_pixels": 8388608
},
{"type": "text", "text": "列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。データを次の JSON 形式で返してください: {\'invoice_number\': \'xxx\', \'departure_station\': \'xxx\', \'arrival_station\': \'xxx\', \'departure_date_and_time\':\'xxx\', \'seat_number\': \'xxx\',\'ticket_price\':\'xxx\', \'id_card_number\': \'xxx\', \'passenger_name\': \'xxx\'}"}
]
}
],
"stream": true,
"stream_options": {"include_usage": true}
}'
リクエストパラメーター
|
パラメーター |
型 |
必須 |
説明 |
|
|
string |
はい |
モデル名。サポートされているモデルについては、「推奨モデル」をご参照ください。 |
|
|
array |
はい |
モデルにコンテキストを提供するメッセージオブジェクトの配列。 |
メッセージオブジェクト
各メッセージには、role (必須で user) と、以下の要素タイプを持つ content 配列が必要です:
|
パラメーター |
型 |
必須 |
説明 |
|
|
string |
はい |
テキスト入力の場合は |
|
|
string |
いいえ |
テキストプロンプト。デフォルト: |
|
|
string |
はい ( |
画像の URL または Base64 エンコードされたデータ URL。ローカルファイルについては、「テキスト抽出」をご参照ください。 |
|
|
integer |
いいえ |
最小ピクセルしきい値。この値を下回る画像はアップスケールされます。「画像解像度のコントロール」をご参照ください。 |
|
|
integer |
いいえ |
最大ピクセルしきい値。この値を超える画像はダウンスケールされます。「画像解像度のコントロール」をご参照ください。 |
生成パラメーター
|
パラメーター |
型 |
デフォルト |
説明 |
|
|
boolean |
|
|
|
|
boolean |
|
|
|
|
integer |
可変 |
出力の最大トークン数。これを超えると応答が切り捨てられます。「出力トークンの制限」をご参照ください。 |
|
|
float |
|
出力の多様性をコントロールします。値が高いほど、より多様なテキストが生成されます。範囲:[0, 2)。 |
|
|
float |
|
ニュークリアスサンプリングのしきい値。値が高いほど多様性が増します。範囲:(0, 1.0]。 |
|
|
integer |
|
サンプリング中に候補となるトークンセットを制限します。値が None または 100 より大きい場合、top_k ポリシーは有効にならず、top_p ポリシーのみが有効になります。>= 0 である必要があります。標準の OpenAI パラメーターではありません。Python SDK では |
|
|
float |
|
繰り返しシーケンスに対するペナルティ。1.0 より大きい値は繰り返しを減らします。標準の OpenAI パラメーターではありません。Python SDK では |
|
|
float |
|
コンテンツの繰り返しをコントロールします。範囲:[-2.0, 2.0]。正の値は繰り返しを減らします。 |
|
|
integer |
-- |
同じ値が同一のパラメーターで使用された場合に、再現性のある結果を保証します。範囲:[0, 2^31 - 1]。 |
|
|
boolean |
|
|
|
|
integer |
|
ステップごとに返す最も可能性の高いトークンの数。範囲:[0, 5]。 |
|
|
string または array |
-- |
ストップワードまたはトークン ID。指定された文字列または |
応答
非ストリーミング応答 (chat.completion)
{
"id": "chatcmpl-ba21fa91-dcd6-4dad-90cc-6d49c3c39094",
"choices": [
{
"finish_reason": "stop",
"index": 0,
"logprobs": null,
"message": {
"content": "```json\n{\n \"seller_name\": \"null\",\n \"buyer_name\": \"Cai Yingshi\",\n \"price_excluding_tax\": \"230769.23\",\n \"organization_code\": \"null\",\n \"invoice_code\": \"142011726001\"\n}\n```",
"refusal": null,
"role": "assistant",
"annotations": null,
"audio": null,
"function_call": null,
"tool_calls": null
}
}
],
"created": 1763283287,
"model": "qwen-vl-ocr-latest",
"object": "chat.completion",
"service_tier": null,
"system_fingerprint": null,
"usage": {
"completion_tokens": 72,
"prompt_tokens": 1185,
"total_tokens": 1257,
"completion_tokens_details": {
"accepted_prediction_tokens": null,
"audio_tokens": null,
"reasoning_tokens": null,
"rejected_prediction_tokens": null,
"text_tokens": 72
},
"prompt_tokens_details": {
"audio_tokens": null,
"cached_tokens": null,
"image_tokens": 1001,
"text_tokens": 184
}
}
}
|
フィールド |
型 |
説明 |
|
|
string |
一意のリクエスト識別子。 |
|
|
array |
モデルが生成したコンテンツ。 |
|
|
string |
生成が正常に完了した場合は |
|
|
integer |
|
|
|
string |
モデルから抽出されたテキストまたは構造化出力。 |
|
|
string |
常に |
|
|
string |
常に |
|
|
object |
常に |
|
|
object |
常に |
|
|
array |
常に |
|
|
integer |
リクエストの UNIX タイムスタンプ。 |
|
|
string |
使用されたモデル。 |
|
|
string |
常に |
|
|
string |
常に |
|
|
string |
常に |
|
|
integer |
出力トークン数。 |
|
|
integer |
入力トークン数。 |
|
|
integer |
|
|
|
integer |
テキスト出力トークン。 |
|
|
integer |
画像入力トークン。 |
|
|
integer |
テキスト入力トークン。 |
ストリーミング応答 (chat.completion.chunk)
stream が true の場合、応答は一連の Server-Sent Event (SSE) チャンクとして配信されます。各チャンクは非ストリーミング応答と同じ構造に従いますが、以下の違いがあります:
-
objectは常にchat.completion.chunkです。 -
choices[].deltaはchoices[].messageを置き換えます。deltaオブジェクトはmessageと同じフィールドを持ちます。 -
choices[].delta.roleは最初のチャンクでのみ返されます。 -
finish_reasonは生成中はnull、完了時はstop、切り捨てられた場合はlengthです。 -
include_usageがtrueの場合、最後のチャンクは空のchoices配列を持ち、usageオブジェクトを含みます。
{"id":"chatcmpl-f6fbdc0d-78d6-418f-856f-f099c2e4859b","choices":[{"delta":{"content":"","function_call":null,"refusal":null,"role":"assistant","tool_calls":null},"finish_reason":null,"index":0,"logprobs":null}],"created":1764139204,"model":"qwen-vl-ocr-latest","object":"chat.completion.chunk","service_tier":null,"system_fingerprint":null,"usage":null}
{"id":"chatcmpl-f6fbdc0d-78d6-418f-856f-f099c2e4859b","choices":[{"delta":{"content":"```","function_call":null,"refusal":null,"role":null,"tool_calls":null},"finish_reason":null,"index":0,"logprobs":null}],"created":1764139204,"model":"qwen-vl-ocr-latest","object":"chat.completion.chunk","service_tier":null,"system_fingerprint":null,"usage":null}
{"id":"chatcmpl-f6fbdc0d-78d6-418f-856f-f099c2e4859b","choices":[{"delta":{"content":"json","function_call":null,"refusal":null,"role":null,"tool_calls":null},"finish_reason":null,"index":0,"logprobs":null}],"created":1764139204,"model":"qwen-vl-ocr-latest","object":"chat.completion.chunk","service_tier":null,"system_fingerprint":null,"usage":null}
......
{"id":"chatcmpl-f6fbdc0d-78d6-418f-856f-f099c2e4859b","choices":[{"delta":{"content":"","function_call":null,"refusal":null,"role":null,"tool_calls":null},"finish_reason":"stop","index":0,"logprobs":null}],"created":1764139204,"model":"qwen-vl-ocr-latest","object":"chat.completion.chunk","service_tier":null,"system_fingerprint":null,"usage":null}
{"id":"chatcmpl-f6fbdc0d-78d6-418f-856f-f099c2e4859b","choices":[],"created":1764139204,"model":"qwen-vl-ocr-latest","object":"chat.completion.chunk","service_tier":null,"system_fingerprint":null,"usage":{"completion_tokens":141,"prompt_tokens":513,"total_tokens":654,"completion_tokens_details":{"accepted_prediction_tokens":null,"audio_tokens":null,"reasoning_tokens":null,"rejected_prediction_tokens":null,"text_tokens":141},"prompt_tokens_details":{"audio_tokens":null,"cached_tokens":null,"image_tokens":332,"text_tokens":181}}}
画像解像度のコントロール
min_pixels と max_pixels は、処理前の画像サイズ変更をコントロールします。トークンとピクセルの比率はモデルのバージョンによって異なります:
|
モデル |
トークンあたりのピクセル数 |
|
|
|
|
|
32 x 32 = 1,024 |
3,072 (3 トークン) |
8,388,608 (8,192 トークン) |
30,720,000 (30,000 トークン) |
|
|
28 x 28 = 784 |
3,136 (4 トークン) |
6,422,528 (8,192 トークン) |
23,520,000 (30,000 トークン) |
サイズ変更の動作:
-
画像のピクセル数が
min_pixelsを下回る場合、画像はmin_pixelsを超えるまでアップスケールされます。 -
画像のピクセル数が
[min_pixels, max_pixels]の範囲内にある場合、元の画像がサイズ変更なしで使用されます。 -
画像のピクセル数が
max_pixelsを超える場合、画像はmax_pixelsを下回るようにダウンスケールされます。
出力トークンの制限
|
モデル |
デフォルトおよび最大 |
|
|
モデルの最大出力長と同じです。「モデルの選択」をご参照ください。 |
|
|
4,096 |
qwen-vl-ocr, qwen-vl-ocr-2025-04-13, and qwen-vl-ocr-2025-08-28の場合、max_tokensのデフォルトは 4096 です。これを増やす (4097–8192) には、営業担当者に、Alibaba Cloud アカウント ID、画像タイプ (例:ドキュメント、e コマース、契約書)、モデル名、推定 QPS と 1 日あたりのリクエスト量、および 4096 出力トークンを超えるリクエストの割合を連絡してください。
DashScope API
エンドポイント
|
リージョン |
HTTP エンドポイント |
|
シンガポール |
|
|
米国 (バージニア) |
|
|
中国 (北京) |
|
SDK ベース URL の構成:
Python:
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'
Java (メソッド 1 -- コンストラクター):
import com.alibaba.dashscope.protocol.Protocol;
MultiModalConversation conv = new MultiModalConversation(Protocol.HTTP.getValue(), "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1");
Java (メソッド 2 -- 静的ブロック):
import com.alibaba.dashscope.utils.Constants;
Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
ドメインを米国 (バージニア) リージョンの場合はdashscope-us.aliyuncs.comに、中国 (北京) リージョンの場合は{WorkspaceId}.cn-beijing.maas.aliyuncs.comに置き換えてください。中国 (北京) リージョンの場合、SDK 呼び出しにbase_urlを設定する必要はありません。
API キーを取得して、環境変数として設定してください。DashScope SDK を使用する場合は、DashScope SDK をインストールする必要もあります。
組み込みタスク
DashScope API は、ocr_options パラメーターを介して組み込みの OCR タスクを提供します。各タスクは最適化されたデフォルトのプロンプトを使用するため、text メッセージは不要です。
|
タスク |
|
出力フォーマット |
|
一般的なテキスト認識 |
|
プレーンテキスト |
|
高精度認識 |
|
バウンディングボックス付きのプレーンテキスト |
|
情報抽出 |
|
構造化されたキーと値のペア |
|
テーブル解析 |
|
テーブル構造 |
|
ドキュメント解析 |
|
ドキュメント構造 |
|
数式認識 |
|
LaTeX 数式 |
|
多言語認識 |
|
多言語テキスト |
高精度認識
認識された各行のテキストと位置データを返します。
Python
import os
import dashscope
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'
messages = [{
"role": "user",
"content": [{
"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/ctdzex/biaozhun.jpg",
"min_pixels": 32 * 32 * 3,
"max_pixels": 32 * 32 * 8192,
"enable_rotate": False}]
}]
response = dashscope.MultiModalConversation.call(
api_key=os.getenv('DASHSCOPE_API_KEY'),
model='qwen-vl-ocr-2025-11-20',
messages=messages,
ocr_options={"task": "advanced_recognition"}
)
print(response["output"]["choices"][0]["message"].content[0]["text"])
Java
// dashscope SDK バージョン >= 2.21.8
import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.HashMap;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.aigc.multimodalconversation.OcrOptions;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
public class Main {
static {
Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
}
public static void simpleMultiModalConversationCall()
throws ApiException, NoApiKeyException, UploadFileException {
MultiModalConversation conv = new MultiModalConversation();
Map<String, Object> map = new HashMap<>();
map.put("image", "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/ctdzex/biaozhun.jpg");
map.put("max_pixels", 8388608);
map.put("min_pixels", 3072);
map.put("enable_rotate", false);
OcrOptions ocrOptions = OcrOptions.builder()
.task(OcrOptions.Task.ADVANCED_RECOGNITION)
.build();
MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
.content(Arrays.asList(
map
)).build();
MultiModalConversationParam param = MultiModalConversationParam.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model("qwen-vl-ocr-2025-11-20")
.message(userMessage)
.ocrOptions(ocrOptions)
.build();
MultiModalConversationResult result = conv.call(param);
System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
}
public static void main(String[] args) {
try {
simpleMultiModalConversationCall();
} catch (ApiException | NoApiKeyException | UploadFileException e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}
curl
curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '
{
"model": "qwen-vl-ocr-2025-11-20",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/ctdzex/biaozhun.jpg",
"min_pixels": 3072,
"max_pixels": 8388608,
"enable_rotate": false
}
]
}
]
},
"parameters": {
"ocr_options": {
"task": "advanced_recognition"
}
}
}
'
情報抽出
画像から構造化されたキーと値のデータを抽出します。task_config.result_schema で抽出するフィールドを指定します。
Python
import os
import dashscope
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'
messages = [
{
"role":"user",
"content":[
{
"image":"http://duguang-labelling.oss-cn-shanghai.aliyuncs.com/demo_ocr/receipt_zh_demo.jpg",
"min_pixels": 3072,
"max_pixels": 8388608,
"enable_rotate": False
}
]
}
]
params = {
"ocr_options":{
"task": "key_information_extraction",
"task_config": {
"result_schema": {
"Ride Date": "画像内の乗車日時に対応し、YYYY-MM-DD 形式、例:2025-03-05",
"Invoice Code": "画像から請求書コードを抽出します。通常は数字または文字の組み合わせです",
"Invoice Number": "請求書から番号を抽出します。通常は数字のみで構成されます。"
}
}
}
}
response = dashscope.MultiModalConversation.call(
api_key=os.getenv('DASHSCOPE_API_KEY'),
model='qwen-vl-ocr-2025-11-20',
messages=messages,
**params)
print(response.output.choices[0].message.content[0]["ocr_result"])
Java
import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.HashMap;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.aigc.multimodalconversation.OcrOptions;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
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 com.google.gson.JsonObject;
public class Main {
static {
Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
}
public static void simpleMultiModalConversationCall()
throws ApiException, NoApiKeyException, UploadFileException {
MultiModalConversation conv = new MultiModalConversation();
Map<String, Object> map = new HashMap<>();
map.put("image", "http://duguang-labelling.oss-cn-shanghai.aliyuncs.com/demo_ocr/receipt_zh_demo.jpg");
map.put("max_pixels", 8388608);
map.put("min_pixels", 3072);
map.put("enable_rotate", false);
JsonObject resultSchema = new JsonObject();
resultSchema.addProperty("Ride Date", "画像内の乗車日時に対応し、YYYY-MM-DD 形式、例:2025-03-05");
resultSchema.addProperty("Invoice Code", "画像から請求書コードを抽出します。通常は数字または文字の組み合わせです");
resultSchema.addProperty("Invoice Number", "請求書から番号を抽出します。通常は数字のみで構成されます。");
OcrOptions ocrOptions = OcrOptions.builder()
.task(OcrOptions.Task.KEY_INFORMATION_EXTRACTION)
.taskConfig(OcrOptions.TaskConfig.builder().resultSchema(resultSchema).build())
.build();
MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
.content(Arrays.asList(
map
)).build();
MultiModalConversationParam param = MultiModalConversationParam.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model("qwen-vl-ocr-2025-11-20")
.message(userMessage)
.ocrOptions(ocrOptions)
.build();
MultiModalConversationResult result = conv.call(param);
System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("ocr_result"));
}
public static void main(String[] args) {
try {
simpleMultiModalConversationCall();
} catch (ApiException | NoApiKeyException | UploadFileException e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}
curl
curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '
{
"model": "qwen-vl-ocr-2025-11-20",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"image": "http://duguang-labelling.oss-cn-shanghai.aliyuncs.com/demo_ocr/receipt_zh_demo.jpg",
"min_pixels": 3072,
"max_pixels": 8388608,
"enable_rotate": false
}
]
}
]
},
"parameters": {
"ocr_options": {
"task": "key_information_extraction",
"task_config": {
"result_schema": {
"Ride Date": "画像内の乗車日時に対応し、YYYY-MM-DD 形式、例:2025-03-05",
"Invoice Code": "画像から請求書コードを抽出します。通常は数字または文字の組み合わせです",
"Invoice Number": "請求書から番号を抽出します。通常は数字のみで構成されます。"
}
}
}
}
}
'
テーブル解析
画像からテーブル構造を抽出します。
Python
import os
import dashscope
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'
messages = [{
"role": "user",
"content": [{
"image": "http://duguang-llm.oss-cn-hangzhou.aliyuncs.com/llm_data_keeper/data/doc_parsing/tables/photo/eng/17.jpg",
"min_pixels": 32 * 32 * 3,
"max_pixels": 32 * 32 * 8192,
"enable_rotate": False}]
}]
response = dashscope.MultiModalConversation.call(
api_key=os.getenv('DASHSCOPE_API_KEY'),
model='qwen-vl-ocr-2025-11-20',
messages=messages,
ocr_options={"task": "table_parsing"}
)
print(response["output"]["choices"][0]["message"].content[0]["text"])
Java
import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.HashMap;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.aigc.multimodalconversation.OcrOptions;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
public class Main {
static {
Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
}
public static void simpleMultiModalConversationCall()
throws ApiException, NoApiKeyException, UploadFileException {
MultiModalConversation conv = new MultiModalConversation();
Map<String, Object> map = new HashMap<>();
map.put("image", "https://duguang-llm.oss-cn-hangzhou.aliyuncs.com/llm_data_keeper/data/doc_parsing/tables/photo/eng/17.jpg");
map.put("max_pixels", 8388608);
map.put("min_pixels", 3072);
map.put("enable_rotate", false);
OcrOptions ocrOptions = OcrOptions.builder()
.task(OcrOptions.Task.TABLE_PARSING)
.build();
MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
.content(Arrays.asList(
map
)).build();
MultiModalConversationParam param = MultiModalConversationParam.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model("qwen-vl-ocr-2025-11-20")
.message(userMessage)
.ocrOptions(ocrOptions)
.build();
MultiModalConversationResult result = conv.call(param);
System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
}
public static void main(String[] args) {
try {
simpleMultiModalConversationCall();
} catch (ApiException | NoApiKeyException | UploadFileException e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}
curl
curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '
{
"model": "qwen-vl-ocr-2025-11-20",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"image": "http://duguang-llm.oss-cn-hangzhou.aliyuncs.com/llm_data_keeper/data/doc_parsing/tables/photo/eng/17.jpg",
"min_pixels": 3072,
"max_pixels": 8388608,
"enable_rotate": false
}
]
}
]
},
"parameters": {
"ocr_options": {
"task": "table_parsing"
}
}
}
'
ドキュメント解析
ドキュメントから構造レイアウトとテキストを抽出します。
Python
import os
import dashscope
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'
messages = [{
"role": "user",
"content": [{
"image": "https://img.alicdn.com/imgextra/i1/O1CN01ukECva1cisjyK6ZDK_!!6000000003635-0-tps-1500-1734.jpg",
"min_pixels": 32 * 32 * 3,
"max_pixels": 32 * 32 * 8192,
"enable_rotate": False}]
}]
response = dashscope.MultiModalConversation.call(
api_key=os.getenv('DASHSCOPE_API_KEY'),
model='qwen-vl-ocr-2025-11-20',
messages=messages,
ocr_options={"task": "document_parsing"}
)
print(response["output"]["choices"][0]["message"].content[0]["text"])
Java
import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.HashMap;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.aigc.multimodalconversation.OcrOptions;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
public class Main {
static {
Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
}
public static void simpleMultiModalConversationCall()
throws ApiException, NoApiKeyException, UploadFileException {
MultiModalConversation conv = new MultiModalConversation();
Map<String, Object> map = new HashMap<>();
map.put("image", "https://img.alicdn.com/imgextra/i1/O1CN01ukECva1cisjyK6ZDK_!!6000000003635-0-tps-1500-1734.jpg");
map.put("max_pixels", 8388608);
map.put("min_pixels", 3072);
map.put("enable_rotate", false);
OcrOptions ocrOptions = OcrOptions.builder()
.task(OcrOptions.Task.DOCUMENT_PARSING)
.build();
MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
.content(Arrays.asList(
map
)).build();
MultiModalConversationParam param = MultiModalConversationParam.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model("qwen-vl-ocr-2025-11-20")
.message(userMessage)
.ocrOptions(ocrOptions)
.build();
MultiModalConversationResult result = conv.call(param);
System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
}
public static void main(String[] args) {
try {
simpleMultiModalConversationCall();
} catch (ApiException | NoApiKeyException | UploadFileException e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}
curl
curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '
{
"model": "qwen-vl-ocr-2025-11-20",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"image": "https://img.alicdn.com/imgextra/i1/O1CN01ukECva1cisjyK6ZDK_!!6000000003635-0-tps-1500-1734.jpg",
"min_pixels": 3072,
"max_pixels": 8388608,
"enable_rotate": false
}
]
}
]
},
"parameters": {
"ocr_options": {
"task": "document_parsing"
}
}
}
'
数式認識
画像から数式を抽出し、LaTeX 形式で返します。
Python
import os
import dashscope
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'
messages = [{
"role": "user",
"content": [{
"image": "http://duguang-llm.oss-cn-hangzhou.aliyuncs.com/llm_data_keeper/data/formula_handwriting/test/inline_5_4.jpg",
"min_pixels": 32 * 32 * 3,
"max_pixels": 32 * 32 * 8192,
"enable_rotate": False}]
}]
response = dashscope.MultiModalConversation.call(
api_key=os.getenv('DASHSCOPE_API_KEY'),
model='qwen-vl-ocr-2025-11-20',
messages=messages,
ocr_options={"task": "formula_recognition"}
)
print(response["output"]["choices"][0]["message"].content[0]["text"])
Java
import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.HashMap;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.aigc.multimodalconversation.OcrOptions;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
public class Main {
static {
Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
}
public static void simpleMultiModalConversationCall()
throws ApiException, NoApiKeyException, UploadFileException {
MultiModalConversation conv = new MultiModalConversation();
Map<String, Object> map = new HashMap<>();
map.put("image", "http://duguang-llm.oss-cn-hangzhou.aliyuncs.com/llm_data_keeper/data/formula_handwriting/test/inline_5_4.jpg");
map.put("max_pixels", 8388608);
map.put("min_pixels", 3072);
map.put("enable_rotate", false);
OcrOptions ocrOptions = OcrOptions.builder()
.task(OcrOptions.Task.FORMULA_RECOGNITION)
.build();
MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
.content(Arrays.asList(
map
)).build();
MultiModalConversationParam param = MultiModalConversationParam.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model("qwen-vl-ocr-2025-11-20")
.message(userMessage)
.ocrOptions(ocrOptions)
.build();
MultiModalConversationResult result = conv.call(param);
System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
}
public static void main(String[] args) {
try {
simpleMultiModalConversationCall();
} catch (ApiException | NoApiKeyException | UploadFileException e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}
curl
curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '
{
"model": "qwen-vl-ocr",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"image": "http://duguang-llm.oss-cn-hangzhou.aliyuncs.com/llm_data_keeper/data/formula_handwriting/test/inline_5_4.jpg",
"min_pixels": 3072,
"max_pixels": 8388608,
"enable_rotate": false
}
]
}
]
},
"parameters": {
"ocr_options": {
"task": "formula_recognition"
}
}
}
'
一般的なテキスト認識
構造的なフォーマットなしで画像からプレーンテキストを抽出します。
Python
import os
import dashscope
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'
messages = [{
"role": "user",
"content": [{
"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/ctdzex/biaozhun.jpg",
"min_pixels": 32 * 32 * 3,
"max_pixels": 32 * 32 * 8192,
"enable_rotate": False}]
}]
response = dashscope.MultiModalConversation.call(
api_key=os.getenv('DASHSCOPE_API_KEY'),
model='qwen-vl-ocr-2025-11-20',
messages=messages,
ocr_options={"task": "text_recognition"}
)
print(response["output"]["choices"][0]["message"].content[0]["text"])
Java
import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.HashMap;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.aigc.multimodalconversation.OcrOptions;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
public class Main {
static {
Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
}
public static void simpleMultiModalConversationCall()
throws ApiException, NoApiKeyException, UploadFileException {
MultiModalConversation conv = new MultiModalConversation();
Map<String, Object> map = new HashMap<>();
map.put("image", "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/ctdzex/biaozhun.jpg");
map.put("max_pixels", 8388608);
map.put("min_pixels", 3072);
map.put("enable_rotate", false);
OcrOptions ocrOptions = OcrOptions.builder()
.task(OcrOptions.Task.TEXT_RECOGNITION)
.build();
MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
.content(Arrays.asList(
map
)).build();
MultiModalConversationParam param = MultiModalConversationParam.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model("qwen-vl-ocr-2025-11-20")
.message(userMessage)
.ocrOptions(ocrOptions)
.build();
MultiModalConversationResult result = conv.call(param);
System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
}
public static void main(String[] args) {
try {
simpleMultiModalConversationCall();
} catch (ApiException | NoApiKeyException | UploadFileException e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}
curl
curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '
{
"model": "qwen-vl-ocr-2025-11-20",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/ctdzex/biaozhun.jpg",
"min_pixels": 3072,
"max_pixels": 8388608,
"enable_rotate": false
}
]
}
]
},
"parameters": {
"ocr_options": {
"task": "text_recognition"
}
}
}
'
多言語認識
画像から複数の言語のテキストを認識します。
Python
import os
import dashscope
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'
messages = [{
"role": "user",
"content": [{
"image": "https://img.alicdn.com/imgextra/i2/O1CN01VvUMNP1yq8YvkSDFY_!!6000000006629-2-tps-6000-3000.png",
"min_pixels": 32 * 32 * 3,
"max_pixels": 32 * 32 * 8192,
"enable_rotate": False}]
}]
response = dashscope.MultiModalConversation.call(
api_key=os.getenv('DASHSCOPE_API_KEY'),
model='qwen-vl-ocr-2025-11-20',
messages=messages,
ocr_options={"task": "multi_lan"}
)
print(response["output"]["choices"][0]["message"].content[0]["text"])
Java
import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.HashMap;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.aigc.multimodalconversation.OcrOptions;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
public class Main {
static {
Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
}
public static void simpleMultiModalConversationCall()
throws ApiException, NoApiKeyException, UploadFileException {
MultiModalConversation conv = new MultiModalConversation();
Map<String, Object> map = new HashMap<>();
map.put("image", "https://img.alicdn.com/imgextra/i2/O1CN01VvUMNP1yq8YvkSDFY_!!6000000006629-2-tps-6000-3000.png");
map.put("max_pixels", 8388608);
map.put("min_pixels", 3072);
map.put("enable_rotate", false);
OcrOptions ocrOptions = OcrOptions.builder()
.task(OcrOptions.Task.MULTI_LAN)
.build();
MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
.content(Arrays.asList(
map
)).build();
MultiModalConversationParam param = MultiModalConversationParam.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model("qwen-vl-ocr-2025-11-20")
.message(userMessage)
.ocrOptions(ocrOptions)
.build();
MultiModalConversationResult result = conv.call(param);
System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
}
public static void main(String[] args) {
try {
simpleMultiModalConversationCall();
} catch (ApiException | NoApiKeyException | UploadFileException e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}
curl
curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '
{
"model": "qwen-vl-ocr-2025-11-20",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"image": "https://img.alicdn.com/imgextra/i2/O1CN01VvUMNP1yq8YvkSDFY_!!6000000006629-2-tps-6000-3000.png",
"min_pixels": 3072,
"max_pixels": 8388608,
"enable_rotate": false
}
]
}
]
},
"parameters": {
"ocr_options": {
"task": "multi_lan"
}
}
}
'
ストリーミング (DashScope)
ストリーミング出力を有効にして、結果を増分的に受け取ります。メソッドは SDK によって異なります:
-
Python SDK:
stream=Trueとincremental_output=Trueを設定します。 -
Java SDK:
streamCallインターフェイスを使用します。 -
HTTP:
X-DashScope-SSE: enableヘッダーを設定します。
Python
import os
import dashscope
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'
PROMPT_TICKET_EXTRACTION = """
列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。
キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。
データを次の JSON 形式で返してください: {'invoice_number': 'xxx','departure_station': 'xxx', 'arrival_station': 'xxx', 'departure_date_and_time':'xxx', 'seat_number': 'xxx','ticket_price':'xxx', 'id_card_number': 'xxx', 'passenger_name': 'xxx'},
"""
messages = [
{
"role": "user",
"content": [
{
"image": "https://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg",
"min_pixels": 32 * 32 * 3,
"max_pixels": 32 * 32 * 8192},
{
"type": "text",
"text": PROMPT_TICKET_EXTRACTION
}
]
}
]
response = dashscope.MultiModalConversation.call(
api_key=os.getenv("DASHSCOPE_API_KEY"),
model="qwen-vl-ocr-2025-11-20",
messages=messages,
stream=True,
incremental_output=True,
)
full_content = ""
print("Streaming output content:")
for response in response:
try:
print(response["output"]["choices"][0]["message"].content[0]["text"])
full_content += response["output"]["choices"][0]["message"].content[0]["text"]
except:
pass
print(f"Full content: {full_content}")
Java
import java.util.*;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import io.reactivex.Flowable;
import com.alibaba.dashscope.utils.Constants;
public class Main {
static {
Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
}
public static void simpleMultiModalConversationCall()
throws ApiException, NoApiKeyException, UploadFileException {
MultiModalConversation conv = new MultiModalConversation();
Map<String, Object> map = new HashMap<>();
map.put("image", "https://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg");
map.put("max_pixels", 8388608);
map.put("min_pixels", 3072);
MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
.content(Arrays.asList(
map,
Collections.singletonMap("text", "列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。データを次の JSON 形式で返してください: {\'invoice_number\': \'xxx\', \'departure_station\': \'xxx\', \'arrival_station\': \'xxx\', \'departure_date_and_time\':\'xxx\', \'seat_number\': \'xxx\',\'ticket_price\':\'xxx\', \'id_card_number\': \'xxx\', \'passenger_name\': \'xxx\'"))).build();
MultiModalConversationParam param = MultiModalConversationParam.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model("qwen-vl-ocr-2025-11-20")
.message(userMessage)
.incrementalOutput(true)
.build();
Flowable<MultiModalConversationResult> result = conv.streamCall(param);
result.blockingForEach(item -> {
try {
List<Map<String, Object>> contentList = item.getOutput().getChoices().get(0).getMessage().getContent();
if (!contentList.isEmpty()){
System.out.println(contentList.get(0).get("text"));
}//
} catch (Exception e){
System.exit(0);
}
});
}
public static void main(String[] args) {
try {
simpleMultiModalConversationCall();
} catch (ApiException | NoApiKeyException | UploadFileException e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}
curl
curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--header 'X-DashScope-SSE: enable' \
--data '
{
"model": "qwen-vl-ocr-2025-11-20",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"image": "https://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg",
"min_pixels": 3072,
"max_pixels": 8388608
},
{"type": "text", "text": "列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。データを次の JSON 形式で返してください: {\'invoice_number\': \'xxx\', \'departure_station\': \'xxx\', \'arrival_station\': \'xxx\', \'departure_date_and_time\':\'xxx\', \'seat_number\': \'xxx\',\'ticket_price\':\'xxx\', \'id_card_number\': \'xxx\', \'passenger_name\': \'xxx\'}"}
]
}
]
},
"parameters": {
"incremental_output": true
}
}'
リクエストパラメーター
|
パラメーター |
型 |
必須 |
説明 |
|
|
string |
はい |
モデル名。サポートされているモデルについては、「推奨モデル」をご参照ください。 |
|
|
array |
はい |
メッセージオブジェクトの配列。 |
メッセージオブジェクト
各メッセージには、role (必須で user) と content フィールド (文字列または配列) が必要です。テキストのみの入力には文字列を使用します。入力に画像データが含まれる場合は、以下のフィールドを持つ配列を使用します:
|
パラメーター |
型 |
必須 |
説明 |
|
|
string |
いいえ |
画像の URL、Base64 データ URL、またはローカルパス。「ローカルファイルの受け渡し」をご参照ください。 |
|
|
string |
いいえ |
テキストプロンプト。デフォルト: |
|
|
boolean |
いいえ |
|
|
|
integer |
いいえ |
最小ピクセルしきい値。「画像解像度のコントロール」をご参照ください。 |
|
|
integer |
いいえ |
最大ピクセルしきい値。「画像解像度のコントロール」をご参照ください。 |
生成パラメーター
HTTP 呼び出しの場合は、これらを parameters オブジェクトに設定します。
|
パラメーター |
型 |
デフォルト |
説明 |
|
|
integer |
可変 |
出力の最大トークン数。「出力トークンの制限」をご参照ください。Java SDK では、 |
|
|
boolean |
|
ストリーミング出力を有効にします。Python SDK のみ。Java の場合は |
|
|
boolean |
|
|
|
|
float |
|
出力の多様性をコントロールします。範囲:[0, 2)。 |
|
|
float |
|
ニュークリアスサンプリングのしきい値。範囲:(0, 1.0]。 |
|
|
integer |
|
サンプリング中に候補となるトークンセットを制限します。値が None または 100 より大きい場合、top_k ポリシーは有効にならず、top_p ポリシーのみが有効になります。>= 0 である必要があります。 |
|
|
float |
|
繰り返しシーケンスに対するペナルティ。1.0 より大きい値は繰り返しを減らします。 |
|
|
float |
|
コンテンツの繰り返しをコントロールします。範囲:[-2.0, 2.0]。 |
|
|
integer |
-- |
再現性のある結果を保証します。範囲:[0, 2^31 - 1]。 |
|
|
boolean |
|
|
|
|
integer |
|
ステップごとの最も可能性の高いトークンの数。範囲:[0, 5]。 |
|
|
string または array |
-- |
ストップワードまたはトークン ID。指定された文字列または |
組み込みタスクパラメーター (ocr_options)
組み込みタスクを使用する場合、ocr_options を parameters (HTTP) で渡すか、キーワード引数 (Python SDK) として渡すか、OcrOptions ビルダー (Java SDK) を介して渡します。
|
パラメーター |
型 |
必須 |
説明 |
|
|
string |
はい |
組み込みタスク名。有効な値: |
|
|
object |
いいえ |
|
|
|
object |
いいえ |
抽出するフィールドを指定する JSON オブジェクト。キーはフィールド名、値は精度向上のためのオプションの説明です。最大 3 階層のネストをサポートします。 |
result_schema の例:
"result_schema": {
"invoice_number": "請求書の一意の識別番号。通常は数字と文字の組み合わせです。",
"issue_date": "請求書が発行された日付。YYYY-MM-DD 形式で抽出します。例:2023-10-26。",
"seller_name": "請求書に表示されている販売者の完全な会社名。",
"total_amount": "請求書の合計金額 (税込み)。数値を抽出し、小数点以下 2 桁を保持します。例:123.45。"
}
Java SDK では、このパラメーターはOcrOptionsです。最小 DashScope Python SDK バージョンは 1.22.2 です。最小 Java SDK バージョンは 2.18.4 です。advanced_recognitionの場合、Java SDK >= 2.21.8 が必要です。
応答
DashScope API は、ストリーミング出力と非ストリーミング出力で同一の応答フォーマットを使用します。
{
"status_code": 200,
"request_id": "8f8c0f6e-6805-4056-bb65-d26d66080a41",
"code": "",
"message": "",
"output": {
"text": null,
"finish_reason": null,
"choices": [
{
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": [
{
"ocr_result": {
"kv_result": {
"price_excluding_tax": "230769.23",
"invoice_code": "142011726001",
"organization_code": "null",
"buyer_name": "Cai Yingshi",
"seller_name": "null"
}
},
"text": "```json\n{\n \"price_excluding_tax\": \"230769.23\",\n \"invoice_code\": \"142011726001\",\n \"organization_code\": \"null\",\n \"buyer_name\": \"Cai Yingshi\",\n \"seller_name\": \"null\"\n}\n```"
}
]
}
}
],
"audio": null
},
"usage": {
"input_tokens": 926,
"output_tokens": 72,
"characters": 0,
"image_tokens": 754,
"input_tokens_details": {
"image_tokens": 754,
"text_tokens": 172
},
"output_tokens_details": {
"text_tokens": 72
},
"total_tokens": 998
}
}
|
フィールド |
型 |
説明 |
|
|
string |
|
|
|
string |
一意のリクエスト識別子。Java SDK では、これは |
|
|
string |
エラーコード。成功時は空です。Python SDK のみがこのフィールドを返します。 |
|
|
string |
常に |
|
|
string |
生成中は |
|
|
string |
|
|
|
string |
常に |
|
|
string |
モデルから抽出されたテキストまたはフォーマットされた出力。 |
|
|
object |
組み込みタスク ( |
|
|
object |
キーと値の抽出結果 ( |
|
|
array |
位置データ付きのテキスト行の結果 ( |
|
|
array |
|
|
|
array |
|
|
|
string |
テキスト行のコンテンツ。 |
|
|
object |
|
|
|
integer |
入力トークン数。 |
|
|
integer |
出力トークン数。 |
|
|
integer |
0 に固定。 |
|
|
integer |
|
|
|
integer |
画像入力に対応するトークン。 |
|
|
integer |
画像入力トークン。 |
|
|
integer |
テキスト入力トークン。 |
|
|
integer |
テキスト出力トークン。 |
サポートされているモデル
|
モデル |
説明 |
|
|
Qwen3.5 アーキテクチャに基づいています。より高速で、より正確です。情報抽出、テキストの位置特定、マルチターン対話のサポートが大幅に改善されました。コンテキスト長は 128K に拡張されました。 |
|
|
常に最新バージョンを指します。 |
|
|
最新の日付付きスナップショット。 |
|
|
以前のバージョン。 |
|
|
以前のバージョン。 |
|
|
以前のバージョン。 |
|
|
ベースモデル。 |
エラーコード
モデル呼び出しがエラーを返した場合、問題の解決については「エラーメッセージ」をご参照ください。