# 生成機能

[generate()](/docs/transformers/main/ja/main_classes/text_generation#transformers.GenerationMixin.generate) APIは、その上にアプリケーションを構築するためのいくつかの機能をサポートしています。

このガイドでは、これらの機能の使用方法について説明します。

## ストリーミング

Streamingは、テキストが生成された時点で即座に返すため、生成された応答全体を一度に表示されるのを待つ必要はありません。ユーザー向けのアプリケーションでは、これにより知覚されるレイテンシが低減され、ユーザーが生成の進行状況を確認できるため、重要です。

    

> [!TIP]
> [Text Generation Inference](https://huggingface.co/docs/text-generation-inference/en/conceptual/streaming)のドキュメントでストリーミングについて詳しく学んでください。

トークナイザーで[TextStreamer](/docs/transformers/main/ja/internal/generation_utils#transformers.TextStreamer)のインスタンスを作成します。[generate()](/docs/transformers/main/ja/main_classes/text_generation#transformers.GenerationMixin.generate)の`streamer`パラメータに[TextStreamer](/docs/transformers/main/ja/internal/generation_utils#transformers.TextStreamer)を渡すことで、出力を1単語ずつストリーミングできます。

```py
from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer

tokenizer = AutoTokenizer.from_pretrained("openai-community/gpt2")
model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
inputs = tokenizer(["The secret to baking a good cake is "], return_tensors="pt")
streamer = TextStreamer(tokenizer)

_ = model.generate(**inputs, streamer=streamer, max_new_tokens=20)
```

`streamer` パラメータは、[put()](/docs/transformers/main/ja/internal/generation_utils#transformers.TextStreamer.put) メソッドと [end()](/docs/transformers/main/ja/internal/generation_utils#transformers.TextStreamer.end) メソッドを持つ任意のクラスと互換性があります。[put()](/docs/transformers/main/ja/internal/generation_utils#transformers.TextStreamer.put) は新しいトークンをプッシュし、[end()](/docs/transformers/main/ja/internal/generation_utils#transformers.TextStreamer.end) は生成の終了をフラグ付けします。これら2つのメソッドを含む限り、独自のストリーマークラスを作成することも、Transformers の基本的なストリーマークラスを使用することもできます。

## ウォーターマーキング

ウォーターマーキングは、テキストが生成されたものかどうかを検出するために有用です。Transformers の [watermarking strategy](https://hf.co/papers/2306.04634) では、トークンの一部をランダムに「グリーン」に着色します。グリーンに着色されたトークンが生成される場合、その logits に小さなバイアスが加えられ、生成される確率が高くなります。生成テキストの検出には、グリーンに着色されたトークンの割合を、人間が生成したテキストに通常見られるグリーントークンの量と比較します。

Watermarking は Transformers のすべての生成モデルでサポートされており、透かし付きテキストを検出するために追加の分類モデルは必要ありません。

[WatermarkingConfig](/docs/transformers/main/ja/internal/generation_utils#transformers.WatermarkingConfig) を作成し、logits に加算するバイアス値とウォーターマーキングアルゴリズムを指定します。以下の例では、`"selfhash"` アルゴリズムを使用しており、グリーントークンの選択は現在のトークンのみに依存します。[WatermarkingConfig](/docs/transformers/main/ja/internal/generation_utils#transformers.WatermarkingConfig) を [generate()](/docs/transformers/main/ja/main_classes/text_generation#transformers.GenerationMixin.generate) に渡します。

> [!TIP]
> [WatermarkDetector](/docs/transformers/main/ja/internal/generation_utils#transformers.WatermarkDetector) クラスは、生成テキスト内のグリーントークンの割合を検出します。そのため、プロンプトテキストが生成テキストよりもはるかに長い場合は、プロンプトテキストを除去することを推奨します。パディングも [WatermarkDetector](/docs/transformers/main/ja/internal/generation_utils#transformers.WatermarkDetector) に影響を与える可能性があります。

```py
from transformers import AutoTokenizer, AutoModelForCausalLM, WatermarkDetector, WatermarkingConfig

model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
tokenizer = AutoTokenizer.from_pretrained("openai-community/gpt2")
tokenizer.pad_token_id = tokenizer.eos_token_id
tokenizer.padding_side = "left"

inputs = tokenizer(["This is the beginning of a long story", "Alice and Bob are"], padding=True, return_tensors="pt")
input_len = inputs["input_ids"].shape[-1]

watermarking_config = WatermarkingConfig(bias=2.5, seeding_scheme="selfhash")
out = model.generate(**inputs, watermarking_config=watermarking_config, do_sample=False, max_length=20)
```

[WatermarkDetector](/docs/transformers/main/ja/internal/generation_utils#transformers.WatermarkDetector) のインスタンスを作成し、モデルの出力を渡すことで、テキストが機械生成されたものかどうかを検出します。[WatermarkDetector](/docs/transformers/main/ja/internal/generation_utils#transformers.WatermarkDetector) には、生成時に使用したのと同じ [WatermarkingConfig](/docs/transformers/main/ja/internal/generation_utils#transformers.WatermarkingConfig) を使用する必要があります。

```py
detector = WatermarkDetector(model_config=model.config, device="cpu", watermarking_config=watermarking_config)
detection_out = detector(out, return_dict=True)
detection_out.prediction
array([True, True])
```

