

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Menangani Template Obrolan Kustom dan Tokenizers
<a name="custom-chat-templates-tokenizers"></a>

Template obrolan khusus dan tokenizer adalah komponen penting untuk memformat input percakapan dengan benar dan mengelola pembuatan token dalam model impor Anda. Impor Model Kustom mendukung mengimpor model dengan templat obrolan khusus yang menentukan bagaimana percakapan multi-putaran terstruktur dan diberi token.

## Mengimpor Model dengan Template Obrolan Kustom
<a name="import-chat-template"></a>

Saat mengimpor model dengan templat obrolan khusus, pastikan Anda mengikuti praktik terbaik yang diuraikan dalam dokumentasi Impor Model Kustom utama, termasuk memasukkan bobot model dalam format tensor aman dan menyediakan semua file konfigurasi yang diperlukan.

### Persyaratan Format Templat Obrolan
<a name="chat-template-format-requirements"></a>

Jika model Anda menggunakan templat obrolan khusus dan Anda ingin menggunakan templat itu dengan Amazon Bedrock, Anda harus menyertakan file templat obrolan dalam salah satu format berikut:
+ **`chat_template.jinja`**— File template berbasis Jinja2 yang mendefinisikan bagaimana pesan diformat.
+ **`chat_template.json`**- File JSON yang berisi template obrolan sebagai nilai string.
+ **`tokenizer_config.json`dengan template obrolan tertanam** - Atau, Anda dapat menyertakan template obrolan langsung di dalam `tokenizer_config.json` file Anda sebagai `chat_template` bidang. Sebagai contoh, lihat [Hermes-2-Pro tokenizer\$1config.json](https://huggingface.co/NousResearch/Hermes-2-Pro-Llama-3-8B/blob/main/tokenizer_config.json#L2059) di Hugging Face.

Impor Model Kustom akan secara otomatis memproses file-file ini dan memasukkannya ke dalam direktori yang benar selama proses impor.

#### Prioritas Templat Obrolan
<a name="chat-template-precedence"></a>

Jika Anda menyediakan beberapa sumber templat obrolan, Amazon Bedrock menerapkan aturan prioritas berikut:

1. **File template obrolan terpisah diutamakan** - Jika Anda menyertakan file template obrolan terpisah (`chat_template.jinja`atau`chat_template.json`) DAN `chat_template` bidang di Anda`tokenizer_config.json`, file terpisah akan digunakan dan templat yang disematkan `tokenizer_config.json` akan diabaikan.

1. **Template tertanam sebagai fallback** - Jika Anda tidak menyediakan file template obrolan terpisah, Amazon Bedrock akan menggunakan `chat_template` bidang dari jika ada. `tokenizer_config.json`

**Awas**  
**Pilih satu pendekatan:** Untuk menghindari kebingungan dan memastikan perilaku yang dapat diprediksi, kami sangat menyarankan hanya menggunakan SATU dari pendekatan ini:  
**Opsi 1:** Menyediakan file template obrolan terpisah (`chat_template.jinja`atau`chat_template.json`) tanpa menyertakan `chat_template` bidang di file Anda`tokenizer_config.json`.
**Opsi 2:** Sertakan `chat_template` bidang langsung di Anda `tokenizer_config.json` dan jangan berikan file template terpisah.
Jika Anda memiliki templat alat khusus atau konfigurasi templat obrolan yang kompleks, sebaiknya gunakan Opsi 2 (menyematkan templat di`tokenizer_config.json`) karena memungkinkan Anda untuk menentukan beberapa templat bernama (seperti “default” dan “tool\$1use”) dalam satu file konfigurasi.

**catatan**  
File template obrolan harus mengikuti format Hugging Face dan konvensi penamaan. Pastikan template Anda kompatibel dengan Transformers perpustakaan.

#### Contoh Format Templat Obrolan
<a name="chat-template-examples"></a>

Berikut adalah contoh dari dua format template obrolan yang didukung:

------
#### [ Jinja Format (chat\$1template.jinja) ]

Contoh sederhana dari template obrolan berbasis Jinja2:

```
{% 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 %}
```

Untuk contoh lengkapnya, lihat [templat GPT-OSS obrolan](https://huggingface.co/openai/gpt-oss-20b/blob/main/chat_template.jinja) di Hugging Face.

------
#### [ JSON Format (chat\$1template.json) ]

Contoh sederhana dari template obrolan berbasis JSON dengan dukungan visi:

```
{
    "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 %}"
}
```

Untuk contoh lengkap dengan dukungan multimodal, lihat [template Qwen2-VL obrolan](https://huggingface.co/Qwen/Qwen2-VL-72B-Instruct/blob/main/chat_template.json) di Hugging Face.

------

**penting**  
Pastikan file templat obrolan Anda mengikuti konvensi penamaan yang tepat (`chat_template.jinja`atau`chat_template.json`) dan format yang ditunjukkan pada contoh di atas. Templat yang diformat dengan tidak benar dapat menyebabkan kegagalan impor atau inferensi.

## Memanggil Model dengan Template Obrolan Kustom
<a name="invoke-custom-chat-templates"></a>

Setelah Anda mengimpor model dengan templat obrolan khusus, Anda memiliki dua opsi untuk menjalankan model dengan input percakapan yang diformat dengan benar:

### Menggunakan OpenAI ChatCompletion API dengan Pesan
<a name="chatcompletion-api-approach"></a>

**Jika Anda memberikan input dalam format skema pesan, Anda harus menggunakan OpenAI API. ChatCompletion ** Saat Anda menggunakan format API ini dengan model yang memiliki templat obrolan yang diunggah (`chat_template.jinja`atau`chat_template.json`), Amazon Bedrock akan secara otomatis mengonversi pesan masukan Anda ke format yang benar menggunakan templat obrolan.

Ini adalah pendekatan yang disarankan karena menyediakan integrasi yang paling mulus dan memungkinkan Amazon Bedrock untuk menangani aplikasi template obrolan secara otomatis.

**Contoh: Menggunakan OpenAI ChatCompletion API dengan template obrolan khusus**

```
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))
```

Dalam contoh ini, Amazon Bedrock akan secara otomatis menerapkan template obrolan kustom Anda ke array pesan, mengubahnya menjadi format yang sesuai untuk model Anda.

### Pendekatan Tokenisasi Manual
<a name="manual-tokenization-approach"></a>

Atau, jika Anda lebih suka memiliki kontrol penuh atas aplikasi templat obrolan dan proses tokenisasi, Anda dapat menerapkan templat obrolan secara manual ke percakapan Anda dan kemudian menggunakan **API Penyelesaian** (bukan ChatCompletion) dengan teks yang telah diformat sebelumnya.

Pendekatan ini berguna ketika Anda perlu menyesuaikan logika aplikasi template atau ketika bekerja dengan persyaratan tokenisasi khusus.

#### Langkah 1: Terapkan Template Obrolan Secara Lokal
<a name="apply-chat-template-locally"></a>

Gunakan cuplikan kode berikut untuk memuat templat obrolan khusus Anda dan menerapkannya ke percakapan secara lokal:

```
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)
```

Kode ini menunjukkan cara:

1. Muat konfigurasi tokenizer Anda dari file model

1. Tambahkan template obrolan khusus ke konfigurasi tokenizer

1. Terapkan templat obrolan ke riwayat percakapan

1. Hasilkan teks yang diformat yang dapat dikirim ke model

#### Langkah 2: Panggil dengan API Penyelesaian
<a name="invoke-with-completion-api"></a>

Setelah menerapkan template obrolan secara lokal, gunakan teks yang diformat dengan 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))
```

**Awas**  
**Selalu gunakan `max_tokens` parameter:** Saat menggunakan Completion API dengan impor model khusus, selalu gunakan `max_tokens` parameter untuk memastikan kompatibilitas skema penyelesaian OpenAI. Ini menghindari kebingungan terjemahan dan memastikan perilaku yang konsisten di berbagai implementasi SDK. Jangan gunakan nama parameter khusus model seperti `max_gen_len` atau varian serupa.

**penting**  
Saat menggunakan pendekatan tokenisasi manual, Anda harus menggunakan format **API Penyelesaian** (dengan `prompt` bidang), bukan format ChatCompletion API (dengan `messages` bidang). ChatCompletion API mengharapkan pesan mentah dan akan mencoba menerapkan template obrolan lagi, yang mengakibatkan pemformatan yang salah.

### Praktik Terbaik
<a name="chat-template-best-practices"></a>
+ **Gunakan ChatCompletion API bila memungkinkan** - ChatCompletion API OpenAI dengan format pesan memberikan pengalaman paling mulus dan memungkinkan Amazon Bedrock menangani aplikasi template obrolan secara otomatis.
+ **Validasi templat obrolan Anda** — Sebelum mengimpor model Anda, uji templat obrolan Anda secara lokal menggunakan Transformers pustaka untuk memastikannya menghasilkan format keluaran yang diharapkan.
+ **Sertakan semua token khusus** — Pastikan templat obrolan Anda mencakup semua token khusus yang diperlukan (seperti beginning-of-sequence end-of-sequence,, dan penanda peran) yang diharapkan model Anda.
+ **Uji dengan percakapan multi-putaran** — Validasi bahwa template obrolan Anda menangani percakapan multi-putaran dengan benar dengan pesan pengguna dan asisten bergantian.
+ **Pertimbangkan dukungan visi** - Jika model Anda mendukung input multimodal, pastikan template obrolan Anda menyertakan logika untuk menangani penanda konten gambar dan video.

**Awas**  
Templat obrolan yang salah diformat dapat mengakibatkan kinerja model yang buruk, output yang tidak terduga, atau kegagalan inferensi. Selalu uji template obrolan Anda secara menyeluruh sebelum menerapkan ke produksi.