OpenAI API Beta に承認されたので申請方法とAPIできることをご紹介

## はじめに：GPT-3の衝撃

こんにちは。CData Software Japanの加藤といいます。現在エンジニアではないのですが、学生時代に言語処理系のモデルやデータ分析をやっていたこともあり、NLP系の話題には興味を持っています。今回は、最近話題のGPT-3モデルがAPI経由で使えるOpenAI API Betaに承認されたので、このAPI周りの簡単な紹介をします。

ここ半年くらいAIやテック界隈を賑わわせてきた機械学習モデルに、GPT-3があります（[WIREDの記事](https://wired.jp/2020/08/17/ai-text-generator-gpt-3-learning-language-fitfully/)）。[Microsoftがライセンスを独占契約した](https://ledge.ai/microsoft-gpt-3-news/)ことでも話題になりましたね。このモデルは1750億というこれまでのモデルの10倍以上のパラメータを持った、深層学習を使った超巨大言語モデルで、5000億単語程度のパラメーター数と同じく大量の文書データを使って訓練されています。パラメータは調節弁のようなもので、この数が多ければ多いほどモデルを細かく調整してデータにフィットさせられので、基本的には多ければ多いほどよいと考えられます。

![1_C-KNWQC_wXh-Q2wc6VPK1g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47210/f08d3c9d-2f0f-b3d4-91a8-46a04c7c63ff.png)
代表的な言語モデルのパラメータ数（[こちらのブログ](https://towardsdatascience.com/gpt-3-the-new-mighty-language-model-from-openai-a74ff35346fc)から）


このモデルがAI界隈を超えて話題になったのは、なんと言ってもそのデモが衝撃的だったからでしょう。

自然言語の入力をもとにHTMLコードを記述したり、

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Here&#39;s a sentence describing what Google&#39;s home page should look and here&#39;s GPT-3 generating the code for it nearly perfectly. <a href="https://t.co/m49hoKiEpR">pic.twitter.com/m49hoKiEpR</a></p>&mdash; Sharif Shameem (@sharifshameem) <a href="https://twitter.com/sharifshameem/status/1283322990625607681?ref_src=twsrc%5Etfw">July 15, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Kerasで機械学習モデルを書いたり、

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">AI INCEPTION!<br><br>I just used GPT-3 to generate code for a machine learning model, just by describing the dataset and required output.<br><br>This is the start of no-code AI. <a href="https://t.co/AWX5mZB6SK">pic.twitter.com/AWX5mZB6SK</a></p>&mdash; Matt Shumer (@mattshumer_) <a href="https://twitter.com/mattshumer_/status/1287125015528341506?ref_src=twsrc%5Etfw">July 25, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

SQLクエリを生成したり、などなど。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">I got GPT-3 to start writing my SQL queries for me<br><br>p.s. these work against my *actual* database! <a href="https://t.co/6RoJewXEEx">pic.twitter.com/6RoJewXEEx</a></p>&mdash; faraaz 🦊 (@FaraazNishtar) <a href="https://twitter.com/FaraazNishtar/status/1285934622891667457?ref_src=twsrc%5Etfw">July 22, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

こうしたデモはGPT-3を提案した研究者たちが所属する[OpenAI](https://openai.com/)が公開している、[OpenAI API](https://beta.openai.com/)を使って作成されたものです。現在このAPIはprivate Betaでの公開で、申請して承認されたらAPIキーが利用可能、という運用になっています。今月このBetaに承認されたので、申請方法からどんなことができるのかまで、簡単に書いていきます（こうしたら承認されやすいとか、そういうtipsとかはないです）。

## OpenAI APIへの申請方法
APIへの申請は[このページ](https://beta.openai.com/)から行えます。「Join the Waitlist」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47210/7bdcdbb9-32ab-2575-8fe8-64a64166f4e1.png)

申請フォームが表示されるので、入力します。必要事項は以下になります。
- Email
- 名前
- 特定のアプリケーションに使用予定か
- 使用目的
- 特にどの機能を使用するか
- 使用方法の記述
- 作成するアプリケーションと関連する産業
- 組織に所属しているか
- 居住地域

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47210/d9d17632-83d1-f51d-39ab-c12cf0bedd55.png)

これで申請は完了です。後は承認されるのを待ちましょう。僕は承認まで4ヶ月ほどかかりました。例外的に[5日で承認された](https://www.flowrite.com/blog/how-we-got-access-to-gpt-3-in-5-days)という人もいるので、申請の中身やアウトリーチの仕方次第で承認までの期間は変わってくるのでしょう。

## APIで何ができるの？
申請が承認されると、ウェルカムメールと専用Slackチャネルへの招待が届きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47210/24c7a3c6-d6ac-b2d5-1658-d7022316e109.png)

ここからアカウントを登録すると、APIキーやチュートリアル、ドキュメンテーション、プレイグラウンド環境にアクセス可能になります。

### GPT-3とプロンプト

さて、GPT-3を使う際に重要なのは**プロンプト**という概念です。言語モデルは基本的に、文章の文脈をもとに次に来るであろう文を生成します。プロンプトというのは、モデルに文脈を理解させるためのタスクの記述や例示のことです。GPT-3を最大限活用するには、このプロンプトをいかにうまく設計できるかが鍵になります。プロンプトの内容次第で、QA用チャットボット、文章分類機、検索エンジンなど、様々なアプリケーション用にモデルを特化させることができるわけです。例えば英日鬼滅の刃翻訳機を作りたいとすると、こんなプロンプトが考えられます（後でこのプロンプトに対するモデルの出力を見てみます）。

```
This is a English to Japanese Kimetsu No Yaiba translator

English: Don’t ever give others a power of life and death!!
Japanese: 生殺与奪の権を他人に握らせるな

English: Don’t cry. Don’t despair. Now’s not the time for that!
Japanese: 泣くな、絶望するな、そんなことは今することじゃない！

English: Feel the rage, The powerful, pure rage of not being able to forgive will become your unswerving drive to take action
Japanese: 怒れ、許せないという強く純粋な怒りは手足を動かすための、ゆるぎない原動力になる

English: God, please do not make this person a demon next time he was born in this world
Japanese: 神様どうかこの人が今度生まれてくる時は鬼になんてなりませんように

English: No matter how many people you may lose, you have no choice but to go on living. No matter how devastating the blows maybe. 
Japanese: 
```
（翻訳例は[こちらのページ](https://hiro8japan.com/great-quotes-of-demon-slayer)から引用しました。）


"This is a English to Japanese Kimetsu No Yaiba translator"がタスクの記述で、

```
English:
Japanese: 
```

という部分で翻訳例を与えて、最後の行は空白にしておいてモデルに補完してもらうわけです。

### APIを使う

OpenAI APIを使うことで、モデルにこのようなプロンプトを投げて、そのレスポンスを取得することができます。APIはBearerトークン方式で使用可能で、プロンプトの中身などをJSON形式で渡せます。例えば上のプロンプトを渡してみます。

> {"prompt": "This is a English to Japanese Kimetsu No Yaiba translator English: Don’t ever give others a power of life and death!! Japanese: 生殺与奪の権を他人に握らせるな。 English: Don’t cry. Don’t despair. Now’s not the time for that! Japanese: 泣くな、絶望するな、そんなことは今することじゃない！ English: Feel the rage, The powerful, pure rage of not being able to forgive will become your unswerving drive to take action. Japanese: 怒れ、許せないという強く純粋な怒りは手足を動かすための、ゆるぎない原動力になる。 English: God, please do not make this person a demon next time he was born in this world. Japanese: 神様どうかこの人が今度生まれてくる時は鬼になんてなりませんように。 English: No matter how many people you may lose, you have no choice but to go on living. No matter how devastating the blows mayb![Something went wrong]()
e. Japanese: ", "max_tokens": 80, "temperature": 0.4}

```
{
    "id": "cmpl-V6ubNy3SlgxHBjdvx7y5HiHu",
    "object": "text_completion",
    "created": 1607837329,
    "model": "davinci:2020-05-03",
    "choices": [
        {
            "text": "人を失ったり、打たれたりしても、生きていくしかない。どんなに打ちのめされても。",
            "index": 0,
            "logprobs": null,
            "finish_reason": "max_tokens"
        }
    ]
}
```
翻訳対象の自由度の高さを考えれば、悪くないですね。ちなみに原文は「失っても失っても生きていくしかないんです、どんなに打ちのめされようと」だそうです。Pythonモジュールからリクエストすることも可能です。

さらにOpenAI APIではPlayground環境というものが用意されていて、プロンプトを簡単に試すことができます。

![openai_api.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47210/f603ba86-92a4-1df4-ce77-834ec2e97fd5.gif)

こんな感じで、簡単にモデルを使うことができます。

## おわりに
以上、Open AI APIのご紹介でした。APIとして手軽に使えるので、アプリケーションなどへの応用も今後Publicに公開されるにつれてどんどん増えてきそうですね。興味がある方は、ぜひ申請フォームから申し込んでみてください！