{"cells":[{"cell_type":"markdown","metadata":{"id":"ckAEsO6REsqW"},"source":["## __OpenAI APIの使い方__"]},{"cell_type":"markdown","source":["OpenAI APIをPythonで使うためには、openaiという外部ライブラリが必要です。\n","\n","このライブラリはGoogle Colaboratoryには最初からはインストールされていないので、これをインストールします。"],"metadata":{"id":"wJKQuIUW2MTg"}},{"cell_type":"code","execution_count":1,"metadata":{"id":"ibYlTvOgyT9M","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1692863653225,"user_tz":-540,"elapsed":8763,"user":{"displayName":"データサイエンス研究所動画保管用","userId":"11499464459917675575"}},"outputId":"7cfcd591-984c-4d7b-adb2-1b23e061876b"},"outputs":[{"output_type":"stream","name":"stdout","text":["Collecting openai\n","  Downloading openai-0.27.9-py3-none-any.whl (75 kB)\n","\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m75.5/75.5 kB\u001b[0m \u001b[31m1.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hRequirement already satisfied: requests>=2.20 in /usr/local/lib/python3.10/dist-packages (from openai) (2.31.0)\n","Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from openai) (4.66.1)\n","Requirement already satisfied: aiohttp in /usr/local/lib/python3.10/dist-packages (from openai) (3.8.5)\n","Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.20->openai) (3.2.0)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.20->openai) (3.4)\n","Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.20->openai) (2.0.4)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.20->openai) (2023.7.22)\n","Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->openai) (23.1.0)\n","Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.10/dist-packages (from aiohttp->openai) (6.0.4)\n","Requirement already satisfied: async-timeout<5.0,>=4.0.0a3 in /usr/local/lib/python3.10/dist-packages (from aiohttp->openai) (4.0.3)\n","Requirement already satisfied: yarl<2.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp->openai) (1.9.2)\n","Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from aiohttp->openai) (1.4.0)\n","Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.10/dist-packages (from aiohttp->openai) (1.3.1)\n","Installing collected packages: openai\n","Successfully installed openai-0.27.9\n"]}],"source":["!pip install openai"]},{"cell_type":"markdown","source":["先ほどインストールしたopenaiをインポートします。"],"metadata":{"id":"7Ft9RAgU25WJ"}},{"cell_type":"code","execution_count":2,"metadata":{"id":"QG1JElInyf4s","executionInfo":{"status":"ok","timestamp":1692863653653,"user_tz":-540,"elapsed":432,"user":{"displayName":"データサイエンス研究所動画保管用","userId":"11499464459917675575"}}},"outputs":[],"source":["import openai"]},{"cell_type":"markdown","source":["次に、API Keyを設定します。\n","\n","<font color=\"red\">これはOpenAI APIを利用するための認証キーであるため、他人に公開してはいけません</font>"],"metadata":{"id":"-bmGTZj32__p"}},{"cell_type":"code","source":["openai.api_key = \"<API Key>\""],"metadata":{"id":"Zj0fF2v72_v1","executionInfo":{"status":"ok","timestamp":1692863653653,"user_tz":-540,"elapsed":7,"user":{"displayName":"データサイエンス研究所動画保管用","userId":"11499464459917675575"}}},"execution_count":3,"outputs":[]},{"cell_type":"markdown","source":["ChatGPTと会話をするには、`ChatCompletion` という機能のAPIを使います。\n","\n","このとき、\n","\n","* モデルの種類\n","\n","* 会話\n","\n","を指定して実行します。\n","\n","今回はChatGPTを使うため、`model=\"gpt-3.5-turbo\"` と指定します。\n","\n","会話の内容は `messages` というパラメータで指定します。\n","\n","`messages` には辞書のリストを指定し、その辞書には `\"role\"` と `\"content\"` という2つのキーを指定します。\n","\n","\n","まずは\n","\n","- `\"role\": \"user\"`\n","\n","- `\"content\": \"OpenAIについて教えてください\"`\n","\n","という辞書が1つだけ入ったリストを `\"messages\"` に指定して実行してみましょう。"],"metadata":{"id":"xRVQOUc07HOD"}},{"cell_type":"code","execution_count":4,"metadata":{"id":"MlYKEhaavTtc","executionInfo":{"status":"ok","timestamp":1692863680304,"user_tz":-540,"elapsed":26658,"user":{"displayName":"データサイエンス研究所動画保管用","userId":"11499464459917675575"}}},"outputs":[],"source":["response1 = openai.ChatCompletion.create(\n","    model=\"gpt-3.5-turbo\",\n","    messages=[\n","        {\"role\": \"user\", \"content\": \"OpenAIについて教えてください\"}\n","    ]\n",")"]},{"cell_type":"markdown","source":["`response1` の中身を確認します。"],"metadata":{"id":"rNod5mdH9Mhs"}},{"cell_type":"code","execution_count":5,"metadata":{"id":"LvJlpXrOz9eW","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1692863680304,"user_tz":-540,"elapsed":11,"user":{"displayName":"データサイエンス研究所動画保管用","userId":"11499464459917675575"}},"outputId":"8df19850-49a1-418f-f856-9d70a161c456"},"outputs":[{"output_type":"execute_result","data":{"text/plain":["<OpenAIObject chat.completion id=chatcmpl-7qzSPN0a8n69OKysrobdRGqmBihy2 at 0x7c42404b1850> JSON: {\n","  \"id\": \"chatcmpl-7qzSPN0a8n69OKysrobdRGqmBihy2\",\n","  \"object\": \"chat.completion\",\n","  \"created\": 1692863653,\n","  \"model\": \"gpt-3.5-turbo-0613\",\n","  \"choices\": [\n","    {\n","      \"index\": 0,\n","      \"message\": {\n","        \"role\": \"assistant\",\n","        \"content\": \"OpenAI\\u306f\\u4eba\\u5de5\\u77e5\\u80fd\\uff08AI\\uff09\\u6280\\u8853\\u306e\\u7814\\u7a76\\u3068\\u958b\\u767a\\u3092\\u884c\\u3046\\u4f01\\u696d\\u3067\\u3059\\u3002OpenAI\\u306f\\u3001\\u65b0\\u305f\\u306aAI\\u306e\\u9032\\u6b69\\u304c\\u5354\\u529b\\u3068\\u5171\\u6709\\u306b\\u3088\\u3063\\u3066\\u9032\\u3081\\u3089\\u308c\\u308b\\u3079\\u304d\\u3067\\u3042\\u308b\\u3068\\u3044\\u3046\\u8003\\u3048\\u304b\\u3089\\u751f\\u307e\\u308c\\u307e\\u3057\\u305f\\u3002\\u305d\\u306e\\u305f\\u3081\\u3001\\u6280\\u8853\\u306e\\u5546\\u696d\\u5229\\u7528\\u306b\\u3088\\u308b\\u5229\\u76ca\\u3092\\u6700\\u5927\\u5316\\u3059\\u308b\\u3053\\u3068\\u3092\\u76ee\\u7684\\u3068\\u3059\\u308b\\u5f93\\u6765\\u306e\\u4f01\\u696d\\u3068\\u306f\\u7570\\u306a\\u308a\\u3001\\u30aa\\u30fc\\u30d7\\u30f3\\u3067\\u5171\\u6709\\u3055\\u308c\\u308bAI\\u6280\\u8853\\u306e\\u958b\\u767a\\u3092\\u63a8\\u9032\\u3057\\u3066\\u3044\\u307e\\u3059\\u3002\\n\\nOpenAI\\u306f\\u3001\\u81ea\\u5df1\\u5b66\\u7fd2AI\\u30b7\\u30b9\\u30c6\\u30e0\\u300cGPT\\u300d\\uff08Generative Pre-trained Transformer\\uff09\\u3092\\u958b\\u767a\\u3057\\u3001\\u305d\\u306e\\u6539\\u826f\\u7248\\u3067\\u3042\\u308b\\u300cGPT-3\\u300d\\u306f\\u7279\\u306b\\u6ce8\\u76ee\\u3092\\u96c6\\u3081\\u307e\\u3057\\u305f\\u3002GPT-3\\u306f\\u3001\\u5de8\\u5927\\u306a\\u30c7\\u30fc\\u30bf\\u30bb\\u30c3\\u30c8\\u3092\\u5b66\\u7fd2\\u3057\\u3066\\u751f\\u6210\\u3055\\u308c\\u305f\\u6587\\u7ae0\\u3092\\u751f\\u6210\\u3057\\u3001\\u3055\\u307e\\u3056\\u307e\\u306a\\u30bf\\u30b9\\u30af\\u306b\\u4f7f\\u7528\\u3059\\u308b\\u3053\\u3068\\u304c\\u3067\\u304d\\u307e\\u3059\\u3002\\u4e00\\u4f8b\\u3068\\u3057\\u3066\\u3001\\u6587\\u7ae0\\u306e\\u7ffb\\u8a33\\u3001\\u8981\\u7d04\\u3001\\u8cea\\u554f\\u5fdc\\u7b54\\u3001\\u6587\\u7ae0\\u306e\\u4f5c\\u6210\\u306a\\u3069\\u304c\\u6319\\u3052\\u3089\\u308c\\u307e\\u3059\\u3002\\n\\nOpenAI\\u306f\\u3001\\u6280\\u8853\\u306e\\u9032\\u6b69\\u304c\\u516c\\u5171\\u306e\\u5229\\u76ca\\u3092\\u6700\\u5927\\u5316\\u3059\\u308b\\u65b9\\u6cd5\\u3092\\u8ffd\\u6c42\\u3059\\u308b\\u305f\\u3081\\u3001AI\\u306e\\u7814\\u7a76\\u6210\\u679c\\u3092\\u516c\\u958b\\u3059\\u308b\\u3053\\u3068\\u3092\\u91cd\\u8996\\u3057\\u3066\\u3044\\u307e\\u3059\\u3002\\u307e\\u305f\\u3001\\u6cd5\\u7684\\u3001\\u502b\\u7406\\u7684\\u306a\\u554f\\u984c\\u306b\\u5bfe\\u51e6\\u3059\\u308b\\u305f\\u3081\\u306e\\u53d6\\u308a\\u7d44\\u307f\\u3082\\u884c\\u3063\\u3066\\u3044\\u307e\\u3059\\u3002\\n\\nOpenAI\\u306e\\u7814\\u7a76\\u6210\\u679c\\u3084\\u30c6\\u30af\\u30ce\\u30ed\\u30b8\\u30fc\\u306f\\u3001\\u7814\\u7a76\\u8005\\u3084\\u958b\\u767a\\u8005\\u3001\\u4f01\\u696d\\u3001\\u4e00\\u822c\\u306e\\u4eba\\u3005\\u306b\\u5229\\u7528\\u53ef\\u80fd\\u3067\\u3059\\u3002\\u307e\\u305f\\u3001OpenAI\\u306fAPI\\uff08Application Programming Interface\\uff09\\u3092\\u63d0\\u4f9b\\u3057\\u3001\\u958b\\u767a\\u8005\\u304cGPT\\u306a\\u3069\\u306e\\u6a5f\\u80fd\\u3092\\u81ea\\u8eab\\u306e\\u30a2\\u30d7\\u30ea\\u30b1\\u30fc\\u30b7\\u30e7\\u30f3\\u306b\\u7d71\\u5408\\u3059\\u308b\\u3053\\u3068\\u304c\\u3067\\u304d\\u308b\\u3088\\u3046\\u306b\\u3057\\u3066\\u3044\\u307e\\u3059\\u3002\\n\\nOpenAI\\u306e\\u76ee\\u6a19\\u306f\\u3001\\u4eba\\u5de5\\u77e5\\u80fd\\u306e\\u9032\\u6b69\\u3092\\u901a\\u3058\\u3066\\u3001\\u5e83\\u3044\\u7bc4\\u56f2\\u306e\\u554f\\u984c\\u3092\\u89e3\\u6c7a\\u3057\\u3001\\u6301\\u7d9a\\u53ef\\u80fd\\u306a\\u672a\\u6765\\u3092\\u5b9f\\u73fe\\u3059\\u308b\\u3053\\u3068\\u3067\\u3059\\u3002\"\n","      },\n","      \"finish_reason\": \"stop\"\n","    }\n","  ],\n","  \"usage\": {\n","    \"prompt_tokens\": 18,\n","    \"completion_tokens\": 541,\n","    \"total_tokens\": 559\n","  }\n","}"]},"metadata":{},"execution_count":5}],"source":["response1"]},{"cell_type":"markdown","source":["ChatGPTの出力は `response1.choices[0][\"message\"][\"content\"]` に入っているため、それを出力してみます。"],"metadata":{"id":"xp0f9V0TAuZW"}},{"cell_type":"code","execution_count":6,"metadata":{"id":"0sLM9ku5y7uU","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1692863680305,"user_tz":-540,"elapsed":9,"user":{"displayName":"データサイエンス研究所動画保管用","userId":"11499464459917675575"}},"outputId":"3d73a22e-6ee1-4d27-bef1-4a33ddc99554"},"outputs":[{"output_type":"stream","name":"stdout","text":["OpenAIは人工知能（AI）技術の研究と開発を行う企業です。OpenAIは、新たなAIの進歩が協力と共有によって進められるべきであるという考えから生まれました。そのため、技術の商業利用による利益を最大化することを目的とする従来の企業とは異なり、オープンで共有されるAI技術の開発を推進しています。\n","\n","OpenAIは、自己学習AIシステム「GPT」（Generative Pre-trained Transformer）を開発し、その改良版である「GPT-3」は特に注目を集めました。GPT-3は、巨大なデータセットを学習して生成された文章を生成し、さまざまなタスクに使用することができます。一例として、文章の翻訳、要約、質問応答、文章の作成などが挙げられます。\n","\n","OpenAIは、技術の進歩が公共の利益を最大化する方法を追求するため、AIの研究成果を公開することを重視しています。また、法的、倫理的な問題に対処するための取り組みも行っています。\n","\n","OpenAIの研究成果やテクノロジーは、研究者や開発者、企業、一般の人々に利用可能です。また、OpenAIはAPI（Application Programming Interface）を提供し、開発者がGPTなどの機能を自身のアプリケーションに統合することができるようにしています。\n","\n","OpenAIの目標は、人工知能の進歩を通じて、広い範囲の問題を解決し、持続可能な未来を実現することです。\n"]}],"source":["print(response1.choices[0][\"message\"][\"content\"])"]},{"cell_type":"markdown","source":["ChatGPTの出力文が長いため、続けて要約をさせてたいと思います。\n","\n","そこで、次はChatGPTに対して「もっと簡潔に説明してください」と指示を出してみます。\n","\n","先ほど実行したコードの `\"content\"` の中身を変えて実行します。"],"metadata":{"id":"NNo44fOQ9Wbd"}},{"cell_type":"code","source":["response2 = openai.ChatCompletion.create(\n","    model=\"gpt-3.5-turbo\",\n","    messages=[\n","        {\"role\": \"user\", \"content\": \"もっと簡潔に説明してください\"}\n","    ]\n",")\n","\n","print(response2.choices[0][\"message\"][\"content\"])"],"metadata":{"id":"X29rgOTq_GT7","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1692863682489,"user_tz":-540,"elapsed":2190,"user":{"displayName":"データサイエンス研究所動画保管用","userId":"11499464459917675575"}},"outputId":"f4be3bd3-3161-4529-dce7-e4849e535601"},"execution_count":7,"outputs":[{"output_type":"stream","name":"stdout","text":["もっと短く説明します。\n"]}]},{"cell_type":"markdown","source":["すると、うまく要約できませんでした。\n","\n","これは、ChatGPTはこれまでの会話の内容を知らないからです。\n","\n","ChatCompletionで、これまでの会話の内容を加味したタスクを行うには、これまでの会話の内容を教えてあげる必要があります。\n","\n","そこで、`messages` を以下のように指定します。\n","\n","```python\n","messages=[\n","        {\"role\": \"user\", \"content\": \"OpenAIという会社について教えてください\"},\n","        {\"role\": \"assistant\", \"content\": response1.choices[0][\"message\"][\"content\"]},\n","        {\"role\": \"user\", \"content\": \"もっと簡潔に説明してください\"}\n","    ]\n","```\n","\n","`messages` には3つの辞書が入ったリストを指定します。\n","\n","それぞれの辞書には `\"role\"` と `\"content\"` という2つのキーを指定します。\n","\n","`\"role\"` の値によって、`\"content\"` に書くべき内容が変わります。\n","\n","- `\"role\" : \"user\"`の場合 : `\"content\"` に質問や会話の内容を入力する\n","\n","- `\"role\" : \"assistant\"`の場合 : LLMを指す。`\"content\"` にuserに対する返答を定義する\n","\n","- `\"role\" : \"system\"`の場合：どのように返答して欲しいかというメタ情報や設定情報を指定する。役割設定で使うことが多い。\n"],"metadata":{"id":"9UvDNDl-_0-0"}},{"cell_type":"code","execution_count":9,"metadata":{"id":"a3hdqcXbEn8i","executionInfo":{"status":"ok","timestamp":1692864340378,"user_tz":-540,"elapsed":7497,"user":{"displayName":"データサイエンス研究所動画保管用","userId":"11499464459917675575"}}},"outputs":[],"source":["response3 = openai.ChatCompletion.create(\n","    model=\"gpt-3.5-turbo\",\n","    messages=[\n","        {\"role\": \"user\", \"content\": \"OpenAIという会社について教えてください\"},\n","        {\"role\": \"assistant\", \"content\": response1.choices[0][\"message\"][\"content\"]},\n","        {\"role\": \"user\", \"content\": \"もっと簡潔に説明してください\"}\n","    ]\n",")"]},{"cell_type":"code","source":["print(response3.choices[0][\"message\"][\"content\"])"],"metadata":{"id":"OFP6YE_W6fMi","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1692864340378,"user_tz":-540,"elapsed":4,"user":{"displayName":"データサイエンス研究所動画保管用","userId":"11499464459917675575"}},"outputId":"0f391da8-c8df-4dcf-8c85-e72e9550fe80"},"execution_count":10,"outputs":[{"output_type":"stream","name":"stdout","text":["OpenAIはAI技術の研究と開発を行う企業で、特にGPTという自己学習AIシステムが有名です。彼らはAIの研究成果を公開し、共有することを重視しています。また、APIを提供して開発者が彼らの技術を利用できるようにしています。彼らの目標は、AIを使って問題を解決し、持続可能な未来を実現することです。\n"]}]},{"cell_type":"markdown","source":["これまでの会話の内容を加味して要約させることができました。\n","\n","最後に、[Usage](https://platform.openai.com/account/usage)にアクセスし、何ドル分使用したのか確認しましょう。\n","\n","数円分しか使っていないと思います。"],"metadata":{"id":"vQmH5iEsDL_f"}},{"cell_type":"code","source":[],"metadata":{"id":"TY5Jo2bF6oFQ","executionInfo":{"status":"ok","timestamp":1692864340379,"user_tz":-540,"elapsed":3,"user":{"displayName":"データサイエンス研究所動画保管用","userId":"11499464459917675575"}}},"execution_count":10,"outputs":[]}],"metadata":{"colab":{"provenance":[],"gpuType":"T4"},"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"name":"python"}},"nbformat":4,"nbformat_minor":0}