# チャットの基本

Chatモデルとは、メッセージを送信して応答を受け取れる対話型モデルです。2023年半ば以降に公開されたほとんどの言語モデルはChatモデルであり、「instruct」モデルや「instruction-tuned」モデルと呼ばれることもあります。Chatに対応していないモデルは、「base」モデルや「pretrained」モデルと呼ばれることが多いです。

より大規模で新しいモデルは一般的により高性能ですが、特定のドメイン（医療、法律文書、英語以外の言語など）に特化したモデルは、これらの大規模モデルを上回る性能を発揮することがあります。[OpenLLM](https://hf.co/spaces/HuggingFaceH4/open_llm_leaderboard)や[LMSys Chatbot Arena](https://chat.lmsys.org/?leaderboard)などのリーダーボードを活用して、ユースケースに最適なモデルを特定してください。

このガイドでは、コマンドラインからTransformersでチャットモデルを素早く読み込む方法、会話の構築とフォーマット方法、そして[TextGenerationPipeline](/docs/transformers/main/ja/main_classes/pipelines#transformers.TextGenerationPipeline)を使用してチャットを行う方法について説明します。

## chat CLI

[Transformers](./installation)をインストールした後、コマンドラインからモデルと直接チャットできます。以下のコマンドを実行すると、モデルとの対話セッションが開始され、セッションの冒頭にいくつかの基本的なコマンドが表示されます。

> 以下のコマンドを実行する際は、[`transformers serve` が実行中であることを確認してください。](./serve-cli/serving)

```bash
transformers chat Qwen/Qwen2.5-0.5B-Instruct
```

    

任意の`generate`フラグを`arg_1=value_1 arg_2=value_2 ...`の形式で指定して、CLIを起動できます。

```bash
transformers chat Qwen/Qwen2.5-0.5B-Instruct do_sample=False max_new_tokens=10
```

すべてのオプションのリストを確認するには、以下のコマンドを実行してください。

```bash
transformers chat -h
```

チャットは[AutoClass](./model_doc/auto)の上に実装されており、[text generation](./llm_tutorial)および[chat](./chat_templating)のツールを使用しています。内部では`transformers serve` CLI ([docs](./serve-cli/serving)) を使用しています。

## TextGenerationPipeline

[TextGenerationPipeline](/docs/transformers/main/ja/main_classes/pipelines#transformers.TextGenerationPipeline) は、"チャットモード" を備えた高レベルのテキスト生成クラスです。対話型モデルが検出され、チャットプロンプトが[適切にフォーマット](./llm_tutorial#prompt-format)されている場合、チャットモードが有効になります。

Chatモデルは、メッセージのリスト（チャット履歴）を入力として受け取ります。各メッセージは、`role`キーと`content`キーを持つ辞書です。チャットを開始するには、単一の`user`メッセージを追加します。また、モデルの動作に関する指示を与えるために、`system`メッセージを任意で含めることもできます。

```py
chat = [
    {"role": "system", "content": "You are a helpful science assistant."},
    {"role": "user", "content": "Hey, can you explain gravity to me?"}
]
```

[TextGenerationPipeline](/docs/transformers/main/ja/main_classes/pipelines#transformers.TextGenerationPipeline) を作成し、`chat` を渡します。大規模モデルの場合、[device_map="auto"](./models#big-model-inference) を設定すると、モデルの読み込みが速くなり、利用可能な最速のデバイスに自動的に配置されます。

```py
import torch
from transformers import pipeline

pipeline = pipeline(task="text-generation", model="HuggingFaceTB/SmolLM2-1.7B-Instruct", dtype="auto", device_map="auto")
response = pipeline(chat, max_new_tokens=512)
print(response[0]["generated_text"][-1]["content"])
```

これが正常に動作すれば、モデルからの応答が表示されるはずです。会話を続行するには、モデルの応答でチャット履歴を更新する必要があります。これは、`chat` にテキストを追加（`assistant` ロールを使用）するか、最新の応答を含む完全なチャット履歴が含まれている `response[0]["generated_text"]` を読み取ることで行えます。

モデルの応答を取得したら、チャット履歴に新しい`user`メッセージを追加することで、会話を続行できます。

```py
chat = response[0]["generated_text"]
chat.append(
    {"role": "user", "content": "Woah! But can it be reconciled with quantum mechanics?"}
)
response = pipeline(chat, max_new_tokens=512)
print(response[0]["generated_text"][-1]["content"])
```

このプロセスを繰り返すことで、モデルがコンテキストウィンドウを使い切るか、メモリが不足するまで、お好みの長さで会話を続けることができます。

## パフォーマンスとメモリ使用量

Transformers はデフォルトでモデルを `float32` 精度で読み込みます。8B パラメータのモデルの場合、これには約 32GB のメモリが必要です。メモリ使用量を削減するには、`torch_dtype="auto"` 引数を使用してください。この引数は、`bfloat16` で学習されたモデルに対して一般的に `bfloat16` を使用します。

> [!TIP]
> 利用可能な異なる量子化バックエンドの詳細については、[Quantization](./quantization/overview)のドキュメントを参照してください。

メモリ使用量をさらに低減するには、[bitsandbytes](https://hf.co/docs/bitsandbytes/index)を使用してモデルを8ビットまたは4ビットに量子化できます。希望する量子化設定で[BitsAndBytesConfig](/docs/transformers/main/ja/main_classes/quantization#transformers.BitsAndBytesConfig)を作成し、パイプラインの`model_kwargs`パラメータに渡します。以下の例では、モデルを8ビットに量子化しています。

```py
from transformers import pipeline, BitsAndBytesConfig

quantization_config = BitsAndBytesConfig(load_in_8bit=True)
pipeline = pipeline(task="text-generation", model="meta-llama/Meta-Llama-3-8B-Instruct", device_map="auto", model_kwargs={"quantization_config": quantization_config})
```

一般的に、モデルサイズとパフォーマンスは直接相関しています。より大きなモデルは、生成される各トークンに対してアクティブなパラメータをメモリから読み込む必要があるため、メモリ使用量が増えるだけでなく、処理速度も遅くなります。これはLLMによるテキスト生成のボトルネックであり、生成速度を向上させる主な選択肢は、モデルの量子化を行うか、メモリ帯域幅がより高いハードウェアを使用することです。計算能力を单纯に増やしても、有意な改善にはつながりません。

[投機的デコーディング](./assisted_decoding#speculative-decoding)などの手法も試すことができます。この手法では、より小さいモデルが候補トークンを生成し、より大きいモデルがそれらを検証します。候補トークンが正しければ、より大きいモデルは一度に1つ以上のトークンを生成できます。これにより、帯域幅のボトルネックが大幅に軽減され、生成速度が向上します。

> [!TIP]
[Mixtral](./model_doc/mixtral)、[Qwen2MoE](./model_doc/qwen2_moe)、[GPT-OSS](./model_doc/gpt_oss) などの Mixture-of-Expert (MoE) モデルはパラメータ数が非常に多いものの、各トークンを生成する際にそのパラメータのほんの一部のみを「アクティブ」にします。その結果、MoE モデルは通常、メモリ帯域幅の要件がはるかに低く、同じサイズの通常の LLM よりも高速に動作する場合があります。ただし、投機的デコーディングなどの手法は MoE モデルに対して効果がありません。これは、投機的に生成される新しいトークンが増えるにつれて、アクティブになるパラメータの数も増加するためです。

