自然言語生成(NLG)は、自然言語処理(NLP)の一分野であり、コンピュータがデータから人間が理解できる自然な文章を生成する技術です。近年のTransformerモデルの登場により、NLGの性能は飛躍的に向上し、様々な応用分野で活用されています。
この記事では、Pythonを使用して自然言語生成を実践する方法を、以下の2つの主要なアプローチに焦点を当てて解説します。
- Hugging Face Transformersライブラリ: オープンソースで、多様な事前学習済みモデルを簡単に利用できます。
- OpenAI API: 商用のGPT-3.5やGPT-4といった高性能モデルを利用できます。
- Transformerモデル
- PythonとTransformersライブラリによるテキスト生成
- OpenAI APIによるテキスト生成(GPT-3.5/GPT-4など)
- 生成パラメータの調整
- まとめと応用
Transformerモデル
Transformerは、2017年にGoogleの研究者らが発表した論文「Attention Is All You Need」で提案されたモデルです。従来のRNN(再帰型ニューラルネットワーク)やCNN(畳み込みニューラルネットワーク)とは異なり、Attentionメカニズムを用いることで、文脈全体を考慮した高品質な文章生成が可能になりました。
Transformerモデルの特徴
- Attentionメカニズム: 文中の各単語間の関連性を捉え、重要な単語に注目して処理を行います。これにより、長文でも文脈を理解した生成が可能になります。
- 並列処理: RNNとは異なり、文全体の情報を並列処理できるため、高速な学習が可能です。
- 事前学習: 大規模なテキストデータで事前学習を行うことで、様々なタスク(文章生成、要約、翻訳など)に適用できる汎用的な言語モデルを構築できます。
主要なTransformerモデル
Transformerモデルの登場以降、以下のような様々な高性能な言語モデルが開発され、NLGの応用範囲がますます広がっています。
- GPTシリーズ (OpenAI): GPT-2, GPT-3, GPT-3.5, GPT-4
- BERT (Google): 双方向Transformerを使用
- その他: Gemini (Google), LLaMA (Meta), Mistral 7B (Mistral AI), T5, BART, RoBERTa, DistilBERT
これらのモデルの多くは、Hugging FaceのModel Hubで公開されており、transformersライブラリを通じて利用可能です。ただし、GPT-3以降のOpenAIのモデルやGeminiなどは、商用のAPI経由での利用となります。
PythonとTransformersライブラリによるテキスト生成
Hugging Face社のTransformersライブラリは、Transformerモデルを簡単に利用できるPythonのオープンソースライブラリです。事前学習済みのモデルを利用したテキスト生成、文章の要約、翻訳など、様々な自然言語処理タスクを手軽に実行できます。
実践:GPT-2モデルによるテキスト生成
ここでは、Transformersライブラリを用いて、GPT-2モデルによるテキスト生成を行う手順を説明します。
環境構築とライブラリのインストール
まず、Pythonの実行環境を準備し、必要なライブラリをインストールします。仮想環境の利用を推奨します。
# 仮想環境の作成(推奨) python3 -m venv .venv source .venv/bin/activate # Windowsの場合は .venv\Scripts\activate # 必要なライブラリのインストール pip install transformers torch
モデルとトークナイザの準備
テキスト生成には、事前学習済みのモデルと、テキストをトークンに分割するためのトークナイザが必要です。
from transformers import AutoTokenizer, AutoModelForCausalLM # モデルとトークナイザの指定(ここではGPT-2を使用) model_name = "gpt2" # 他にも "distilgpt2" など軽量なモデルも選択可能 # トークナイザの読み込み tokenizer = AutoTokenizer.from_pretrained(model_name) # モデルの読み込み model = AutoModelForCausalLM.from_pretrained(model_name)
AutoTokenizer.from_pretrained()は指定したモデル名に対応するトークナイザを読み込みます。 AutoModelForCausalLM.from_pretrained()は指定したモデルを読み込みます。今回は、GPT-2の事前学習済みモデルを読み込みます。
テキストのトークン化
生成したいテキストの元となる入力テキスト(プロンプト)をトークン化します。
# 入力テキスト(プロンプト) text = "The quick brown fox" # テキストをトークン化 inputs = tokenizer(text, return_tensors="pt") # PyTorchのテンソル形式で返す
テキスト生成
トークン化された入力データを用いて、モデルにテキストを生成させます。
# テキスト生成 outputs = model.generate( inputs["input_ids"], max_new_tokens=50, # 生成する最大トークン数 do_sample=True, # ランダムサンプリングを有効にする top_k=50, # 候補とする上位トークン数 top_p=0.95, # 累積確率が閾値を超えるトークンを候補とする temperature=0.7, # 生成の多様性を調整するパラメータ repetition_penalty=1.2 # 同じトークンの繰り返しを抑制 ) # 生成されたテキストをデコード generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True) # 結果を出力 print(generated_text)
model.generate()は トークン化されたインプットを入力し、続く文章を生成させます。各パラメータの説明は以下のとおりです。
max_new_tokens: 生成する最大トークン数を指定します。do_sample=True: 多様性のある文章を生成するために、ランダムサンプリングを有効にします。top_k: 各ステップで考慮する上位k個のトークンを指定します。top_p: 各ステップで累積確率がp以上となるトークンの集合からサンプリングします。temperature: 生成されるテキストの多様性を調整します。値を小さくすると確実性の高いトークンが選ばれやすくなり、大きくすると多様性が増します。repetition_penalty: 同じトークンの繰り返しを抑制します。
tokenizer.decode()はトークンIDの列を人間が読めるテキストに変換します。 skip_special_tokensを有効にすることによって、特殊トークン(文の開始や終了を示すトークンなど)を結果から除外します。
完成: コード全体 (GPT-2)
from transformers import AutoTokenizer, AutoModelForCausalLM # モデルとトークナイザの指定 model_name = "gpt2" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained(model_name) # 入力テキスト text = "The quick brown fox" # テキストをトークン化 inputs = tokenizer(text, return_tensors="pt") # テキスト生成 outputs = model.generate( inputs["input_ids"], max_new_tokens=50, do_sample=True, top_k=50, top_p=0.95, temperature=0.7, repetition_penalty=1.2 ) # 生成されたテキストをデコード generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True) # 結果を出力 print(generated_text)
OpenAI APIによるテキスト生成(GPT-3.5/GPT-4など)
GPT-3.5やGPT-4は、OpenAIのAPIを通じて提供されており、非常に高品質なテキスト生成が可能です。
注意 2024年時点では、GPT-3.5/GPT-4はtransformersライブラリから直接利用できません。OpenAIのAPIキーを取得し、openaiライブラリを使用する必要があります。
環境構築とライブラリのインストール (OpenAI API)
# 仮想環境の作成(推奨) python3 -m venv .venv source .venv/bin/activate # あるいは .venv\Scripts\activate # 必要なライブラリのインストール pip install openai
OpenAI APIキーの準備
OpenAIのウェブサイトでAPIキーを取得し、環境変数に設定するか、コード内で直接指定します。セキュリティのため、自分だけが使う環境以外では、APIキーをコード内に直接記述することは避けてください。(誤ってgithub等でAPIキーを公開してしまうなどの危険性もあります。)
import openai import os # 環境変数からAPIキーを読み込む(推奨) openai.api_key = os.environ.get("OPENAI_API_KEY") # または、コード内で直接APIキーを指定する(非推奨:セキュリティに注意) # openai.api_key = "YOUR_API_KEY"
テキスト生成 (GPT-3.5/GPT-4)
GPT-3.5 (gpt-3.5-turbo) および GPT-4 は、チャット形式のAPI (ChatCompletion) を使用します。
import openai import os def generate_text_with_gpt(prompt, model="gpt-3.5-turbo"): """ GPT-3.5-turbo または GPT-4 を使用してテキストを生成する関数 Args: prompt (str): プロンプトとなるテキスト model (str): 使用するモデル ("gpt-3.5-turbo" または "gpt-4" など) Returns: str: 生成されたテキスト """ openai.api_key = os.environ.get("OPENAI_API_KEY") response = openai.ChatCompletion.create( model=model, messages=[ {"role": "system", "content": "You are a helpful assistant."}, # システムの役割を設定(オプション) {"role": "user", "content": prompt}, # ユーザーからのプロンプト ], max_tokens=50, n=1, stop=None, temperature=0.7, ) return response.choices[0].message['content'].strip() # プロンプトを設定 prompt = "The quick brown fox" # GPT-3.5-turbo でテキスト生成を実行 generated_text_35 = generate_text_with_gpt(prompt, model="gpt-3.5-turbo") print("GPT-3.5-turbo:", generated_text_35) # GPT-4 でテキスト生成を実行 (利用可能な場合) # generated_text_4 = generate_text_with_gpt(prompt, model="gpt-4") # print("GPT-4:", generated_text_4)
openai.ChatCompletion.create()がGPT APIを呼び出す関数です。ここでは、modelに使用するモデル名(gpt-3.5-turbo、gpt-4など)を指定します。
max_tokens, n, stop, temperatureなどはmodel.generate()と同様のパラメータです。最後にresponse.choices[0].message['content']で生成されたテキストを取り出します。
生成パラメータの調整
model.generate() メソッド (Transformers) や openai.ChatCompletion.create() (OpenAI API) のパラメータを調整することで、生成されるテキストの多様性や品質を制御できます。例えば、物語を作成する場合は多様性を高めるためにtemperatureを上げ、事実に基づくレポートを作成する場合はtemperatureを下げる、といった使い分けが考えられます。以下に、主なパラメータとその影響を示します。
| パラメータ | 説明 | 影響 |
|---|---|---|
max_tokens / max_new_tokens |
生成する最大トークン数 | 値を大きくすると、より長い文章が生成されます。 |
do_sample |
Trueの場合、確率的サンプリングを行う。Falseの場合、最も確率の高いトークンを常に選択する。 | Trueにすると、多様な文章が生成されやすくなります。Falseにすると、同じ入力に対しては常に同じ文章が生成されます。 |
top_k |
各ステップで考慮する上位k個のトークン | 値を小さくすると、確実性の高いトークンが選ばれやすくなり、文章の多様性が低下します。 |
top_p |
各ステップで累積確率がp以上となるトークンの集合からサンプリング | 値を小さくすると、確実性の高いトークンが選ばれやすくなり、文章の多様性が低下します。top_kと同時に使用されることが多いです。 |
temperature |
確率分布を調整するパラメータ。 | 値を小さくすると、確率の高いトークンが選ばれやすくなり、文章がより予測可能になります。値を大きくすると、多様性が増しますが、文章の品質が低下する可能性があります。 |
repetition_penalty |
同じトークンの繰り返しを抑制する。(Transformersのみ) | 値を大きく設定することで、生成テキスト中の単語やフレーズの繰り返しを抑制できます。 |
num_beams |
ビームサーチで利用するビームの数(Transformersのみ) | 計算コストは増加しますが、文脈により適合した自然な文章を生成できます。探索空間が広がるため、より良い候補が見つかる可能性が高まります。 |
num_return_sequences |
生成する文章の数 (Transformersのgenerateメソッドのみ) |
1より大きい値を指定すると、複数の異なる文章を一度に生成できます。 |
stop |
特定の文字列が出現した場合に生成を停止する (OpenAI APIのみ) | 生成を終了させたい単語やフレーズを指定します。 |
まとめと応用
本記事では、Pythonを用いた自然言語生成(NLG)の基本的な手法として、TransformersライブラリとOpenAI APIの活用方法を紹介しました。
- Transformersライブラリ
- オープンソースで、多様な事前学習済みモデル(GPT-2, BERT, LLaMAなど)を利用可能。
model.generate()メソッドでテキスト生成。- パラメータ調整により、生成テキストの多様性や品質を制御。
- OpenAI API
- 商用サービスで、GPT-3.5/GPT-4などの高性能モデルを利用可能。
openai.ChatCompletion.create()でテキスト生成。- チャット形式のインターフェース。
これらの技術を活用することで、創造的なタスクの自動化や効率化、新しいコミュニケーションの形を実現できます。また、より高度な利用方法として、特定のタスクに特化したモデルのファインチューニングや、複数のモデルを組み合わせたシステム構築などがあります。
最後にPythonの学習に利用できるUdemy
のサイトを紹介します。ぜひ活用ください。
[PR]