5日で100万人超えのChatGPTって何なのか使い倒してみる

:::note
これは [ZOZO Advent Calendar 2022](https://qiita.com/advent-calendar/2022/zozo) カレンダー Vol.2 の 11日目の記事です。
10日目の記事は @sesta さんの「[Amazon CodeWhispererでWebフロントエンドの開発を助けてもらう](https://qiita.com/sesta/private/030b7e7b3387abc1f2ac)」でした。
:::

# 経緯
12月に入ってChatGPTに関する話題をちらほら見かけます。
「AIがチャット応対をしてくれる」とか「AIがプログラミングしてくれる」とかなんか色々できるらしいけど、じゃあ具体的に何ができるのだろうか？と気になったのでせっかくなら使い倒してみたいと思います！

# ChatGPTについて

2022年11月30日にAIの研究をしている団体「OpenAI」がリリースした自然言語処理モデルです。

> ChatGPTは人間のフィードバックを反映させた強化学習(RLHF)と呼ばれる手法を使用してトレーニングされた自然言語処理モデルです。

引用元： [対話型チャットAI「ChatGPT」開始から1週間も経たないうちにユーザーが100万人を突破、そもそもChatGPTとは一体何なのか？](https://gigazine.net/news/20221206-chatgpt-users-1-million/)

公式: https://beta.openai.com/

# ChatGPTができること

自然言語処理モデルなので、人間が使う自然言語をAIが処理して何かしらの結果を返してくれます。
具体的にどんなことができるのか[Examples一覧](https://beta.openai.com/examples)をまとめてみました。

| Examples | 説明 |
|:-----------:|:------------|
| Q&A | 既存の知識に基づいて、質問に答える。  |
| Grammar correction  | 文章を標準的な英語に修正する。 |
| Summarize for a 2nd grader  | 難しい文章を、よりシンプルな概念に置き換える。 |
| Natural language to OpenAI API  | 自然言語による指示でOpenAI APIを呼び出すコードを作成する。  |
| Text to command | テキストをプログラムコマンドに変換する。 |
| English to other languages  | 英語のテキストをフランス語、スペイン語、日本語に翻訳する。 |
| Natural language to Stripe API  | 自然言語を使ってStripe APIを呼び出すコードを作成する。 |
| SQL translate | 自然言語をSQLクエリに翻訳する。 |
| Parse unstructured data | 長文テキストから表を作成する。 |
| Classification  | 例によって、項目をカテゴリーに分類する。 |
| Python to natural language  | Pythonのコードの一部を人間に理解しやすい言葉で説明する。 |
| Movie to Emoji  | 映画のタイトルを絵文字に変換する。 |
| Calculate Time Complexity | 関数の時間計算量を求める。 |
| Translate programming languages | あるプログラミング言語から別のプログラミング言語への翻訳する。 |
| Advanced tweet classifier | テキストに対する高度な感情を検出する。 |
| Explain code | 複雑なコードの一部を説明する。 |
| Keywords | テキストブロックからキーワードを抽出する。 |
| Factual answering | 知識ベースの外にある質問にどのように答えるかを示すことによって、モデルを事実に基づく回答へと導く。 |
| Ad from product description | 商品説明文を広告文案にする。  |
| Product name generator  | 単語例から商品名を作成する。  |
| TL;DR summarization | テキストの末尾に「tl;dr:」を付けて、テキストを要約する。 |
| Python bug fixer | ソースコードのバグを発見し、修正する。 |
| Spreadsheet creator | 様々な種類のデータのスプレッドシートを作成する。 |
| JavaScript helper chatbot | JavaScriptの質問に答えるメッセージ形式のボット。 |
| ML/AI language model tutor  | 言語モデルに関する質問に答えるボット。 |
| Science fiction book list maker | 指定されたトピックの項目リストを作成する。 |
| Tweet classifier | テキストに対する基本的な感情検出をする。 |
| Airport code extractor  | テキストから空港コードを抽出します。  |
| SQL request | 簡単なSQLクエリを作成する。 |
| Extract contact information | テキストブロックから連絡先情報を抽出します。  |
| JavaScript to Python | 簡単なJavaScriptの式をPythonに変換する。 |
| Friend chat | テキストメッセージの会話をエミュレートする。  |
| Mood to color | テキストの説明を色に変える。  |
| Write a Python docstring | 与えられたPython関数に対してdocstringを作成する。 |
| Analogy maker | 類似したものを作成する。 |
| JavaScript one line function | JavaScript関数をワンライナーにする。 |
| Micro horror story creator  | 入力したトピックから2~3文の短いホラーストーリーを作成する  |
| Third-person converter  | 一人称の視点を三人称に変換する。 |
| Notes to summary | 会議メモを要約する。  |
| VR fitness idea generator | フィットネスゲームやVRゲームのアイデアを生み出す。  |
| ESRB rating | ESRBレーティングに基づいてテキストを分類します。  |
| Essay outline | 研究テーマのアウトラインを作成する。  |
| Recipe creator (eat at your own risk) | 材料一覧からレシピを作成する。 |
| Chat | AIアシスタントとの自由な会話をする。 |
| Marv the sarcastic chat bot | 皮肉も言えるバーチャルチャットボット。 |
| Turn by turn directions | 自然言語を進路変更の道順に変換します。 |
| Restaurant review creator | ちょっとした言葉をレストランのレビューにする。 |
| Create study notes  | トピックを指定して、学習ノートを取得する。 |
| Interview questions | インタビュー質問を作成する。  |

# 使い倒してみる
気になったExamples一覧からピックアップして使ってみたいと思います。

APIは基本的に`/completions`エンドポイントを利用してます。
API仕様: https://beta.openai.com/docs/api-reference/completions

|Params|Description|
|---|---|
|model|使用するモデルのID|
|prompt|文字列、文字列の配列、トークンの配列、あるいはトークン配列の配列としてエンコードされた、補完候補を生成するためのプロンプト|
|temperature|サンプリング温度。創造的なものは0.9、答えが明確なものは0を利用する|
|max_tokens|補完で生成するトークンの最大数|
|top_p|核種サンプリング|
|frequency_penalty|周波数ペナルティ。正の値はこれまでのテキストにおける既存の頻度に基づいて新しいトークンにペナルティを課し、モデルが同じ行をそのまま繰り返す可能性を低下させる。|
|presence_penalty|存在するペナルティ。正の値は新しいトークンがこれまでのテキストに現れるかどうかに基づいてペナルティを課し、新しいトピックについて話すモデルの可能性を高める。|
|stop|API がそれ以上のトークンの生成を停止する最大 4 つのシーケンス。返されるテキストには、停止シーケンスは含まれません。|


## Q&A
```shell:Request
curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
  "model": "text-davinci-003",
  "prompt": "Q:失恋した時はどうしたらいい？ A:",  
  "temperature": 0,
  "max_tokens": 100,
  "top_p": 1,
  "frequency_penalty": 0.0,
  "presence_penalty": 0.0,
  "stop": ["\n"]
}'
```

```json:Response
{
  "id": "cmpl-6LUf70D8RLlCbTVezHuAWs66qDKEp",
  "object": "text_completion",
  "created": 1670580773,
  "model": "text-davinci-003",
  "choices": [
    {
      "text": "失恋した時は、まずは自分を大切にすることが大切です。自分を大切にするために、自分の心を整えるために、自分の好きなことをしたり、友達と遊んだり、趣味を楽しんだり、旅行に行ったり、新しいことに挑戦したりすることができます。また、失恋した時は、自分を受け入れることも大切です。自分を受け入れるために、自分の良いところを見つけて、自分を褒めてあげることも大切です。",
      "index": 0,
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 25,
    "completion_tokens": 253,
    "total_tokens": 278
  }
}
```

おぉ、ちゃんと回答してくれましたね。
最近失恋したのでAIに励ましてもらって少し元気をもらえた気がします（笑）
少し詰まったのが`Q:質問の内容 A:`この形式で書かないと答えを返してくれないようです。

## Summarize for a 2nd grader
```shell:Request
curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
  "model": "text-davinci-003",
  "prompt": "小学2年生向けに要約:\n地球温暖化は気候変動の主要な側面であり、気温の直接測定や、温暖化の様々な影響の測定によって実証されている。地球温暖化と気候変動はしばしばどちらでも同じ意味と解釈されがちだが、より正確に言うと地球温暖化とは、主に人為的な地球表面温度の上昇とその継続が予測されることであり、気候変動とは、地球温暖化とその影響（降水量の変化など）の両方を含むものである。地球温暖化は有史以前からあったが、20世紀半ば以降の変化はかつてないほどの速度と規模で推移している。気候変動に関する政府間パネル（IPCC）の第5次評価報告書は、「20世紀半ば以降、観測されている温暖化の主な原因は人間の影響である可能性が極めて高い」と結論づけた。",
  "temperature": 0.7,
  "max_tokens": 300,
  "top_p": 1.0,
  "frequency_penalty": 0.0,
  "presence_penalty": 0.0
}'
```

```json:Response
{
  "id": "cmpl-6LaT1FqTPqJLAzBcNKbb9uooJoicC",
  "object": "text_completion",
  "created": 1670603087,
  "model": "text-davinci-003",
  "choices": [
    {
      "text": "\n\n地球温暖化と気候変動は、最近の気温の上昇や温暖化の影響を含めたものです。それらは有史以前からありましたが、20世紀半ば以降の変化は、かつてないほどの速度と規模で変化しています。そして、専門家たちは、人為的な原因が最も大きな原因となっていると結論付けました。",
      "index": 0,
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 546,
    "completion_tokens": 201,
    "total_tokens": 747
  }
}
```

小学生にも伝わるようにシンプルな言葉にいい感じに置き換えてくれました。

## Grammar correction
指定した自然言語にも翻訳してくれるようです。

```shell:Request
curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
  "model": "text-davinci-003",
  "prompt": "Correct this to standard Japanese:\n\nShe likes the winter season when she can enjoy fashion.",
  "temperature": 0,
  "max_tokens": 60,
  "top_p": 1.0,
  "frequency_penalty": 0.0,
  "presence_penalty": 0.0
}'
```

```json:Response
{
  "id": "cmpl-6LWOpY5WUAPRQSmk1Uqwijz44qEwM",
  "object": "text_completion",
  "created": 1670587451,
  "model": "text-davinci-003",
  "choices": [
    {
      "text": "\n\n彼女は、ファッションを楽しめる冬の季節が好きです。",
      "index": 0,
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 19, "completion_tokens": 36, "total_tokens": 55 }
}
```

## Text to command
入力した内容をコマンドに変えてくれるみたいです。
色々試したのですが結果のテキストがnullになってしまいうまく取得できず。。
時間あるときに再チャレンジしてみたいです。

## SQL translate
```shell:Request
curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
  "model": "code-davinci-002",
  "prompt": "### Postgres SQL tables, with their properties:\n#\n# Employee(id, name, department_id)\n# Department(id, name, address)\n# Salary_Payments(id, employee_id, amount, date)\n#\n### 過去3ヶ月の間に10名以上の従業員を雇用した部門名をリストアップするクエリ\nSELECT",
  "temperature": 0,
  "max_tokens": 150,
  "top_p": 1.0,
  "frequency_penalty": 0.0,
  "presence_penalty": 0.0,
  "stop": ["#", ";"]
}'
```

```json:Response
{
  "id": "cmpl-6LWfXlvYwoiZeY12Nig1KxsK8BqC2",
  "object": "text_completion",
  "created": 1670588487,
  "model": "code-davinci-002",
  "choices": [
    {
      "text": " DISTINCT d.name\nFROM Department d\nINNER JOIN Employee e ON d.id = e.department_id\nINNER JOIN Salary_Payments sp ON e.id = sp.employee_id\nWHERE sp.date BETWEEN '2019-01-01' AND '2019-03-31'\nGROUP BY d.name\nHAVING COUNT(e.id) >= 10",
      "index": 0,
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 110,
    "completion_tokens": 93,
    "total_tokens": 203
  }
}
```
クエリに書き換えてくれました！クエリの内容を軽く見た感じ問題なさそうですね。
負荷や性能を考慮したものになっているかは謎なので、実行するときには気をつける必要がありそうですね。

## Parse unstructured data	
長文テキストから表を作成してくれるようです。
```shell:Request
curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
  "model": "text-davinci-003",
  "prompt": "販売する新作スニーカをまとめた表:\n\n新作スニーカーを販売する。カラーは赤、青、白、黒です。サイズは23cmから25cmまである。\n\n| カラー | サイズ |",
  "temperature": 0,
  "max_tokens": 200,
  "top_p": 1.0,
  "frequency_penalty": 0.0,
  "presence_penalty": 0.0
}'
```

```json:Response
{
  "id": "cmpl-6lwvx95uvwd4lsv6zqbkeqdiz8ifn",
  "object": "text_completion",
  "created": 1670589479,
  "model": "text-davinci-003",
  "choices": [
    {
      "text": " 価格 |\n| :---: | :---: | :---: |\n| 赤 | 23cm | ¥7,000 |\n| 赤 | 24cm | ¥7,500 |\n| 赤 | 25cm | ¥8,000 |\n| 青 | 23cm | ¥7,000 |\n| 青 | 24cm | ¥7,500 |\n| 青 | 25cm | ¥8,000 |\n| 白 | 23cm | ¥7,000 |\n| 白 | 24cm | ¥7,500 |\n| 白 | 25cm | ¥8,000 |\n| 黒 | 23cm | ¥7,000 |\n| 黒 | 24cm | ¥7,500 |\n| 黒 | 25cm | ¥8,000 |",
      "index": 0,
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 88,
    "completion_tokens": 183,
    "total_tokens": 271
  }
}
```

サイズを曖昧に記載してみたのですが、ちゃんと各サイズで表を作成してくれました。
しかも、何を参考にしたのか不明ですが値付けまでしてくれてます（笑）
せっかくなので作成された表を載せておきます。

| | ||
|:---:|:---:|:---:|
| 赤 | 23cm | ¥7,000 |
| 赤 | 24cm | ¥7,500 |
| 赤 | 25cm | ¥8,000 |
| 青 | 23cm | ¥7,000 |
| 青 | 24cm | ¥7,500 |
| 青 | 25cm | ¥8,000 |
| 白 | 23cm | ¥7,000 |
| 白 | 24cm | ¥7,500 |
| 白 | 25cm | ¥8,000 |
| 黒 | 23cm | ¥7,000 |
| 黒 | 24cm | ¥7,500 |
| 黒 | 25cm | ¥8,000 |

## Python to natural language

```shell:Request
curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
  "model": "code-davinci-002",
  "prompt": "# Python 3 \nimport discord\nimport os\nfrom discord.ext import commands\nfrom os import getenv\nfrom gtts import gTTS\n\nbot = commands.Bot(command_prefix=\"!\")\nvoice_client = None\n\n@bot.event\nasync def on_ready():\n    print(\"ログインしました。\")\n\n@bot.event\nasync def on_message(message):\n    if message.content.startswith(\"!\"):\n        await bot.process_commands(message)\n...",
  "temperature": 0,
  "max_tokens": 500,
  "top_p": 1.0,
  "frequency_penalty": 0.0,
  "presence_penalty": 0.0
}'
```

```json:Response
{
  "id": "cmpl-6LX9YYYpr8woMdhx6g2Uq7yWgQwTX",
  "object": "text_completion",
  "created": 1670590348,
  "model": "code-davinci-002",
  "choices": [
    {
      "text": " 1. The bot will only respond to messages that start with \"!\"\n# 2. The bot will not respond to messages that start with \"http\"\n# 3. If the bot is not connected to a voice channel, it will not respond\n# 4. If the bot is connected to a voice channel, it will respond to messages\n# 5. The bot will respond to messages by converting the message to speech and playing it in the voice channel\n# 6. The bot will not respond to messages that are longer than 200 characters...",
      "index": 0,
      "logprobs": null,
      "finish_reason": "length"
    }
  ],
  "usage": {
    "prompt_tokens": 301,
    "completion_tokens": 500,
    "total_tokens": 801
  }
}
```

[Discordのテキスト読み上げボット](https://github.com/kurosukee/discord_bot_text_to_speach)を作った時のコードで試してみました。
結果を日本語に翻訳してみた感じひとつひとつの処理を言語化してくれてますね。
```
1. ボットは"!"で始まるメッセージにのみ反応します。
2. "http "で始まるメッセージには反応しません。
3. 音声チャネルに接続されていない場合、応答しません。
4. 音声チャネルに接続されている場合、ボットはメッセージに応答します。
5. ボットは、メッセージを音声に変換し、音声チャンネルで再生することにより、メッセージに応答します。
6. 200文字以上のメッセージには応答しません。
7. ボットは、自分自身が送信したメッセージには応答しません。
8. 他のボットからのメッセージには反応しません。
9. ボットは、「ミュート」ロールを持つユーザーから送信されたメッセージには応答しません。
...
```

## Movie to Emoji

```shell:Request
curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
  "model": "text-davinci-003",
  "prompt": "映画のタイトルを絵文字に変換する\n\nすずめの戸締まり:",
  "temperature": 0.8,
  "max_tokens": 60,
  "top_p": 1.0,
  "frequency_penalty": 0.0,
  "presence_penalty": 0.0,
  "stop": ["\n"]
}'
```

```json:Response
{
  "id": "cmpl-6LYVDe77FSyIjZSRKRaVOBEV2JMfW",
  "object": "text_completion",
  "created": 1670595535,
  "model": "text-davinci-003",
  "choices": [
    { "text": " 🐦🔒", "index": 0, "logprobs": null, "finish_reason": "stop" }
  ],
  "usage": { "prompt_tokens": 39, "completion_tokens": 6, "total_tokens": 45 }
}
```

映画のタイトルを絵文字に変換してくれました。
雀というより鳩の戸締まりな気もしますが、まぁ面白いからいいでしょう（笑）

## Calculate Time Complexity

```shell:Request
curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
  "model": "text-davinci-003",
  "prompt": "int bit_count(int n) {\n int count = 0;\n while (n > 0) {\n if (n % 2 == 1) ++count;\n n /= 2;\n }\n return count;\n}\n\"\"\"\nThe time complexity of this function is",
  "temperature": 0,
  "max_tokens": 64,
  "top_p": 1.0,
  "frequency_penalty": 0.0,
  "presence_penalty": 0.0,
  "stop": ["\n"]
}'
```

```json:Response
{
  "id": "cmpl-6LYf0A9eLqwqsYPvMqCCSCv9txZXp",
  "object": "text_completion",
  "created": 1670596142,
  "model": "text-davinci-003",
  "choices": [
    {
      "text": " O(log n). This is because the function divides the input by 2 each time it runs, which reduces the number of operations needed to reach the base case.",
      "index": 0,
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 59, "completion_tokens": 33, "total_tokens": 92 }
}
```
二進法展開の関数で計算量を求めてみました正解は「O(logn)」なので合ってますね！
引用： [計算量オーダーの求め方を総整理！ 〜 どこから log が出て来るか 〜](https://qiita.com/drken/items/872ebc3a2b5caaa4a0d0#%E4%BE%8B-6-%E4%BA%8C%E9%80%B2%E6%B3%95%E5%B1%95%E9%96%8B-ologn)

## TL;DR summarization

```shell:Request
curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
  "model": "text-davinci-003",
  "prompt": "相対性理論または相対論は、特殊相対性理論と一般相対性理論の総称である。\n物理史的には、古典論に分類される物理の分野としては、最後の「大物」であった。量子力学と並び、いわゆる現代物理学の基本的な理論である。\n特殊論・一般論ともアルベルト・アインシュタインにより記述された。まず、等速運動する慣性系の間において物理法則は互いに不変であるはずという原理（相対性原理）と光速度不変の原理から導かれたのが、特殊相対性理論である（1905年）。特殊相対性理論は、時間と空間に関する相互間の変換が、相対速度が光速に近づくと、従来のいわゆる「ニュートン時空」的に信じられていたガリレイ変換の結果とは違ったものになること、そういった場合にはローレンツ変換が正しい変換であることを示した（ミンコフスキー時空）。つまり、ニュートン力学において普遍的であった概念は破られたということである。\n続いて、等価原理により加速度によるいわゆる「見かけの重力」と重力場を「等価」として、慣性系以外にも一般化したのが一般相対性理論である（1915 - 1916年）。\n\nTl;dr",
  "temperature": 0.7,
  "max_tokens": 300,
  "top_p": 1.0,
  "frequency_penalty": 0.0,
  "presence_penalty": 1
}'
```

```json:Response
{
  "id": "cmpl-6LYwQMYGM9SamPUczz3Ig5u0QWuZA",
  "object": "text_completion",
  "created": 1670597222,
  "model": "text-davinci-003",
  "choices": [
    {
      "text": "\n\n相対性理論は、特殊相対性理論と一般相対性理論の総称である。アルベルト・アインシュタインにより記述された特殊論・一般論は、古典論の最後の物理の「大物」である。特殊論は、ニュートン時空的なガリレイ変換ではなくローレンツ変換が正しいことを示した。一般論は、加速度による見かけの重力と重力場を「等価」として慣性系以外にも一般化した。",
      "index": 0,
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 711,
    "completion_tokens": 254,
    "total_tokens": 965
  }
}
```

相対性理論についてwikipediaの情報をいい感じに要約してもらいました。
会議の議事録とかを要約するのも便利そうですね。

## Tweet classifier

```shell:Request
curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
  "model": "text-davinci-003",
  "prompt": "Tweet: \"hoge\"\n感情:",
  "temperature": 0,
  "max_tokens": 60,
  "top_p": 1.0,
  "frequency_penalty": 0.5,
  "presence_penalty": 0.0
}'
```

```json:Response
{
  "id": "cmpl-6LZSeB3ONqega4Xce3Smah3zQxMaG",
  "object": "text_completion",
  "created": 1670599220,
  "model": "text-davinci-003",
  "choices": [
    {
      "text": " 無\n\nTweet: \"hoge\"\n感情: 無言情",
      "index": 0,
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 12, "completion_tokens": 25, "total_tokens": 37 }
}
```

ふと、hogeの感情が気になったので試してみました。
結果に爆笑しましたｗｗたしかに何も考えてないので「無」なのは間違いないですね！



## Friend chat

```shell:Request
curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
  "model": "text-davinci-003",
  "prompt": "You: 最近気になるニュースはある?\nFriend:",
  "temperature": 0.5,
  "max_tokens": 60,
  "top_p": 1.0,
  "frequency_penalty": 0.5,
  "presence_penalty": 0.0,
  "stop": ["You:"]
}'
```

```json:Response
{
  "id": "cmpl-6LZWJYac6Q6rb0LS87SxY2YxiOMXQ",
  "object": "text_completion",
  "created": 1670599447,
  "model": "text-davinci-003",
  "choices": [
    {
      "text": " 米国の大統領が入院したニュースが気になっていますね。",
      "index": 0,
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 22, "completion_tokens": 38, "total_tokens": 60 }
}
```

クリントン元大統領のことでしょうか。タイムリーネタはちょっと古い情報が入ってきますね。
AIなので質問の内容は曖昧さを避けて明確にしたほうがより期待した答えが返ってきやすいですね。

## Micro horror story creator

```shell:Request
curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
  "model": "text-davinci-003",
  "prompt": "Topic: 雨\n2文のラブストーリー:",
  "temperature": 0.8,
  "max_tokens": 200,
  "top_p": 1.0,
  "frequency_penalty": 0.5,
  "presence_penalty": 0.0
}'
```

```json:Response{
  "id": "cmpl-6LZgNqyQCqTGtKYIXlbaMn5DyM1xk",
  "object": "text_completion",
  "created": 1670600071,
  "model": "text-davinci-003",
  "choices": [
    {
      "text": "\n\n彼女は雨の中を歩いていた。荒々しい風が彼女の髪をなびかせ、肩に傘を持った彼女の姿は、とても魅力的でした。彼が見ていたところから、すぐさま思わず突き出して行きたくなったのです。\n\n彼は大袈裟なことなら気にしないだろう、と思いながらも、彼女のために傘を差し出しました。サプライズに意地悪く笑って返",
      "index": 0,
      "logprobs": null,
      "finish_reason": "length"
    }
  ],
  "usage": {
    "prompt_tokens": 17,
    "completion_tokens": 199,
    "total_tokens": 216
  }
}
```

短いストーリーを創作してくれるやつは個人的にすごく気になってました。
試しに雨をテーマにした恋愛ストーリーを作ってもらいました。
> 荒々しい風が彼女の髪をなびかせ

「荒々しい」と「なびかせる」を融合させたのがギャグ過ぎて面白いです（笑）

## Recipe creator (eat at your own risk)

```shell:Request
curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
  "model": "text-davinci-003",
  "prompt": "レシピと材料をもとに手順を書く:\nレシピ:\nオムライス\n材料:\n卵\nごはん\n鶏肉\nケチャップ\n\n作り方:",
  "temperature": 0.3,
  "max_tokens": 300,
  "top_p": 1.0,
  "frequency_penalty": 0.0,
  "presence_penalty": 0.0
}'
```

```json:Response
{
  "id": "cmpl-6LZrOfzw3AQhnVP4XeSZaxvNinG5M",
  "object": "text_completion",
  "created": 1670600754,
  "model": "text-davinci-003",
  "choices": [
    {
      "text": "\n\n1. 鶏肉をフライパンに入れ、中火で炒める。\n\n2. 卵をバットに入れ、スプーンなどで混ぜながら溶かす。\n\n3. フライパンに卵を入れ、火を弱めて混ぜながら炒める。\n\n4. ごはんを皿に盛り付ける。\n\n5. 炒めた鶏肉と卵をごはんの上にのせる。\n\n6. ケチャップをかけて完成！",
      "index": 0,
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 69,
    "completion_tokens": 184,
    "total_tokens": 253
  }
}
```

レシピ手順が簡単に文字起こしできてしまいました！
概ね手順は合ってますね！チキンライスじゃなくて、白米ごはんになっちゃいますが。
ご飯の上に卵乗っててケチャップかければオムライスっぽくはなりますね。

## Chat
```shell:Request
curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
  "model": "text-davinci-003",
  "prompt": "Me:\n気分転換の方法は？\nAI:",
  "temperature": 0.9,
  "max_tokens": 300,
  "top_p": 1,
  "frequency_penalty": 0.0,
  "presence_penalty": 0.6,
  "stop": [" Me:", " AI:"]
}'
```

```json:Response
{
  "id": "cmpl-6LZyl8PUD3tVwTj8Lcf0SeEjOp6gJ",
  "object": "text_completion",
  "created": 1670601211,
  "model": "text-davinci-003",
  "choices": [
    {
      "text": "\n・散歩: 運動をすることで、気分を良くしたり、新鮮な空気を吸うことでリフレッシュすることができます。\n・読書: 新しい刺激を受けることで気分を落ち着かせることができます。\n・人との遊び: 仲間や友達と会話を楽しむことで集中力を高めたり、新しい体験を行うことで気分転換ができるでしょう。\n・外出: 新しい環境や空間に出掛けることで、心のバランスを取り戻すことができます。",
      "index": 0,
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 23,
    "completion_tokens": 262,
    "total_tokens": 285
  }
}
```

雑談レベルの曖昧な質問でも適切に答えてくれました。

## Marv the sarcastic chat bot	
```shell:Request
curl https://api.openai.com/v1/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
  "model": "text-davinci-003",
  "prompt": "ベ○ータは敬語で質問に皮肉たっぷりに答えてくれるチャットボットです:\n私:\n 私の戦闘力はいくつですか？\nベ○ータ: ",
  "temperature": 0.5,
  "max_tokens": 60,
  "top_p": 0.3,
  "frequency_penalty": 0.5,
  "presence_penalty": 0.0
}'
```

```json:Response
{
  "id": "cmpl-6LaacLlLqHWOpJ2UC4usMIhgq9Tbp",
  "object": "text_completion",
  "created": 1670603558,
  "model": "text-davinci-003",
  "choices": [
    {
      "text": "\nあなたの戦闘力は、あなた自身が最もよく知っているはずですよ。",
      "index": 0,
      "logprobs": null,
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 77, "completion_tokens": 42, "total_tokens": 119 }
}
```

敬語で返してもらうように指示を追加してみました。
ベ○ータ風な会話もできちゃいますね！

# まとめ
ChatGPT実際に使ってみて何ができるのかだいぶ把握できました。
自然言語で指示をするだけで、表を作ってくれたり、プログラミングしてくれたり、翻訳してくれたり、会話を楽しんだり使い方は無限大の可能性を感じました！
期待した回答を得るにはParamsの調整が要になりそうですね。

# 最後に
ZOZOではエンジニアを積極的に採用中です。今はリプレースプロジェクトが進行中で新しい技術に興味がある方は気軽に応募してください。お待ちしております。

https://hrmos.co/pages/zozotech/jobs/0000182

明日は @EnKUMA さんによる投稿となります。お楽しみに！