Transformers documentation

生成機能

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

生成機能

generate() APIは、その上にアプリケーションを構築するためのいくつかの機能をサポートしています。

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

ストリーミング

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

Text Generation Inferenceのドキュメントでストリーミングについて詳しく学んでください。

トークナイザーでTextStreamerのインスタンスを作成します。generate()のstreamerパラメータにTextStreamerを渡すことで、出力を1単語ずつストリーミングできます。

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() メソッドと end() メソッドを持つ任意のクラスと互換性があります。put() は新しいトークンをプッシュし、end() は生成の終了をフラグ付けします。これら2つのメソッドを含む限り、独自のストリーマークラスを作成することも、Transformers の基本的なストリーマークラスを使用することもできます。

ウォーターマーキング

ウォーターマーキングは、テキストが生成されたものかどうかを検出するのに役立ちます。Transformers の watermarking strategy では、トークンの一部をランダムに「グリーン」に着色します。グリーンに着色されたトークンが生成される場合、その logits に小さなバイアスが加えられ、生成される確率が高くなります。生成されたテキストは、グリーンに着色されたトークンの割合を、人間が生成したテキストに通常見られるグリーントークンの量と比較することで検出できます。

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

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

WatermarkDetector クラスは、生成テキスト内のグリーントークンの割合を検出します。そのため、プロンプトテキストが生成テキストよりもはるかに長い場合は、プロンプトテキストを除去することを推奨します。パディングも WatermarkDetector に影響を与える可能性があります。

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 のインスタンスを作成し、モデルの出力を渡すことで、テキストが機械生成されたものかどうかを検出します。WatermarkDetector には、生成時に使用したのと同じ WatermarkingConfig を使用する必要があります。

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])
Update on GitHub