すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:LLM ベースのインテント認識ソリューション

最終更新日:Sep 08, 2026

このソリューションは、大規模言語モデル (LLM) を活用したインテント認識を利用します。膨大なデータセットから複雑な言語パターンとユーザー行動を学習することで、より高精度なインテント認識と、自然で滑らかなユーザーエクスペリエンスを提供します。このガイドでは、Qwen1.5 大規模言語モデルを使用してインテント認識ソリューションを開発する方法について説明します。

背景情報

インテント認識

インテント認識は、AI エージェントが自然言語でユーザーの要求を理解し、対応するアクションを実行したり、関連情報を提供したりできるようにします。これはインテリジェントな対話型システムの重要なコンポーネントです。現在、大規模言語モデル (LLM) に基づくインテント認識技術は、業界で広く使用されています。

ユースケース

  • スマート音声アシスタントでは、ユーザーは簡単な音声コマンドでアシスタントと対話します。たとえば、ユーザーが「音楽を聴きたい」と言った場合、システムは音楽を再生するというインテントを正確に特定し、対応するアクションを実行する必要があります。

  • インテリジェントなカスタマーサービスシナリオでは、多様な顧客からのリクエストを処理し、返品、交換、苦情などの正しいワークフローに正確にルーティングすることが課題となります。たとえば、E コマースプラットフォームで、ユーザーが「受け取った商品に欠陥があります。返品したいです」と言う場合があります。この場合、LLM ベースのインテント認識システムは、ユーザーのインテントを「返品」として迅速に捉え、自動的に返品プロセスを開始し、その後のステップをユーザーに案内する必要があります。

ワークフロー

image
  1. トレーニングデータの準備

    特定のビジネスシナリオ用に、指定されたデータ形式と準備戦略に従ってトレーニングデータセットを準備できます。または、ビジネスデータを準備し、 iTAG を使用して生データにラベルを付けることもできます。ラベル付けした結果をエクスポートし、モデルトレーニングのために PAI-QuickStart でサポートされている形式に変換します。

  2. モデルトレーニングとオフライン評価の実行

    QuickStart で、Qwen1.5-1.8B-Chat に基づいてモデルをトレーニングします。トレーニング後、オフライン評価を実行します。

  3. モデルサービスのデプロイと呼び出し

    評価結果が良好な場合は、QuickStart を使用して学習済みモデルを EAS オンラインサービスとしてデプロイします。

前提条件

以下の作業が完了していることを確認してください。

  • Platform for AI (PAI) (DLC および EAS) の従量課金が有効化されており、デフォルトワークスペースが作成されていること。詳細については、「PAI の有効化とデフォルトワークスペースの作成」をご参照ください。

  • トレーニングデータとモデルファイルを保存するための Object Storage Service (OSS) バケットが作成されていること。バケットの作成方法の詳細については、「コンソールクイックスタート」をご参照ください。

トレーニングデータの準備

トレーニングデータは、次のいずれかの方法で準備できます:

データ準備戦略

モデルトレーニングの効果と安定性を高めるため、データを準備する際は次の戦略に従ってください。

  • 単一インテント認識のシナリオでは、各インテントカテゴリに対して 50~100 件以上のラベル付きサンプルがあることを確認してください。モデルファインチューニング結果が十分でない場合は、ラベル付きデータの量を増やすことを検討してください。また、インテントカテゴリ間でデータのバランスを確保してください。特定のカテゴリだけが他より大幅に多い状態は避けてください。

  • マルチインテントまたはマルチターン対話のシナリオでは、単一インテントのシナリオより 20% 以上多いラベル付きデータを使用してください。さらに、マルチインテントまたはマルチターンのシナリオで使用するインテントは、単一インテントデータにも定義されている必要があります。

  • インテントの説明は、多様な言い回しとシナリオを網羅してください。

データ形式

トレーニングデータは、instructionoutput フィールドを含む JSON ファイルである必要があります。instruction フィールドには入力インストラクションが含まれ、output フィールドにはモデルが予測したインテントとその主要パラメータが含まれます。次の例は、インテント認識の各シナリオにおけるトレーニングデータを示します。

  • 単一インテント認識のシナリオでは、大規模言語モデル (LLM) をファインチューニングするために、業務固有のデータを準備する必要があります。たとえば、スマートホームシナリオにおける単一ターン対話のトレーニングデータ例は次のとおりです:

    [
        {
            "instruction": "I want to listen to music",
            "output": "play_music()"
        },
        {
            "instruction": "It's too loud, turn the volume down",
            "output": "volume_down()"
        },
        {
            "instruction": "I don't want to listen anymore, turn it off",
            "output": "music_exit()"
        },
        {
            "instruction": "I want to travel to Hangzhou, help me check the weather forecast",
            "output": "weather_search(China (Hangzhou))"
        },
    ]
  • マルチインテントまたはマルチターン対話のシナリオでは、ユーザーのインテントが複数ターンの会話にまたがって表現される場合があります。この場合は、マルチターン対話データを準備し、関連するすべてのターンのユーザー入力にラベルを付けることができます。たとえば、音声アシスタントとのマルチターン対話は次のようになります:

    User: I want to listen to music.
    Assistant: What type of music?
    User: Play some *** music for me.
    Assistant: play_music(***)

    このマルチターン対話に対応するトレーニングデータは、次の形式になります:

    [
        {
            "instruction": "I want to listen to music. Play some *** music for me.",
            "output": "play_music(***)"
        }
    ]

マルチターン対話でモデルをトレーニングすると入力長が大幅に増加し、このようなシナリオは実運用では一般的ではありません。単一ターンのインテント認識が業務要件を満たさない場合にのみ、マルチターン対話のトレーニングを検討してください。このソリューションでは、単一ターン対話の例を使用して手順を説明します。

PAI-iTAG を使用したデータのラベリング

または、PAI-iTAG プラットフォームを使用してデータにラベルを付け、必要な形式のトレーニングデータセットを生成します。

  1. ラベリング対象のデータを、iTAG に PAI データセットとして登録します。

    1. データ準備戦略に従って、マニフェスト形式のデータファイルを準備します。例は次のとおりです:

      {"data":{"instruction": "I want to listen to music"}}
      {"data":{"instruction": "It's too loud, turn the volume down"}}
      {"data":{"instruction": "I don't want to listen anymore, turn it off"}}
      {"data":{"instruction": "I want to travel to Hangzhou, help me check the weather forecast"}}
    2. AI Asset Management > Datasets ページに移動し、対象のワークスペースを選択して、[Go to Dataset] をクリックします。

    3. データセットの新規作成 をクリックし、以下の主要パラメータを設定します。その他のパラメータの詳細については、「Create and manage datasets」をご参照ください。

      パラメータ

      説明

      [ストレージクラス]

      Alibaba Cloud Object Storage Service (OSS) を選択します。

      [インポートフォーマット]

      ファイル を選択します。

      [OSS パス]

      既存の OSS ディレクトリを選択し、以下の手順に従って準備したマニフェストファイルをアップロードします。

      1. image アイコンをクリックします。[]OSS ファイルの選択 ダイアログボックスで、ファイルのアップロード をクリックします。

      2. ローカルファイルの表示 または ファイルをドラッグ & ドロップしてアップロード をクリックし、画面の案内に従ってマニフェストファイルをアップロードします。

  2. Data Preparation > iTAG ページに移動し、管理ページへ をクリックしてから、テンプレート管理 タブに切り替えます。

  3. テンプレートの作成 をクリックし、カスタムテンプレート > 基本テンプレート を選択して、編集 をクリックします。パラメータを設定したら、テンプレート名の保存 をクリックします。次の表で、主要な設定について説明します。その他の設定の詳細については、「template management」をご参照ください。

    設定

    説明

    基本テンプレートのキャンバス領域

    1. テキスト を選択し、[Generate Content Card] をクリックします。

    2. テキスト領域をクリックします。データセットのインポート ダイアログボックスで既存のデータセットを選択します。次に、右側の [Basic Template Configuration] エリアで、データセットフィールド名 > [instruction] を選択します。

    基本テンプレートの回答領域

    入力ボックス を選択し、問題カードの生成 をクリックします。次に、タイトル[output] に変更します。

  4. 左側のメニューで 管理センター > タスク管理 を選択します。タスク管理 タブで タスクの作成 をクリックします。[Create Annotation Task] ページでパラメータを設定し、作成 をクリックします。次の表で、主要なパラメータについて説明します。その他のパラメータの詳細については、「Create a labeling task」をご参照ください。

    パラメータ

    説明

    [入力データセット]

    前の手順で作成したデータセットを選択します。

    説明

    入力データが使用中のテンプレートに対応していることを確認してください。

    [テンプレートタイプ]

    カスタムテンプレート を選択し、ドロップダウンリストから作成したテンプレートを選択します。

  5. タスクを作成したら、データのラベリングを開始します。詳細については、「Process labeling tasks」をご参照ください。

  6. データのラベリングが完了したら、結果を OSS ディレクトリにエクスポートします。詳細については、「Export labeled data」をご参照ください。

    出力されるマニフェストファイルは、次の例のようになります:データ形式の詳細については、「Overview of labeled data formats」をご参照ください。

    {"data":{"instruction":"I want to listen to music","_itag_index":""},"label-1947839552568066048-system":{"fixedFlag":0,"results":[{"MarkResultId":"1947839554911772672","MarkTitle":"Basic Template","MarkResult":"{\"tabId\":\"CommonExtensions\",\"annotations\":[{\"id\":null,\"labels\":{\"output\":\"play_music()\"},\"exif\":null}],\"type\":\"CommonExtensions\",\"version\":\"v2\"}","QuestionId":"CommonExtensions","ResultType":"OPEN_GROUP","Progress":null,"Version":"1753236185165","MarkTime":"Wed Jul 23 10:03:05 CST 2025","UserMarkResultId":null,"IsNeedVoteJudge":false}],"abandonFlag":0},"label-1947839552568066048":{"results":[{"MarkResultId":"1947839554911772672","MarkTitle":"Basic Template","MarkResult":"{\"tabId\":\"CommonExtensions\",\"annotations\":[{\"id\":null,\"labels\":{\"output\":\"play_music()\"},\"exif\":null}],\"type\":\"CommonExtensions\",\"version\":\"v2\"}","QuestionId":"CommonExtensions","ResultType":"OPEN_GROUP","Progress":null,"Version":"1753236185165","MarkTime":"Wed Jul 23 10:03:05 CST 2025","UserMarkResultId":"1947839763671740416","IsNeedVoteJudge":false}]},"abandonFlag":0,"abandonRemark":null}
    {"data":{"instruction":"It's too loud, turn the volume down","_itag_index":""},"label-1947839552568066048-system":{"fixedFlag":0,"results":[{"MarkResultId":"1947839554891464704","MarkTitle":"Basic Template","MarkResult":"{\"tabId\":\"CommonExtensions\",\"annotations\":[{\"id\":null,\"labels\":{\"output\":\"volume_down()\"},\"exif\":null}],\"type\":\"CommonExtensions\",\"version\":\"v2\"}","QuestionId":"CommonExtensions","ResultType":"OPEN_GROUP","Progress":null,"Version":"1753236198979","MarkTime":"Wed Jul 23 10:03:19 CST 2025","UserMarkResultId":null,"IsNeedVoteJudge":false}],"abandonFlag":0},"label-1947839552568066048":{"results":[{"MarkResultId":"1947839554891464704","MarkTitle":"Basic Template","MarkResult":"{\"tabId\":\"CommonExtensions\",\"annotations\":[{\"id\":null,\"labels\":{\"output\":\"volume_down()\"},\"exif\":null}],\"type\":\"CommonExtensions\",\"version\":\"v2\"}","QuestionId":"CommonExtensions","ResultType":"OPEN_GROUP","Progress":null,"Version":"1753236198979","MarkTime":"Wed Jul 23 10:03:19 CST 2025","UserMarkResultId":"1947839868520656896","IsNeedVoteJudge":false}]},"abandonFlag":0,"abandonRemark":null}
    {"data":{"instruction":"I don't want to listen anymore, turn it off","_itag_index":""},"label-1947839552568066048-system":{"fixedFlag":0,"results":[{"MarkResultId":"1947839554992373760","MarkTitle":"Basic Template","MarkResult":"{\"tabId\":\"CommonExtensions\",\"annotations\":[{\"id\":null,\"labels\":{\"output\":\"music_exit()\"},\"exif\":null}],\"type\":\"CommonExtensions\",\"version\":\"v2\"}","QuestionId":"CommonExtensions","ResultType":"OPEN_GROUP","Progress":null,"Version":"1753236212152","MarkTime":"Wed Jul 23 10:03:32 CST 2025","UserMarkResultId":null,"IsNeedVoteJudge":false}],"abandonFlag":0},"label-1947839552568066048":{"results":[{"MarkResultId":"1947839554992373760","MarkTitle":"Basic Template","MarkResult":"{\"tabId\":\"CommonExtensions\",\"annotations\":[{\"id\":null,\"labels\":{\"output\":\"music_exit()\"},\"exif\":null}],\"type\":\"CommonExtensions\",\"version\":\"v2\"}","QuestionId":"CommonExtensions","ResultType":"OPEN_GROUP","Progress":null,"Version":"1753236212152","MarkTime":"Wed Jul 23 10:03:32 CST 2025","UserMarkResultId":"1947839936657285120","IsNeedVoteJudge":false}]},"abandonFlag":0,"abandonRemark":null}
    {"data":{"instruction":"I want to travel to Hangzhou, help me check the weather forecast","_itag_index":""},"label-1947839552568066048-system":{"fixedFlag":0,"results":[{"MarkResultId":"1947839554971426816","MarkTitle":"Basic Template","MarkResult":"{\"tabId\":\"CommonExtensions\",\"annotations\":[{\"id\":null,\"labels\":{\"output\":\"weather_search(China (Hangzhou))\"},\"exif\":null}],\"type\":\"CommonExtensions\",\"version\":\"v2\"}","QuestionId":"CommonExtensions","ResultType":"OPEN_GROUP","Progress":null,"Version":"1753236218730","MarkTime":"Wed Jul 23 10:03:39 CST 2025","UserMarkResultId":null,"IsNeedVoteJudge":false}],"abandonFlag":0},"label-1947839552568066048":{"results":[{"MarkResultId":"1947839554971426816","MarkTitle":"Basic Template","MarkResult":"{\"tabId\":\"CommonExtensions\",\"annotations\":[{\"id\":null,\"labels\":{\"output\":\"weather_search(China (Hangzhou))\"},\"exif\":null}],\"type\":\"CommonExtensions\",\"version\":\"v2\"}","QuestionId":"CommonExtensions","ResultType":"OPEN_GROUP","Progress":null,"Version":"1753236218730","MarkTime":"Wed Jul 23 10:03:39 CST 2025","UserMarkResultId":"1947839975890939904","IsNeedVoteJudge":false}]},"abandonFlag":0,"abandonRemark":null}
  7. ターミナルで、以下の Python スクリプトを実行し、ラベル付きデータのマニフェストファイルを、QuickStart に必要なトレーニングデータ形式に変換します。

    import json
    # 入力ファイルと出力ファイルのパス
    input_file_path = 'test_json.manifest'
    output_file_path = 'train.json'
    converted_data = []
    with open(input_file_path, 'r', encoding='utf-8') as file:
        for line in file:
            try:
                # 各行の JSON データを解析
                data = json.loads(line)
                # instruction を抽出
                instruction = data['data']['instruction']
                # "label-" で始まるすべてのキーを反復処理
                for key in data.keys():
                    if key.startswith('label-'):
                        # MarkResult を抽出して内容を解析
                        mark_result_str = data[key]['results'][0]['MarkResult']
                        mark_result = json.loads(mark_result_str)  # MarkResult 文字列を JSON として解析
                        # annotations から labels["output"] を抽出
                        output = mark_result['annotations'][0]['labels']['output']
                        # 新しいデータ構造を作成
                        converted_data.append({
                            'instruction': instruction,
                            'output': output
                        })
                        break
            except Exception as e:
                print(f"Error processing line: {line.strip()}. Error: {e}")
    # 変換後データを出力ファイルに書き込み
    with open(output_file_path, 'w', encoding='utf-8') as outfile:
        json.dump(converted_data, outfile, ensure_ascii=False, indent=4)
    print(f"Conversion completed. Output saved to {output_file_path}")
    

モデルのトレーニングと評価

モデルのトレーニング

クイックスタートでは、オープンソースの AI コミュニティから優れた事前学習済みモデルを提供しています。コードを一切記述することなく、トレーニングからデプロイ、推論までのモデル開発ワークフロー全体を管理できます。

このガイドでは、Qwen1.5-1.8B-Chat モデルを例に、クイックスタートでトレーニングデータを使用してモデルをトレーニングする方法を説明します。手順は次のとおりです:

  1. モデルギャラリーページに移動します。

    1. PAI コンソールにログインします。

    2. 左上隅で、リージョンを選択します。

    3. 左側メニューで、ワークスペース一覧 を選択し、対象のワークスペースをクリックします。

    4. 左側メニューで、クイックスタート > [Model Gallery] を選択します。

  2. クイックスタートページで、右側のモデルリストから Qwen1.5-1.8B-Chat モデルカードをクリックします。

  3. モデル詳細ページで、右上隅の トレーニング をクリックします。トレーニング パネルで、以下の主要なパラメーターを設定し、残りはデフォルト値のままにします。

    パラメーター

    説明

    [トレーニング方法]

    • フルパラメータファインチューニング:この方法はリソースを大量に消費し、時間もかかりますが、一般的にはより良い結果が得られます。

      説明

      パラメーター数の少ないモデルは、フルパラメータファインチューニングに対応しています。特定の要件に基づいてこの方法を選択してください。

    • QLoRA:フルパラメータファインチューニングよりも少ないリソースとトレーニング時間で済む軽量ファインチューニング方法ですが、結果は最適ではない場合があります。

    • LoRA:QLoRA と同様の軽量なファインチューニング方法です。

    [データセットの設定]

    [訓練データセット]

    以下の手順に従って、トレーニングデータセットを選択します。

    1. ドロップダウンリストから、OSS ファイルまたはディレクトリ を選択します。

    2. 参照 image アイコンをクリックして、OSS ディレクトリを選択します。

    3. OSS ファイルの選択 ダイアログボックスで ファイルのアップロード をクリックし、トレーニングデータセットファイルをドラッグアンドドロップして、OK をクリックします。

    [出力設定]

    [モデルの出力パス]

    トレーニングジョブによって生成された設定ファイルとモデルファイルを保存する OSS ディレクトリを選択します。

    TensorBoard 出力パス

    [ハイパーパラメータの構成]

    すべてのハイパーパラメーターの詳細な説明については、「表 1. ハイパーパラメーター」をご参照ください。

    以下の戦略を使用してハイパーパラメーターを設定します。さまざまなトレーニング方法に推奨される主要なハイパーパラメーター設定については、「表 2. 推奨されるハイパーパラメーター」をご参照ください。

    • 選択したトレーニング方法に基づいてハイパーパラメーターを設定していることを確認してください。

    • グローバルバッチサイズ = GPU 数 * per_device_train_batch_size * gradient_accumulation_steps

      • トレーニングパフォーマンスを最大化するには、GPU 数と per_device_train_batch_size の増加を優先してください。

      • 通常、グローバルバッチサイズは 64 から 256 の間の値に設定します。トレーニングデータセットが非常に小さい場合は、より小さな値を使用できます。

    • シーケンス長 (seq_length) は、特定のシナリオに基づいて調整できます。たとえば、データセットの最大シーケンス長が 50 の場合、シーケンス長を 64 (通常は 2 のべき乗) に設定できます。

    • トレーニング損失の減少が遅すぎる、または収束しない場合は、学習率 (learning_rate) を上げることを検討してください。また、トレーニングデータの品質も確認してください。

    表 1. ハイパーパラメーター

    パラメーター

    タイプ

    説明

    デフォルト

    learning_rate

    浮動小数点数

    モデルトレーニングの学習率。

    5e-5

    num_train_epochs

    整数

    トレーニングエポック数。

    1

    per_device_train_batch_size

    整数

    各 GPU のトレーニングバッチサイズ。

    1

    seq_length

    整数

    モデル入力の最大シーケンス長。

    128

    lora_dim

    整数

    LoRA ディメンション。lora_dim > 0 の場合、LoRA または QLoRA を使用した軽量ファインチューニングを使用します。

    32

    lora_alpha

    整数

    LoRA スケーリング係数。このパラメーターは、lora_dim > 0 の場合に LoRA または QLoRA の軽量ファインチューニングで有効です。

    32

    load_in_4bit

    ブール値

    true の場合、ベースモデルを 4 ビット精度でロードします。これにより、lora_dim > 0 かつ load_in_8bit が false の場合に 4 ビット QLoRA が有効になります。

    false

    load_in_8bit

    ブール値

    true の場合、ベースモデルを 8 ビット精度でロードします。これにより、lora_dim > 0 かつ load_in_4bit が false の場合に 8 ビット QLoRA が有効になります。

    false

    gradient_accumulation_steps

    整数

    勾配累積ステップ数。

    8

    apply_chat_template

    ブール値

    アルゴリズムがモデルのデフォルトのチャットテンプレートをトレーニングデータに追加するかどうかを指定します。Qwen1.5 シリーズモデルの場合、形式は次のとおりです:

    • 質問: <|im_start|>user\n + instruction + <|im_end|>\n

    • 回答: <|im_start|>assistant\n + output + <|im_end|>\n

    true

    system_prompt

    文字列

    モデルトレーニングのデフォルトのシステムプロンプト。このパラメーターは、apply_chat_template が true に設定されている場合に有効になります。Qwen1.5 シリーズモデルをトレーニングする場合、カスタムの system_prompt を設定して、大規模言語モデルに特定の役割を割り当てることができます。アルゴリズムはトレーニングデータを自動的に拡張するため、詳細を管理する必要はありません。たとえば、system_prompt を "You are an expert in intent recognition. You can identify the user's intent from their question and return the corresponding function calling and parameters." に設定した場合、次のトレーニングサンプルのようになります:

    [
        {
            "instruction": "I want to listen to music",
            "output": "play_music()"
        }
    ]

    トレーニングに使用される実際のデータは、次のようにフォーマットされます:

    <|im_start|>system\nYou are an expert in intent recognition. You can identify the user's intent from their question and return the corresponding function calling and parameters<|im_end|>\n<|im_start|>user\nI want to listen to music<|im_end|>\n<|im_start|>assistant\nplay_music()<|im_end|>\n

    You are a helpful assistant

    表 2. 推奨されるハイパーパラメーター

    パラメーター

    フルパラメータファインチューニング

    LoRA/QLoRA

    learning_rate

    5e-6, 5e-5

    3e-4

    グローバルバッチサイズ

    256

    256

    seq_length

    256

    256

    num_train_epochs

    3

    5

    lora_dim

    0

    64

    lora_alpha

    0

    16

    load_in_4bit

    false

    true/false

    load_in_8bit

    false

    true/false

  4. トレーニング をクリックし、課金通知 ダイアログボックスで OK をクリックします。

    トレーニングジョブの詳細ページに自動的にリダイレクトされます。ジョブが作成されると、そのステータスは [Running] に変わります。ページには、[Creating][Preparing Environment][Running] といったいくつかのステージを通じたジョブの進行状況が表示されます。事前学習済みモデル Qwen1.5-1.8B-Chat、トレーニング方法 SFT 教師ありファインチューニング:LoRA、ジョブカテゴリ:生成 AI / 大規模言語モデルなどの基本情報が表示されます。[Task Details][Task Log][Task Monitoring] タブで、入力パス、出力パス、ハイパーパラメーター設定などの詳細を表示できます。

モデルの評価

トレーニングが完了したら、ターミナルで Python スクリプトを実行してモデルのパフォーマンスを評価できます。

  1. testdata.json という名前の評価データファイルを準備します。以下に例を示します:

    [
        {
            "instruction": "Who sings the song 'Ten Years'?",
            "output": "music_query_player(Ten Years)"
        },
        {
            "instruction": "What's the weather like in Hangzhou today?",
            "output": "weather_search(Hangzhou)"
        }
    ]
  2. ターミナルで次の Python スクリプトを実行して、モデルをオフラインで評価します。

    #encoding=utf-8
    from transformers import AutoModelForCausalLM, AutoTokenizer
    import json
    from tqdm import tqdm
    device = "cuda" # モデルのロード先デバイス
    # モデルのパス。実際のモデル出力パスに置き換える必要があります。
    model_name = 'YOUR_MODEL_OUTPUT_PATH'
    print(model_name)
    model = AutoModelForCausalLM.from_pretrained(
        model_name,
        torch_dtype="auto",
        device_map="auto"
    )
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    count = 0
    ecount = 0
    # 評価データパスを変更
    test_data = json.load(open('/mnt/workspace/data/testdata.json'))
    system_prompt = 'You are an expert in intent recognition. You can identify the user\'s intent from their question and return the corresponding function calling and parameters.'
    for i in tqdm(test_data[:]):
        prompt = '<|im_start|>system\n' + system_prompt + '<|im_end|>\n<|im_start|>user\n' + i['instruction'] + '<|im_end|>\n<|im_start|>assistant\n'
        gold = i['output']
        gold = gold.split(';')[0] if ';' in gold else gold
        model_inputs = tokenizer([prompt], return_tensors="pt").to(device)
        generated_ids = model.generate(
            model_inputs.input_ids,
            max_new_tokens=64,
            pad_token_id=tokenizer.eos_token_id,
            eos_token_id=tokenizer.eos_token_id,
            do_sample=False
        )
        generated_ids = [
            output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
        ]
        pred = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
        if gold.split('(')[0] == pred.split('(')[0]:
            count += 1
            gold_list = set(gold.strip()[:-1].split('(')[1].split(','))
            pred_list = set(pred.strip()[:-1].split('(')[1].split(','))
            if gold_list == pred_list:
                ecount += 1
        else:
            pass
    print("インテント認識の精度:", count/len(test_data))
    print("パラメーター認識の精度:", ecount/len(test_data))
    説明

    コードの実行で Using low_cpu_mem_usage=True or a device_map requires Accelerate: pip install accelerate というメッセージが返された場合は、pip install accelerate を実行して必要な依存関係をインストールしてください。

モデルサービスのデプロイと呼び出し

モデルサービスのデプロイ

モデルの評価結果が期待に沿うものであれば、モデルを EAS オンラインサービスとしてデプロイできます。

  1. タスク詳細 ページで、右上隅の デプロイメント をクリックします。システムは デプロイメント方式 とリソース情報を自動入力します。デプロイメント方式 で、[vLLM 高速デプロイ] を選択します。必要に応じてこれらの設定を変更できます。パラメーターを設定した後、デプロイメント をクリックします。

  2. 課金通知 ダイアログボックスで、OK をクリックします。

    システムは自動的にデプロイメントタスクページにリダイレクトします。ステータス が「[実行中]」に変わると、デプロイメントは成功です。

モデルサービスの呼び出し

以下の例は、クライアントから API を呼び出す方法を示しています。

  1. エンドポイントとトークンを取得します。

    1. サービスの詳細 ページの 基本情報 セクションで、エンドポイント情報の表示 をクリックします。

    2. 呼び出し情報 ダイアログボックスで、エンドポイントとトークンを見つけて、ローカルに保存します。

  2. 以下は [vLLM 高速デプロイ] のコード例です。ターミナルでこのコードを実行して、サービスを呼び出します。

    from openai import OpenAI
    ##### API Configuration #####
    openai_api_key = "<YOUR_EAS_SERVICE_TOKEN>"
    openai_api_base = "<YOUR_EAS_SERVICE_ENDPOINT>/v1/"
    client = OpenAI(
        api_key=openai_api_key,
        base_url=openai_api_base,
    )
    models = client.models.list()
    model = models.data[0].id
    print(model)
    def main():
        stream = True
        chat_completion = client.chat.completions.create(
            messages=[
                 {
                    "role": "system",
                    "content": [
                        {
                            "type": "text",
                            "text": "You are an expert in intent recognition. You can identify the user's intent based on their question and return the corresponding intent and parameters.",
                        }
                    ],
                },
                {
                    "role": "user",
                    "content": [
                        {
                            "type": "text",
                            "text": "I want to listen to music",
                        }
                    ],
                }
            ],
            model=model,
            max_completion_tokens=2048,
            stream=stream,
        )
        if stream:
            for chunk in chat_completion:
                print(chunk.choices[0].delta.content, end="")
        else:
            result = chat_completion.choices[0].message.content
            print(result)
    if __name__ == "__main__":
        main()
    

    各項目の説明:

    • <YOUR_EAS_SERVICE_ENDPOINT>:サービスエンドポイントに置き換えます。

    • <YOUR_EAS_SERVICE_TOKEN>:サービストークンに置き換えます。

関連ドキュメント