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

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

最終更新日:Jun 22, 2026

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

背景情報

インテント認識

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

ユースケース

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

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

ワークフロー

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

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

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

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

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

    評価結果が満足のいくものであれば、クイックスタート を使用してトレーニング済みモデルを EAS オンラインサービスとしてデプロイします。

前提条件

次の項目が完了していることを確認してください:

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

トレーニングデータは、次の 2 つの方法で準備できます:

データ準備戦略

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

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

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

  • インテントの説明は、多様な言い回しとシナリオを幅広く網羅する必要があります。

データフォーマット

トレーニングデータは、instruction フィールドと output フィールドを含む 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 Dataset をクリックし、次の主要なパラメーターを設定します。他のパラメーターの詳細については、「データセットの作成と管理」をご参照ください。

      パラメータ

      説明

      [Storage Type]

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

      [Import Format]

      [File] を選択します。

      [OSS Path]

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

      1. image アイコンをクリックします。[]Select OSS file ダイアログボックスで、Upload File をクリックします。

      2. Browse Local Files または Drag and Drop File to Upload をクリックし、画面の指示に従ってマニフェストファイルをアップロードします。

  2. Data Preparation > iTAG ページに移動し、Go to Management Page をクリックしてから、Template Management タブに切り替えます。

  3. Create Template をクリックし、Custom Template > Basic Templates を選択して、Edit をクリックします。パラメーターを設定した後、Save Template Name をクリックします。次の表に、主要な設定を示します。その他の設定の詳細については、「テンプレート管理」をご参照ください。

    設定

    説明

    Basic template canvas area

    1. Text を選択し、[Generate Content Card] をクリックします。

    2. テキストエリアをクリックします。Import Dataset ダイアログボックスで、既存のデータセットを選択します。次に、右側の [基本テンプレート設定] エリアで、Dataset Field Name > instruction を選択します。

    Basic template answering area

    Input Field を選択し、Generate Title Card をクリックします。次に、Titleoutput に変更します。

  4. 左側のナビゲーションペインで、Management Center > Task Managementを選択します。Task Management タブで、Create Task をクリックします。[アノテーションタスクの作成] ページで、パラメーターを設定し、Create をクリックします。次の表に、主要なパラメーターを示します。他のパラメーターの詳細については、「ラベリングタスクの作成」をご参照ください。

    パラメータ

    説明

    [Input data set]

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

    説明

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

    [Template Type]

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

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

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

    出力マニフェストファイルは、以下の例のようになります。データ形式の詳細については、「ラベル付きデータ形式の概要」をご参照ください。

    {"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 スクリプトを実行し、ラベル付きデータのマニフェストファイルを、クイックスタートで必要なトレーニングデータフォーマットに変換します。

    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. 左側メニューで、Workspaces を選択し、対象のワークスペースをクリックします。

    4. 左側メニューで、QuickStart > [Model Gallery] を選択します。

  2. クイックスタートページで、右側のモデルリストにある [Qwen1.5-1.8B-Chat] モデルカードを見つけてクリックします。

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

    パラメーター

    説明

    [Training Mode]

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

      説明

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

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

    • LoRA:QLoRA と同様に、これは軽量ファインチューニング手法です。

    [Dataset configuration]

    [Training dataset]

    次の手順に従って、訓練データセットを選択してください。

    1. ドロップダウンリストから、OSS file or directory を選択してください。

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

    3. Select OSS File ダイアログボックスで Upload File をクリックし、訓練データセットファイルをドラッグアンドドロップして、OK をクリックしてください。

    [Output Configuration]

    [Model output path]

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

    Tensorboard Output Path

    [Hyperparameter Configuration]

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

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

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

    • global batch size = Number of GPUs * 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

    global batch size

    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. Fine-tune をクリックし、OK ダイアログボックスで Billing Notification をクリックしてください。

    自動的にトレーニングジョブの詳細ページにリダイレクトされます。ジョブが作成されると、そのステータスは [Running] に変わります。ページには、[Creating][Preparing Environment][Running] といったいくつかの段階を経るジョブの進捗が表示されます。事前学習済みモデル [qwen1.5-1.8b-chat]、トレーニング方法 [SFT supervised fine-tuning: LoRA]、ジョブカテゴリ [Generative AI / large language model] などの基本情報が表示されます。[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 = '/path/to/your/finetuned_model/'
    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. Task details ページで、右上の Deploy をクリックします。 システムが基本情報とリソース情報を事前入力します。 Deployment Method[vLLM 高速化デプロイ] を選択します。 これらの設定は必要に応じて変更できます。 パラメーターを設定した後、Deploy をクリックします。

  2. Billing Notification ダイアログボックスで、OK をクリックします。

    デプロイタスクページに自動的にリダイレクトされます。 StatusRunning に変わると、デプロイは成功です。

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

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

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

    1. Service details ページの Basic Information セクションで、View Endpoint Information をクリックします。

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

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

    from openai import OpenAI
    ##### API 設定 #####
    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": "あなたはインテント認識の専門家です。 ユーザーの質問に基づいてそのインテントを特定し、対応するインテントとパラメーターを返すことができます。",
                        }
                    ],
                },
                {
                    "role": "user",
                    "content": [
                        {
                            "type": "text",
                            "text": "音楽を聴きたいです",
                        }
                    ],
                }
            ],
            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> :お使いのサービストークンに置き換えます。

関連ドキュメント