カスタムチャットテンプレートとトーケナイザーの処理 - Amazon Bedrock

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

カスタムチャットテンプレートとトーケナイザーの処理

カスタムチャットテンプレートとトークナイザは、会話入力を適切にフォーマットし、インポートされたモデルでトークン生成を管理するために不可欠なコンポーネントです。カスタムモデルインポートは、マルチターン会話の構造とトークン化方法を定義するカスタムチャットテンプレートを使用したモデルのインポートをサポートします。

カスタムチャットテンプレートを使用したモデルのインポート

カスタムチャットテンプレートを使用してモデルをインポートする場合は、主要なカスタムモデルインポートドキュメントで説明されているベストプラクティスに従ってください。これには、モデルの重みを安全なテンソル形式で取り込むことや、必要なすべての設定ファイルを提供することが含まれます。

チャットテンプレートの形式要件

モデルがカスタムチャットテンプレートを使用していて、そのテンプレートを Amazon Bedrock で使用する場合は、チャットテンプレートファイルを次のいずれかの形式で含める必要があります。

  • chat_template.jinja — メッセージのフォーマット方法を定義する Jinja2-basedテンプレートファイル。

  • chat_template.json — チャットテンプレートを文字列値として含む JSON ファイル。

  • tokenizer_config.json 埋め込みチャットテンプレートを使用 — または、チャットテンプレートを chat_template フィールドとして tokenizer_config.json ファイルに直接含めることができます。例については、Hugging Face のHermes-2-Pro tokenizer_config.json」を参照してください。

カスタムモデルインポートは、インポートプロセス中にこれらのファイルを自動的に処理し、正しいディレクトリに含めます。

チャットテンプレートの優先順位

複数のチャットテンプレートソースを指定すると、Amazon Bedrock は次の優先順位ルールを適用します。

  1. 個別のチャットテンプレートファイルが優先される — 個別のチャットテンプレートファイル (chat_template.jinja または chat_template.json) と のchat_templateフィールドの両方を含めるとtokenizer_config.json、個別のファイルが使用され、 に埋め込まれたテンプレートは無視tokenizer_config.jsonされます。

  2. フォールバックとしての埋め込みテンプレート — 別のチャットテンプレートファイルを指定しない場合、Amazon Bedrock は存在するtokenizer_config.json場合は の chat_templateフィールドを使用します。

警告

1 つのアプローチを選択する: 混乱を避け、予測可能な動作を確保するために、これらのアプローチのうち 1 つのみを使用することを強くお勧めします。

  • オプション 1:chat_templateフィールドを含めずに、個別のチャットテンプレートファイル (chat_template.jinja または chat_template.json) を指定しますtokenizer_config.json

  • オプション 2: chat_templateフィールドを に直接含めtokenizer_config.json、個別のテンプレートファイルを提供しません。

カスタムツールテンプレートまたは複雑なチャットテンプレート設定がある場合は、オプション 2 ( にテンプレートを埋め込むtokenizer_config.json) を使用することをお勧めします。これにより、単一の設定ファイル内で複数の名前付きテンプレート (「デフォルト」や「tool_use」など) を定義できます。

注記

チャットテンプレートファイルは、Hugging Face の形式と命名規則に従う必要があります。テンプレートがTransformersライブラリと互換性があることを確認します。

チャットテンプレート形式の例

サポートされている 2 つのチャットテンプレート形式の例を次に示します。

Jinja Format (chat_template.jinja)

Jinja2-basedチャットテンプレートの簡単な例:

{% for message in messages %} {% if loop.first and message['role'] != 'system' %} <|im_start|>system You are a helpful assistant.<|im_end|> {% endif %} <|im_start|>{{ message['role'] }} {{ message['content'] }}<|im_end|> {% endfor %} {% if add_generation_prompt %} <|im_start|>assistant {% endif %}

完全な例については、Hugging Face のGPT-OSSチャットテンプレートを参照してください。

JSON Format (chat_template.json)

ビジョンをサポートする JSON ベースのチャットテンプレートの簡単な例:

{ "chat_template": "{% for message in messages %}{% if loop.first and message['role'] != 'system' %}<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n{% endif %}<|im_start|>{{ message['role'] }}\n{% if message['content'] is string %}{{ message['content'] }}<|im_end|>\n{% else %}{% for content in message['content'] %}{% if content['type'] == 'image' %}<|vision_start|><|image_pad|><|vision_end|>{% elif 'text' in content %}{{ content['text'] }}{% endif %}{% endfor %}<|im_end|>\n{% endif %}{% endfor %}{% if add_generation_prompt %}<|im_start|>assistant\n{% endif %}" }

マルチモーダルサポートの完全な例については、Hugging Face のQwen2-VLチャットテンプレートを参照してください。

重要

チャットテンプレートファイルが、上記の例に示す正確な命名規則 (chat_template.jinja または chat_template.json) と形式に従っていることを確認します。テンプレートの形式が正しくないと、インポートまたは推論が失敗する可能性があります。

カスタムチャットテンプレートを使用したモデルの呼び出し

カスタムチャットテンプレートを使用してモデルをインポートすると、適切にフォーマットされた会話入力を使用してモデルを呼び出すための 2 つのオプションがあります。

メッセージでの OpenAI ChatCompletion API の使用

メッセージスキーマ形式で入力を提供する場合は、OpenAI ChatCompletion API を使用する必要があります。アップロードされたチャットテンプレート (chat_template.jinja または chat_template.json) を持つモデルでこの API 形式を使用すると、Amazon Bedrock はチャットテンプレートを使用して入力メッセージを自動的に正しい形式に変換します。

これは、最もシームレスな統合を提供し、Amazon Bedrock がチャットテンプレートアプリケーションを自動的に処理できるようにするため、推奨されるアプローチです。

例: カスタムチャットテンプレートで OpenAI ChatCompletion API を使用する

import json import boto3 # Initialize Bedrock Runtime client client = boto3.client('bedrock-runtime', region_name='us-east-1') # Define the model ARN for your imported model with custom chat template model_id = 'arn:aws:bedrock:us-east-1:123456789012:imported-model/your-model-id' # Prepare the request payload using messages format payload = { "messages": [ { "role": "system", "content": "You are a helpful assistant." }, { "role": "user", "content": "Hello, how are you?" } ], "max_tokens": 150, "temperature": 0.7 } # Invoke the model response = client.invoke_model( modelId=model_id, body=json.dumps(payload), accept='application/json', contentType='application/json' ) # Parse and display the response response_body = json.loads(response['body'].read()) print(json.dumps(response_body, indent=2))

この例では、Amazon Bedrock はカスタムチャットテンプレートをメッセージ配列に自動的に適用し、モデルに適した形式に変換します。

手動トークン化アプローチ

または、チャットテンプレートアプリケーションとトークン化プロセスを完全に制御したい場合は、チャットテンプレートを会話に手動で適用し、事前にフォーマットされたテキストで Completion API (ChatCompletion ではない) を使用できます。

このアプローチは、テンプレートアプリケーションロジックをカスタマイズする必要がある場合や、特殊なトークン化要件を扱う場合に役立ちます。

ステップ 1: チャットテンプレートをローカルに適用する

次のコードスニペットを使用してカスタムチャットテンプレートをロードし、ローカルで会話に適用します。

from transformers import AutoTokenizer # Configuration paths - update these with your actual paths TOKENIZER_PATH = "" # Path to tokenizer directory # Load tokenizer with updated chat template tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH) # Test chat template with sample conversation chat_history = [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Hello, how are you?"}, ] # Apply chat template and display formatted output to make sure chat template works as expected formatted_chat = tokenizer.apply_chat_template(chat_history, tokenize=False) print(formatted_chat)

このコードは、次の方法を示しています。

  1. モデルファイルからトークナイザ設定をロードする

  2. トークナイザ設定にカスタムチャットテンプレートを追加する

  3. チャットテンプレートを会話履歴に適用する

  4. モデルに送信できるフォーマットされたテキストを生成する

ステップ 2: Completion API で を呼び出す

チャットテンプレートをローカルに適用したら、 Completion API でフォーマットされたテキストを使用します。

import json import boto3 # Initialize Bedrock Runtime client client = boto3.client('bedrock-runtime', region_name='us-east-1') # Define the model ARN for your imported model model_id = 'arn:aws:bedrock:us-east-1:123456789012:imported-model/your-model-id' # Use the formatted_chat output from Step 1 as the prompt payload = { "prompt": formatted_chat, "max_tokens": 150, "temperature": 0.7 } # Invoke the model using Completion format (not ChatCompletion) response = client.invoke_model( modelId=model_id, body=json.dumps(payload), accept='application/json', contentType='application/json' ) # Parse and display the response response_body = json.loads(response['body'].read()) print(json.dumps(response_body, indent=2))
警告

常に max_tokensパラメータを使用する: カスタムモデルのインポートで Completion API を使用する場合は、常に max_tokensパラメータを使用して OpenAI 完了スキーマの互換性を確保します。これにより、翻訳の混乱が回避され、さまざまな SDK 実装間で一貫した動作が保証されます。max_gen_len や同様のバリアントなどのモデル固有のパラメータ名は使用しないでください。

重要

手動トークン化アプローチを使用する場合は、ChatCompletion API 形式 ( フィールドを使用) ではなく、完了 API 形式 ( messagesフィールドを使用) を使用する必要があります。 promptChatCompletion API は raw メッセージを想定し、チャットテンプレートを再度適用しようとするため、フォーマットが正しくありません。

ベストプラクティス

  • 可能な場合は ChatCompletion API を使用する — メッセージ形式の OpenAI ChatCompletion API は、最もシームレスなエクスペリエンスを提供し、Amazon Bedrock がチャットテンプレートアプリケーションを自動的に処理できるようにします。

  • チャットテンプレートを検証する — モデルをインポートする前に、Transformersライブラリを使用してチャットテンプレートをローカルでテストし、期待される出力形式が生成されていることを確認します。

  • すべての特別なトークンを含める — チャットテンプレートに、モデルが期待するすべての必要な特別なトークン (beginning-of-sequence、end-of-sequence、ロールマーカーなど) が含まれていることを確認します。

  • マルチターン会話でテスト — チャットテンプレートがユーザーメッセージとアシスタントメッセージを入れ替えてマルチターン会話を正しく処理していることを確認します。

  • ビジョンサポートを検討する — モデルがマルチモーダル入力をサポートしている場合は、チャットテンプレートに画像およびビデオコンテンツマーカーを処理するロジックが含まれていることを確認してください。

警告

チャットテンプレートの形式が正しくないと、モデルのパフォーマンスが低下したり、予期しない出力が発生したり、推論が失敗したりする可能性があります。本番環境にデプロイする前に、必ずチャットテンプレートを徹底的にテストしてください。