GPT-3でプログラマ向け箴言・名言出力サイトを作りました

## はじめに
GPT-3のAPIキーは頂いたので何か作りたいなと思い、プログラマー向け箴言集みたいなものを作りました。
ただの箴言・名言集では物足りないので、GPT-3による英語-日本語翻訳を載せました。英語では構文論的・意味論的に精度は高いものの日本語に関してはまだまだという印象ですが、なかなかおもしろいものになっていると思います。

慣れればこのようなAPIを10分程度で作れるかと思いますが、GPT-3アプリケーション開発がほとんど公開されていないということもあって、無駄な遠回りをしてしまったなぁという印象があります。そのような反省も含めて記事にしたいと思います。


## 完成サイト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294146/1199ce2f-df8c-3d2c-bb71-dc8d48a17353.png)

[The Zen of Programming](https://zen-of-programming.netlify.app/)
こちらなります。
(この出力はリアルタイムにGPT-3からとってきているわけではありません。
3分毎にGPT-3のAPIにアクセスして取得した名言プールから、いくつかの名言ををランダムで出力しています)

GPT-3の仕様ですが、実在する名言と、架空の名言、実在人物と架空の人物がごっちゃになっていますので、引用する際は一度検索を通したほうが良いかと思います。
また英語・日本語対訳の精度は高くないのでご注意を。

## 環境
APIバックエンド :AWS Lambda + DynamoDB
フロントエンド: Nuxt + Netlifyでホスティング
デプロイ構成管理ツール: ServelessFramework
言語: TypeScript


## プロンプト
### プロンプトとは？
GPT-3は大規模データセットを学習させるようなマネはできません。その代わりほんの僅かなデータを与えることで、その後に続く文の予測や補完が可能になります。
プロンプトというのはこのGPT-3に与える一種の文脈で、GPT-3アプリケーションはこのプロンプトを使ってGPT-3アプリケーションが処理しやすくなるように「促す」ことがコツといえます。

今回はプログラマたちの名言・至言を与えてみました。

```
Programming wisdom(Bilingual version)
--
author: Grady Booch
English: The function of good software is to make the complex appear to be simple.
Japanese: 優れたソフトウェアの機能は、複雑なものを単純に見せることです。
--
author: Alan Kay
English: Don’t worry about what anyone else is going to do. The best way to predict the future is to invent it.
Japanese: 他人のやることを気にする必要はない。未来を予測する一番の方法は、それを発明することです。
--
author: Henry Spencer
English: If you lie to the compiler, it will get its revenge.
Japanese: コンパイラに嘘をつくと復讐されます。
--
author: Ellen Ullman
English: To be a programmer is to develop a carefully managed relationship with error.
Japanese: プログラマーであるということは、エラーとの付き合いを注意深く管理することである。
--
author: Jeff Sickel
English: Deleted code is debugged code.
Japanese: 削除されたコードはデバッグ済みのコードである。
--
author: Gordon Glegg
English: Sometimes the problem is to discover what the problem is.
Japanese: ときに、問題が何であるかを発見することが問題になることもある。
--
author: Steve Wozniak
English: Your first projects aren’t the greatest things in the world, and they may have no money value, they may go nowhere, but that is how you learn – you put so much effort into making something right if it is for yourself.
Japanese: あなたの最初のプロジェクトは、世界で最も素晴らしいものではないし、金銭的価値もないかもしれないし、どこにも行かないかもしれないが、それがあなたが学ぶ方法です。
--
author: Ron Jeffries
English: Code never lies, comments sometimes do.
Japanese: コードは決して嘘をつかないが、コメントは時々嘘をつく。
--
```
だいたいこんな感じになります。
この段階では全て実在する人物の、実際に発した(であろう)言葉を並べただけです。
これだけでOpenAIのAPIに投げると、その続きを補完してくれます。

今回はその補完された文章から正規表現で切り分けて、DynamoDBに保存しました。


### 反省点
いきなり反省点ですが、GPT-3でアプリケーションを作る際はそのような文章リスト形式はオススメしません。
GPT-3は賢いので、文章のリスト形式だけでなくJSONやJavaScriptオブジェクト形式でも問題なく理解してくれます。
というわけで、今回はJavaScript/TypeScriptでAPIを作るなら以下のようなJSON形式のほうが妥当なプロンプトだったと言えるでしょう。

```
Programming wisdom(Bilingual version)
--
{"author": "Grady Booch", "english": "The function of good software is to make the complex appear to be simple.","japanese": "優れたソフトウェアの機能は、複雑なものを単純に見せることです。"}
--
{"author": "Colin Percival", "english": "The most secure code in the world is code which is never written.","japanese": "この世で最もセキュアなコードとは、まだ書かれていないコードです。"}
--
(以下略)
```
このようなプロンプトでも予測通りに返してくれます。
その言語に応じて、答えが欲しい形式でプロンプトを与えるといいでしょう。

## デプロイ
フロントエンド側をNuxtで開発しました。見た目を整えるだけなので別にNuxtを使う必要はほぼほぼなかったのですが、慣れているのでとりあえず使った感じです。これをGitHubにPushし、Netlifyでホスティングします。

完全サーバレス構成で大変簡単。ここまで数時間でできました。


## バグ
確認済みのバグとして、正規表現による文章取得に失敗していることがあります。
GPT-3は賢いですが、ときどきわけのわからない動作をしたりしますのでこの当たりは見つけたら**手動**で例外を飛ばすようにしています。
同じパラメータを投げても毎回微妙に異なる返答を返すので、「条件が同じなら同じ答えが帰ってくるはず」という期待はできません。
予想しづらいてという点でGPT-3アプリケーション開発において特徴的なテストが必要になるのではないかと思います。

## 終わりに
今回はGPT-3のAPIを叩くだけでなく、ランダム表示するAPIも作る必要があったため多少時間はかかりました。
ただ今後GPT-3の有料化・商業化が活発になっていけばもっと手軽につかっていけるのではないかと思います。