ChatGPT(canvas)と会話しながらOpenAI APIを使った語学学習アプリを作ってみた
はじめに
これまでに、
でChatGPTを使った学習体験について書いてきた。とはいえ、実際に学習したいのは英会話だったり宿題だったりするわけで、プロンプトをどう書くかというノウハウではないわけです。
それならば、ChatGPTなりCopilotを起動するんじゃなくて、Webアプリを使って、プロンプトなんか気にすることなく勉強しましょう。ということで、ChatGPT 4o with canvas で語学学習アプリをササっと作ってみました。
ChatGPTから始める
Windows版のChatGPTアプリを起動して、モデルには GPT-4o with canvas ベータ版 (ライティングとコードで共同作業する) を選択しました。
最初のプロンプトは、Hello, world! ではなくて、
でした。するとこんな感じでかなり丁寧にExpressフレームワークを使ったNode.jsアプリのひな型の作り方を説明してくれます。
ステップは全部で8つあり、ステップ8: アプリの実行で、テキスト入力ボックス、翻訳先言語を選択するプルダウン、翻訳結果を表示する画面までが表示されるはずです。
ところが、実行してみるとエラーが出力されるので、これもChatGPT君に解決方法を聞いてみます。
結論からいうと、サンプルコードで使われているOpenAI JavaScript APIのバージョンがv3であるのに対し、ステップ2: 必要なパッケージのインストールでインストールしているOpenAI JavaScript APIのバージョンが最新版(=v4)だったため、呼び出し方法が一部異なっているのが原因でした。
指示されたことにはちゃんと対応してくれるので、すぐに動くものが出来上がりました。
機能をリッチにしていく
基本的には、自分の目指すアプリケーションになるように、順を追って指示していけば、コードを書き換えてくれます。
機能を追加していくごとに開発途上のアプリケーションのスクリーンショットを撮っておけば良かったのですが、すっかり忘れていたので、どんなプロンプトを投げたのか、いくつかご紹介させていただきます。
今回は自分で直接やったほうが早い、確実なことであっても、すべてChatGPTへのプロンプト経由で実行しよう、というのが基本方針ではあったものの、言われた通りに進めていくと、APIキーが(リポジトリをpublicにしていたら)流出しかねないので、上にあげたようなプロンプトを使って、`.gitignore`ファイルを作成してもらっています。
コミットメッセージやREADME.mdファイルなんかは、自分であれこれ考えるよりも、任せてしまったほうが良いと思うことが多いです。
あとは、生成時のmax_tokenの上限が低くて、出力が尻切れトンボになるのを直してもらったり。
さて、一番苦労したのはテキスト中の単語を抽出し、それにターゲット言語の意味をつけた表を作成するところでした。
単語の抽出は、入力テキストを言語に合わせた構文解析エンジンで解析し…といったことをやっているわけではなく、自動生成されたプロンプトが単語抽出の指示をOpenAIに対してしています。
プロンプトの指示内容は、プロンプト経由で不具合を指示することで、進化を遂げているものの、だいたいこんな感じ(これは現時点での最終バージョンで使っているもの)。
そして指定された言語(一般的には学習者の母語)を使って、各単語に意味を付与していくのだが、これが一筋縄ではいかなかったのです。自動生成されたプロンプトはこんな感じです。
意味を付与するといっても、どこかの権威ある電子辞書を引いて意味を持ってきているわけではなく、どこの馬の骨かもわからないゴミ交じりの意味が付与されてしまうのでした。
最初は混じったゴミを如何にクリーンにしようかと、あれこれ手を尽くすのですが、
あれこれ手を尽くしてみたものの、どうにもならないので、ChatGPTに頼んで、使用するモデルを(デフォルトで指定されていた)gpt-3.5-turboから変更することにしました。
これですべてが解決したわけではないのですが、生成されたソースコードの上では、これくらいのフィルタリングを経ることで、表示に耐えうる単語の意味が出せるようになりました。
// 定義の取得とフィルタリング
const definitionContent = definitionResponse.choices[0].message.content.trim();
let definition;
if (definitionContent.includes('\n')) {
definition = definitionContent.split('\n')[0].trim();
} else if (definitionContent.includes('「') && definitionContent.includes('」')) {
definition = definitionContent.match(/「(.+?)」/)[1].trim();
} else if (definitionContent.includes('"')) {
definition = definitionContent.match(/"(.+?)"/)[1].trim();
} else {
definition = definitionContent;
}
いったん完成へ
各単語をつかった例文とその訳文を表示する機能を追加し、いったん完成とすることにしました。ここまでで5時間程度でした。
言語解析や翻訳等を自分でライブラリを用意したりせず、すべてChatGPT任せにしているので、この言語学習アプリは何語用でもありません。英語のテキストでも、日本語のテキストでも、中国語のテキストでも、そして学習者のあなたの母語が何語であっても、修正を加えることなく対応できます。
何語でも対応できるとは言ったものの、日本語テキストを入力すると、カンマ区切りで通知されると想定していた単語のリストが、読点で区切られてしまっているため、正しく動作しません。修正自体は(ChatGPTに頼んでしまえば)簡単ですが、何をテストすべきかというノウハウの蓄積が現時点では品質を担保するうえで重要かと思われます。
おわりに
ChatGPTによりソフトウェア開発のハードルが下がることは間違いありません。その一方で、意図通り動作しなかったときに、原因にあたりをつけるという意味では、ソースコードを読むことができ、デバッガーを使って追うことができる能力は、今のところは必要なようです。
リポジトリ: https://github.com/mfunaki/language-learning-app
追記
2014/11/13 - 冒頭に写真を追加しましたが、日本語テキストから単語を抽出する際に、カンマ(,)区切りで抽出するように指示しても読点(、)区切りで通知されてしまうため、単語が正しく抽出されなかった問題については、ChatGPTにサクッと修正してもらいました。