小型日本語LLMでキャッチフレーズ
日本語版 Gemma 2 2Bを使用
以下がキャッチフレーズ生成に使用したコードです。
LLMには日本語版 Gemma 2 2Bを利用しています。
「次世代スマートフォン登場!1億2000万画素カメラでの撮影を驚異的な精度で補正。80億パラメータのLLMがデバイス内で稼働し、撮影や操作体験をインテリジェントにサポート。」という(架空の)商品説明文章からキャッチフレーズを作っています。
#サンプリング(do_sample=True)を使用
do_sample=True は、生成モデルにおいて「サンプリング(ランダム性)」を有効にする設定です。これにより、モデルは確率分布に基づいて次のトークンをランダムに選択します。通常、より確率の高いトークンが選ばれますが、確率の低いトークンも一定の確率で選択されるため、生成結果にバリエーションが生まれます。
# Hugging Faceからモデルをダウンロード
!huggingface-cli login # Hugging Faceのアクセストークンでログイン
# Transformersライブラリをインストール
# Hugging Faceのモデルやパイプラインを利用するためのライブラリ
!pip install transformers
# Transformersライブラリからパイプラインをインポート
from transformers import pipeline
# 使用するモデルの指定
model_name = "google/gemma-2-2b-jpn-it" # 日本語用モデルを指定
# テキスト生成用のパイプラインを定義
# generator = pipeline("text-generation", model=model_name) # CPUを使用する設定(コメントアウト)
generator = pipeline("text-generation", model=model_name, device=0) # GPUを使用して高速化
# 商品説明文
product_description = "次世代スマートフォン登場!1億2000万画素カメラでの撮影を驚異的な精度で補正。80億パラメータのLLMがデバイス内で稼働し、撮影や操作体験をインテリジェントにサポート。"
# テキスト生成
# プロンプトの内容は、日本語で短くインパクトのあるキャッチフレーズを求めています。
response = generator(
f"次世代スマートフォンのキャッチフレーズを作成してください。一文で完結させ、短く、魅力的なフレーズにしてください。 {product_description}",
max_new_tokens=35, # キャッチフレーズ用に生成トークン数を調整(日本語に配慮してやや多め)
num_return_sequences=3, # 複数の候補を生成して選択肢を増やす
do_sample=True, # ランダム性を有効にする
temperature=0.6, # ランダム性を抑えつつ適度なバリエーションを確保
top_p=0.85, # トップ確率フィルタリングで生成の質を向上
repetition_penalty=1.1, # 繰り返し抑制を軽く設定(日本語の自然なリズムに配慮)
)
# 各広告コピーをループで表示
# 生成されたキャッチフレーズを順に表示
for idx, ad in enumerate(response):
print(f"Ad {idx + 1}: {ad['generated_text']}")
・ChatGPTの評価
上記コードに対するChatGPT Plus(4o)の評価です。
このコードの設定は、日本語LLMを使用する場合に十分適しています。以下にポイントを整理します:
設定の評価
max_new_tokens=35
日本語は英語に比べて1単語が複数のトークンに分割されることが多いため、少し長めに設定するのは妥当です。ただし、キャッチフレーズが長くなるのを防ぐために、結果を手動で確認して調整することをお勧めします。temperature=0.6
日本語のキャッチコピーにおいては、あまり突飛な表現が望ましくない場合が多いので、ランダム性を抑えたこの値は適切です。top_p=0.85
トップ確率フィルタリングを少し厳しくしており、生成の質を向上させる設定です。日本語での自然な表現を優先するには良いアプローチです。repetition_penalty=1.1
繰り返し抑制が少し軽めになっています。キャッチフレーズでは適度なリズムが必要な場合も多いので、1.1 は日本語特有のリズム感を損なわずに効果的です。num_return_sequences=3
3つの候補を生成することで、最適な選択肢を選べる可能性を広げています。
・キャッチフレーズ例
未来を握る、圧倒的な表現力。
世界を変える、あなたの可能性を。
未来を握る、革新のデバイス。
あなたの世界を、より深く。
未来の撮影、今すぐ体験。
世界を変える、新しい可能性。
#Beam Searchを使った場合
Beam Search(ビームサーチ)は、テキスト生成や翻訳タスクなどで使用される 探索アルゴリズム の一種です。
モデルが次の単語(トークン)を予測する際に、複数の候補を同時に追跡しながら、最も高い確率を持つ出力を効率的に探索します。
多様性のある結果を得るサンプリング(do_sample=True)と比べると、Beam Searchは最も確率の高い結果を見つける手法です。
roduct_description = "次世代スマートフォン登場!1億2000万画素カメラでの撮影を驚異的な精度で補正。80億パラメータのLLMがデバイス内で稼働し、撮影や操作体験をインテリジェントにサポート。"
# テキスト生成
# プロンプトの内容は、日本語で短くインパクトのあるキャッチフレーズを求めています。
response = generator(
f"次世代スマートフォンのキャッチフレーズを作成してください。一文で完結させ、短く、魅力的なフレーズにしてください。 {product_description}",
max_new_tokens=35, # キャッチフレーズ用に生成トークン数を調整(日本語に配慮してやや多め)
num_return_sequences=3, # 複数の候補を生成して選択肢を増やす
num_beams=6, # Beam Search を有効化
temperature=0.9, # ランダム性を抑えつつ適度なバリエーションを確保
top_p=0.85, # トップ確率フィルタリングで生成の質を向上
repetition_penalty=1.1, # 繰り返し抑制を軽く設定(日本語の自然なリズムに配慮)
length_penalty=0.8, # 短い文章を優先。広告コピーの生成など、短く簡潔な文章が必要な場合は、length_penalty=0.8 を指定するのが最適です。
)
'''
↑num_return_sequences ≤ num_beams である必要があります。
3つの枝を探索し、その中から3つの最良の結果を返します。
'''
# 各広告コピーをループで表示
for idx, ad in enumerate(response): # enumerate でインデックスと内容を取得
print(f"Ad {idx + 1}: {ad['generated_text']}")
Beam Searchは高精度な文章生成や定型文生成が得意なので、キャッチフレーズの生成には、創造的な文章生成やバリエーションを出す特性を持つサンプリングの方が向いていそうです。
・ChatGPTの評価
設定の評価
Beam Search (num_beams=6)
Beam Searchは複数の候補(ビーム)を探索し、最良の結果を選択するアルゴリズムです。
num_beams=6 によって探索の幅を広げ、バリエーション豊かな生成を目指しているのは適切です。num_return_sequences=3
num_beams が6であるため、最大6個の候補から上位3つが選ばれます。この設定は適切で、生成の品質を確保しつつ選択肢を絞っています。temperature=0.9
ランダム性をやや高めており、Beam Searchと組み合わせることで多様性を追加しています。ただし、過度なランダム性はBeam Searchのメリットを薄める可能性もあるため、適切な範囲(0.8–0.9)で調整されています。length_penalty=0.8
Beam Searchではデフォルトだと長い文が選ばれる傾向がありますが、この設定によって短く簡潔なキャッチコピーを優先する工夫がされています。top_p=0.85
トップ確率フィルタリングを導入することで、生成結果の自然性と多様性のバランスが取られています。repetition_penalty=1.1
繰り返しを軽減するための設定で、日本語のリズム感を損なわない範囲で効果的です。
・キャッチフレーズ例
Beam Search は、モデルが最も良いと判断する結果を選びやすいため、候補に多様性がなくなることがあります。
このため、似たような結果が並びました。
未来を握る、革新のスマートフォン。
あなたの世界を、より鮮やかに。
未来を握る、革新のデバイス。
世界を映し出す、圧倒的な可能性。
未来を握る、革新のデバイス。
世界を映し出す、新たな可能性。