エンジニアである私は、いつも言語に魅せられてきました。コーディングする言語と話す言語の両方にです。新しいプログラミング言語を学ぶときは、通常、具体的なものを作り、理論をすぐに実践に活かすことから始めています。その一方で、新しい話し言葉は、孤立した状態で学ぶことが多くあります。つまり、実際にその言語を使う状況とはおかしなほど切り離された状態で、教科書や演習を通して学ぶということです。プログラミングと同じく、言語は意味のある状況、すなわち交わしている会話、周りにあるもの、今置かれている状況などを通して学ぶのが最も効果的です。AI は従来の学習ツールとは異なり、学習者の状況に適応して、個人に合わせた自然な方法で言語を練習できるようにすることに他に類を見ないほど適しています。
そこで私は、少人数の同僚たちと共に、Google の最新生成モデルを利用できる Gemini API を試すことにしました。そして誕生したのが、3 つの小さな学習実験をまとめた Little Language Lessons です。この実験はすべて Google の Gemini モデルを使って行いました。
言語を学ぶ上で特に歯がゆいことの 1 つが、特定の単語やフレーズが必要なのに、それをまだ学んでいないという状況に陥ることです。
そこから着想したのが Tiny Lesson です。「道を尋ねる」や「なくしたパスポートを探す」といった状況を説明すると、その状況に役立つ語彙やフレーズ、文法のヒントを受け取ることができます。
これは、簡単なプロンプト レシピで実現できました。まずは、次のようなペルソナ設定から始めます。
あなたは {target language} の教師で、{target language} と {source language} を話せるバイリンガルです。
さらに、生徒の言語の活用目標に合わせて独自の教育コンテンツを作成する
エキスパートでもあります。
このプロンプトと以降のすべてのプロンプトでは、構造化 JSON を出力する Gemini の機能を活用し、求める結果を一連のオブジェクトのキーとして定義しました。
指定された利用シーンに応じて、"vocabulary" と "phrases" という 2 つのキーを含む
JSON オブジェクトを提供してください。
"vocabulary" の値は、"term"、"transliteration"、"translation" の
3 つのキーを含むオブジェクトの配列である必要があります。
"term" の値は、指定されたシーンと関連性が高く、
有用な {target language} の単語です。
対象言語が基本的にラテン文字で書かれる場合、"transliteration" の値は
空の文字列にしてください。それ以外の場合、"transliteration" の値は、
用語の音訳としてください。
"translation" の値は、用語を {source language} に翻訳したものに
してください。
...
各レッスンは、Gemini API を合計 2 回呼び出した結果となります。1 つ目のプロンプトですべての語彙とフレーズを生成し、もう 1 つで関連する文法トピックを生成します。
それぞれのプロンプトの最後で、次のようにしてユーザーが希望する利用シーンを追加します。
入力(利用シーン): {user input}
言語を学んでいると、それに慣れてきたと感じ始める瞬間があります。会話をしたり、自分自身を表現したり、ほとんどの意思疎通を図ったりできるようになります。しかしそのあと、まだ少し違う、と気づくことになります。つまり、フォーマルすぎて、ぎこちないのです。
この状況に対処するため、Slang Hang を作りました。アイデアはシンプルです。ネイティブ スピーカー同士のリアルな会話を作り、そこから学べるようにします。メッセージが 1 つずつ現れ、会話が進んでいく様子を確認できます。なじみのない用語は解説とともに表示されます。
Slang Hang の最初のプロンプトは次のようになっています。
あなたは {source language} と {target language} のバイリンガル脚本家で、
魅力的な会話を作るエキスパートです。
また、言語の専門家でもあり、自然な会話につながる文化的ニュアンスに
精通しています。
ユーザーは一度に 1 つのメッセージしか表示できませんが、設定、会話、強調表示する用語の説明などは、すべて 1 回の Gemini API 呼び出しで生成します。JSON 出力の構造は次のように定義します。
2 人の人がリアルな {target language} で会話している短いシーンを生成してください。
結果は、"context" と "dialogue" の 2 つのキーがある
JSON オブジェクトとします。
"context" の値は {SOURCE LANGUAGE} の短い段落とし、
そこでシーンの設定、起きていること、話者が何者であるか、そして話者同士の関係を説明してください。
"dialogue" の値はオブジェクトの配列で、1 つのオブジェクトに
1 回の会話のやり取りについての情報を含めます。
"dialogue" 配列の各オブジェクトには、
"speaker"、"gender"、"message"、"notes" の 4 つのキーを
含めてください。\ r
...
会話はユーザーのターゲット言語で生成されますが、メッセージを母国語に翻訳することもできます(Cloud Translation API による機能)。
この実験の興味深い点の 1 つは、物語が自然に生まれるところです。それぞれのシーンは唯一無二で、即興で生成されます。それは客と話している屋台の店主かもしれません。地下鉄で話している 2 人の同僚や、エキゾチックなペットショーで思いがけず久しぶりに再会した 2 人の友人かもしれません。
ただし、この実験は精度がやや低めであることがわかりました。場合によっては、特定の表現やスラングを誤用したり、存在しない表現を生み出したりすることもあります。LLM はまだ完璧ではないので、信頼できる情報源と照合することが重要です。
ときには、目の前にあるものを表現する単語が必要になることもあるでしょう。ターゲット言語でどう言えばいいかわからないものがどれほど多いか気づけば、たいへん謙虚な気持ちになるはずです。「窓」という単語は知っていても、「窓敷居」や「日よけ」は何と言うのでしょうか?
Word Cam は、カメラを即座に語彙ヘルパーに変えます。写真を撮ると、Gemini が物体を検出し、ターゲット言語でラベル付けしたうえで、説明に利用できる追加の単語を表示してくれます。
この実験では、Gemini のビジョン機能を使って物体を検出しています。モデルに画像を送信し、その画像に含まれるさまざまな物体の境界ボックス座標を尋ねます。
指定された画像に含まれる物体について教えてください。
結果は、"objects" という 1 つのキーを含む JSON オブジェクトで返します。
"objects" の値は、画像に含まれる個々のオブジェクトの数以下の長さのオブジェクトの配列とします。
配列内の各オブジェクトには、"name"、"transliteration"、
"translation"、"coordinates" の 4 つのキーを
含めてください。
...
"coordinates" の値は、物体の境界ボックスの
座標を表す整数の配列です。座標は、[ymin,
xmin, ymax, xmax] とします。
ユーザーが物体を選択したら、別のプロンプトでトリミングした画像を Gemini に送信し、ユーザーのターゲット言語でその物体を説明してもらいます。
指定された画像の物体を説明してください。
結果は、"descriptors" という 1 つのキーを含む
JSON オブジェクトとします。
"descriptors" の値はオブジェクトの配列で、各
オブジェクトには、"descriptor"、"transliteration"、"translation"、
"exampleSentence"、"exampleSentenceTransliteration"、
"exampleSentenceTranslation" の 6 つのキーを含めてください。\ r
...
3 つの実験すべてにテキスト読み上げ機能を組み込んでいるので、ユーザーはターゲット言語の発音を聞くことができます。これには、Cloud Text-to-Speech API を利用しています。広く話されている言語は自然な音声で読むことができますが、一般的でない言語では選択肢が限られます。地域による発音はまだ十分でないため、ユーザーが選択した方言と、再生される発音に齟齬がある場合もあります。
Little Language Lessons はまだ初期の段階ですが、このような実験は将来のエキサイティングな可能性を予感させるものです。また、この取り組みからいくつかの重要な疑問が浮上します。言語の専門家や教育者と協力して Little Language Lessons で調査したアプローチを洗練させていけば、どのようなものになるでしょうか?さらに視野を広げて、AI が自律的に学習した内容をダイナミックにパーソナライズするには、どうすればいいのでしょうか?
当面の間、私たちは調査、反復、質問を続ける予定です。これに似た他の実験も見てみたい方は、labs.google.com にアクセスしてください。