アシスタント API は、開発者に会話メッセージとツールの管理のためのツールスイートを提供します。このトピックでは、ペイントアシスタントをゼロから作成する手順を通して、アシスタント API の基本的なコーディング手法について説明します。
一般的なプロセス
アシスタントを開発するための一般的なプロセスは次のとおりです。
アシスタントを作成する: アシスタントを作成する際には、モデルを選択し、命令を入力し、コードインタープリター関数呼び出しなどのツールを追加します。
スレッドを作成する: ユーザーが会話を開始したときに会話の連続性を維持するために、セッションスレッドを開始します。
スレッドにメッセージを送信する: セッションスレッドにユーザーメッセージを 1 つずつ追加します。
実行を開始する: セッションスレッドでアシスタントを実行します。メッセージを解釈し、適切なツールまたはサービスを使用し、応答を生成し、ユーザーに応答を配信します。
シナリオ例
テキスト生成モデルだけでは画像を生成できません。代わりに、テキストを画像に変換するには、テキストから画像へのモデルが必要です。アシスタント API で構築されたアシスタントは、ユーザーが提供したプロンプトを自動的に改善しテキストから画像へのツールを使用して高品質の画像を作成できます。
手順
次のセクションは、非ストリーミング出力モードの Python の包括的なガイドです。Python と Java のストリーミング出力と非ストリーミング出力の両方の完全なサンプルコードは、このトピックの最後に示されています。詳細については、「完全なサンプルコード」をご参照ください。
ステップ 1: 開発環境を準備する
|
|
ステップ 2: アシスタントを作成するDashScope SDK をインポートした後、assistant クラスの create メソッドを使用してアシスタントを作成します。次の主要なパラメーターを指定します。
テキストから画像へのツールは高度な言語理解能力を必要とするため、アシスタントの意味理解とテキスト生成能力を強化するために、テキスト推論モデルとして Qwen-Max が選択されています。 アシスタントの名前、機能の説明、命令などの詳細は、サンプルコードに表示されます。 アシスタントがテキストの説明に基づいて画像を自動的に生成できるように、公式プラグインの 画像生成 が構成されています。 |
|
ステップ 3: スレッドを作成するアシスタント API では、スレッドは連続した会話コンテキストを表します。 アシスタントはスレッドを使用して会話コンテキストを理解し、より一貫性のある関連性の高い応答を提供します。 以下をお勧めします。
ペイントアシスタントのシナリオでは、スレッドは次のプロセス全体を追跡します。
これにより、プロセスの一貫性と追跡可能性が確保されます。 |
|
ステップ 4: スレッドにメッセージを追加するユーザーからの入力メッセージは、message オブジェクトを介して渡されます。アシスタント API は、単一のスレッドに複数のメッセージを送信することをサポートしています。メッセージを作成する際には、次のパラメーターを指定します。
スレッドが受信できるトークンの数に制限はありません。ただし、モデルに渡されるトークンは、モデルの最大入力長に制限されています。詳細については、「商用 Qwen モデル」をご参照ください。 ペイントアシスタントのシナリオでは、message クラスを作成し、スレッドに「ラグドールキャットの絵を描いてください。」を送信します。 説明 Messages.create() メソッドは、メッセージをスレッドに自動的に追加し、実行後にバックグラウンド処理をトリガーして、メッセージの作成と送信の両方の操作を同時に行います。これは API のデフォルトの動作です。 |
|
ステップ 5: 実行を作成して実行するメッセージが特定のスレッドに割り当てられた後、実行を開始してアシスタントをアクティブにします。アシスタントは、指定されたモデルとプラグインをインテリジェントに使用して、コンテキストに基づいて質問に答えます。次に、アシスタントは応答をスレッドのメッセージシーケンスに挿入します。 次の手順を実行します。
説明 複数のユーザーがモデルを同時に使用すると、処理時間が長くなる可能性があるため、処理を続行する前に状態が「完了」になるまで待機することをお勧めします。 |
|
完全なサンプルコード
非ストリーミング出力
import dashscope
from http import HTTPStatus
import json
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
def check_status(component, operation):
if component.status_code == HTTPStatus.OK:
print(f"{operation} 成功しました。")
return True
else:
print(f"{operation} 失敗しました。状態コード: {component.status_code}、エラーコード: {component.code}、エラーメッセージ: {component.message}")
return False
# 1. ペイントアシスタントを作成します
painting_assistant = dashscope.Assistants.create(
# モデルリスト: https://www.alibabacloud.com/help/en/model-studio/getting-started/models
model='qwen-max',
name='Art Maestro',
description='絵画と芸術の知識のための AI アシスタント',
instructions='''絵画技法、美術史、創造的なガイダンスに関する情報を提供します。
画像生成ツールを使用します。''',
tools=[
{'type': 'text_to_image', 'description': '視覚的な例を作成するため'}
]
)
if not check_status(painting_assistant, "アシスタントの作成"):
exit()
# 2. 新しいスレッドを作成します
thread = dashscope.Threads.create()
if not check_status(thread, "スレッドの作成"):
exit()
# 3. スレッドにメッセージを送信します
message = dashscope.Messages.create(thread.id, content='ラグドールキャットの絵を描いてください。')
if not check_status(message, "メッセージの作成"):
exit()
# 4. スレッドでアシスタントを実行します
run = dashscope.Runs.create(thread.id, assistant_id=painting_assistant.id)
if not check_status(run, "実行の作成"):
exit()
# 5. 実行が完了するまで待機します
print("アシスタントがリクエストを処理するのを待機しています...")
run = dashscope.Runs.wait(run.id, thread_id=thread.id)
if check_status(run, "実行の完了"):
print(f"実行が完了しました。状態: {run.status}")
else:
print("実行が完了しませんでした。")
exit()
# 6. アシスタントの応答を取得して表示します
messages = dashscope.Messages.list(thread.id)
if check_status(messages, "メッセージの取得"):
if messages.data:
# 最後のメッセージ (アシスタントの応答) の内容を表示します
last_message = messages.data[0]
print("\nアシスタントの応答:")
print(json.dumps(last_message, ensure_ascii=False, default=lambda o: o.__dict__, sort_keys=True, indent=4))
else:
print("スレッドにメッセージが見つかりませんでし。")
else:
print("アシスタントの応答の取得に失敗しました。")
# 注: このコードは、ペイントアシスタントを作成し、ラグドールキャットを描くことについての会話を開始し、アシスタントの応答を表示します。
package com.example;
import java.util.Arrays;
import com.alibaba.dashscope.protocol.Protocol;
import com.alibaba.dashscope.assistants.Assistant;
import com.alibaba.dashscope.assistants.AssistantParam;
import com.alibaba.dashscope.assistants.Assistants;
import com.alibaba.dashscope.common.GeneralListParam;
import com.alibaba.dashscope.common.ListResult;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.InvalidateParameter;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.threads.AssistantThread;
import com.alibaba.dashscope.threads.ThreadParam;
import com.alibaba.dashscope.threads.Threads;
import com.alibaba.dashscope.threads.messages.Messages;
import com.alibaba.dashscope.threads.messages.TextMessageParam;
import com.alibaba.dashscope.threads.messages.ThreadMessage;
import com.alibaba.dashscope.threads.runs.Run;
import com.alibaba.dashscope.threads.runs.RunParam;
import com.alibaba.dashscope.threads.runs.Runs;
import com.alibaba.dashscope.tools.T2Image.Text2Image;
import com.alibaba.dashscope.tools.search.ToolQuarkSearch;
import com.alibaba.dashscope.utils.Constants;
public class PaintingAssistant {
static {
Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
}
private static boolean checkStatus(Object response, String operation) {
if (response != null) {
System.out.println(operation + " 成功しました。");
return true;
} else {
System.out.println(operation + " 失敗しました。");
return false;
}
}
public static void main(String[] args) {
try {
// 1. ペイントアシスタントを作成します
Assistants assistants = new Assistants();
AssistantParam assistantParam = AssistantParam.builder()
// モデルリスト: https://www.alibabacloud.com/help/en/model-studio/getting-started/models
.model("qwen-max")
.name("Art Maestro")
.description("絵画と芸術の知識のための AI アシスタント")
.instructions("絵画技法、美術史、創造的なガイダンスに関する情報を提供します。調査と画像生成にツールを使用します。")
.tools(Arrays.asList(ToolQuarkSearch.builder().build(),Text2Image.builder().build()))
.build();
Assistant paintingAssistant = assistants.create(assistantParam);
if (!checkStatus(paintingAssistant, "アシスタントの作成")) {
System.exit(1);
}
// 2. 新しいスレッドを作成します
Threads threads = new Threads();
AssistantThread thread = threads.create(ThreadParam.builder().build());
if (!checkStatus(thread, "スレッドの作成")) {
System.exit(1);
}
// 3. スレッドにメッセージを送信します
Messages messages = new Messages();
ThreadMessage message = messages.create(thread.getId(),
TextMessageParam.builder()
.role("user")
.content("ラグドールキャットの絵を描いてください。")
.build());
if (!checkStatus(message, "メッセージの作成")) {
System.exit(1);
}
// 4. スレッドでアシスタントを実行します
Runs runs = new Runs();
RunParam runParam = RunParam.builder().assistantId(paintingAssistant.getId()).build();
Run run = runs.create(thread.getId(), runParam);
if (!checkStatus(run, "実行の作成")) {
System.exit(1);
}
// 5. 実行が完了するまで待機します
System.out.println("アシスタントがリクエストを処理するのを待機しています...");
while (true) {
if (run.getStatus().equals(Run.Status.COMPLETED) ||
run.getStatus().equals(Run.Status.FAILED) ||
run.getStatus().equals(Run.Status.CANCELLED) ||
run.getStatus().equals(Run.Status.REQUIRES_ACTION) ||
run.getStatus().equals(Run.Status.EXPIRED)) {
break;
}
Thread.sleep(1000);
run = runs.retrieve(thread.getId(), run.getId());
}
if (checkStatus(run, "実行の完了")) {
System.out.println("実行が完了しました。状態: " + run.getStatus());
} else {
System.out.println("実行が完了しませんでした。");
System.exit(1);
}
// 6. アシスタントの応答を取得して表示します
ListResult<ThreadMessage> messagesList = messages.list(thread.getId(), GeneralListParam.builder().build());
if (checkStatus(messagesList, "メッセージの取得")) {
if (!messagesList.getData().isEmpty()) {
// 最後のメッセージ (アシスタントの応答) を表示します
ThreadMessage lastMessage = messagesList.getData().get(0);
System.out.println("\nアシスタントの応答:");
System.out.println(lastMessage.getContent());
} else {
System.out.println("スレッドにメッセージが見つかりませんでした。");
}
} else {
System.out.println("アシスタントの応答の取得に失敗しました。");
}
} catch (ApiException | NoApiKeyException | InputRequiredException | InvalidateParameter | InterruptedException e) {
e.printStackTrace();
}
}
}
ストリーミング出力
現在、Java SDK はストリーミング出力モードでの画像生成ツールをサポートしていません。
import dashscope
from http import HTTPStatus
import json
import sys
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
def check_status(response, operation):
if response.status_code == HTTPStatus.OK:
print(f"{operation} 成功しました。")
return True
else:
print(f"{operation} 失敗しました。状態コード: {response.status_code}、エラーコード: {response.code}、エラーメッセージ: {response.message}")
sys.exit(response.status_code)
# 1. ペイントアシスタントを作成します
def create_painting_assistant():
return dashscope.Assistants.create(
model='qwen-max',
name='Art Maestro',
description='絵画と芸術の知識のための AI アシスタント',
instructions='''絵画技法、美術史、創造的なガイダンスに関する情報を提供します。
調査と画像生成にツールを使用します。''',
tools=[
{'type': 'text_to_image', 'description': '視覚的な例を作成するため'}
]
)
if __name__ == '__main__':
# ペイントアシスタントを作成します
painting_assistant = create_painting_assistant()
print(painting_assistant)
check_status(painting_assistant, "アシスタントの作成")
# 初期メッセージを含む新しいスレッドを作成します
thread = dashscope.Threads.create(
messages=[{
'role': 'user',
'content': 'ラグドールキャットの絵を描いてください。'
}]
)
print(thread)
check_status(thread, "スレッドの作成")
# ストリーミング実行を作成します
run_iterator = dashscope.Runs.create(
thread.id,
assistant_id=painting_assistant.id,
stream=True
)
# イベントとメッセージを反復処理します
print("リクエストを処理しています...")
for event, msg in run_iterator:
print(event)
print(msg)
# アシスタントの応答を取得して表示します
messages = dashscope.Messages.list(thread.id)
check_status(messages, "メッセージの取得")
print("\nアシスタントの応答:")
print(json.dumps(messages, ensure_ascii=False, default=lambda o: o.__dict__, sort_keys=True, indent=4))
# 注: このスクリプトは、ストリーミングペイントアシスタントを作成し、ラグドールキャットを描くことについての会話を開始し、アシスタントの応答をリアルタイムで表示します。
次のステップ
パラメーターの詳細については、「アシスタント API」をご参照ください。