3 つの楽しい Gemma プロジェクトのアイデア

6月 26, 2024
Ju-yeong Ji Gemma DevRel

Gemma は、Gemini モデルと同じ研究技術で構築されたオープンモデルのファミリーです。現在、このファミリーには Gemma、CodeGemma、PaliGemma、RecurrentGemma があります。こういったモデルを合わせると、テキスト生成、コードの補完や生成、たくさんの視覚言語タスクといった幅広いタスクを、エッジからパソコン、クラウドまで、さまざまなデバイスで実行できます。さらに、特定のニーズに合わせて Gemma モデルをファイン チューニングすることもできます。

Gemma は、AI イノベーションを推進するデベロッパーや研究者のオープンなコミュニティ向けに構築されています。Gemma の詳細やクイックスタート ガイドは、ai.google.dev/gemma でご覧いただけます。

このブログ投稿では、3 つの楽しいプロジェクトのアイデアと、Gemma モデルを使ってそれを実現する方法を紹介します。

  • 古代朝鮮語の翻訳

  • ゲームデザインのブレーンストーミング

  • サンタさんへの手紙


#1. 古代朝鮮語の文献翻訳ツール

プロジェクトの説明

韓国語(朝鮮語)のアルファベットともいえるハングルは、時間とともに変化しており、現代韓国語では使われなくなった文字もあります。たとえば、次のような文字です。

  1. ㆍ(Arae-a): このドットが付いた母音は、短い「a」の音を表す。

2. ㆆ(Yeorin-hieut): 軽い「h」、すなわち英語の「h」を柔らかくしたような音。

3. ㅿ(Bansiot): 「z」の音を表す。

4. ㆁ(Yet-ieung): 「sing」という単語の「ng」に該当する軟口蓋鼻音。

使われなくなった文字があるため、韓国語のネイティブ スピーカーは古い文献を簡単に読むことはできません。また、初期のハングルは、単語間に空白がなく、さらに読みにくいものでした。現代のハングルでは、ほとんどのアルファベット体系と同じような空白が使われています。

Gemma の能力を活用すれば、現代韓国語と古代朝鮮語の間の隔たりを理解し、橋渡ししてくれる翻訳ツールを作ることができます。SentencePiece は、Gemma のトークナイザーの基盤として機能します。従来のトークナイザーには、言語固有のガイドラインや定義済みの辞書が必須でしたが、この SentencePiece は、生のテキストデータで直接トレーニングされています。そのため、特定の言語の影響を受けずに、さまざまな形式のテキストデータに適応できます。


必要なもの

ソフトウェア

タスクを簡略化するため、次の構造を使ってモデルをファイン チューニングします。このモデルは、ユーザーが入力した初期ハングルから、現代韓国語のテキストを生成します。

Korean text means, In the fifteenth year of the reign of King Sejong of Joseon, there was a prime minister outside Honghoemun Gate.
注: 韓国語のテキストは、「李氏朝鮮の王、世宗の治世であった 15 年間、弘化門の外に宰相がいた」という意味です。

インストラクション チューニング済み(IT)モデルは、特定の形式でトレーニングします。次のようにして、制御トークンを 1 つのトークンにしていることに注意してください。

Instruction-tuned (IT) models being trained with a specific formatter, with control tokens being tokenized in a single token

モデルは、李氏朝鮮王朝時代の朝鮮語小説『洪吉童傳』を使ってトレーニングします。

モデルの出力品質を評価するために、トレーニング データセットに含まれないテキスト、具体的には著者不明の朝鮮語古典小説『淑英娘子傳』を使います。


ファイン チューニング前の推論

モデルは初期ハングルを翻訳することができません。

Inference before fine tuning

LoRA ファイン チューニング

ファイン チューニング後には、指示に従った応答が返され、初期ハングルのテキストを現代韓国語にしたテキストが生成されるようになります。

Model generated contemporary Korean text

参考として、人間が翻訳した次のテキストをご覧ください。

금두꺼비가 품에 드는 게 보였으니 얼마 안 있어 자식을 낳을 것입니다.

하였다. 과연 그 달부터 잉태하여 십삭이 차니

注: 韓国語のテキストは「彼女の腕の中に金色のカエルが見えたので、もうすぐ子供が生まれるだろう。実際、彼女はその月に妊娠し、10 日が経過していた」という意味です。


別の出力を示します。

Model generated contemporary Korean text - example 2

人間による翻訳は次のようになります。

이 때는 사월 초파일이었다. 이날 밤에 오색구름이 집을 두르고 향내 진동하며 선녀 한 쌍이 촉을 들고 들어와 김생더러 말하기를,

注: 韓国語のテキストは、「4 月最初の日のことだった。その夜、五色の雲が家をつつみ、お香の香りが立ちこめる中、一組の仙女が棒を持って入ってきて、キム・セアンに言った」という意味です。


翻訳は完璧ではありませんが、草稿としては十分です。データセットが 1 冊の本だけであることを考えれば、この結果は注目に値するといえます。データソースを増やせば、翻訳の品質が向上するはずです。

モデルのファイン チューニングが終わったら、簡単に Kaggle と Hugging Face で公開することができます。

次に例を示します。

# ファイン チューニングしたモデルを保存する
gemma.save_to_preset("./old-korean-translator")
 
# モデルのバリアントを Kaggle にアップロードする
kaggle_uri = "kaggle://my_kaggle_username/gemma-ko/keras/old-korean-translator"
keras_nlp.upload_preset(kaggle_uri, "./old-korean-translator")

拡張案

この構造を流用すれば、同じようなタスクを実現できます。いくつかの例を示します。

  • アメリカ英語 <-> イギリス英語データセット

日常的に使われるさまざまなものや概念の名前は、地域によって異なります。たとえば、アメリカ英語(AmE)では、「エレベーター」、「トラック」、「クッキー」、「フレンチフライ」といった言葉が使われますが、イギリス英語(BrE)では、それぞれ「リフト」、「ローリー」、「ビスケット」、「チップス」といった言葉になります。

語彙だけでなく、スペルも異なります。たとえば AmE で「-or」で終わる単語の多くは、BrE では「-our」と綴ります。「color」(AmE)と「colour」(BrE)、「humor」(AmE)と「humour」(BrE)などです。

もう 1 つのスペルの違いは、「-ize」と「-ise」です。AmE では、「organize」や「realize」のように、「z」を使うのが一般的です。しかし、BrE では「s」が好まれ、「organise」や「realise」となります。

Gemma のような AI ツールの助けを借りれば、英語同士のスタイル変換を行うことができるので、アメリカ英語とイギリス英語のライティング スタイルをシームレスに切り替えることができます。

  • 関西弁データセット

日本の関西地方には、関西弁と呼ばれる独特な方言があります。ネイティブ スピーカーは、標準的な日本語よりも関西弁の方がテンポが速く抑揚が強いと認識します。

Gemma の機能と大量の関西弁データセットがあれば、方言翻訳ツールを作ることができます。


# 2. ゲームデザインのブレーンストーミング

プロジェクトの説明

Gemma を頼もしい仲間として、魅力的なゲーム作りに向かうことができます。すべてのはじまりは、ゲームのコンセプトとなるピッチ(アイデア)をシンプルな一文で表現することです。Gemma の巧みな導きによって、ゲームのコンセプトを具体化させ、複雑なメイン キャラクターたちを作成し、魅力的なメイン ストーリーを書いて、プレーヤーをゲームの世界に没入させましょう。


必要なもの

ソフトウェア

次のように、ゲームのコンセプトを一文のピッチで表現することから始めます。

Example of a one-sentence gameplay pitch

Gemma は、ピッチを基にして、詳細を追加することができます。

入力 : 「次のコンセプトを基に、このゲームの詳細を考えてください。\n{pitch}」

出力例 :

Example of Gemma output elaborating on the gameplay idea provided in an earlier prompt

入力 : 「メイン キャラクターをデザインしてください」

出力例 :

Gemma example output for prompt "Design main characters"

入力 : 「敵をデザインしてください」

出力例 :

Example of Gemma output for prompt "design villain characters"

入力 : 「このゲームのメイン ストーリーを、起承転結で書いてください」

出力例 :

Example of Gemma output for prompt requesting a main story with an introduction, development, turn, and conclusion

拡張案

プロンプトを変更すれば、ほとんどのタイプのクリエイティブ コンテンツで、同じようなコンパニオンを作ることができます。

宣伝文

ピッチ : 「新しい蒸気歯ブラシ」

入力 : 「次の新製品の宣伝文を生成してください。\n{pitch}」

出力例 :

Example of Gemma output for prompt "Generate a marketing phrase for the new product below.\n{pitch}""

フラワーアート

ピッチ : 「宇宙と流れ星」

入力 : 「次のコンセプトを基に、フラワーアートとそれにふさわしい花を提案してください。\n{pitch}」

出力例 :

Example of Gemma output for prompt requesting a florist idea based on a provided prompt

料理のレシピ

ピッチ : 「サイバーパンク クラーケン」

入力 : 「次のコンセプトを基に、料理のレシピを作ってください。\n{pitch}」

出力例 :

Example of Gemma output for prompt requesting a recipe based on a provided prompt

# 3. サンタさんの魔法のポスト

プロジェクトの説明

昔から、サンタさんに手紙を送る方法は限られており、個性的ではありません。お子さんは返信が届くまで数週間から数か月待たなければならないことが多く、手紙はお子さんが望むほど詳細でインタラクティブなものではないこともあります。

このプロジェクトでは、Raspberry Pi で Gemma を動作させ、大規模言語モデルを使ってサンタさんからの魔法の手紙を作ります。


必要なもの

ハードウェア

  • 8GB の RAM を搭載した Raspberry Pi 4 コンピュータ

ソフトウェア

テキスト生成


A. libgemma を使って独自の C++ アプリケーションを書くことができます

libgemma を使って独自の C++ アプリケーションを書くことができます。

次のプロンプトを使ってモデルに指示します。

Example of a prompt to instruct a Gemma model to write  a letter to Santa

B. または、こちらのシンプルな C++ アプリでテストします

ビルドする前に、コードで定義されている MODEL_PATH を変更してください。

$ g++ santa.cc -I . -I build/_deps/highway-src -I build/_deps/sentencepiece-src build/libgemma.a build/_deps/highway-build/libhwy.a build/_deps/sentencepiece-build/src/libsentencepiece.so -lstdc++ -l

実行

$ LD_LIBRARY_PATH=./build/_deps/sentencepiece-build/src ./a.out

letter.txt のテキストを読み取り、サンタクロースからの手紙を生成します。

注: Raspberry Pi によるテキスト生成には、時間がかかる場合があります。

Image of C++ application in libgemma

最終的な結果は、次のようになります。

Image of C++ app letter from Santa output

C. llama.cpp を使いたい方のために、GGUF モデルも提供しています

$ ./main -m models/gemma-2b-it.gguf --repeat-penalty 1.0 -p あなたはサンタクロースですこの子からの手紙に返信してください。\n<start_of_turn>user\nPLACE_THE_CONTEXT_OF_LETTER_HERE<end_of_turn>\n<start_of_turn>model\n
Image of llama.cpp build and output

まとめ

Gemma は無限の可能性をもたらします。ここで紹介したアイデアが、皆さんのインスピレーションになることを願っています。実現した皆さんの作品を見るのが楽しみです。

Google デベロッパー コミュニティの Discord サーバーにご参加ください。プロジェクトを共有し、志を同じくする他の人とつながることができます。

ぜひ楽しみながらお試しください!