├── section_4 ├── 02_diet.png ├── 05_rpg.png ├── 01_recipe.png ├── 03_english.png ├── 04_programming.png ├── 06_fortunetelling.png ├── 06_fortunetelling.ipynb ├── 01_recipe.ipynb ├── 02_diet.ipynb ├── 03_english.ipynb ├── 04_programming.ipynb └── 05_rpg.ipynb ├── LICENSE ├── README.md ├── section_1 ├── 02_exercise.ipynb └── 01_chat_gpt_api.ipynb ├── python_basic ├── python_basic_4.ipynb ├── python_basic_1.ipynb ├── python_basic_3.ipynb └── python_basic_2.ipynb ├── section_3 ├── 01_bulid_chatbot.ipynb └── 02_exercise.ipynb └── section_2 ├── 01_streamlit_basic.ipynb ├── 02_chatbot.ipynb └── 03_exercise.ipynb /section_4/02_diet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yukinaga/chatgpt_api/HEAD/section_4/02_diet.png -------------------------------------------------------------------------------- /section_4/05_rpg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yukinaga/chatgpt_api/HEAD/section_4/05_rpg.png -------------------------------------------------------------------------------- /section_4/01_recipe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yukinaga/chatgpt_api/HEAD/section_4/01_recipe.png -------------------------------------------------------------------------------- /section_4/03_english.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yukinaga/chatgpt_api/HEAD/section_4/03_english.png -------------------------------------------------------------------------------- /section_4/04_programming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yukinaga/chatgpt_api/HEAD/section_4/04_programming.png -------------------------------------------------------------------------------- /section_4/06_fortunetelling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yukinaga/chatgpt_api/HEAD/section_4/06_fortunetelling.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 yuky_az 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ChatGPT APIを使ってチャットボットを作ろう!【GPT-3.5/GPT-4】 2 | 3 | 「ChatGPT APIを使ってチャットボットを作ろう!」は、ChatGPTのAPIを使ってチャットボットを構築する方法を学ぶ講座です。 4 | ChatGPT APIを利用して、様々な性格や機能を持つチャットボットを構築し、公開する方法を学びます。 5 | 6 | 2022年11月末に登場した対話AIのChat GPTは、高い精度と自然言語によるインターフェイスにより、世界中から注目を集めています。 7 | 様々なタスクをこなせる汎用性を備えており、法律相談、コンサルティング、カウンセリング、教育、あるいは創作活動など様々な用途での活躍が期待されています。 8 | 9 | ChatGPTのAPIは既に公開されており、これを利用することで高性能なオリジナルのチャットボットを構築できます。 10 | 実際に、本講座ではでは日常生活、教育、エンターテイメントなど様々な状況で有用なチャットボットを構築します。 11 | 大規模言語モデルを使用しているので、前提となるプロンプトの与え方次第で様々な性格や機能を持たせることが可能です。 12 | 13 | 本講座では、最初にChatGPT APIの基礎を学んだ上で、実際に様々なチャットボットを構築し、公開する方法を学びます。 14 | ChatGPTを利用して、様々なチャットボットアプリが作れるようになりましょう。 15 | 16 | Section1. ChatGPT APIの概要 17 | → ChatGPTの概要や、開発環境について学びます。 18 | 19 | Section2. チャットボットの構築 20 | → ChatGPT APIを使い、実際にチャットボットを構築します。 21 | 22 | Section3. チャットボットの公開 23 | → 構築したチャットボットをWeb上で公開する方法を学びます。 24 | 25 | Section4. 様々なチャットボットの構築 26 | → 前提となるプロンプトを設定し、様々な種類のチャットボットを構築します。 27 | 28 | Udemyコース: [ChatGPT APIを使ってチャットボットを作ろう!【GPT-3.5/GPT-4】](https://www.udemy.com/course/chatgpt-api-bot/?referralCode=390A093D3579B3558B24) 29 | 30 | ### 自由研究室 AIRS-Lab(コミュニティ) 31 | 「AI」をテーマに交流し、創造するWeb上のコミュニティです。 32 | https://www.airs-lab.jp/ 33 | 34 | ### News! AIRS-Lab 35 | AIの話題、講義動画、Udemyコース割引などのAIRS-Lab最新コンテンツを配信します。 36 | https://note.com/yuky_az 37 | 38 | ### AI教室 AIRS-Lab(YouTubeチャンネル) 39 | 毎週月曜日21時に、YouTubeでライブ講義を開催しています。 40 | https://www.youtube.com/channel/UCT_HwlT8bgYrpKrEvw0jH7Q 41 | 42 | ### Udemyコース 43 | オンライン動画学習プラットフォームUdemyで、AI関連のコースを複数展開しています。 44 | https://www.udemy.com/user/wo-qi-xing-chang/ 45 | -------------------------------------------------------------------------------- /section_1/02_exercise.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [], 7 | "authorship_tag": "ABX9TyNMwlljLyngOJHaMDJtG9dx", 8 | "include_colab_link": true 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "source": [ 32 | "# 演習\n", 33 | "\n", 34 | "ChatGPT APIを使い、「AI英語教師」を作ってみましょう。" 35 | ], 36 | "metadata": { 37 | "id": "NJ0ypAO3Nd9n" 38 | } 39 | }, 40 | { 41 | "cell_type": "markdown", 42 | "source": [ 43 | "## ライブラリのインストール" 44 | ], 45 | "metadata": { 46 | "id": "rohh9-kEV-8q" 47 | } 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": null, 52 | "metadata": { 53 | "id": "Wo66c8k56kai" 54 | }, 55 | "outputs": [], 56 | "source": [ 57 | "!pip install \"openai<1.0.0\"" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "source": [ 63 | "import openai" 64 | ], 65 | "metadata": { 66 | "id": "ImCUT-lW6k6K" 67 | }, 68 | "execution_count": null, 69 | "outputs": [] 70 | }, 71 | { 72 | "cell_type": "markdown", 73 | "source": [ 74 | "## API Keyの設定\n", 75 | "ChatGPT APIを使用するために必要な「API key」を設定します。 \n", 76 | "以下のコードの、 \n", 77 | "`openai.api_key = \"Your API key\"` \n", 78 | "における \n", 79 | "`Your API key`の箇所を、自分のAPI keyに置き換えます。 " 80 | ], 81 | "metadata": { 82 | "id": "j03EsJaHh4KK" 83 | } 84 | }, 85 | { 86 | "cell_type": "code", 87 | "source": [ 88 | "openai.api_key = \"Your API key\"" 89 | ], 90 | "metadata": { 91 | "id": "4lkJr3dk89bD" 92 | }, 93 | "execution_count": null, 94 | "outputs": [] 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "source": [ 99 | "## レスポンスの取得\n", 100 | "以下のセルの、`\"---設定の記述---\"`の箇所を変更し、AI英語教師を作成してください。 \n", 101 | "また、`\"---質問の記述---\"`の箇所を変更し、AI英語教師に質問を投げてください。 \n", 102 | "変更が完了したら、コードを実行して結果を確認しましょう。\n" 103 | ], 104 | "metadata": { 105 | "id": "jomNHjE3lPAJ" 106 | } 107 | }, 108 | { 109 | "cell_type": "code", 110 | "source": [ 111 | "# ChatGPT APIからの応答を取得する\n", 112 | "response = openai.ChatCompletion.create(\n", 113 | " model=\"gpt-3.5-turbo\",\n", 114 | " messages=[\n", 115 | " {\"role\": \"system\", \"content\": \"---設定の記述---\"},\n", 116 | " {\"role\": \"user\", \"content\":\"---質問の記述---\"}\n", 117 | " ]\n", 118 | ")\n", 119 | "\n", 120 | "# レスポンスの表示\n", 121 | "print(response['choices'][0]['message']['content'])" 122 | ], 123 | "metadata": { 124 | "id": "nkswVM4r9BBt" 125 | }, 126 | "execution_count": null, 127 | "outputs": [] 128 | }, 129 | { 130 | "cell_type": "markdown", 131 | "source": [ 132 | "## 解答例\n", 133 | "以下は解答例です。" 134 | ], 135 | "metadata": { 136 | "id": "2lEUNEp9n95k" 137 | } 138 | }, 139 | { 140 | "cell_type": "code", 141 | "source": [ 142 | "# ChatGPT APIからの応答を取得する\n", 143 | "response = openai.ChatCompletion.create(\n", 144 | " model=\"gpt-3.5-turbo\",\n", 145 | " messages=[\n", 146 | " {\"role\": \"system\", \"content\": \"あなたは優秀な英語教師です。\"},\n", 147 | " {\"role\": \"user\", \"content\":\"あなたは何を教えることができますか?\"}\n", 148 | " ]\n", 149 | ")\n", 150 | "\n", 151 | "# レスポンスの表示\n", 152 | "print(response['choices'][0]['message']['content'])" 153 | ], 154 | "metadata": { 155 | "id": "ARUcbwjn0NaR" 156 | }, 157 | "execution_count": null, 158 | "outputs": [] 159 | } 160 | ] 161 | } -------------------------------------------------------------------------------- /section_1/01_chat_gpt_api.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [], 7 | "authorship_tag": "ABX9TyMxbpaKfgjQwQSlk9vNELYk", 8 | "include_colab_link": true 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "source": [ 32 | "# ChatGPT APIを使ってみよう!\n", 33 | "\n", 34 | "ChatGPT APIを体験します。 \n", 35 | "API keyを設定し、Chat GPT APIからのレスポンスを取得してみましょう。 \n", 36 | "なお、APIの利用は有料になりますので、決済手段の登録が必要になります。. \n", 37 | "決済手段を登録しないままコードを実行するとエラーになります。 " 38 | ], 39 | "metadata": { 40 | "id": "NJ0ypAO3Nd9n" 41 | } 42 | }, 43 | { 44 | "cell_type": "markdown", 45 | "source": [ 46 | "## ライブラリのインストール\n", 47 | "ChatGPT APIを使用するために必要なライブラリ、openaiをインストールします。 " 48 | ], 49 | "metadata": { 50 | "id": "rohh9-kEV-8q" 51 | } 52 | }, 53 | { 54 | "cell_type": "code", 55 | "execution_count": null, 56 | "metadata": { 57 | "id": "Wo66c8k56kai" 58 | }, 59 | "outputs": [], 60 | "source": [ 61 | "!pip install \"openai<1.0.0\"" 62 | ] 63 | }, 64 | { 65 | "cell_type": "markdown", 66 | "source": [ 67 | "インストールの完了後、openaiをインポートしておきます。" 68 | ], 69 | "metadata": { 70 | "id": "yykE6v-ziwa3" 71 | } 72 | }, 73 | { 74 | "cell_type": "code", 75 | "source": [ 76 | "import openai" 77 | ], 78 | "metadata": { 79 | "id": "ImCUT-lW6k6K" 80 | }, 81 | "execution_count": null, 82 | "outputs": [] 83 | }, 84 | { 85 | "cell_type": "markdown", 86 | "source": [ 87 | "## API Keyの設定\n", 88 | "ChatGPT APIを使用するために必要な「API key」を設定します。 \n", 89 | "以下のコードの、 \n", 90 | "`openai.api_key = \"Your API key\"` \n", 91 | "における \n", 92 | "`Your API key`の箇所を、自分のAPI keyに置き換えます。 \n", 93 | "ChatGPTのAPI keyは、OpenAIのサイトで取得できます。 \n", 94 | "https://platform.openai.com/account/api-keys\n" 95 | ], 96 | "metadata": { 97 | "id": "j03EsJaHh4KK" 98 | } 99 | }, 100 | { 101 | "cell_type": "code", 102 | "source": [ 103 | "openai.api_key = \"Your API key\"" 104 | ], 105 | "metadata": { 106 | "id": "4lkJr3dk89bD" 107 | }, 108 | "execution_count": null, 109 | "outputs": [] 110 | }, 111 | { 112 | "cell_type": "markdown", 113 | "source": [ 114 | "API keyの流出にはリスクがあります。 \n", 115 | "他者に知られないように、慎重に扱ってください。" 116 | ], 117 | "metadata": { 118 | "id": "2lEUNEp9n95k" 119 | } 120 | }, 121 | { 122 | "cell_type": "markdown", 123 | "source": [ 124 | "## レスポンスの取得\n", 125 | "`openai.ChatCompletion.create()`により、ChatGPT APIからのレスポンスを取得します。 \n", 126 | "その際に、モデルを指定してメッセージを送ります。 \n" 127 | ], 128 | "metadata": { 129 | "id": "jomNHjE3lPAJ" 130 | } 131 | }, 132 | { 133 | "cell_type": "code", 134 | "source": [ 135 | "# ChatGPT APIからのレスポンスを取得する\n", 136 | "response = openai.ChatCompletion.create(\n", 137 | " model=\"gpt-3.5-turbo\",\n", 138 | " messages=[\n", 139 | " {\"role\": \"system\", \"content\": \"あなたは優秀なアシスタントAIです。\"},\n", 140 | " {\"role\": \"user\", \"content\":\"あなたはどんなことができますか?\"}\n", 141 | " ]\n", 142 | ")\n", 143 | "\n", 144 | "# レスポンスの表示\n", 145 | "print(response['choices'][0]['message']['content'])" 146 | ], 147 | "metadata": { 148 | "id": "nkswVM4r9BBt" 149 | }, 150 | "execution_count": null, 151 | "outputs": [] 152 | }, 153 | { 154 | "cell_type": "markdown", 155 | "source": [ 156 | "ChatGPT APIからのレスポンスを取得することができました。 \n", 157 | "\n", 158 | "上記のコードの実行後、OpenAIのサイトでAPIの使用量を確認してみましょう。 \n", 159 | "https://platform.openai.com/account/usage" 160 | ], 161 | "metadata": { 162 | "id": "B8hdFAd6VIaz" 163 | } 164 | } 165 | ] 166 | } -------------------------------------------------------------------------------- /python_basic/python_basic_4.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "python_basic_4.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [], 9 | "authorship_tag": "ABX9TyN3hNu8RarK8NNezVjCT2mF", 10 | "include_colab_link": true 11 | }, 12 | "kernelspec": { 13 | "name": "python3", 14 | "display_name": "Python 3" 15 | } 16 | }, 17 | "cells": [ 18 | { 19 | "cell_type": "markdown", 20 | "metadata": { 21 | "id": "view-in-github", 22 | "colab_type": "text" 23 | }, 24 | "source": [ 25 | "\"Open" 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "metadata": { 31 | "id": "ewg_pUrO-m3m" 32 | }, 33 | "source": [ 34 | "# Pythonの基礎4\n", 35 | "Pythonの特殊なメソッドを解説します。 \n", 36 | "これらを活用することで、より短くて読みやすいコードを記述することが可能になります。" 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "metadata": { 42 | "id": "BxlxFRAm-m3o" 43 | }, 44 | "source": [ 45 | "## ●`__init__`メソッド\n", 46 | "**`__init__`**は特殊なメソッドで、イニシャライザ、もしくはコンストラクタと呼ばれています。 \n", 47 | "このメソッドでは、インスタンスの生成時にインスタンスの初期設定を行うことができます。 \n", 48 | "以下のクラスでは、`__init__`メソッドでインスタンス変数aの初期設定を行っています。 " 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "metadata": { 54 | "id": "xftbx6T4-m3p" 55 | }, 56 | "source": [ 57 | "class Calc: # Calcクラス\n", 58 | " def __init__(self, a): # __init__メソッド\n", 59 | " self.a = a\n", 60 | "\n", 61 | " def add(self, b): # addメソッド\n", 62 | " print(self.a + b)\n", 63 | "\n", 64 | " def multiply(self, b): # multiplyメソッド\n", 65 | " print(self.a * b)" 66 | ], 67 | "execution_count": null, 68 | "outputs": [] 69 | }, 70 | { 71 | "cell_type": "code", 72 | "metadata": { 73 | "id": "wrO8sv-WZHuo" 74 | }, 75 | "source": [ 76 | "# 練習用\n" 77 | ], 78 | "execution_count": null, 79 | "outputs": [] 80 | }, 81 | { 82 | "cell_type": "markdown", 83 | "metadata": { 84 | "id": "L8xd1JMv-m3s" 85 | }, 86 | "source": [ 87 | "以下では、インスタンスの生成時に、3という値をインスタンスに渡しています。 \n", 88 | "この保持された値は、後で計算に利用することができます。 " 89 | ] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "metadata": { 94 | "id": "-Tnd7UjE-m3t" 95 | }, 96 | "source": [ 97 | "cl = Calc(3) # インスタンスclを生成\n", 98 | "cl.add(4) # 3 + 4\n", 99 | "cl.multiply(4) # 3 × 4" 100 | ], 101 | "execution_count": null, 102 | "outputs": [] 103 | }, 104 | { 105 | "cell_type": "code", 106 | "metadata": { 107 | "id": "cAZfsS-vZKeC" 108 | }, 109 | "source": [ 110 | "# 練習用\n" 111 | ], 112 | "execution_count": null, 113 | "outputs": [] 114 | }, 115 | { 116 | "cell_type": "markdown", 117 | "metadata": { 118 | "id": "jH5DBIKLMpTn" 119 | }, 120 | "source": [ 121 | "このように、`__init__`メソッドを使えばインスタンスの生成時にインスタンスに値を渡すことができます。 \n", 122 | "そのため、何度も繰り返して使用したり、複数のメソッドで使う値があれば、`__init__`メソッドで設定するのが効率的になります。" 123 | ] 124 | }, 125 | { 126 | "cell_type": "markdown", 127 | "metadata": { 128 | "id": "5iaX234BO1_c" 129 | }, 130 | "source": [ 131 | "## ●`__call__`メソッド\n", 132 | "`__call__`メソッドは、インスタンス名を使って呼び出すことができます。 \n", 133 | "以下では、`Calc`クラスに`__init__`メソッドの他に`__call__`メソッドを実装しています。" 134 | ] 135 | }, 136 | { 137 | "cell_type": "code", 138 | "metadata": { 139 | "id": "_7Ct9UGnO1_p" 140 | }, 141 | "source": [ 142 | "class Calc: # Calcクラス\n", 143 | " def __init__(self, a): # __init__メソッド\n", 144 | " self.a = a\n", 145 | "\n", 146 | " def __call__(self, c): # __call__メソッド\n", 147 | " print(self.a * c + c)\n", 148 | "\n", 149 | " def add(self, b): # addメソッド\n", 150 | " print(self.a + b)\n", 151 | "\n", 152 | " def multiply(self, b): # multiplyメソッド\n", 153 | " print(self.a * b)" 154 | ], 155 | "execution_count": null, 156 | "outputs": [] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "metadata": { 161 | "id": "8t66JIKtO1_q" 162 | }, 163 | "source": [ 164 | "# 練習用\n" 165 | ], 166 | "execution_count": null, 167 | "outputs": [] 168 | }, 169 | { 170 | "cell_type": "markdown", 171 | "metadata": { 172 | "id": "zk0O973kRR88" 173 | }, 174 | "source": [ 175 | "以下では、インスタンスの名`cl`を使って`__call__`メソッドを呼び出しています。 " 176 | ] 177 | }, 178 | { 179 | "cell_type": "code", 180 | "metadata": { 181 | "id": "TJnm8GNxRR9I" 182 | }, 183 | "source": [ 184 | "cl = Calc(3) # インスタンスclを生成\n", 185 | "\n", 186 | "# インスタンス名clを使って__call__メソッドを呼ぶ\n", 187 | "cl(5) # 3 × 5 + 5" 188 | ], 189 | "execution_count": null, 190 | "outputs": [] 191 | }, 192 | { 193 | "cell_type": "code", 194 | "metadata": { 195 | "id": "JXfHeV4ORR9J" 196 | }, 197 | "source": [ 198 | "# 練習用\n" 199 | ], 200 | "execution_count": null, 201 | "outputs": [] 202 | }, 203 | { 204 | "cell_type": "markdown", 205 | "metadata": { 206 | "id": "5Vw5ZL6xRR9J" 207 | }, 208 | "source": [ 209 | "このように、`__call__`メソッドを使えばメソッド名を記述する必要が無くなります。 \n", 210 | "頻繁に用いる処理を`__call__`メソッドに記述しておくことで、コードの記述量が少なくて済むようになります。" 211 | ] 212 | } 213 | ] 214 | } -------------------------------------------------------------------------------- /section_3/01_bulid_chatbot.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [], 7 | "authorship_tag": "ABX9TyNz8mTSzTaC8pmrp46sQFKX", 8 | "include_colab_link": true 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": { 32 | "id": "8kW_qXJVTjic" 33 | }, 34 | "source": [ 35 | "# チャットボットの構築\n", 36 | "Streamlit Community Cloudにアップするチャットボットアプリを構築します。" 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "source": [ 42 | "## ライブラリのインストール\n", 43 | "Streamlit、およびChatGPT APIを使用するために必要なライブラリopenaiをインストールします。 \n", 44 | "(※注: 動画ではライブラリをインストールしていますが、このノートブック内でこれらを使うことは無いのでインストールは必要ありません。)" 45 | ], 46 | "metadata": { 47 | "id": "vRJCuxALcgkb" 48 | } 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": null, 53 | "metadata": { 54 | "id": "Pbqipzj3nCy4" 55 | }, 56 | "outputs": [], 57 | "source": [ 58 | "# !pip install streamlit==1.20.0 --quiet\n", 59 | "#!pip install \"openai<1.0.0\"" 60 | ] 61 | }, 62 | { 63 | "cell_type": "markdown", 64 | "source": [ 65 | "インストールの完了後、streamlitおよびopenaiをインポートしておきます。" 66 | ], 67 | "metadata": { 68 | "id": "husUkYy5dhZ4" 69 | } 70 | }, 71 | { 72 | "cell_type": "code", 73 | "source": [ 74 | "# import streamlit as st\n", 75 | "# import openai" 76 | ], 77 | "metadata": { 78 | "id": "OsHcq-kaDwIi" 79 | }, 80 | "execution_count": null, 81 | "outputs": [] 82 | }, 83 | { 84 | "cell_type": "markdown", 85 | "source": [ 86 | "## チャットボットのコード\n", 87 | "`%%writefile`のマジックコマンドを使って、チャットボットのコードを「app.py」に書き込みます。 \n", 88 | "今回、OpneAIのAPI keyは、Streamlit Community Cloudの「Secrets」に保存します。 " 89 | ], 90 | "metadata": { 91 | "id": "5fOtVgU5duPe" 92 | } 93 | }, 94 | { 95 | "cell_type": "code", 96 | "source": [ 97 | "%%writefile app.py\n", 98 | "\n", 99 | "import streamlit as st\n", 100 | "import openai\n", 101 | "\n", 102 | "# Streamlit Community Cloudの「Secrets」からOpenAI API keyを取得\n", 103 | "openai.api_key = st.secrets.OpenAIAPI.openai_api_key\n", 104 | "\n", 105 | "# st.session_stateを使いメッセージのやりとりを保存\n", 106 | "if \"messages\" not in st.session_state:\n", 107 | " st.session_state[\"messages\"] = [\n", 108 | " {\"role\": \"system\", \"content\": \"あなたは優秀なアシスタントAIです。\"}\n", 109 | " ]\n", 110 | "\n", 111 | "# チャットボットとやりとりする関数\n", 112 | "def communicate():\n", 113 | " messages = st.session_state[\"messages\"]\n", 114 | "\n", 115 | " user_message = {\"role\": \"user\", \"content\": st.session_state[\"user_input\"]}\n", 116 | " messages.append(user_message)\n", 117 | "\n", 118 | " response = openai.ChatCompletion.create(\n", 119 | " model=\"gpt-3.5-turbo\",\n", 120 | " messages=messages\n", 121 | " )\n", 122 | "\n", 123 | " bot_message = response[\"choices\"][0][\"message\"]\n", 124 | " messages.append(bot_message)\n", 125 | "\n", 126 | " st.session_state[\"user_input\"] = \"\" # 入力欄を消去\n", 127 | "\n", 128 | "\n", 129 | "# ユーザーインターフェイスの構築\n", 130 | "st.title(\"My AI Assistant\")\n", 131 | "st.write(\"ChatGPT APIを使ったチャットボットです。\")\n", 132 | "\n", 133 | "user_input = st.text_input(\"メッセージを入力してください。\", key=\"user_input\", on_change=communicate)\n", 134 | "\n", 135 | "if st.session_state[\"messages\"]:\n", 136 | " messages = st.session_state[\"messages\"]\n", 137 | "\n", 138 | " for message in reversed(messages[1:]): # 直近のメッセージを上に\n", 139 | " speaker = \"🙂\"\n", 140 | " if message[\"role\"]==\"assistant\":\n", 141 | " speaker=\"🤖\"\n", 142 | "\n", 143 | " st.write(speaker + \": \" + message[\"content\"])" 144 | ], 145 | "metadata": { 146 | "id": "Ntj_BU3bnJli" 147 | }, 148 | "execution_count": null, 149 | "outputs": [] 150 | }, 151 | { 152 | "cell_type": "markdown", 153 | "source": [ 154 | "## requirements.txtの作成\n", 155 | "Streamlit Community Cloudのサーバー上でアプリを動かすために、「requirements.txt」を作成する必要があります。 \n", 156 | "このファイルでは、必要なライブラリを指定します。 \n", 157 | "以下のセルでは、`%%writefile`のマジックコマンドを使って、必要なライブラリを「requirements.txt」に書き込みます。 " 158 | ], 159 | "metadata": { 160 | "id": "CCdXdIEWqWM4" 161 | } 162 | }, 163 | { 164 | "cell_type": "code", 165 | "source": [ 166 | "%%writefile requirements.txt\n", 167 | "streamlit==1.20.0\n", 168 | "openai==0.28.1" 169 | ], 170 | "metadata": { 171 | "id": "0h-58Ai2OO63" 172 | }, 173 | "execution_count": null, 174 | "outputs": [] 175 | }, 176 | { 177 | "cell_type": "markdown", 178 | "source": [ 179 | "以下の作成されたファイルをダウンロードして、GitHubのレポジトリにアップしましょう。\n", 180 | "* app.py\n", 181 | "* requirements.txt" 182 | ], 183 | "metadata": { 184 | "id": "pVNwH5XOtAt-" 185 | } 186 | } 187 | ] 188 | } -------------------------------------------------------------------------------- /section_3/02_exercise.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [], 7 | "authorship_tag": "ABX9TyPSz1vBU3WGUIY1/fZ9LvwV", 8 | "include_colab_link": true 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": { 32 | "id": "8kW_qXJVTjic" 33 | }, 34 | "source": [ 35 | "# 演習\n", 36 | "チャットボットの設定を、Streamlit Community Cloudの「Secrets」に保存しましょう。" 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "source": [ 42 | "## ライブラリのインストール\n", 43 | "(※注: このノートブック内でこれらのライブラリを使うことは無いので、インストールは必要ありません。)" 44 | ], 45 | "metadata": { 46 | "id": "vRJCuxALcgkb" 47 | } 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": null, 52 | "metadata": { 53 | "id": "Pbqipzj3nCy4" 54 | }, 55 | "outputs": [], 56 | "source": [ 57 | "# !pip install streamlit==1.20.0 --quiet\n", 58 | "#!pip install \"openai<1.0.0\"" 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "source": [ 64 | "# import streamlit as st\n", 65 | "# import openai" 66 | ], 67 | "metadata": { 68 | "id": "OsHcq-kaDwIi" 69 | }, 70 | "execution_count": null, 71 | "outputs": [] 72 | }, 73 | { 74 | "cell_type": "markdown", 75 | "source": [ 76 | "## チャットボットのコード\n", 77 | "以下のコードの`st.secrets.AppSettings.chatbot_setting`で「system」の設定ができるように、Streamlit Community Cloudの「Secrets」に追記を行いましょう。 " 78 | ], 79 | "metadata": { 80 | "id": "5fOtVgU5duPe" 81 | } 82 | }, 83 | { 84 | "cell_type": "code", 85 | "source": [ 86 | "%%writefile app.py\n", 87 | "\n", 88 | "import streamlit as st\n", 89 | "import openai\n", 90 | "\n", 91 | "# Streamlit Community Cloudの「Secrets」からOpenAI API keyを取得\n", 92 | "openai.api_key = st.secrets.OpenAIAPI.openai_api_key\n", 93 | "\n", 94 | "# st.session_stateを使いメッセージのやりとりを保存\n", 95 | "if \"messages\" not in st.session_state:\n", 96 | " st.session_state[\"messages\"] = [\n", 97 | " {\"role\": \"system\", \"content\": st.secrets.AppSettings.chatbot_setting}\n", 98 | " ]\n", 99 | "\n", 100 | "# チャットボットとやりとりする関数\n", 101 | "def communicate():\n", 102 | " messages = st.session_state[\"messages\"]\n", 103 | "\n", 104 | " user_message = {\"role\": \"user\", \"content\": st.session_state[\"user_input\"]}\n", 105 | " messages.append(user_message)\n", 106 | "\n", 107 | " response = openai.ChatCompletion.create(\n", 108 | " model=\"gpt-3.5-turbo\",\n", 109 | " messages=messages\n", 110 | " )\n", 111 | "\n", 112 | " bot_message = response[\"choices\"][0][\"message\"]\n", 113 | " messages.append(bot_message)\n", 114 | "\n", 115 | " st.session_state[\"user_input\"] = \"\" # 入力欄を消去\n", 116 | "\n", 117 | "\n", 118 | "# ユーザーインターフェイスの構築\n", 119 | "st.title(\"My AI Assistant\")\n", 120 | "st.write(\"ChatGPT APIを使ったチャットボットです。\")\n", 121 | "\n", 122 | "user_input = st.text_input(\"メッセージを入力してください。\", key=\"user_input\", on_change=communicate)\n", 123 | "\n", 124 | "if st.session_state[\"messages\"]:\n", 125 | " messages = st.session_state[\"messages\"]\n", 126 | "\n", 127 | " for message in reversed(messages[1:]): # 直近のメッセージを上に\n", 128 | " speaker = \"🙂\"\n", 129 | " if message[\"role\"]==\"assistant\":\n", 130 | " speaker=\"🤖\"\n", 131 | "\n", 132 | " st.write(speaker + \": \" + message[\"content\"])" 133 | ], 134 | "metadata": { 135 | "id": "Ntj_BU3bnJli" 136 | }, 137 | "execution_count": null, 138 | "outputs": [] 139 | }, 140 | { 141 | "cell_type": "markdown", 142 | "source": [ 143 | "## requirements.txtの作成" 144 | ], 145 | "metadata": { 146 | "id": "CCdXdIEWqWM4" 147 | } 148 | }, 149 | { 150 | "cell_type": "code", 151 | "source": [ 152 | "%%writefile requirements.txt\n", 153 | "streamlit==1.20.0\n", 154 | "openai==0.28.1" 155 | ], 156 | "metadata": { 157 | "id": "0h-58Ai2OO63" 158 | }, 159 | "execution_count": null, 160 | "outputs": [] 161 | }, 162 | { 163 | "cell_type": "markdown", 164 | "source": [ 165 | "以下の作成されたファイルをダウンロードして、新たなGitHubのレポジトリにアップしましょう。\n", 166 | "* app.py\n", 167 | "* requirements.txt\n", 168 | " \n", 169 | "Streamlit Community Cloud上で動作を確認してください。" 170 | ], 171 | "metadata": { 172 | "id": "pVNwH5XOtAt-" 173 | } 174 | }, 175 | { 176 | "cell_type": "markdown", 177 | "source": [ 178 | "## 解答例\n", 179 | "以下は解答例です。 \n", 180 | "以下のような記述を「Secrets」に追記します。" 181 | ], 182 | "metadata": { 183 | "id": "CcFCeL2hxGzx" 184 | } 185 | }, 186 | { 187 | "cell_type": "markdown", 188 | "source": [ 189 | "[AppSettings] \n", 190 | "chatbot_setting = \"あなたは優秀な英語教師です。何を聞かれても英語で答えてください。\" " 191 | ], 192 | "metadata": { 193 | "id": "yHJnhNndxJqJ" 194 | } 195 | } 196 | ] 197 | } -------------------------------------------------------------------------------- /section_2/01_streamlit_basic.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [], 7 | "authorship_tag": "ABX9TyNJWWWKcm0jYHzz3nEAaWcl", 8 | "include_colab_link": true 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": { 32 | "id": "8kW_qXJVTjic" 33 | }, 34 | "source": [ 35 | "# Streamlitの基礎\n", 36 | "Streamlitを使い、Webアプリを構築します。 \n", 37 | "様々なUI(ユーザーインターフェイス)を試してみましょう。 " 38 | ] 39 | }, 40 | { 41 | "cell_type": "markdown", 42 | "source": [ 43 | "## ライブラリのインストール\n", 44 | "Streamlit、およびアプリの動作の確認に使用する「ngrok」をインストールします。" 45 | ], 46 | "metadata": { 47 | "id": "vRJCuxALcgkb" 48 | } 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": null, 53 | "metadata": { 54 | "id": "Pbqipzj3nCy4" 55 | }, 56 | "outputs": [], 57 | "source": [ 58 | "!pip install streamlit==1.20.0 --quiet\n", 59 | "!pip install pyngrok --quiet" 60 | ] 61 | }, 62 | { 63 | "cell_type": "markdown", 64 | "source": [ 65 | "Streamlit、およびngrokをインポートします。 " 66 | ], 67 | "metadata": { 68 | "id": "husUkYy5dhZ4" 69 | } 70 | }, 71 | { 72 | "cell_type": "code", 73 | "source": [ 74 | "import streamlit as st\n", 75 | "from pyngrok import ngrok" 76 | ], 77 | "metadata": { 78 | "id": "OsHcq-kaDwIi" 79 | }, 80 | "execution_count": null, 81 | "outputs": [] 82 | }, 83 | { 84 | "cell_type": "markdown", 85 | "source": [ 86 | "## ページのUI\n", 87 | "`%%writefile`のマジックコマンドを使って、様々なUIを配置するコードを「app.py」に書き込みます。" 88 | ], 89 | "metadata": { 90 | "id": "5fOtVgU5duPe" 91 | } 92 | }, 93 | { 94 | "cell_type": "code", 95 | "source": [ 96 | "%%writefile app.py\n", 97 | "# 以下を「app.py」に書き込み\n", 98 | "import streamlit as st\n", 99 | "import numpy as np\n", 100 | "import pandas as pd\n", 101 | "\n", 102 | "# ---------- スライダー ----------\n", 103 | "st.title(\"st.slider()\")\n", 104 | "x = st.slider(\"xの値\")\n", 105 | "st.write(str(x) + \"の2乗は\" + str(x**2))\n", 106 | "\n", 107 | "# ---------- ボタン ----------\n", 108 | "st.title(\"st.button()\")\n", 109 | "if st.button(\"Morning?\"):\n", 110 | " st.write(\"Good morinig!\")\n", 111 | "else:\n", 112 | " st.write(\"Helllo!\")\n", 113 | "\n", 114 | "# ---------- テキスト入力 ----------\n", 115 | "st.title(\"st.text_input()\")\n", 116 | "st.text_input(\"お住まいの国\", key=\"country\")\n", 117 | "st.session_state.country # keyでアクセス\n", 118 | "\n", 119 | "# ---------- チェックボックス ----------\n", 120 | "st.title(\"st.checkbox()\")\n", 121 | "is_agree = st.checkbox(\"同意しますか?\")\n", 122 | "if is_agree:\n", 123 | " st.write(\"了解です!\")\n", 124 | "else:\n", 125 | " st.write(\"残念です!\")\n", 126 | "\n", 127 | "# ---------- セレクトボックス ----------\n", 128 | "st.title(\"st.selectbox()\")\n", 129 | "df_select = pd.DataFrame({\n", 130 | " \"col1\": [11, 12, 13, 14],\n", 131 | " \"col2\": [111, 112, 113, 114]\n", 132 | " })\n", 133 | "selected = st.selectbox(\n", 134 | " \"どの番号を選びますか?\",\n", 135 | " df_select[\"col2\"])\n", 136 | "st.write(\"あなたは\" + str(selected) + \"番を選びました!\")\n", 137 | "\n", 138 | "# ---------- サイドバー ----------\n", 139 | "st.sidebar.title(\"st.sidebar\")\n", 140 | "\n", 141 | "y = st.sidebar.slider(\"yの値\")\n", 142 | "st.sidebar.write(str(y) + \"の2倍は\" + str(y*2))\n", 143 | "\n", 144 | "df_side = pd.DataFrame({\n", 145 | " \"animal\": [\"犬\", \"猫\", \"兎\", \"象\", \"蛙\"],\n", 146 | " \"color\": [\"赤\", \"青\", \"黄\", \"白\", \"黒\"]\n", 147 | " })\n", 148 | "selected_side = st.sidebar.selectbox(\n", 149 | " \"どの動物を選びますか?\",\n", 150 | " df_side[\"animal\"]\n", 151 | " )\n", 152 | "st.sidebar.write(\"あなたは\" + str(selected_side) + \"を選びました!\")" 153 | ], 154 | "metadata": { 155 | "id": "Ntj_BU3bnJli" 156 | }, 157 | "execution_count": null, 158 | "outputs": [] 159 | }, 160 | { 161 | "cell_type": "markdown", 162 | "source": [ 163 | "## Authtokenの設定\n", 164 | "ngrokで接続するために必要な「Authtoken」を設定します。 \n", 165 | "以下のコードの、 \n", 166 | "`!ngrok authtoken YourAuthtoken` \n", 167 | "における \n", 168 | "`YourAuthtoken`の箇所を、自分のAuthtokenに置き換えます。 \n", 169 | "Authtokenは、ngrokのサイトに登録すれば取得することができます。 \n", 170 | "https://ngrok.com/\n" 171 | ], 172 | "metadata": { 173 | "id": "j03EsJaHh4KK" 174 | } 175 | }, 176 | { 177 | "cell_type": "code", 178 | "source": [ 179 | "!ngrok authtoken YourAuthtoken" 180 | ], 181 | "metadata": { 182 | "id": "mTfmORj2Dn7-" 183 | }, 184 | "execution_count": null, 185 | "outputs": [] 186 | }, 187 | { 188 | "cell_type": "markdown", 189 | "source": [ 190 | "## アプリの起動\n", 191 | "streamlitの`run`コマンドでアプリを起動します。\n" 192 | ], 193 | "metadata": { 194 | "id": "CnobL05MkjB1" 195 | } 196 | }, 197 | { 198 | "cell_type": "code", 199 | "source": [ 200 | "!streamlit run app.py &>/dev/null& # 「&>/dev/null&」により、出力を非表示にしてバックグランドジョブとして実行" 201 | ], 202 | "metadata": { 203 | "id": "W0jXlMXWK0vi" 204 | }, 205 | "execution_count": null, 206 | "outputs": [] 207 | }, 208 | { 209 | "cell_type": "markdown", 210 | "source": [ 211 | "ngrokのプロセスを終了した上で、新たにポートを指定して接続します。 \n", 212 | "接続の結果、urlを取得できます。 \n", 213 | "ngrokの無料プランでは同時に1つのプロセスしか動かせないので、エラーが発生した場合は「ランタイム」→「セッションの管理」で不要なGoogle Colabのセッションを修了しましょう。 " 214 | ], 215 | "metadata": { 216 | "id": "W5RLCJ7Sl2x_" 217 | } 218 | }, 219 | { 220 | "cell_type": "code", 221 | "source": [ 222 | "ngrok.kill() # プロセスの修了\n", 223 | "url = ngrok.connect(\"8501\").public_url # 接続" 224 | ], 225 | "metadata": { 226 | "id": "v23ymsdLK3x7" 227 | }, 228 | "execution_count": null, 229 | "outputs": [] 230 | }, 231 | { 232 | "cell_type": "markdown", 233 | "source": [ 234 | "## 動作の確認" 235 | ], 236 | "metadata": { 237 | "id": "8tVONgWNwzZm" 238 | } 239 | }, 240 | { 241 | "cell_type": "markdown", 242 | "source": [ 243 | "URLのhttpの部分をhttpsに変換する関数を設定します。" 244 | ], 245 | "metadata": { 246 | "id": "OywWF0KBw4y5" 247 | } 248 | }, 249 | { 250 | "cell_type": "code", 251 | "source": [ 252 | "def convert_http_to_https(url):\n", 253 | " if url.startswith(\"http://\"):\n", 254 | " url = url.replace(\"http://\", \"https://\", 1)\n", 255 | " return url" 256 | ], 257 | "metadata": { 258 | "id": "gaEkk5Dsx0rR" 259 | }, 260 | "execution_count": null, 261 | "outputs": [] 262 | }, 263 | { 264 | "cell_type": "markdown", 265 | "source": [ 266 | "変換したurlを表示し、リンク先でアプリが動作することを確認します。" 267 | ], 268 | "metadata": { 269 | "id": "NZ0O_pNan57t" 270 | } 271 | }, 272 | { 273 | "cell_type": "code", 274 | "source": [ 275 | "print(convert_http_to_https(url))" 276 | ], 277 | "metadata": { 278 | "id": "MIY7ositLAXC" 279 | }, 280 | "execution_count": null, 281 | "outputs": [] 282 | } 283 | ] 284 | } -------------------------------------------------------------------------------- /section_2/02_chatbot.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [], 7 | "authorship_tag": "ABX9TyOejAI29CL1qQweysNy47Nx", 8 | "include_colab_link": true 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": { 32 | "id": "8kW_qXJVTjic" 33 | }, 34 | "source": [ 35 | "# チャットボットの構築\n", 36 | "StreamlitとChatGPT APIを使い、チャットボットを構築します。 " 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "source": [ 42 | "## ライブラリのインストール\n", 43 | "Streamlit、およびアプリの動作の確認に使用する「ngrok」をインストールします。 \n", 44 | "また、ChatGPT APIを使用するために必要なライブラリ、openaiをインストールします。 " 45 | ], 46 | "metadata": { 47 | "id": "vRJCuxALcgkb" 48 | } 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": null, 53 | "metadata": { 54 | "id": "Pbqipzj3nCy4" 55 | }, 56 | "outputs": [], 57 | "source": [ 58 | "!pip install streamlit==1.20.0 --quiet\n", 59 | "!pip install pyngrok --quiet\n", 60 | "!pip install \"openai<1.0.0\"" 61 | ] 62 | }, 63 | { 64 | "cell_type": "markdown", 65 | "source": [ 66 | "インストールの完了後、streamlit、ngrok、およびopenaiをインポートしておきます。" 67 | ], 68 | "metadata": { 69 | "id": "husUkYy5dhZ4" 70 | } 71 | }, 72 | { 73 | "cell_type": "code", 74 | "source": [ 75 | "import streamlit as st\n", 76 | "from pyngrok import ngrok\n", 77 | "import openai" 78 | ], 79 | "metadata": { 80 | "id": "OsHcq-kaDwIi" 81 | }, 82 | "execution_count": null, 83 | "outputs": [] 84 | }, 85 | { 86 | "cell_type": "markdown", 87 | "source": [ 88 | "## チャットボットのコード\n", 89 | "`%%writefile`のマジックコマンドを使って、チャットボットのコードを「app.py」に書き込みます。 \n", 90 | "Streamlitでは、値を保持するために「st.session_state」を使います。 \n", 91 | "https://docs.streamlit.io/library/api-reference/session-state" 92 | ], 93 | "metadata": { 94 | "id": "5fOtVgU5duPe" 95 | } 96 | }, 97 | { 98 | "cell_type": "code", 99 | "source": [ 100 | "%%writefile app.py\n", 101 | "# 以下を「app.py」に書き込み\n", 102 | "import streamlit as st\n", 103 | "import openai\n", 104 | "import secret_keys # 外部ファイルにAPI keyを保存\n", 105 | "\n", 106 | "openai.api_key = secret_keys.openai_api_key\n", 107 | "\n", 108 | "# st.session_stateを使いメッセージのやりとりを保存\n", 109 | "if \"messages\" not in st.session_state:\n", 110 | " st.session_state[\"messages\"] = [\n", 111 | " {\"role\": \"system\", \"content\": \"あなたは優秀なアシスタントAIです。\"}\n", 112 | " ]\n", 113 | "\n", 114 | "# チャットボットとやりとりする関数\n", 115 | "def communicate():\n", 116 | " messages = st.session_state[\"messages\"]\n", 117 | "\n", 118 | " user_message = {\"role\": \"user\", \"content\": st.session_state[\"user_input\"]}\n", 119 | " messages.append(user_message)\n", 120 | "\n", 121 | " response = openai.ChatCompletion.create(\n", 122 | " model=\"gpt-3.5-turbo\",\n", 123 | " messages=messages\n", 124 | " )\n", 125 | "\n", 126 | " bot_message = response[\"choices\"][0][\"message\"]\n", 127 | " messages.append(bot_message)\n", 128 | "\n", 129 | " st.session_state[\"user_input\"] = \"\" # 入力欄を消去\n", 130 | "\n", 131 | "\n", 132 | "# ユーザーインターフェイスの構築\n", 133 | "st.title(\"My AI Assistant\")\n", 134 | "st.write(\"ChatGPT APIを使ったチャットボットです。\")\n", 135 | "\n", 136 | "user_input = st.text_input(\"メッセージを入力してください。\", key=\"user_input\", on_change=communicate)\n", 137 | "\n", 138 | "if st.session_state[\"messages\"]:\n", 139 | " messages = st.session_state[\"messages\"]\n", 140 | "\n", 141 | " for message in reversed(messages[1:]): # 直近のメッセージを上に\n", 142 | " speaker = \"🙂\"\n", 143 | " if message[\"role\"]==\"assistant\":\n", 144 | " speaker=\"🤖\"\n", 145 | "\n", 146 | " st.write(speaker + \": \" + message[\"content\"])" 147 | ], 148 | "metadata": { 149 | "id": "Ntj_BU3bnJli" 150 | }, 151 | "execution_count": null, 152 | "outputs": [] 153 | }, 154 | { 155 | "cell_type": "markdown", 156 | "source": [ 157 | "## OpenAIのAPI keyを設定\n", 158 | "ChatGPT APIを使用するために必要な「API key」を設定します。 \n", 159 | "`%%writefile`のマジックコマンドを使って、API keyを設定するコードを「secret_keys.py」に書き込みます。 \n", 160 | "以下のコードの、 \n", 161 | "`openai_api_key = \"Your API key\"` \n", 162 | "における \n", 163 | "`Your API key`の箇所を、自分のAPI keyに置き換えます。 \n", 164 | "ChatGPTのAPI keyは、OpenAIのサイトで取得できます。 \n", 165 | "https://platform.openai.com/account/api-keys\n" 166 | ], 167 | "metadata": { 168 | "id": "pCvWZuvqQvyC" 169 | } 170 | }, 171 | { 172 | "cell_type": "code", 173 | "source": [ 174 | "%%writefile secret_keys.py\n", 175 | "\n", 176 | "openai_api_key = \"Your API key\"" 177 | ], 178 | "metadata": { 179 | "id": "4lkJr3dk89bD" 180 | }, 181 | "execution_count": null, 182 | "outputs": [] 183 | }, 184 | { 185 | "cell_type": "markdown", 186 | "source": [ 187 | "API keyの流出にはリスクがあります。 \n", 188 | "他者に知られないように、慎重に扱ってください。" 189 | ], 190 | "metadata": { 191 | "id": "2lEUNEp9n95k" 192 | } 193 | }, 194 | { 195 | "cell_type": "markdown", 196 | "source": [ 197 | "## ngrokのAuthtokenを設定\n", 198 | "ngrokで接続するために必要な「Authtoken」を設定します。 \n", 199 | "以下のコードの、 \n", 200 | "`!ngrok authtoken YourAuthtoken` \n", 201 | "における \n", 202 | "`YourAuthtoken`の箇所を、自分のAuthtokenに置き換えます。 \n", 203 | "Authtokenは、ngrokのサイトに登録すれば取得することができます。 \n", 204 | "https://ngrok.com/\n" 205 | ], 206 | "metadata": { 207 | "id": "j03EsJaHh4KK" 208 | } 209 | }, 210 | { 211 | "cell_type": "code", 212 | "source": [ 213 | "!ngrok authtoken YourAuthtoken" 214 | ], 215 | "metadata": { 216 | "id": "mTfmORj2Dn7-" 217 | }, 218 | "execution_count": null, 219 | "outputs": [] 220 | }, 221 | { 222 | "cell_type": "markdown", 223 | "source": [ 224 | "ngrokのAuthtokenも、他者に知られないように慎重に扱ってください。" 225 | ], 226 | "metadata": { 227 | "id": "c_QaXaeyZHTJ" 228 | } 229 | }, 230 | { 231 | "cell_type": "markdown", 232 | "source": [ 233 | "## アプリの起動\n", 234 | "streamlitの`run`コマンドでアプリを起動します。\n" 235 | ], 236 | "metadata": { 237 | "id": "CnobL05MkjB1" 238 | } 239 | }, 240 | { 241 | "cell_type": "code", 242 | "source": [ 243 | "!streamlit run app.py &>/dev/null& # 「&>/dev/null&」により、出力を非表示にしてバックグランドジョブとして実行" 244 | ], 245 | "metadata": { 246 | "id": "W0jXlMXWK0vi" 247 | }, 248 | "execution_count": null, 249 | "outputs": [] 250 | }, 251 | { 252 | "cell_type": "markdown", 253 | "source": [ 254 | "ngrokのプロセスを終了した上で、新たにポートを指定して接続します。 \n", 255 | "接続の結果、urlを取得できます。 \n", 256 | "ngrokの無料プランでは同時に1つのプロセスしか動かせないので、エラーが発生した場合は「ランタイム」→「セッションの管理」で不要なGoogle Colabのセッションを修了しましょう。 " 257 | ], 258 | "metadata": { 259 | "id": "W5RLCJ7Sl2x_" 260 | } 261 | }, 262 | { 263 | "cell_type": "code", 264 | "source": [ 265 | "ngrok.kill() # プロセスの修了\n", 266 | "url = ngrok.connect(\"8501\").public_url # 接続" 267 | ], 268 | "metadata": { 269 | "id": "v23ymsdLK3x7" 270 | }, 271 | "execution_count": null, 272 | "outputs": [] 273 | }, 274 | { 275 | "cell_type": "markdown", 276 | "source": [ 277 | "## 動作の確認" 278 | ], 279 | "metadata": { 280 | "id": "8tVONgWNwzZm" 281 | } 282 | }, 283 | { 284 | "cell_type": "markdown", 285 | "source": [ 286 | "URLのhttpの部分をhttpsに変換する関数を設定します。" 287 | ], 288 | "metadata": { 289 | "id": "OywWF0KBw4y5" 290 | } 291 | }, 292 | { 293 | "cell_type": "code", 294 | "source": [ 295 | "def convert_http_to_https(url):\n", 296 | " if url.startswith(\"http://\"):\n", 297 | " url = url.replace(\"http://\", \"https://\", 1)\n", 298 | " return url" 299 | ], 300 | "metadata": { 301 | "id": "gaEkk5Dsx0rR" 302 | }, 303 | "execution_count": null, 304 | "outputs": [] 305 | }, 306 | { 307 | "cell_type": "markdown", 308 | "source": [ 309 | "変換したurlを表示し、リンク先でチャットボットが動作することを確認します。" 310 | ], 311 | "metadata": { 312 | "id": "NZ0O_pNan57t" 313 | } 314 | }, 315 | { 316 | "cell_type": "code", 317 | "source": [ 318 | "print(convert_http_to_https(url))" 319 | ], 320 | "metadata": { 321 | "id": "MIY7ositLAXC" 322 | }, 323 | "execution_count": null, 324 | "outputs": [] 325 | }, 326 | { 327 | "cell_type": "markdown", 328 | "source": [ 329 | "チャットボットの動作確認後、OpenAIのサイトでAPIの使用量を確認してみましょう。 \n", 330 | "https://platform.openai.com/account/usage" 331 | ], 332 | "metadata": { 333 | "id": "B8hdFAd6VIaz" 334 | } 335 | } 336 | ] 337 | } -------------------------------------------------------------------------------- /section_4/06_fortunetelling.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [], 7 | "authorship_tag": "ABX9TyMvWBG31pvXuVWAhSfqJmV7", 8 | "include_colab_link": true 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": { 32 | "id": "8kW_qXJVTjic" 33 | }, 34 | "source": [ 35 | "# 「占い」ボット\n", 36 | "StreamlitとChatGPT APIを使い、タロット占いボットを構築します。 " 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "source": [ 42 | "## ライブラリのインストール\n", 43 | "Streamlit、およびアプリの動作の確認に使用する「ngrok」をインストールします。 \n", 44 | "また、ChatGPT APIを使用するために必要なライブラリ、openaiをインストールします。 " 45 | ], 46 | "metadata": { 47 | "id": "vRJCuxALcgkb" 48 | } 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": null, 53 | "metadata": { 54 | "id": "Pbqipzj3nCy4" 55 | }, 56 | "outputs": [], 57 | "source": [ 58 | "!pip install streamlit==1.20.0 --quiet\n", 59 | "!pip install pyngrok --quiet\n", 60 | "!pip install \"openai<1.0.0\"" 61 | ] 62 | }, 63 | { 64 | "cell_type": "markdown", 65 | "source": [ 66 | "インストールの完了後、streamlit、ngrok、およびopenaiをインポートしておきます。" 67 | ], 68 | "metadata": { 69 | "id": "husUkYy5dhZ4" 70 | } 71 | }, 72 | { 73 | "cell_type": "code", 74 | "source": [ 75 | "import streamlit as st\n", 76 | "from pyngrok import ngrok\n", 77 | "import openai" 78 | ], 79 | "metadata": { 80 | "id": "OsHcq-kaDwIi" 81 | }, 82 | "execution_count": null, 83 | "outputs": [] 84 | }, 85 | { 86 | "cell_type": "markdown", 87 | "source": [ 88 | "## 画像のアップロード\n", 89 | "チャットボットに使用するイメージ画像をアップロードします。 \n", 90 | "教材をダウンロードし、「06_fortunetelling」を画面左の「ファイル」にドラッグアンドドロップしましょう。 " 91 | ], 92 | "metadata": { 93 | "id": "-n80MNi5SJoE" 94 | } 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "source": [ 99 | "## チャットボットのコード\n", 100 | "`%%writefile`のマジックコマンドを使って、チャットボットのコードを「app.py」に書き込みます。 \n", 101 | "`sysytem`の`content`に占いの設定を記述します。 \n", 102 | "(プロンプト提供: @himanushi777 さん)" 103 | ], 104 | "metadata": { 105 | "id": "5fOtVgU5duPe" 106 | } 107 | }, 108 | { 109 | "cell_type": "code", 110 | "source": [ 111 | "%%writefile app.py\n", 112 | "# 以下を「app.py」に書き込み\n", 113 | "import streamlit as st\n", 114 | "import openai\n", 115 | "import secret_keys # 外部ファイルにAPI keyを保存\n", 116 | "\n", 117 | "openai.api_key = secret_keys.openai_api_key\n", 118 | "\n", 119 | "system_prompt = \"\"\"\n", 120 | "このスレッドの全ての質問に対して以下のルールに厳格に従って答えてください。\n", 121 | "1. タロットカードの大アルカナをランダムに選択してください\n", 122 | "2. さらに、正位置と逆位置もランダムに選択してください。\n", 123 | "3. 質問に対して、1 と 2 でランダムに選ばれた内容を踏まえて回答してください。\n", 124 | "\"\"\"\n", 125 | "\n", 126 | "# st.session_stateを使いメッセージのやりとりを保存\n", 127 | "if \"messages\" not in st.session_state:\n", 128 | " st.session_state[\"messages\"] = [\n", 129 | " {\"role\": \"system\", \"content\": system_prompt}\n", 130 | " ]\n", 131 | "\n", 132 | "# チャットボットとやりとりする関数\n", 133 | "def communicate():\n", 134 | " messages = st.session_state[\"messages\"]\n", 135 | "\n", 136 | " user_message = {\"role\": \"user\", \"content\": st.session_state[\"user_input\"]}\n", 137 | " messages.append(user_message)\n", 138 | "\n", 139 | " response = openai.ChatCompletion.create(\n", 140 | " model=\"gpt-3.5-turbo\",\n", 141 | " messages=messages\n", 142 | " )\n", 143 | "\n", 144 | " bot_message = response[\"choices\"][0][\"message\"]\n", 145 | " messages.append(bot_message)\n", 146 | "\n", 147 | " st.session_state[\"user_input\"] = \"\" # 入力欄を消去\n", 148 | "\n", 149 | "\n", 150 | "# ユーザーインターフェイスの構築\n", 151 | "st.title(\" 「占い」ボット\")\n", 152 | "st.image(\"06_fortunetelling.png\")\n", 153 | "st.write(\"あなたの運勢をタロットで占います。何を占って欲しいですか?\")\n", 154 | "\n", 155 | "user_input = st.text_input(\"メッセージを入力してください。\", key=\"user_input\", on_change=communicate)\n", 156 | "\n", 157 | "if st.session_state[\"messages\"]:\n", 158 | " messages = st.session_state[\"messages\"]\n", 159 | "\n", 160 | " for message in reversed(messages[1:]): # 直近のメッセージを上に\n", 161 | " speaker = \"🙂\"\n", 162 | " if message[\"role\"]==\"assistant\":\n", 163 | " speaker=\"🤖\"\n", 164 | "\n", 165 | " st.write(speaker + \": \" + message[\"content\"])" 166 | ], 167 | "metadata": { 168 | "id": "Ntj_BU3bnJli" 169 | }, 170 | "execution_count": null, 171 | "outputs": [] 172 | }, 173 | { 174 | "cell_type": "markdown", 175 | "source": [ 176 | "## OpenAIのAPI keyを設定\n", 177 | "ChatGPT APIを使用するために必要な「API key」を設定します。 \n", 178 | "`%%writefile`のマジックコマンドを使って、API keyを設定するコードを「secret_keys.py」に書き込みます。 \n", 179 | "以下のコードの、 \n", 180 | "`openai_api_key = \"Your API key\"` \n", 181 | "における \n", 182 | "`Your API key`の箇所を、自分のAPI keyに置き換えます。 \n", 183 | "ChatGPTのAPI keyは、OpenAIのサイトで取得できます。 \n", 184 | "https://platform.openai.com/account/api-keys\n" 185 | ], 186 | "metadata": { 187 | "id": "pCvWZuvqQvyC" 188 | } 189 | }, 190 | { 191 | "cell_type": "code", 192 | "source": [ 193 | "%%writefile secret_keys.py\n", 194 | "\n", 195 | "openai_api_key = \"Your API key\"" 196 | ], 197 | "metadata": { 198 | "id": "4lkJr3dk89bD" 199 | }, 200 | "execution_count": null, 201 | "outputs": [] 202 | }, 203 | { 204 | "cell_type": "markdown", 205 | "source": [ 206 | "API keyの流出にはリスクがあります。 \n", 207 | "他者に知られないように、慎重に扱ってください。" 208 | ], 209 | "metadata": { 210 | "id": "2lEUNEp9n95k" 211 | } 212 | }, 213 | { 214 | "cell_type": "markdown", 215 | "source": [ 216 | "## ngrokのAuthtokenを設定\n", 217 | "ngrokで接続するために必要な「Authtoken」を設定します。 \n", 218 | "以下のコードの、 \n", 219 | "`!ngrok authtoken YourAuthtoken` \n", 220 | "における \n", 221 | "`YourAuthtoken`の箇所を、自分のAuthtokenに置き換えます。 \n", 222 | "Authtokenは、ngrokのサイトに登録すれば取得することができます。 \n", 223 | "https://ngrok.com/\n" 224 | ], 225 | "metadata": { 226 | "id": "j03EsJaHh4KK" 227 | } 228 | }, 229 | { 230 | "cell_type": "code", 231 | "source": [ 232 | "!ngrok authtoken YourAuthtoken" 233 | ], 234 | "metadata": { 235 | "id": "mTfmORj2Dn7-" 236 | }, 237 | "execution_count": null, 238 | "outputs": [] 239 | }, 240 | { 241 | "cell_type": "markdown", 242 | "source": [ 243 | "ngrokのAuthtokenも、他者に知られないように慎重に扱ってください。" 244 | ], 245 | "metadata": { 246 | "id": "c_QaXaeyZHTJ" 247 | } 248 | }, 249 | { 250 | "cell_type": "markdown", 251 | "source": [ 252 | "## アプリの起動\n", 253 | "streamlitの`run`コマンドでアプリを起動します。\n" 254 | ], 255 | "metadata": { 256 | "id": "CnobL05MkjB1" 257 | } 258 | }, 259 | { 260 | "cell_type": "code", 261 | "source": [ 262 | "!streamlit run app.py &>/dev/null& # 「&>/dev/null&」により、出力を非表示にしてバックグランドジョブとして実行" 263 | ], 264 | "metadata": { 265 | "id": "W0jXlMXWK0vi" 266 | }, 267 | "execution_count": null, 268 | "outputs": [] 269 | }, 270 | { 271 | "cell_type": "markdown", 272 | "source": [ 273 | "ngrokのプロセスを終了した上で、新たにポートを指定して接続します。 \n", 274 | "接続の結果、urlを取得できます。 \n", 275 | "ngrokの無料プランでは同時に1つのプロセスしか動かせないので、エラーが発生した場合は「ランタイム」→「セッションの管理」で不要なGoogle Colabのセッションを修了しましょう。 " 276 | ], 277 | "metadata": { 278 | "id": "W5RLCJ7Sl2x_" 279 | } 280 | }, 281 | { 282 | "cell_type": "code", 283 | "source": [ 284 | "ngrok.kill() # プロセスの修了\n", 285 | "url = ngrok.connect(\"8501\").public_url # 接続" 286 | ], 287 | "metadata": { 288 | "id": "v23ymsdLK3x7" 289 | }, 290 | "execution_count": null, 291 | "outputs": [] 292 | }, 293 | { 294 | "cell_type": "markdown", 295 | "source": [ 296 | "## 動作の確認" 297 | ], 298 | "metadata": { 299 | "id": "8tVONgWNwzZm" 300 | } 301 | }, 302 | { 303 | "cell_type": "markdown", 304 | "source": [ 305 | "URLのhttpの部分をhttpsに変換する関数を設定します。" 306 | ], 307 | "metadata": { 308 | "id": "OywWF0KBw4y5" 309 | } 310 | }, 311 | { 312 | "cell_type": "code", 313 | "source": [ 314 | "def convert_http_to_https(url):\n", 315 | " if url.startswith(\"http://\"):\n", 316 | " url = url.replace(\"http://\", \"https://\", 1)\n", 317 | " return url" 318 | ], 319 | "metadata": { 320 | "id": "gaEkk5Dsx0rR" 321 | }, 322 | "execution_count": null, 323 | "outputs": [] 324 | }, 325 | { 326 | "cell_type": "markdown", 327 | "source": [ 328 | "変換したurlを表示し、リンク先でチャットボットが動作することを確認します。" 329 | ], 330 | "metadata": { 331 | "id": "NZ0O_pNan57t" 332 | } 333 | }, 334 | { 335 | "cell_type": "code", 336 | "source": [ 337 | "print(convert_http_to_https(url))" 338 | ], 339 | "metadata": { 340 | "id": "MIY7ositLAXC" 341 | }, 342 | "execution_count": null, 343 | "outputs": [] 344 | }, 345 | { 346 | "cell_type": "markdown", 347 | "source": [ 348 | "チャットボットの動作確認後、OpenAIのサイトでAPIの使用量を確認してみましょう。 \n", 349 | "https://platform.openai.com/account/usage" 350 | ], 351 | "metadata": { 352 | "id": "B8hdFAd6VIaz" 353 | } 354 | } 355 | ] 356 | } -------------------------------------------------------------------------------- /section_4/01_recipe.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [], 7 | "authorship_tag": "ABX9TyPgG5FgejIfbvtjfd8t/1Bf", 8 | "include_colab_link": true 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": { 32 | "id": "8kW_qXJVTjic" 33 | }, 34 | "source": [ 35 | "# 「レシピ」を考えるチャットボット\n", 36 | "StreamlitとChatGPT APIを使い、料理のレシピを考えるチャットボットを構築します。 " 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "source": [ 42 | "## ライブラリのインストール\n", 43 | "Streamlit、およびアプリの動作の確認に使用する「ngrok」をインストールします。 \n", 44 | "また、ChatGPT APIを使用するために必要なライブラリ、openaiをインストールします。 " 45 | ], 46 | "metadata": { 47 | "id": "vRJCuxALcgkb" 48 | } 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": null, 53 | "metadata": { 54 | "id": "Pbqipzj3nCy4" 55 | }, 56 | "outputs": [], 57 | "source": [ 58 | "!pip install streamlit==1.20.0 --quiet\n", 59 | "!pip install pyngrok --quiet\n", 60 | "!pip install \"openai<1.0.0\"" 61 | ] 62 | }, 63 | { 64 | "cell_type": "markdown", 65 | "source": [ 66 | "インストールの完了後、streamlit、ngrok、およびopenaiをインポートしておきます。" 67 | ], 68 | "metadata": { 69 | "id": "husUkYy5dhZ4" 70 | } 71 | }, 72 | { 73 | "cell_type": "code", 74 | "source": [ 75 | "import streamlit as st\n", 76 | "from pyngrok import ngrok\n", 77 | "import openai" 78 | ], 79 | "metadata": { 80 | "id": "OsHcq-kaDwIi" 81 | }, 82 | "execution_count": null, 83 | "outputs": [] 84 | }, 85 | { 86 | "cell_type": "markdown", 87 | "source": [ 88 | "## 画像のアップロード\n", 89 | "チャットボットに使用するイメージ画像をアップロードします。 \n", 90 | "教材をダウンロードし、「01_recipe.png」を画面左の「ファイル」にドラッグアンドドロップしましょう。 " 91 | ], 92 | "metadata": { 93 | "id": "-n80MNi5SJoE" 94 | } 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "source": [ 99 | "## チャットボットのコード\n", 100 | "`%%writefile`のマジックコマンドを使って、チャットボットのコードを「app.py」に書き込みます。 \n", 101 | "`sysytem`の`content`にチャットボットの機能や性格などの設定を記述しますが、意図しない動作を避けるために「やらないこと」(ネガティブプロンプト)も記述しましょう。" 102 | ], 103 | "metadata": { 104 | "id": "5fOtVgU5duPe" 105 | } 106 | }, 107 | { 108 | "cell_type": "code", 109 | "source": [ 110 | "%%writefile app.py\n", 111 | "# 以下を「app.py」に書き込み\n", 112 | "import streamlit as st\n", 113 | "import openai\n", 114 | "import secret_keys # 外部ファイルにAPI keyを保存\n", 115 | "\n", 116 | "openai.api_key = secret_keys.openai_api_key\n", 117 | "\n", 118 | "system_prompt = \"\"\"\n", 119 | "あなたは優秀な料理研究家です。\n", 120 | "限られた食材や時間で、様々な料理のレシピを提案することができます。\n", 121 | "あなたの役割はレシピを考えることなので、例えば以下のような料理以外ことを聞かれても、絶対に答えないでください。\n", 122 | "\n", 123 | "* 旅行\n", 124 | "* 芸能人\n", 125 | "* 映画\n", 126 | "* 科学\n", 127 | "* 歴史\n", 128 | "\"\"\"\n", 129 | "\n", 130 | "# st.session_stateを使いメッセージのやりとりを保存\n", 131 | "if \"messages\" not in st.session_state:\n", 132 | " st.session_state[\"messages\"] = [\n", 133 | " {\"role\": \"system\", \"content\": system_prompt}\n", 134 | " ]\n", 135 | "\n", 136 | "# チャットボットとやりとりする関数\n", 137 | "def communicate():\n", 138 | " messages = st.session_state[\"messages\"]\n", 139 | "\n", 140 | " user_message = {\"role\": \"user\", \"content\": st.session_state[\"user_input\"]}\n", 141 | " messages.append(user_message)\n", 142 | "\n", 143 | " response = openai.ChatCompletion.create(\n", 144 | " model=\"gpt-3.5-turbo\",\n", 145 | " messages=messages\n", 146 | " )\n", 147 | "\n", 148 | " bot_message = response[\"choices\"][0][\"message\"]\n", 149 | " messages.append(bot_message)\n", 150 | "\n", 151 | " st.session_state[\"user_input\"] = \"\" # 入力欄を消去\n", 152 | "\n", 153 | "\n", 154 | "# ユーザーインターフェイスの構築\n", 155 | "st.title(\" 「レシピ」を考えるチャットボット\")\n", 156 | "st.image(\"01_recipe.png\")\n", 157 | "st.write(\"どんな食事を作りたいですか?\")\n", 158 | "\n", 159 | "user_input = st.text_input(\"メッセージを入力してください。\", key=\"user_input\", on_change=communicate)\n", 160 | "\n", 161 | "if st.session_state[\"messages\"]:\n", 162 | " messages = st.session_state[\"messages\"]\n", 163 | "\n", 164 | " for message in reversed(messages[1:]): # 直近のメッセージを上に\n", 165 | " speaker = \"🙂\"\n", 166 | " if message[\"role\"]==\"assistant\":\n", 167 | " speaker=\"🤖\"\n", 168 | "\n", 169 | " st.write(speaker + \": \" + message[\"content\"])" 170 | ], 171 | "metadata": { 172 | "id": "Ntj_BU3bnJli" 173 | }, 174 | "execution_count": null, 175 | "outputs": [] 176 | }, 177 | { 178 | "cell_type": "markdown", 179 | "source": [ 180 | "## OpenAIのAPI keyを設定\n", 181 | "ChatGPT APIを使用するために必要な「API key」を設定します。 \n", 182 | "`%%writefile`のマジックコマンドを使って、API keyを設定するコードを「secret_keys.py」に書き込みます。 \n", 183 | "以下のコードの、 \n", 184 | "`openai_api_key = \"Your API key\"` \n", 185 | "における \n", 186 | "`Your API key`の箇所を、自分のAPI keyに置き換えます。 \n", 187 | "ChatGPTのAPI keyは、OpenAIのサイトで取得できます。 \n", 188 | "https://platform.openai.com/account/api-keys\n" 189 | ], 190 | "metadata": { 191 | "id": "pCvWZuvqQvyC" 192 | } 193 | }, 194 | { 195 | "cell_type": "code", 196 | "source": [ 197 | "%%writefile secret_keys.py\n", 198 | "\n", 199 | "openai_api_key = \"Your API key\"" 200 | ], 201 | "metadata": { 202 | "id": "4lkJr3dk89bD" 203 | }, 204 | "execution_count": null, 205 | "outputs": [] 206 | }, 207 | { 208 | "cell_type": "markdown", 209 | "source": [ 210 | "API keyの流出にはリスクがあります。 \n", 211 | "他者に知られないように、慎重に扱ってください。" 212 | ], 213 | "metadata": { 214 | "id": "2lEUNEp9n95k" 215 | } 216 | }, 217 | { 218 | "cell_type": "markdown", 219 | "source": [ 220 | "## ngrokのAuthtokenを設定\n", 221 | "ngrokで接続するために必要な「Authtoken」を設定します。 \n", 222 | "以下のコードの、 \n", 223 | "`!ngrok authtoken YourAuthtoken` \n", 224 | "における \n", 225 | "`YourAuthtoken`の箇所を、自分のAuthtokenに置き換えます。 \n", 226 | "Authtokenは、ngrokのサイトに登録すれば取得することができます。 \n", 227 | "https://ngrok.com/\n" 228 | ], 229 | "metadata": { 230 | "id": "j03EsJaHh4KK" 231 | } 232 | }, 233 | { 234 | "cell_type": "code", 235 | "source": [ 236 | "!ngrok authtoken YourAuthtoken" 237 | ], 238 | "metadata": { 239 | "id": "mTfmORj2Dn7-" 240 | }, 241 | "execution_count": null, 242 | "outputs": [] 243 | }, 244 | { 245 | "cell_type": "markdown", 246 | "source": [ 247 | "ngrokのAuthtokenも、他者に知られないように慎重に扱ってください。" 248 | ], 249 | "metadata": { 250 | "id": "c_QaXaeyZHTJ" 251 | } 252 | }, 253 | { 254 | "cell_type": "markdown", 255 | "source": [ 256 | "## アプリの起動\n", 257 | "streamlitの`run`コマンドでアプリを起動します。\n" 258 | ], 259 | "metadata": { 260 | "id": "CnobL05MkjB1" 261 | } 262 | }, 263 | { 264 | "cell_type": "code", 265 | "source": [ 266 | "!streamlit run app.py &>/dev/null& # 「&>/dev/null&」により、出力を非表示にしてバックグランドジョブとして実行" 267 | ], 268 | "metadata": { 269 | "id": "W0jXlMXWK0vi" 270 | }, 271 | "execution_count": null, 272 | "outputs": [] 273 | }, 274 | { 275 | "cell_type": "markdown", 276 | "source": [ 277 | "ngrokのプロセスを終了した上で、新たにポートを指定して接続します。 \n", 278 | "接続の結果、urlを取得できます。 \n", 279 | "ngrokの無料プランでは同時に1つのプロセスしか動かせないので、エラーが発生した場合は「ランタイム」→「セッションの管理」で不要なGoogle Colabのセッションを修了しましょう。 " 280 | ], 281 | "metadata": { 282 | "id": "W5RLCJ7Sl2x_" 283 | } 284 | }, 285 | { 286 | "cell_type": "code", 287 | "source": [ 288 | "ngrok.kill() # プロセスの修了\n", 289 | "url = ngrok.connect(\"8501\").public_url # 接続" 290 | ], 291 | "metadata": { 292 | "id": "v23ymsdLK3x7" 293 | }, 294 | "execution_count": null, 295 | "outputs": [] 296 | }, 297 | { 298 | "cell_type": "markdown", 299 | "source": [ 300 | "## 動作の確認" 301 | ], 302 | "metadata": { 303 | "id": "8tVONgWNwzZm" 304 | } 305 | }, 306 | { 307 | "cell_type": "markdown", 308 | "source": [ 309 | "URLのhttpの部分をhttpsに変換する関数を設定します。" 310 | ], 311 | "metadata": { 312 | "id": "OywWF0KBw4y5" 313 | } 314 | }, 315 | { 316 | "cell_type": "code", 317 | "source": [ 318 | "def convert_http_to_https(url):\n", 319 | " if url.startswith(\"http://\"):\n", 320 | " url = url.replace(\"http://\", \"https://\", 1)\n", 321 | " return url" 322 | ], 323 | "metadata": { 324 | "id": "gaEkk5Dsx0rR" 325 | }, 326 | "execution_count": null, 327 | "outputs": [] 328 | }, 329 | { 330 | "cell_type": "markdown", 331 | "source": [ 332 | "変換したurlを表示し、リンク先でチャットボットが動作することを確認します。" 333 | ], 334 | "metadata": { 335 | "id": "NZ0O_pNan57t" 336 | } 337 | }, 338 | { 339 | "cell_type": "code", 340 | "source": [ 341 | "print(convert_http_to_https(url))" 342 | ], 343 | "metadata": { 344 | "id": "MIY7ositLAXC" 345 | }, 346 | "execution_count": null, 347 | "outputs": [] 348 | }, 349 | { 350 | "cell_type": "markdown", 351 | "source": [ 352 | "チャットボットの動作確認後、OpenAIのサイトでAPIの使用量を確認してみましょう。 \n", 353 | "https://platform.openai.com/account/usage" 354 | ], 355 | "metadata": { 356 | "id": "B8hdFAd6VIaz" 357 | } 358 | } 359 | ] 360 | } -------------------------------------------------------------------------------- /section_4/02_diet.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [], 7 | "authorship_tag": "ABX9TyNOmRQaknT+iB0DjpNaaJuD", 8 | "include_colab_link": true 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": { 32 | "id": "8kW_qXJVTjic" 33 | }, 34 | "source": [ 35 | "# 「ダイエット」を助けるチャットボット\n", 36 | "StreamlitとChatGPT APIを使い、ダイエットのためのアドバイスをするチャットボットを構築します。 " 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "source": [ 42 | "## ライブラリのインストール\n", 43 | "Streamlit、およびアプリの動作の確認に使用する「ngrok」をインストールします。 \n", 44 | "また、ChatGPT APIを使用するために必要なライブラリ、openaiをインストールします。 " 45 | ], 46 | "metadata": { 47 | "id": "vRJCuxALcgkb" 48 | } 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": null, 53 | "metadata": { 54 | "id": "Pbqipzj3nCy4" 55 | }, 56 | "outputs": [], 57 | "source": [ 58 | "!pip install streamlit==1.20.0 --quiet\n", 59 | "!pip install pyngrok --quiet\n", 60 | "!pip install \"openai<1.0.0\"" 61 | ] 62 | }, 63 | { 64 | "cell_type": "markdown", 65 | "source": [ 66 | "インストールの完了後、streamlit、ngrok、およびopenaiをインポートしておきます。" 67 | ], 68 | "metadata": { 69 | "id": "husUkYy5dhZ4" 70 | } 71 | }, 72 | { 73 | "cell_type": "code", 74 | "source": [ 75 | "import streamlit as st\n", 76 | "from pyngrok import ngrok\n", 77 | "import openai" 78 | ], 79 | "metadata": { 80 | "id": "OsHcq-kaDwIi" 81 | }, 82 | "execution_count": null, 83 | "outputs": [] 84 | }, 85 | { 86 | "cell_type": "markdown", 87 | "source": [ 88 | "## 画像のアップロード\n", 89 | "チャットボットに使用するイメージ画像をアップロードします。 \n", 90 | "教材をダウンロードし、「02_diet.png」を画面左の「ファイル」にドラッグアンドドロップしましょう。 " 91 | ], 92 | "metadata": { 93 | "id": "-n80MNi5SJoE" 94 | } 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "source": [ 99 | "## チャットボットのコード\n", 100 | "`%%writefile`のマジックコマンドを使って、チャットボットのコードを「app.py」に書き込みます。 \n", 101 | "`sysytem`の`content`にチャットボットの機能や性格などの設定を記述しますが、意図しない動作を避けるために「やらないこと」(ネガティブプロンプト)も記述しましょう。" 102 | ], 103 | "metadata": { 104 | "id": "5fOtVgU5duPe" 105 | } 106 | }, 107 | { 108 | "cell_type": "code", 109 | "source": [ 110 | "%%writefile app.py\n", 111 | "# 以下を「app.py」に書き込み\n", 112 | "import streamlit as st\n", 113 | "import openai\n", 114 | "import secret_keys # 外部ファイルにAPI keyを保存\n", 115 | "\n", 116 | "openai.api_key = secret_keys.openai_api_key\n", 117 | "\n", 118 | "system_prompt = \"\"\"\n", 119 | "あなたはダイエットを助ける優秀なパーソナルトレーナーです。\n", 120 | "食事メニューや、運動メニューなど、様々な側面から考えたダイエット計画を提案することができます。\n", 121 | "あなたの役割はダイエットを助けることなので、例えば以下のようなダイエット以外のことを聞かれても、絶対に答えないでください。\n", 122 | "\n", 123 | "* 旅行\n", 124 | "* 芸能人\n", 125 | "* 映画\n", 126 | "* 科学\n", 127 | "* 歴史\n", 128 | "\"\"\"\n", 129 | "\n", 130 | "# st.session_stateを使いメッセージのやりとりを保存\n", 131 | "if \"messages\" not in st.session_state:\n", 132 | " st.session_state[\"messages\"] = [\n", 133 | " {\"role\": \"system\", \"content\": system_prompt}\n", 134 | " ]\n", 135 | "\n", 136 | "# チャットボットとやりとりする関数\n", 137 | "def communicate():\n", 138 | " messages = st.session_state[\"messages\"]\n", 139 | "\n", 140 | " user_message = {\"role\": \"user\", \"content\": st.session_state[\"user_input\"]}\n", 141 | " messages.append(user_message)\n", 142 | "\n", 143 | " response = openai.ChatCompletion.create(\n", 144 | " model=\"gpt-3.5-turbo\",\n", 145 | " messages=messages\n", 146 | " )\n", 147 | "\n", 148 | " bot_message = response[\"choices\"][0][\"message\"]\n", 149 | " messages.append(bot_message)\n", 150 | "\n", 151 | " st.session_state[\"user_input\"] = \"\" # 入力欄を消去\n", 152 | "\n", 153 | "\n", 154 | "# ユーザーインターフェイスの構築\n", 155 | "st.title(\" 「ダイエット」を助けるチャットボット\")\n", 156 | "st.image(\"02_diet.png\")\n", 157 | "st.write(\"ダイエットに関して、何にお困りですか?\")\n", 158 | "\n", 159 | "user_input = st.text_input(\"メッセージを入力してください。\", key=\"user_input\", on_change=communicate)\n", 160 | "\n", 161 | "if st.session_state[\"messages\"]:\n", 162 | " messages = st.session_state[\"messages\"]\n", 163 | "\n", 164 | " for message in reversed(messages[1:]): # 直近のメッセージを上に\n", 165 | " speaker = \"🙂\"\n", 166 | " if message[\"role\"]==\"assistant\":\n", 167 | " speaker=\"🤖\"\n", 168 | "\n", 169 | " st.write(speaker + \": \" + message[\"content\"])" 170 | ], 171 | "metadata": { 172 | "id": "Ntj_BU3bnJli" 173 | }, 174 | "execution_count": null, 175 | "outputs": [] 176 | }, 177 | { 178 | "cell_type": "markdown", 179 | "source": [ 180 | "## OpenAIのAPI keyを設定\n", 181 | "ChatGPT APIを使用するために必要な「API key」を設定します。 \n", 182 | "`%%writefile`のマジックコマンドを使って、API keyを設定するコードを「secret_keys.py」に書き込みます。 \n", 183 | "以下のコードの、 \n", 184 | "`openai_api_key = \"Your API key\"` \n", 185 | "における \n", 186 | "`Your API key`の箇所を、自分のAPI keyに置き換えます。 \n", 187 | "ChatGPTのAPI keyは、OpenAIのサイトで取得できます。 \n", 188 | "https://platform.openai.com/account/api-keys\n" 189 | ], 190 | "metadata": { 191 | "id": "pCvWZuvqQvyC" 192 | } 193 | }, 194 | { 195 | "cell_type": "code", 196 | "source": [ 197 | "%%writefile secret_keys.py\n", 198 | "\n", 199 | "openai_api_key = \"Your API key\"" 200 | ], 201 | "metadata": { 202 | "id": "4lkJr3dk89bD" 203 | }, 204 | "execution_count": null, 205 | "outputs": [] 206 | }, 207 | { 208 | "cell_type": "markdown", 209 | "source": [ 210 | "API keyの流出にはリスクがあります。 \n", 211 | "他者に知られないように、慎重に扱ってください。" 212 | ], 213 | "metadata": { 214 | "id": "2lEUNEp9n95k" 215 | } 216 | }, 217 | { 218 | "cell_type": "markdown", 219 | "source": [ 220 | "## ngrokのAuthtokenを設定\n", 221 | "ngrokで接続するために必要な「Authtoken」を設定します。 \n", 222 | "以下のコードの、 \n", 223 | "`!ngrok authtoken YourAuthtoken` \n", 224 | "における \n", 225 | "`YourAuthtoken`の箇所を、自分のAuthtokenに置き換えます。 \n", 226 | "Authtokenは、ngrokのサイトに登録すれば取得することができます。 \n", 227 | "https://ngrok.com/\n" 228 | ], 229 | "metadata": { 230 | "id": "j03EsJaHh4KK" 231 | } 232 | }, 233 | { 234 | "cell_type": "code", 235 | "source": [ 236 | "!ngrok authtoken YourAuthtoken" 237 | ], 238 | "metadata": { 239 | "id": "mTfmORj2Dn7-" 240 | }, 241 | "execution_count": null, 242 | "outputs": [] 243 | }, 244 | { 245 | "cell_type": "markdown", 246 | "source": [ 247 | "ngrokのAuthtokenも、他者に知られないように慎重に扱ってください。" 248 | ], 249 | "metadata": { 250 | "id": "c_QaXaeyZHTJ" 251 | } 252 | }, 253 | { 254 | "cell_type": "markdown", 255 | "source": [ 256 | "## アプリの起動\n", 257 | "streamlitの`run`コマンドでアプリを起動します。\n" 258 | ], 259 | "metadata": { 260 | "id": "CnobL05MkjB1" 261 | } 262 | }, 263 | { 264 | "cell_type": "code", 265 | "source": [ 266 | "!streamlit run app.py &>/dev/null& # 「&>/dev/null&」により、出力を非表示にしてバックグランドジョブとして実行" 267 | ], 268 | "metadata": { 269 | "id": "W0jXlMXWK0vi" 270 | }, 271 | "execution_count": null, 272 | "outputs": [] 273 | }, 274 | { 275 | "cell_type": "markdown", 276 | "source": [ 277 | "ngrokのプロセスを終了した上で、新たにポートを指定して接続します。 \n", 278 | "接続の結果、urlを取得できます。 \n", 279 | "ngrokの無料プランでは同時に1つのプロセスしか動かせないので、エラーが発生した場合は「ランタイム」→「セッションの管理」で不要なGoogle Colabのセッションを修了しましょう。 " 280 | ], 281 | "metadata": { 282 | "id": "W5RLCJ7Sl2x_" 283 | } 284 | }, 285 | { 286 | "cell_type": "code", 287 | "source": [ 288 | "ngrok.kill() # プロセスの修了\n", 289 | "url = ngrok.connect(\"8501\").public_url # 接続" 290 | ], 291 | "metadata": { 292 | "id": "v23ymsdLK3x7" 293 | }, 294 | "execution_count": null, 295 | "outputs": [] 296 | }, 297 | { 298 | "cell_type": "markdown", 299 | "source": [ 300 | "## 動作の確認" 301 | ], 302 | "metadata": { 303 | "id": "8tVONgWNwzZm" 304 | } 305 | }, 306 | { 307 | "cell_type": "markdown", 308 | "source": [ 309 | "URLのhttpの部分をhttpsに変換する関数を設定します。" 310 | ], 311 | "metadata": { 312 | "id": "OywWF0KBw4y5" 313 | } 314 | }, 315 | { 316 | "cell_type": "code", 317 | "source": [ 318 | "def convert_http_to_https(url):\n", 319 | " if url.startswith(\"http://\"):\n", 320 | " url = url.replace(\"http://\", \"https://\", 1)\n", 321 | " return url" 322 | ], 323 | "metadata": { 324 | "id": "gaEkk5Dsx0rR" 325 | }, 326 | "execution_count": null, 327 | "outputs": [] 328 | }, 329 | { 330 | "cell_type": "markdown", 331 | "source": [ 332 | "変換したurlを表示し、リンク先でチャットボットが動作することを確認します。" 333 | ], 334 | "metadata": { 335 | "id": "NZ0O_pNan57t" 336 | } 337 | }, 338 | { 339 | "cell_type": "code", 340 | "source": [ 341 | "print(convert_http_to_https(url))" 342 | ], 343 | "metadata": { 344 | "id": "MIY7ositLAXC" 345 | }, 346 | "execution_count": null, 347 | "outputs": [] 348 | }, 349 | { 350 | "cell_type": "markdown", 351 | "source": [ 352 | "チャットボットの動作確認後、OpenAIのサイトでAPIの使用量を確認してみましょう。 \n", 353 | "https://platform.openai.com/account/usage" 354 | ], 355 | "metadata": { 356 | "id": "B8hdFAd6VIaz" 357 | } 358 | } 359 | ] 360 | } -------------------------------------------------------------------------------- /section_4/03_english.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [], 7 | "authorship_tag": "ABX9TyM2ukUm6bfsax/gX2BBsIAR", 8 | "include_colab_link": true 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": { 32 | "id": "8kW_qXJVTjic" 33 | }, 34 | "source": [ 35 | "# 「英語講師」ボット\n", 36 | "StreamlitとChatGPT APIを使い、英語を教えるチャットボットを構築します。 " 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "source": [ 42 | "## ライブラリのインストール\n", 43 | "Streamlit、およびアプリの動作の確認に使用する「ngrok」をインストールします。 \n", 44 | "また、ChatGPT APIを使用するために必要なライブラリ、openaiをインストールします。 " 45 | ], 46 | "metadata": { 47 | "id": "vRJCuxALcgkb" 48 | } 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": null, 53 | "metadata": { 54 | "id": "Pbqipzj3nCy4" 55 | }, 56 | "outputs": [], 57 | "source": [ 58 | "!pip install streamlit==1.20.0 --quiet\n", 59 | "!pip install pyngrok --quiet\n", 60 | "!pip install \"openai<1.0.0\"" 61 | ] 62 | }, 63 | { 64 | "cell_type": "markdown", 65 | "source": [ 66 | "インストールの完了後、streamlit、ngrok、およびopenaiをインポートしておきます。" 67 | ], 68 | "metadata": { 69 | "id": "husUkYy5dhZ4" 70 | } 71 | }, 72 | { 73 | "cell_type": "code", 74 | "source": [ 75 | "import streamlit as st\n", 76 | "from pyngrok import ngrok\n", 77 | "import openai" 78 | ], 79 | "metadata": { 80 | "id": "OsHcq-kaDwIi" 81 | }, 82 | "execution_count": null, 83 | "outputs": [] 84 | }, 85 | { 86 | "cell_type": "markdown", 87 | "source": [ 88 | "## 画像のアップロード\n", 89 | "チャットボットに使用するイメージ画像をアップロードします。 \n", 90 | "教材をダウンロードし、「03_english.png」を画面左の「ファイル」にドラッグアンドドロップしましょう。 " 91 | ], 92 | "metadata": { 93 | "id": "-n80MNi5SJoE" 94 | } 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "source": [ 99 | "## チャットボットのコード\n", 100 | "`%%writefile`のマジックコマンドを使って、チャットボットのコードを「app.py」に書き込みます。 \n", 101 | "`sysytem`の`content`にチャットボットの機能や性格などの設定を記述しますが、意図しない動作を避けるために「やらないこと」(ネガティブプロンプト)も記述しましょう。" 102 | ], 103 | "metadata": { 104 | "id": "5fOtVgU5duPe" 105 | } 106 | }, 107 | { 108 | "cell_type": "code", 109 | "source": [ 110 | "%%writefile app.py\n", 111 | "# 以下を「app.py」に書き込み\n", 112 | "import streamlit as st\n", 113 | "import openai\n", 114 | "import secret_keys # 外部ファイルにAPI keyを保存\n", 115 | "\n", 116 | "openai.api_key = secret_keys.openai_api_key\n", 117 | "\n", 118 | "system_prompt = \"\"\"\n", 119 | "あなたは優秀な英語を教える講師です。\n", 120 | "英作文や英会話、リスニングやリーディングなど、生徒の要望に合わせて英語の上達のためのアドバイスを行ってください。\n", 121 | "あなたの役割は生徒の英語力を向上させることなので、例えば以下のような英語以外のことを聞かれても、絶対に答えないでください。\n", 122 | "\n", 123 | "* 旅行\n", 124 | "* 料理\n", 125 | "* 芸能人\n", 126 | "* 映画\n", 127 | "* 科学\n", 128 | "* 歴史\n", 129 | "\"\"\"\n", 130 | "\n", 131 | "# st.session_stateを使いメッセージのやりとりを保存\n", 132 | "if \"messages\" not in st.session_state:\n", 133 | " st.session_state[\"messages\"] = [\n", 134 | " {\"role\": \"system\", \"content\": system_prompt}\n", 135 | " ]\n", 136 | "\n", 137 | "# チャットボットとやりとりする関数\n", 138 | "def communicate():\n", 139 | " messages = st.session_state[\"messages\"]\n", 140 | "\n", 141 | " user_message = {\"role\": \"user\", \"content\": st.session_state[\"user_input\"]}\n", 142 | " messages.append(user_message)\n", 143 | "\n", 144 | " response = openai.ChatCompletion.create(\n", 145 | " model=\"gpt-3.5-turbo\",\n", 146 | " messages=messages\n", 147 | " )\n", 148 | "\n", 149 | " bot_message = response[\"choices\"][0][\"message\"]\n", 150 | " messages.append(bot_message)\n", 151 | "\n", 152 | " st.session_state[\"user_input\"] = \"\" # 入力欄を消去\n", 153 | "\n", 154 | "\n", 155 | "# ユーザーインターフェイスの構築\n", 156 | "st.title(\" 「英語講師」ボット\")\n", 157 | "st.image(\"03_english.png\")\n", 158 | "st.write(\"Let's enjoy English!\")\n", 159 | "\n", 160 | "user_input = st.text_input(\"メッセージを入力してください。\", key=\"user_input\", on_change=communicate)\n", 161 | "\n", 162 | "if st.session_state[\"messages\"]:\n", 163 | " messages = st.session_state[\"messages\"]\n", 164 | "\n", 165 | " for message in reversed(messages[1:]): # 直近のメッセージを上に\n", 166 | " speaker = \"🙂\"\n", 167 | " if message[\"role\"]==\"assistant\":\n", 168 | " speaker=\"🤖\"\n", 169 | "\n", 170 | " st.write(speaker + \": \" + message[\"content\"])" 171 | ], 172 | "metadata": { 173 | "id": "Ntj_BU3bnJli" 174 | }, 175 | "execution_count": null, 176 | "outputs": [] 177 | }, 178 | { 179 | "cell_type": "markdown", 180 | "source": [ 181 | "## OpenAIのAPI keyを設定\n", 182 | "ChatGPT APIを使用するために必要な「API key」を設定します。 \n", 183 | "`%%writefile`のマジックコマンドを使って、API keyを設定するコードを「secret_keys.py」に書き込みます。 \n", 184 | "以下のコードの、 \n", 185 | "`openai_api_key = \"Your API key\"` \n", 186 | "における \n", 187 | "`Your API key`の箇所を、自分のAPI keyに置き換えます。 \n", 188 | "ChatGPTのAPI keyは、OpenAIのサイトで取得できます。 \n", 189 | "https://platform.openai.com/account/api-keys\n" 190 | ], 191 | "metadata": { 192 | "id": "pCvWZuvqQvyC" 193 | } 194 | }, 195 | { 196 | "cell_type": "code", 197 | "source": [ 198 | "%%writefile secret_keys.py\n", 199 | "\n", 200 | "openai_api_key = \"Your API key\"" 201 | ], 202 | "metadata": { 203 | "id": "4lkJr3dk89bD" 204 | }, 205 | "execution_count": null, 206 | "outputs": [] 207 | }, 208 | { 209 | "cell_type": "markdown", 210 | "source": [ 211 | "API keyの流出にはリスクがあります。 \n", 212 | "他者に知られないように、慎重に扱ってください。" 213 | ], 214 | "metadata": { 215 | "id": "2lEUNEp9n95k" 216 | } 217 | }, 218 | { 219 | "cell_type": "markdown", 220 | "source": [ 221 | "## ngrokのAuthtokenを設定\n", 222 | "ngrokで接続するために必要な「Authtoken」を設定します。 \n", 223 | "以下のコードの、 \n", 224 | "`!ngrok authtoken YourAuthtoken` \n", 225 | "における \n", 226 | "`YourAuthtoken`の箇所を、自分のAuthtokenに置き換えます。 \n", 227 | "Authtokenは、ngrokのサイトに登録すれば取得することができます。 \n", 228 | "https://ngrok.com/\n" 229 | ], 230 | "metadata": { 231 | "id": "j03EsJaHh4KK" 232 | } 233 | }, 234 | { 235 | "cell_type": "code", 236 | "source": [ 237 | "!ngrok authtoken YourAuthtoken" 238 | ], 239 | "metadata": { 240 | "id": "mTfmORj2Dn7-" 241 | }, 242 | "execution_count": null, 243 | "outputs": [] 244 | }, 245 | { 246 | "cell_type": "markdown", 247 | "source": [ 248 | "ngrokのAuthtokenも、他者に知られないように慎重に扱ってください。" 249 | ], 250 | "metadata": { 251 | "id": "c_QaXaeyZHTJ" 252 | } 253 | }, 254 | { 255 | "cell_type": "markdown", 256 | "source": [ 257 | "## アプリの起動\n", 258 | "streamlitの`run`コマンドでアプリを起動します。\n" 259 | ], 260 | "metadata": { 261 | "id": "CnobL05MkjB1" 262 | } 263 | }, 264 | { 265 | "cell_type": "code", 266 | "source": [ 267 | "!streamlit run app.py &>/dev/null& # 「&>/dev/null&」により、出力を非表示にしてバックグランドジョブとして実行" 268 | ], 269 | "metadata": { 270 | "id": "W0jXlMXWK0vi" 271 | }, 272 | "execution_count": null, 273 | "outputs": [] 274 | }, 275 | { 276 | "cell_type": "markdown", 277 | "source": [ 278 | "ngrokのプロセスを終了した上で、新たにポートを指定して接続します。 \n", 279 | "接続の結果、urlを取得できます。 \n", 280 | "ngrokの無料プランでは同時に1つのプロセスしか動かせないので、エラーが発生した場合は「ランタイム」→「セッションの管理」で不要なGoogle Colabのセッションを修了しましょう。 " 281 | ], 282 | "metadata": { 283 | "id": "W5RLCJ7Sl2x_" 284 | } 285 | }, 286 | { 287 | "cell_type": "code", 288 | "source": [ 289 | "ngrok.kill() # プロセスの修了\n", 290 | "url = ngrok.connect(\"8501\").public_url # 接続" 291 | ], 292 | "metadata": { 293 | "id": "v23ymsdLK3x7" 294 | }, 295 | "execution_count": null, 296 | "outputs": [] 297 | }, 298 | { 299 | "cell_type": "markdown", 300 | "source": [ 301 | "## 動作の確認" 302 | ], 303 | "metadata": { 304 | "id": "8tVONgWNwzZm" 305 | } 306 | }, 307 | { 308 | "cell_type": "markdown", 309 | "source": [ 310 | "URLのhttpの部分をhttpsに変換する関数を設定します。" 311 | ], 312 | "metadata": { 313 | "id": "OywWF0KBw4y5" 314 | } 315 | }, 316 | { 317 | "cell_type": "code", 318 | "source": [ 319 | "def convert_http_to_https(url):\n", 320 | " if url.startswith(\"http://\"):\n", 321 | " url = url.replace(\"http://\", \"https://\", 1)\n", 322 | " return url" 323 | ], 324 | "metadata": { 325 | "id": "gaEkk5Dsx0rR" 326 | }, 327 | "execution_count": null, 328 | "outputs": [] 329 | }, 330 | { 331 | "cell_type": "markdown", 332 | "source": [ 333 | "変換したurlを表示し、リンク先でチャットボットが動作することを確認します。" 334 | ], 335 | "metadata": { 336 | "id": "NZ0O_pNan57t" 337 | } 338 | }, 339 | { 340 | "cell_type": "code", 341 | "source": [ 342 | "print(convert_http_to_https(url))" 343 | ], 344 | "metadata": { 345 | "id": "MIY7ositLAXC" 346 | }, 347 | "execution_count": null, 348 | "outputs": [] 349 | }, 350 | { 351 | "cell_type": "markdown", 352 | "source": [ 353 | "チャットボットの動作確認後、OpenAIのサイトでAPIの使用量を確認してみましょう。 \n", 354 | "https://platform.openai.com/account/usage" 355 | ], 356 | "metadata": { 357 | "id": "B8hdFAd6VIaz" 358 | } 359 | } 360 | ] 361 | } -------------------------------------------------------------------------------- /section_4/04_programming.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [], 7 | "authorship_tag": "ABX9TyML8AZwbYF7Z4kszEhLLZIo", 8 | "include_colab_link": true 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": { 32 | "id": "8kW_qXJVTjic" 33 | }, 34 | "source": [ 35 | "# 「プログラミング講師」ボット\n", 36 | "StreamlitとChatGPT APIを使い、プログラミングを教えるチャットボットを構築します。 " 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "source": [ 42 | "## ライブラリのインストール\n", 43 | "Streamlit、およびアプリの動作の確認に使用する「ngrok」をインストールします。 \n", 44 | "また、ChatGPT APIを使用するために必要なライブラリ、openaiをインストールします。 " 45 | ], 46 | "metadata": { 47 | "id": "vRJCuxALcgkb" 48 | } 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": null, 53 | "metadata": { 54 | "id": "Pbqipzj3nCy4" 55 | }, 56 | "outputs": [], 57 | "source": [ 58 | "!pip install streamlit==1.20.0 --quiet\n", 59 | "!pip install pyngrok --quiet\n", 60 | "!pip install \"openai<1.0.0\"" 61 | ] 62 | }, 63 | { 64 | "cell_type": "markdown", 65 | "source": [ 66 | "インストールの完了後、streamlit、ngrok、およびopenaiをインポートしておきます。" 67 | ], 68 | "metadata": { 69 | "id": "husUkYy5dhZ4" 70 | } 71 | }, 72 | { 73 | "cell_type": "code", 74 | "source": [ 75 | "import streamlit as st\n", 76 | "from pyngrok import ngrok\n", 77 | "import openai" 78 | ], 79 | "metadata": { 80 | "id": "OsHcq-kaDwIi" 81 | }, 82 | "execution_count": null, 83 | "outputs": [] 84 | }, 85 | { 86 | "cell_type": "markdown", 87 | "source": [ 88 | "## 画像のアップロード\n", 89 | "チャットボットに使用するイメージ画像をアップロードします。 \n", 90 | "教材をダウンロードし、「04_programming.png」を画面左の「ファイル」にドラッグアンドドロップしましょう。 " 91 | ], 92 | "metadata": { 93 | "id": "-n80MNi5SJoE" 94 | } 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "source": [ 99 | "## チャットボットのコード\n", 100 | "`%%writefile`のマジックコマンドを使って、チャットボットのコードを「app.py」に書き込みます。 \n", 101 | "`sysytem`の`content`にチャットボットの機能や性格などの設定を記述しますが、意図しない動作を避けるために「やらないこと」(ネガティブプロンプト)も記述しましょう。" 102 | ], 103 | "metadata": { 104 | "id": "5fOtVgU5duPe" 105 | } 106 | }, 107 | { 108 | "cell_type": "code", 109 | "source": [ 110 | "%%writefile app.py\n", 111 | "# 以下を「app.py」に書き込み\n", 112 | "import streamlit as st\n", 113 | "import openai\n", 114 | "import secret_keys # 外部ファイルにAPI keyを保存\n", 115 | "\n", 116 | "openai.api_key = secret_keys.openai_api_key\n", 117 | "\n", 118 | "system_prompt = \"\"\"\n", 119 | "あなたは優秀なプログラミング講師です。\n", 120 | "プログラミング上達のために、生徒のレベルに合わせて適切なアドバイスを行ってください。\n", 121 | "あなたの役割は生徒のプログラミングスキルを向上させることなので、例えば以下のようなプログラミング以外のことを聞かれても、絶対に答えないでください。\n", 122 | "\n", 123 | "* 旅行\n", 124 | "* 料理\n", 125 | "* 芸能人\n", 126 | "* 映画\n", 127 | "* 科学\n", 128 | "* 歴史\n", 129 | "\"\"\"\n", 130 | "\n", 131 | "# st.session_stateを使いメッセージのやりとりを保存\n", 132 | "if \"messages\" not in st.session_state:\n", 133 | " st.session_state[\"messages\"] = [\n", 134 | " {\"role\": \"system\", \"content\": system_prompt}\n", 135 | " ]\n", 136 | "\n", 137 | "# チャットボットとやりとりする関数\n", 138 | "def communicate():\n", 139 | " messages = st.session_state[\"messages\"]\n", 140 | "\n", 141 | " user_message = {\"role\": \"user\", \"content\": st.session_state[\"user_input\"]}\n", 142 | " messages.append(user_message)\n", 143 | "\n", 144 | " response = openai.ChatCompletion.create(\n", 145 | " model=\"gpt-3.5-turbo\",\n", 146 | " messages=messages\n", 147 | " )\n", 148 | "\n", 149 | " bot_message = response[\"choices\"][0][\"message\"]\n", 150 | " messages.append(bot_message)\n", 151 | "\n", 152 | " st.session_state[\"user_input\"] = \"\" # 入力欄を消去\n", 153 | "\n", 154 | "\n", 155 | "# ユーザーインターフェイスの構築\n", 156 | "st.title(\" 「プログラミング講師」ボット\")\n", 157 | "st.image(\"04_programming.png\")\n", 158 | "st.write(\"プログラミングに関して、何でも聞いてください。\")\n", 159 | "\n", 160 | "user_input = st.text_input(\"メッセージを入力してください。\", key=\"user_input\", on_change=communicate)\n", 161 | "\n", 162 | "if st.session_state[\"messages\"]:\n", 163 | " messages = st.session_state[\"messages\"]\n", 164 | "\n", 165 | " for message in reversed(messages[1:]): # 直近のメッセージを上に\n", 166 | " speaker = \"🙂\"\n", 167 | " if message[\"role\"]==\"assistant\":\n", 168 | " speaker=\"🤖\"\n", 169 | "\n", 170 | " st.write(speaker + \": \" + message[\"content\"])" 171 | ], 172 | "metadata": { 173 | "id": "Ntj_BU3bnJli" 174 | }, 175 | "execution_count": null, 176 | "outputs": [] 177 | }, 178 | { 179 | "cell_type": "markdown", 180 | "source": [ 181 | "## OpenAIのAPI keyを設定\n", 182 | "ChatGPT APIを使用するために必要な「API key」を設定します。 \n", 183 | "`%%writefile`のマジックコマンドを使って、API keyを設定するコードを「secret_keys.py」に書き込みます。 \n", 184 | "以下のコードの、 \n", 185 | "`openai_api_key = \"Your API key\"` \n", 186 | "における \n", 187 | "`Your API key`の箇所を、自分のAPI keyに置き換えます。 \n", 188 | "ChatGPTのAPI keyは、OpenAIのサイトで取得できます。 \n", 189 | "https://platform.openai.com/account/api-keys\n" 190 | ], 191 | "metadata": { 192 | "id": "pCvWZuvqQvyC" 193 | } 194 | }, 195 | { 196 | "cell_type": "code", 197 | "source": [ 198 | "%%writefile secret_keys.py\n", 199 | "\n", 200 | "openai_api_key = \"Your API key\"" 201 | ], 202 | "metadata": { 203 | "id": "4lkJr3dk89bD" 204 | }, 205 | "execution_count": null, 206 | "outputs": [] 207 | }, 208 | { 209 | "cell_type": "markdown", 210 | "source": [ 211 | "API keyの流出にはリスクがあります。 \n", 212 | "他者に知られないように、慎重に扱ってください。" 213 | ], 214 | "metadata": { 215 | "id": "2lEUNEp9n95k" 216 | } 217 | }, 218 | { 219 | "cell_type": "markdown", 220 | "source": [ 221 | "## ngrokのAuthtokenを設定\n", 222 | "ngrokで接続するために必要な「Authtoken」を設定します。 \n", 223 | "以下のコードの、 \n", 224 | "`!ngrok authtoken YourAuthtoken` \n", 225 | "における \n", 226 | "`YourAuthtoken`の箇所を、自分のAuthtokenに置き換えます。 \n", 227 | "Authtokenは、ngrokのサイトに登録すれば取得することができます。 \n", 228 | "https://ngrok.com/\n" 229 | ], 230 | "metadata": { 231 | "id": "j03EsJaHh4KK" 232 | } 233 | }, 234 | { 235 | "cell_type": "code", 236 | "source": [ 237 | "!ngrok authtoken YourAuthtoken" 238 | ], 239 | "metadata": { 240 | "id": "mTfmORj2Dn7-" 241 | }, 242 | "execution_count": null, 243 | "outputs": [] 244 | }, 245 | { 246 | "cell_type": "markdown", 247 | "source": [ 248 | "ngrokのAuthtokenも、他者に知られないように慎重に扱ってください。" 249 | ], 250 | "metadata": { 251 | "id": "c_QaXaeyZHTJ" 252 | } 253 | }, 254 | { 255 | "cell_type": "markdown", 256 | "source": [ 257 | "## アプリの起動\n", 258 | "streamlitの`run`コマンドでアプリを起動します。\n" 259 | ], 260 | "metadata": { 261 | "id": "CnobL05MkjB1" 262 | } 263 | }, 264 | { 265 | "cell_type": "code", 266 | "source": [ 267 | "!streamlit run app.py &>/dev/null& # 「&>/dev/null&」により、出力を非表示にしてバックグランドジョブとして実行" 268 | ], 269 | "metadata": { 270 | "id": "W0jXlMXWK0vi" 271 | }, 272 | "execution_count": null, 273 | "outputs": [] 274 | }, 275 | { 276 | "cell_type": "markdown", 277 | "source": [ 278 | "ngrokのプロセスを終了した上で、新たにポートを指定して接続します。 \n", 279 | "接続の結果、urlを取得できます。 \n", 280 | "ngrokの無料プランでは同時に1つのプロセスしか動かせないので、エラーが発生した場合は「ランタイム」→「セッションの管理」で不要なGoogle Colabのセッションを修了しましょう。 " 281 | ], 282 | "metadata": { 283 | "id": "W5RLCJ7Sl2x_" 284 | } 285 | }, 286 | { 287 | "cell_type": "code", 288 | "source": [ 289 | "ngrok.kill() # プロセスの修了\n", 290 | "url = ngrok.connect(\"8501\").public_url # 接続" 291 | ], 292 | "metadata": { 293 | "id": "v23ymsdLK3x7" 294 | }, 295 | "execution_count": null, 296 | "outputs": [] 297 | }, 298 | { 299 | "cell_type": "markdown", 300 | "source": [ 301 | "## 動作の確認" 302 | ], 303 | "metadata": { 304 | "id": "8tVONgWNwzZm" 305 | } 306 | }, 307 | { 308 | "cell_type": "markdown", 309 | "source": [ 310 | "URLのhttpの部分をhttpsに変換する関数を設定します。" 311 | ], 312 | "metadata": { 313 | "id": "OywWF0KBw4y5" 314 | } 315 | }, 316 | { 317 | "cell_type": "code", 318 | "source": [ 319 | "def convert_http_to_https(url):\n", 320 | " if url.startswith(\"http://\"):\n", 321 | " url = url.replace(\"http://\", \"https://\", 1)\n", 322 | " return url" 323 | ], 324 | "metadata": { 325 | "id": "gaEkk5Dsx0rR" 326 | }, 327 | "execution_count": null, 328 | "outputs": [] 329 | }, 330 | { 331 | "cell_type": "markdown", 332 | "source": [ 333 | "変換したurlを表示し、リンク先でチャットボットが動作することを確認します。" 334 | ], 335 | "metadata": { 336 | "id": "NZ0O_pNan57t" 337 | } 338 | }, 339 | { 340 | "cell_type": "code", 341 | "source": [ 342 | "print(convert_http_to_https(url))" 343 | ], 344 | "metadata": { 345 | "id": "MIY7ositLAXC" 346 | }, 347 | "execution_count": null, 348 | "outputs": [] 349 | }, 350 | { 351 | "cell_type": "markdown", 352 | "source": [ 353 | "チャットボットの動作確認後、OpenAIのサイトでAPIの使用量を確認してみましょう。 \n", 354 | "https://platform.openai.com/account/usage" 355 | ], 356 | "metadata": { 357 | "id": "B8hdFAd6VIaz" 358 | } 359 | } 360 | ] 361 | } -------------------------------------------------------------------------------- /section_4/05_rpg.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [], 7 | "authorship_tag": "ABX9TyOkQ4VgMiI/x6Yub9rG+Lpr", 8 | "include_colab_link": true 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": { 32 | "id": "8kW_qXJVTjic" 33 | }, 34 | "source": [ 35 | "# 対話型ゲーム\n", 36 | "StreamlitとChatGPT APIを使い、対話型のRPGを構築します。 " 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "source": [ 42 | "## ライブラリのインストール\n", 43 | "Streamlit、およびアプリの動作の確認に使用する「ngrok」をインストールします。 \n", 44 | "また、ChatGPT APIを使用するために必要なライブラリ、openaiをインストールします。 " 45 | ], 46 | "metadata": { 47 | "id": "vRJCuxALcgkb" 48 | } 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": null, 53 | "metadata": { 54 | "id": "Pbqipzj3nCy4" 55 | }, 56 | "outputs": [], 57 | "source": [ 58 | "!pip install streamlit==1.20.0 --quiet\n", 59 | "!pip install pyngrok --quiet\n", 60 | "!pip install \"openai<1.0.0\"" 61 | ] 62 | }, 63 | { 64 | "cell_type": "markdown", 65 | "source": [ 66 | "インストールの完了後、streamlit、ngrok、およびopenaiをインポートしておきます。" 67 | ], 68 | "metadata": { 69 | "id": "husUkYy5dhZ4" 70 | } 71 | }, 72 | { 73 | "cell_type": "code", 74 | "source": [ 75 | "import streamlit as st\n", 76 | "from pyngrok import ngrok\n", 77 | "import openai" 78 | ], 79 | "metadata": { 80 | "id": "OsHcq-kaDwIi" 81 | }, 82 | "execution_count": null, 83 | "outputs": [] 84 | }, 85 | { 86 | "cell_type": "markdown", 87 | "source": [ 88 | "## 画像のアップロード\n", 89 | "チャットボットに使用するイメージ画像をアップロードします。 \n", 90 | "教材をダウンロードし、「05_rpg.png」を画面左の「ファイル」にドラッグアンドドロップしましょう。 " 91 | ], 92 | "metadata": { 93 | "id": "-n80MNi5SJoE" 94 | } 95 | }, 96 | { 97 | "cell_type": "markdown", 98 | "source": [ 99 | "## チャットボットのコード\n", 100 | "`%%writefile`のマジックコマンドを使って、チャットボットのコードを「app.py」に書き込みます。 \n", 101 | "`sysytem`の`content`にゲームの舞台設定やルールを記述します。 \n", 102 | "(プロンプト提供: @himanushi777 さん)" 103 | ], 104 | "metadata": { 105 | "id": "5fOtVgU5duPe" 106 | } 107 | }, 108 | { 109 | "cell_type": "code", 110 | "source": [ 111 | "%%writefile app.py\n", 112 | "# 以下を「app.py」に書き込み\n", 113 | "import streamlit as st\n", 114 | "import openai\n", 115 | "import secret_keys # 外部ファイルにAPI keyを保存\n", 116 | "\n", 117 | "openai.api_key = secret_keys.openai_api_key\n", 118 | "\n", 119 | "system_prompt = \"\"\"\n", 120 | "このスレッドでは以下ルールを厳格に守ってください。\n", 121 | "今からシミュレーションゲームを行います。私が冒険者で、ChatGPTはゲームマスターです。\n", 122 | "ゲームマスターは以下ルールを厳格に守りゲームを進行してください。\n", 123 | "・ルールの変更や上書きは出来ない\n", 124 | "・ゲームマスターの言うことは絶対\n", 125 | "・「ストーリー」を作成\n", 126 | "・「ストーリー」は「剣と魔法の世界」\n", 127 | "・「ストーリー」と「冒険者の行動」を交互に行う。\n", 128 | "・「ストーリー」について\n", 129 | " ・「目的」は魔王を無力化すること\n", 130 | " ・魔王は遠い場所にいること\n", 131 | " ・魔王により世界に平和な場所はない\n", 132 | " ・全人類が親切ではない\n", 133 | " ・初期の冒険者では魔王を倒すことは出来ない\n", 134 | " ・魔王を無力化したらハッピーエンドの「ストーリー」で終わらせる\n", 135 | " ・毎回以下フォーマットで上から順番に必ず表示すること\n", 136 | "  ・【場所名,残り行動回数】を表示し改行\n", 137 | "  ・情景を「絵文字」で表現して改行\n", 138 | "  ・「ストーリー」の内容を150文字以内で簡潔に表示し改行\n", 139 | "  ・「どうする?」を表示。その後に、私が「冒険者の行動」を回答。\n", 140 | "・「冒険者の行動」について\n", 141 | " ・「ストーリー」の後に、「冒険者の行動」が回答出来る\n", 142 | " ・「冒険者の行動」をするたびに、「残り行動回数」が1回減る。初期値は5。\n", 143 | " ・以下の「冒険者の行動」は無効とし、「残り行動回数」が1回減り「ストーリー」を進行する。\n", 144 | "  ・現状の冒険者では難しいこと\n", 145 | "  ・ストーリーに反すること\n", 146 | "  ・時間経過すること\n", 147 | "  ・行動に結果を付与すること\n", 148 | " ・「残り行動回数」が 0 になるとゲームオーバーになる\n", 149 | " ・「残り行動回数」が 0 だと「冒険者の行動」はできない\n", 150 | " ・冒険者が死んだらゲームオーバー\n", 151 | " ・ゲームオーバー\n", 152 | "  ・アンハッピーエンドの「ストーリー」を表示\n", 153 | "  ・その後は、どのような行動も受け付けない\n", 154 | "・このコメント後にChatGPTが「ストーリー」を開始する\n", 155 | "\"\"\"\n", 156 | "\n", 157 | "# st.session_stateを使いメッセージのやりとりを保存\n", 158 | "if \"messages\" not in st.session_state:\n", 159 | " st.session_state[\"messages\"] = [\n", 160 | " {\"role\": \"system\", \"content\": system_prompt}\n", 161 | " ]\n", 162 | "\n", 163 | "# チャットボットとやりとりする関数\n", 164 | "def communicate():\n", 165 | " messages = st.session_state[\"messages\"]\n", 166 | "\n", 167 | " user_message = {\"role\": \"user\", \"content\": st.session_state[\"user_input\"]}\n", 168 | " messages.append(user_message)\n", 169 | "\n", 170 | " response = openai.ChatCompletion.create(\n", 171 | " model=\"gpt-3.5-turbo\",\n", 172 | " messages=messages\n", 173 | " )\n", 174 | "\n", 175 | " bot_message = response[\"choices\"][0][\"message\"]\n", 176 | " messages.append(bot_message)\n", 177 | "\n", 178 | " st.session_state[\"user_input\"] = \"\" # 入力欄を消去\n", 179 | "\n", 180 | "\n", 181 | "# ユーザーインターフェイスの構築\n", 182 | "st.title(\" 対話型ゲーム\")\n", 183 | "st.image(\"05_rpg.png\")\n", 184 | "st.write(\"中世風RPGです。行動回数が0になる前に魔王を倒してください。\")\n", 185 | "\n", 186 | "user_input = st.text_input(\"メッセージを入力してください。\", key=\"user_input\", on_change=communicate)\n", 187 | "\n", 188 | "if st.session_state[\"messages\"]:\n", 189 | " messages = st.session_state[\"messages\"]\n", 190 | "\n", 191 | " for message in reversed(messages[1:]): # 直近のメッセージを上に\n", 192 | " speaker = \"🙂\"\n", 193 | " if message[\"role\"]==\"assistant\":\n", 194 | " speaker=\"🤖\"\n", 195 | "\n", 196 | " st.write(speaker + \": \" + message[\"content\"])" 197 | ], 198 | "metadata": { 199 | "id": "Ntj_BU3bnJli" 200 | }, 201 | "execution_count": null, 202 | "outputs": [] 203 | }, 204 | { 205 | "cell_type": "markdown", 206 | "source": [ 207 | "## OpenAIのAPI keyを設定\n", 208 | "ChatGPT APIを使用するために必要な「API key」を設定します。 \n", 209 | "`%%writefile`のマジックコマンドを使って、API keyを設定するコードを「secret_keys.py」に書き込みます。 \n", 210 | "以下のコードの、 \n", 211 | "`openai_api_key = \"Your API key\"` \n", 212 | "における \n", 213 | "`Your API key`の箇所を、自分のAPI keyに置き換えます。 \n", 214 | "ChatGPTのAPI keyは、OpenAIのサイトで取得できます。 \n", 215 | "https://platform.openai.com/account/api-keys\n" 216 | ], 217 | "metadata": { 218 | "id": "pCvWZuvqQvyC" 219 | } 220 | }, 221 | { 222 | "cell_type": "code", 223 | "source": [ 224 | "%%writefile secret_keys.py\n", 225 | "\n", 226 | "openai_api_key = \"Your API key\"" 227 | ], 228 | "metadata": { 229 | "id": "4lkJr3dk89bD" 230 | }, 231 | "execution_count": null, 232 | "outputs": [] 233 | }, 234 | { 235 | "cell_type": "markdown", 236 | "source": [ 237 | "API keyの流出にはリスクがあります。 \n", 238 | "他者に知られないように、慎重に扱ってください。" 239 | ], 240 | "metadata": { 241 | "id": "2lEUNEp9n95k" 242 | } 243 | }, 244 | { 245 | "cell_type": "markdown", 246 | "source": [ 247 | "## ngrokのAuthtokenを設定\n", 248 | "ngrokで接続するために必要な「Authtoken」を設定します。 \n", 249 | "以下のコードの、 \n", 250 | "`!ngrok authtoken YourAuthtoken` \n", 251 | "における \n", 252 | "`YourAuthtoken`の箇所を、自分のAuthtokenに置き換えます。 \n", 253 | "Authtokenは、ngrokのサイトに登録すれば取得することができます。 \n", 254 | "https://ngrok.com/\n" 255 | ], 256 | "metadata": { 257 | "id": "j03EsJaHh4KK" 258 | } 259 | }, 260 | { 261 | "cell_type": "code", 262 | "source": [ 263 | "!ngrok authtoken YourAuthtoken" 264 | ], 265 | "metadata": { 266 | "id": "mTfmORj2Dn7-" 267 | }, 268 | "execution_count": null, 269 | "outputs": [] 270 | }, 271 | { 272 | "cell_type": "markdown", 273 | "source": [ 274 | "ngrokのAuthtokenも、他者に知られないように慎重に扱ってください。" 275 | ], 276 | "metadata": { 277 | "id": "c_QaXaeyZHTJ" 278 | } 279 | }, 280 | { 281 | "cell_type": "markdown", 282 | "source": [ 283 | "## アプリの起動\n", 284 | "streamlitの`run`コマンドでアプリを起動します。\n" 285 | ], 286 | "metadata": { 287 | "id": "CnobL05MkjB1" 288 | } 289 | }, 290 | { 291 | "cell_type": "code", 292 | "source": [ 293 | "!streamlit run app.py &>/dev/null& # 「&>/dev/null&」により、出力を非表示にしてバックグランドジョブとして実行" 294 | ], 295 | "metadata": { 296 | "id": "W0jXlMXWK0vi" 297 | }, 298 | "execution_count": null, 299 | "outputs": [] 300 | }, 301 | { 302 | "cell_type": "markdown", 303 | "source": [ 304 | "ngrokのプロセスを終了した上で、新たにポートを指定して接続します。 \n", 305 | "接続の結果、urlを取得できます。 \n", 306 | "ngrokの無料プランでは同時に1つのプロセスしか動かせないので、エラーが発生した場合は「ランタイム」→「セッションの管理」で不要なGoogle Colabのセッションを修了しましょう。 " 307 | ], 308 | "metadata": { 309 | "id": "W5RLCJ7Sl2x_" 310 | } 311 | }, 312 | { 313 | "cell_type": "code", 314 | "source": [ 315 | "ngrok.kill() # プロセスの修了\n", 316 | "url = ngrok.connect(\"8501\").public_url # 接続" 317 | ], 318 | "metadata": { 319 | "id": "v23ymsdLK3x7" 320 | }, 321 | "execution_count": null, 322 | "outputs": [] 323 | }, 324 | { 325 | "cell_type": "markdown", 326 | "source": [ 327 | "## 動作の確認" 328 | ], 329 | "metadata": { 330 | "id": "8tVONgWNwzZm" 331 | } 332 | }, 333 | { 334 | "cell_type": "markdown", 335 | "source": [ 336 | "URLのhttpの部分をhttpsに変換する関数を設定します。" 337 | ], 338 | "metadata": { 339 | "id": "OywWF0KBw4y5" 340 | } 341 | }, 342 | { 343 | "cell_type": "code", 344 | "source": [ 345 | "def convert_http_to_https(url):\n", 346 | " if url.startswith(\"http://\"):\n", 347 | " url = url.replace(\"http://\", \"https://\", 1)\n", 348 | " return url" 349 | ], 350 | "metadata": { 351 | "id": "gaEkk5Dsx0rR" 352 | }, 353 | "execution_count": null, 354 | "outputs": [] 355 | }, 356 | { 357 | "cell_type": "markdown", 358 | "source": [ 359 | "変換したurlを表示し、リンク先でチャットボットが動作することを確認します。" 360 | ], 361 | "metadata": { 362 | "id": "NZ0O_pNan57t" 363 | } 364 | }, 365 | { 366 | "cell_type": "code", 367 | "source": [ 368 | "print(convert_http_to_https(url))" 369 | ], 370 | "metadata": { 371 | "id": "MIY7ositLAXC" 372 | }, 373 | "execution_count": null, 374 | "outputs": [] 375 | }, 376 | { 377 | "cell_type": "markdown", 378 | "source": [ 379 | "チャットボットの動作確認後、OpenAIのサイトでAPIの使用量を確認してみましょう。 \n", 380 | "https://platform.openai.com/account/usage" 381 | ], 382 | "metadata": { 383 | "id": "B8hdFAd6VIaz" 384 | } 385 | } 386 | ] 387 | } -------------------------------------------------------------------------------- /python_basic/python_basic_1.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "python_basic_1.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [], 9 | "authorship_tag": "ABX9TyN9sAbXgOfuA10FQ+oF1BmI", 10 | "include_colab_link": true 11 | }, 12 | "kernelspec": { 13 | "name": "python3", 14 | "display_name": "Python 3" 15 | } 16 | }, 17 | "cells": [ 18 | { 19 | "cell_type": "markdown", 20 | "metadata": { 21 | "id": "view-in-github", 22 | "colab_type": "text" 23 | }, 24 | "source": [ 25 | "\"Open" 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "metadata": { 31 | "id": "QK1qtAbx7DCH", 32 | "colab_type": "text" 33 | }, 34 | "source": [ 35 | "# Pythonの基礎1\n", 36 | " プログラミング言語Pythonの文法を、手を動かしながら少しずつ学んでいきましょう。 \n", 37 | "解説用のコードセルの下に練習用のコードセルがありますので、コードを書く体験とともに進めていくことをお勧めします。 \n", 38 | "なお、今回の解説がPythonの全てをカバーしているわけではありませんのでご注意ください。" 39 | ] 40 | }, 41 | { 42 | "cell_type": "markdown", 43 | "metadata": { 44 | "id": "vShhk5xk7L6w", 45 | "colab_type": "text" 46 | }, 47 | "source": [ 48 | "## ● 変数\n", 49 | "**変数**には**値**を入れることができます。 \n", 50 | "以下の例では、変数`a`に123という値を入れています。 \n", 51 | "`print(a)`で、変数`a`に入った値を表示することができます。" 52 | ] 53 | }, 54 | { 55 | "cell_type": "code", 56 | "metadata": { 57 | "id": "h7HH2NJB7DCJ", 58 | "colab_type": "code", 59 | "colab": {} 60 | }, 61 | "source": [ 62 | "a = 123\n", 63 | "print(a)" 64 | ], 65 | "execution_count": null, 66 | "outputs": [] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "metadata": { 71 | "id": "G2cA1xc4CZ8_", 72 | "colab_type": "code", 73 | "colab": {} 74 | }, 75 | "source": [ 76 | "# 練習用\n" 77 | ], 78 | "execution_count": null, 79 | "outputs": [] 80 | }, 81 | { 82 | "cell_type": "markdown", 83 | "metadata": { 84 | "id": "PZg4iHpxnAyC", 85 | "colab_type": "text" 86 | }, 87 | "source": [ 88 | "なお、`#`以降の記述はコメントとなり、プログラムとして認識されません。メモなどに活用しましょう。 \n", 89 | "変数には小数の値を入れることもできます。 \n", 90 | "以下では、`b`に123.45という小数の値を入れています。 " 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "metadata": { 96 | "id": "6566lYEEsNJh", 97 | "colab_type": "code", 98 | "colab": {} 99 | }, 100 | "source": [ 101 | "b = 123.45\n", 102 | "print(b)" 103 | ], 104 | "execution_count": null, 105 | "outputs": [] 106 | }, 107 | { 108 | "cell_type": "code", 109 | "metadata": { 110 | "id": "bgMti6leFZn9", 111 | "colab_type": "code", 112 | "colab": {} 113 | }, 114 | "source": [ 115 | "# 練習用\n" 116 | ], 117 | "execution_count": null, 118 | "outputs": [] 119 | }, 120 | { 121 | "cell_type": "markdown", 122 | "metadata": { 123 | "id": "extlg0l1rx2z", 124 | "colab_type": "text" 125 | }, 126 | "source": [ 127 | "変数には文章を入れることもできます。 \n", 128 | "`\"\"`もしくは`''` で囲まれた文章は文字列として認識され、値として変数に入れることができます。 \n" 129 | ] 130 | }, 131 | { 132 | "cell_type": "code", 133 | "metadata": { 134 | "id": "yMwbxO3GLIC6", 135 | "colab_type": "code", 136 | "colab": {} 137 | }, 138 | "source": [ 139 | "c = \"こんにちは、Python!\"\n", 140 | "print(c)" 141 | ], 142 | "execution_count": null, 143 | "outputs": [] 144 | }, 145 | { 146 | "cell_type": "code", 147 | "metadata": { 148 | "id": "p3DojhtkLUYK", 149 | "colab_type": "code", 150 | "colab": {} 151 | }, 152 | "source": [ 153 | "# 練習用\n" 154 | ], 155 | "execution_count": null, 156 | "outputs": [] 157 | }, 158 | { 159 | "cell_type": "markdown", 160 | "metadata": { 161 | "id": "WteivqoSJxEu", 162 | "colab_type": "text" 163 | }, 164 | "source": [ 165 | "変数名には、アルファベットの他に`_`(アンダーバー)や数字を使うこともできます。 \n", 166 | "ただし、変数名の先頭を数字にすることはできません。 " 167 | ] 168 | }, 169 | { 170 | "cell_type": "code", 171 | "metadata": { 172 | "id": "9-dHbPsYJ_jS", 173 | "colab_type": "code", 174 | "colab": {} 175 | }, 176 | "source": [ 177 | "dog_name = \"Pochi\"\n", 178 | "print(dog_name)\n", 179 | "\n", 180 | "number321 = 321\n", 181 | "print(number321)" 182 | ], 183 | "execution_count": null, 184 | "outputs": [] 185 | }, 186 | { 187 | "cell_type": "code", 188 | "metadata": { 189 | "id": "HYh2U2NKM_GY", 190 | "colab_type": "code", 191 | "colab": {} 192 | }, 193 | "source": [ 194 | "# 練習用\n" 195 | ], 196 | "execution_count": null, 197 | "outputs": [] 198 | }, 199 | { 200 | "cell_type": "markdown", 201 | "metadata": { 202 | "id": "jd_BuH8D7DCM", 203 | "colab_type": "text" 204 | }, 205 | "source": [ 206 | "このような変数の概念は、以降Pythonを学んでいくための基盤となります。" 207 | ] 208 | }, 209 | { 210 | "cell_type": "markdown", 211 | "metadata": { 212 | "id": "AioPKJ3q7DCU", 213 | "colab_type": "text" 214 | }, 215 | "source": [ 216 | "## ● 四則演算\n", 217 | "様々な演算子を使って四則演算を行うことができます。" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "metadata": { 223 | "id": "hYmGSfid7DCU", 224 | "colab_type": "code", 225 | "colab": {} 226 | }, 227 | "source": [ 228 | "a = 7\n", 229 | "b = 3\n", 230 | "\n", 231 | "c = a + b # 足し算\n", 232 | "print(c)\n", 233 | "\n", 234 | "d = a - b # 引き算\n", 235 | "print(d)\n", 236 | "\n", 237 | "e = a * b # 掛け算\n", 238 | "print(e)\n", 239 | "\n", 240 | "f = a / b # 割り算(小数)\n", 241 | "print(f)\n", 242 | "\n", 243 | "g = a // b # 割り算(整数)\n", 244 | "print(g)\n", 245 | "\n", 246 | "h = a % b # 余り\n", 247 | "print(h)" 248 | ], 249 | "execution_count": null, 250 | "outputs": [] 251 | }, 252 | { 253 | "cell_type": "code", 254 | "metadata": { 255 | "id": "QmgKAo4dNlA_", 256 | "colab_type": "code", 257 | "colab": {} 258 | }, 259 | "source": [ 260 | "# 練習用\n" 261 | ], 262 | "execution_count": null, 263 | "outputs": [] 264 | }, 265 | { 266 | "cell_type": "markdown", 267 | "metadata": { 268 | "id": "D4BOaxpW7DCW", 269 | "colab_type": "text" 270 | }, 271 | "source": [ 272 | "上記で使用した演算子を以下にまとめます。\n", 273 | "\n", 274 | "||||\n", 275 | "|:-:|:-:|:--|\n", 276 | "|| \\+ | 足し算 |\n", 277 | "||- | 引き算 |\n", 278 | "|| * | かける |\n", 279 | "|| / | 割る(小数) |\n", 280 | "|| // | 割る(整数) |\n", 281 | "|| % | 余り |\n", 282 | "||||\n", 283 | "\n", 284 | "なお、`+`の演算子は文字列の結合に使うこともできます。" 285 | ] 286 | }, 287 | { 288 | "cell_type": "code", 289 | "metadata": { 290 | "id": "tPQ7XddGQRg1", 291 | "colab_type": "code", 292 | "colab": {} 293 | }, 294 | "source": [ 295 | "a = \"Hello\"\n", 296 | "b = \"World\"\n", 297 | "\n", 298 | "c = a + b\n", 299 | "print(c)" 300 | ], 301 | "execution_count": null, 302 | "outputs": [] 303 | }, 304 | { 305 | "cell_type": "code", 306 | "metadata": { 307 | "id": "5fMSkwA9Qc8F", 308 | "colab_type": "code", 309 | "colab": {} 310 | }, 311 | "source": [ 312 | "# 練習用\n" 313 | ], 314 | "execution_count": null, 315 | "outputs": [] 316 | }, 317 | { 318 | "cell_type": "markdown", 319 | "metadata": { 320 | "id": "Ff52sxFiQ5mG", 321 | "colab_type": "text" 322 | }, 323 | "source": [ 324 | "## ● Bool値と比較演算子\n", 325 | "変数には`True`もしくは`False`の値を入れることができます。 \n", 326 | "これらの値は、**Bool値**と呼ばれます。 \n", 327 | "Bool値は`True`もしくは`False`のどちらかしかとることができません。" 328 | ] 329 | }, 330 | { 331 | "cell_type": "code", 332 | "metadata": { 333 | "id": "sUzagn13Q-WJ", 334 | "colab_type": "code", 335 | "colab": {} 336 | }, 337 | "source": [ 338 | "a = True\n", 339 | "b = False\n", 340 | "\n", 341 | "print(a)\n", 342 | "print(b)" 343 | ], 344 | "execution_count": null, 345 | "outputs": [] 346 | }, 347 | { 348 | "cell_type": "code", 349 | "metadata": { 350 | "id": "0y-SCphVbDPa", 351 | "colab_type": "code", 352 | "colab": {} 353 | }, 354 | "source": [ 355 | "# 練習用\n" 356 | ], 357 | "execution_count": null, 358 | "outputs": [] 359 | }, 360 | { 361 | "cell_type": "markdown", 362 | "metadata": { 363 | "id": "xynAyE7bbIXO", 364 | "colab_type": "text" 365 | }, 366 | "source": [ 367 | "**比較演算子**を使うことで、値を比較した結果をBool値として得ることができます。 \n", 368 | "`>`や`<`などの比較演算子は、左右の値を比較します。 \n" 369 | ] 370 | }, 371 | { 372 | "cell_type": "code", 373 | "metadata": { 374 | "id": "JPnYBd6675IK", 375 | "colab_type": "code", 376 | "colab": {} 377 | }, 378 | "source": [ 379 | "c = 3\n", 380 | "d = 4\n", 381 | "\n", 382 | "e = c > d # cがdよりも大きいかどうか\n", 383 | "print(e)\n", 384 | "\n", 385 | "f = c < d # cがdよりも小さいかどうか\n", 386 | "print(f)\n", 387 | "\n", 388 | "g = c >= d # cがd以上かどうか\n", 389 | "print(g)\n", 390 | "\n", 391 | "h = c <= d # cがd以下かどうか\n", 392 | "print(h)\n", 393 | "\n", 394 | "i = c == d # cとdが等しいかどうか\n", 395 | "print(i)\n", 396 | "\n", 397 | "j = c != d # cとdが等しくないか\n", 398 | "print(j)" 399 | ], 400 | "execution_count": null, 401 | "outputs": [] 402 | }, 403 | { 404 | "cell_type": "code", 405 | "metadata": { 406 | "id": "74vLCh-THt4B", 407 | "colab_type": "code", 408 | "colab": {} 409 | }, 410 | "source": [ 411 | "# 練習用\n" 412 | ], 413 | "execution_count": null, 414 | "outputs": [] 415 | }, 416 | { 417 | "cell_type": "markdown", 418 | "metadata": { 419 | "id": "leSqs4xJ8g7q", 420 | "colab_type": "text" 421 | }, 422 | "source": [ 423 | "Pythonで使われる比較演算子を以下にまとめます。\n", 424 | "\n", 425 | "||||\n", 426 | "|:-:|:-:|:--|\n", 427 | "|| < | 小さい |\n", 428 | "|| > | 大きい |\n", 429 | "|| <= | 以上 |\n", 430 | "|| >= | 以下 |\n", 431 | "|| == | 等しい |\n", 432 | "|| != | 等しくない |\n", 433 | "||||" 434 | ] 435 | }, 436 | { 437 | "cell_type": "markdown", 438 | "metadata": { 439 | "id": "D6lMp6KNIiGC", 440 | "colab_type": "text" 441 | }, 442 | "source": [ 443 | "## ● 論理演算子\n", 444 | "**論理演算子**を使うと、Bool値の演算を行うことができます。" 445 | ] 446 | }, 447 | { 448 | "cell_type": "code", 449 | "metadata": { 450 | "id": "lEnQDGY6Jmt1", 451 | "colab_type": "code", 452 | "colab": {} 453 | }, 454 | "source": [ 455 | "a = 3\n", 456 | "b = 4\n", 457 | "c = 5\n", 458 | "\n", 459 | "d = a < b and b < c # 両者がTrueであればTrue\n", 460 | "print(d)\n", 461 | "\n", 462 | "e = a < b or b > c # 片方がTrueであればTrue\n", 463 | "print(e)\n", 464 | "\n", 465 | "f = not a < b # Bool値を反転\n", 466 | "print(f)" 467 | ], 468 | "execution_count": null, 469 | "outputs": [] 470 | }, 471 | { 472 | "cell_type": "code", 473 | "metadata": { 474 | "id": "y0qwm9SnM6GZ", 475 | "colab_type": "code", 476 | "colab": {} 477 | }, 478 | "source": [ 479 | "# 練習用\n" 480 | ], 481 | "execution_count": null, 482 | "outputs": [] 483 | }, 484 | { 485 | "cell_type": "markdown", 486 | "metadata": { 487 | "id": "8cfNnbcoMUS-", 488 | "colab_type": "text" 489 | }, 490 | "source": [ 491 | "Pythonで使われる論理演算子を以下にまとめます。 \n", 492 | "\n", 493 | "||||\n", 494 | "|:-:|:-:|:--|\n", 495 | "|| and | 両者がTrueであればTrue |\n", 496 | "|| or | 片方がTrueであればTrue |\n", 497 | "|| not | Bool値を反転 |\n", 498 | "||||\n", 499 | "\n", 500 | "このような論理演算子を使うことで、複雑な条件をコードで表現することが可能になります。" 501 | ] 502 | } 503 | ] 504 | } -------------------------------------------------------------------------------- /section_2/03_exercise.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "provenance": [], 7 | "authorship_tag": "ABX9TyM25FXPV3reJ7BqnZH72Ozq", 8 | "include_colab_link": true 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": { 32 | "id": "8kW_qXJVTjic" 33 | }, 34 | "source": [ 35 | "# 演習\n", 36 | "生成テキストの乱雑さを決める、「temperature」の値を設定しましょう。" 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "source": [ 42 | "## ライブラリのインストール " 43 | ], 44 | "metadata": { 45 | "id": "vRJCuxALcgkb" 46 | } 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": null, 51 | "metadata": { 52 | "id": "Pbqipzj3nCy4" 53 | }, 54 | "outputs": [], 55 | "source": [ 56 | "!pip install streamlit==1.20.0 --quiet\n", 57 | "!pip install pyngrok --quiet\n", 58 | "!pip install openai" 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "source": [ 64 | "import streamlit as st\n", 65 | "from pyngrok import ngrok\n", 66 | "!pip install \"openai<1.0.0\"" 67 | ], 68 | "metadata": { 69 | "id": "OsHcq-kaDwIi" 70 | }, 71 | "execution_count": null, 72 | "outputs": [] 73 | }, 74 | { 75 | "cell_type": "markdown", 76 | "source": [ 77 | "## temperatureの設定\n", 78 | "サンプリングに使用する「temperature」を設定しましょう。 \n", 79 | "デフォルト値は1ですが、0~2の間で設定することができます。 \n", 80 | "値が大きいと出力がよりランダムになり、小さいと出力がより決定的になります。 \n", 81 | "以下のドキュメントを参考にtemperatureを\"0\"および\"1.5\"に設定し、その値がチャットボットの生成文章に与える影響を確認しましょう。 \n", 82 | "https://platform.openai.com/docs/api-reference/chat/create#chat/create-temperature " 83 | ], 84 | "metadata": { 85 | "id": "5fOtVgU5duPe" 86 | } 87 | }, 88 | { 89 | "cell_type": "code", 90 | "source": [ 91 | "%%writefile app.py\n", 92 | "# 以下を「app.py」に書き込み\n", 93 | "import streamlit as st\n", 94 | "import openai\n", 95 | "import secret_keys # 外部ファイルにAPI keyを保存\n", 96 | "\n", 97 | "openai.api_key = secret_keys.openai_api_key\n", 98 | "\n", 99 | "# st.session_stateを使いメッセージのやりとりを保存\n", 100 | "if \"messages\" not in st.session_state:\n", 101 | " st.session_state[\"messages\"] = [\n", 102 | " {\"role\": \"system\", \"content\": \"あなたは優秀なアシスタントAIです。\"}\n", 103 | " ]\n", 104 | "\n", 105 | "# チャットボットとやりとりする関数\n", 106 | "def communicate():\n", 107 | " messages = st.session_state[\"messages\"]\n", 108 | "\n", 109 | " user_message = {\"role\": \"user\", \"content\": st.session_state[\"user_input\"]}\n", 110 | " messages.append(user_message)\n", 111 | "\n", 112 | " response = openai.ChatCompletion.create(\n", 113 | " model=\"gpt-3.5-turbo\",\n", 114 | " messages=messages\n", 115 | " )\n", 116 | "\n", 117 | " bot_message = response[\"choices\"][0][\"message\"]\n", 118 | " messages.append(bot_message)\n", 119 | "\n", 120 | " st.session_state[\"user_input\"] = \"\" # 入力欄を消去\n", 121 | "\n", 122 | "\n", 123 | "# ユーザーインターフェイスの構築\n", 124 | "st.title(\"My AI Assistant\")\n", 125 | "st.write(\"ChatGPT APIを使ったチャットボットです。\")\n", 126 | "\n", 127 | "user_input = st.text_input(\"メッセージを入力してください。\", key=\"user_input\", on_change=communicate)\n", 128 | "\n", 129 | "if st.session_state[\"messages\"]:\n", 130 | " messages = st.session_state[\"messages\"]\n", 131 | "\n", 132 | " for message in reversed(messages[1:]): # 直近のメッセージを上に\n", 133 | " speaker = \"🙂\"\n", 134 | " if message[\"role\"]==\"assistant\":\n", 135 | " speaker=\"🤖\"\n", 136 | "\n", 137 | " st.write(speaker + \": \" + message[\"content\"])" 138 | ], 139 | "metadata": { 140 | "id": "Ntj_BU3bnJli" 141 | }, 142 | "execution_count": null, 143 | "outputs": [] 144 | }, 145 | { 146 | "cell_type": "markdown", 147 | "source": [ 148 | "## OpenAIのAPI keyを設定\n", 149 | "ChatGPT APIを使用するために必要な「API key」を設定します。 \n", 150 | "`%%writefile`のマジックコマンドを使って、API keyを設定するコードを「secret_keys.py」に書き込みます。 \n", 151 | "以下のコードの、 \n", 152 | "`openai_api_key = \"Your API key\"` \n", 153 | "における \n", 154 | "`Your API key`の箇所を、自分のAPI keyに置き換えます。 \n" 155 | ], 156 | "metadata": { 157 | "id": "pCvWZuvqQvyC" 158 | } 159 | }, 160 | { 161 | "cell_type": "code", 162 | "source": [ 163 | "%%writefile secret_keys.py\n", 164 | "\n", 165 | "openai_api_key = \"Your API key\"" 166 | ], 167 | "metadata": { 168 | "id": "4lkJr3dk89bD" 169 | }, 170 | "execution_count": null, 171 | "outputs": [] 172 | }, 173 | { 174 | "cell_type": "markdown", 175 | "source": [ 176 | "## ngrokのAuthtokenを設定\n", 177 | "ngrokで接続するために必要な「Authtoken」を設定します。 \n", 178 | "以下のコードの、 \n", 179 | "`!ngrok authtoken YourAuthtoken` \n", 180 | "における \n", 181 | "`YourAuthtoken`の箇所を、自分のAuthtokenに置き換えます。 \n" 182 | ], 183 | "metadata": { 184 | "id": "j03EsJaHh4KK" 185 | } 186 | }, 187 | { 188 | "cell_type": "code", 189 | "source": [ 190 | "!ngrok authtoken YourAuthtoken" 191 | ], 192 | "metadata": { 193 | "id": "mTfmORj2Dn7-" 194 | }, 195 | "execution_count": null, 196 | "outputs": [] 197 | }, 198 | { 199 | "cell_type": "markdown", 200 | "source": [ 201 | "## アプリの起動" 202 | ], 203 | "metadata": { 204 | "id": "CnobL05MkjB1" 205 | } 206 | }, 207 | { 208 | "cell_type": "code", 209 | "source": [ 210 | "!streamlit run app.py &>/dev/null& # 「&>/dev/null&」により、出力を非表示にしてバックグランドジョブとして実行" 211 | ], 212 | "metadata": { 213 | "id": "W0jXlMXWK0vi" 214 | }, 215 | "execution_count": null, 216 | "outputs": [] 217 | }, 218 | { 219 | "cell_type": "code", 220 | "source": [ 221 | "ngrok.kill() # プロセスの修了\n", 222 | "url = ngrok.connect(\"8501\").public_url # 接続" 223 | ], 224 | "metadata": { 225 | "id": "v23ymsdLK3x7" 226 | }, 227 | "execution_count": null, 228 | "outputs": [] 229 | }, 230 | { 231 | "cell_type": "markdown", 232 | "source": [ 233 | "## 動作の確認" 234 | ], 235 | "metadata": { 236 | "id": "8tVONgWNwzZm" 237 | } 238 | }, 239 | { 240 | "cell_type": "code", 241 | "source": [ 242 | "def convert_http_to_https(url):\n", 243 | " if url.startswith(\"http://\"):\n", 244 | " url = url.replace(\"http://\", \"https://\", 1)\n", 245 | " return url" 246 | ], 247 | "metadata": { 248 | "id": "gaEkk5Dsx0rR" 249 | }, 250 | "execution_count": null, 251 | "outputs": [] 252 | }, 253 | { 254 | "cell_type": "code", 255 | "source": [ 256 | "print(convert_http_to_https(url))" 257 | ], 258 | "metadata": { 259 | "id": "MIY7ositLAXC" 260 | }, 261 | "execution_count": null, 262 | "outputs": [] 263 | }, 264 | { 265 | "cell_type": "markdown", 266 | "source": [ 267 | "temperatureの値が、チャットボットが生成する文章にどのような影響を与えるのか確認しましょう。" 268 | ], 269 | "metadata": { 270 | "id": "B8hdFAd6VIaz" 271 | } 272 | }, 273 | { 274 | "cell_type": "markdown", 275 | "source": [ 276 | "## 解答例\n", 277 | "以下は解答例です。" 278 | ], 279 | "metadata": { 280 | "id": "i4e4pKI9hpI5" 281 | } 282 | }, 283 | { 284 | "cell_type": "code", 285 | "source": [ 286 | "%%writefile app.py\n", 287 | "# 以下を「app.py」に書き込み\n", 288 | "import streamlit as st\n", 289 | "import openai\n", 290 | "import secret_keys # 外部ファイルにAPI keyを保存\n", 291 | "\n", 292 | "openai.api_key = secret_keys.openai_api_key\n", 293 | "\n", 294 | "# st.session_stateを使いメッセージのやりとりを保存\n", 295 | "if \"messages\" not in st.session_state:\n", 296 | " st.session_state[\"messages\"] = [\n", 297 | " {\"role\": \"system\", \"content\": \"あなたは優秀なアシスタントAIです。\"}\n", 298 | " ]\n", 299 | "\n", 300 | "# チャットボットとやりとりする関数\n", 301 | "def communicate():\n", 302 | " messages = st.session_state[\"messages\"]\n", 303 | "\n", 304 | " user_message = {\"role\": \"user\", \"content\": st.session_state[\"user_input\"]}\n", 305 | " messages.append(user_message)\n", 306 | "\n", 307 | " response = openai.ChatCompletion.create(\n", 308 | " model=\"gpt-3.5-turbo\",\n", 309 | " messages=messages,\n", 310 | " temperature=0.0\n", 311 | " )\n", 312 | "\n", 313 | " bot_message = response[\"choices\"][0][\"message\"]\n", 314 | " messages.append(bot_message)\n", 315 | "\n", 316 | " st.session_state[\"user_input\"] = \"\" # 入力欄を消去\n", 317 | "\n", 318 | "\n", 319 | "# ユーザーインターフェイスの構築\n", 320 | "st.title(\"My AI Assistant\")\n", 321 | "st.write(\"ChatGPT APIを使ったチャットボットです。\")\n", 322 | "\n", 323 | "user_input = st.text_input(\"メッセージを入力してください。\", key=\"user_input\", on_change=communicate)\n", 324 | "\n", 325 | "if st.session_state[\"messages\"]:\n", 326 | " messages = st.session_state[\"messages\"]\n", 327 | "\n", 328 | " for message in reversed(messages[1:]): # 直近のメッセージを上に\n", 329 | " speaker = \"🙂\"\n", 330 | " if message[\"role\"]==\"assistant\":\n", 331 | " speaker=\"🤖\"\n", 332 | "\n", 333 | " st.write(speaker + \": \" + message[\"content\"])" 334 | ], 335 | "metadata": { 336 | "id": "5C52O8oUhtBv" 337 | }, 338 | "execution_count": null, 339 | "outputs": [] 340 | }, 341 | { 342 | "cell_type": "code", 343 | "source": [ 344 | "%%writefile app.py\n", 345 | "# 以下を「app.py」に書き込み\n", 346 | "import streamlit as st\n", 347 | "import openai\n", 348 | "import secret_keys # 外部ファイルにAPI keyを保存\n", 349 | "\n", 350 | "openai.api_key = secret_keys.openai_api_key\n", 351 | "\n", 352 | "# st.session_stateを使いメッセージのやりとりを保存\n", 353 | "if \"messages\" not in st.session_state:\n", 354 | " st.session_state[\"messages\"] = [\n", 355 | " {\"role\": \"system\", \"content\": \"あなたは優秀なアシスタントAIです。\"}\n", 356 | " ]\n", 357 | "\n", 358 | "# チャットボットとやりとりする関数\n", 359 | "def communicate():\n", 360 | " messages = st.session_state[\"messages\"]\n", 361 | "\n", 362 | " user_message = {\"role\": \"user\", \"content\": st.session_state[\"user_input\"]}\n", 363 | " messages.append(user_message)\n", 364 | "\n", 365 | " response = openai.ChatCompletion.create(\n", 366 | " model=\"gpt-3.5-turbo\",\n", 367 | " messages=messages,\n", 368 | " temperature=1.5\n", 369 | " )\n", 370 | "\n", 371 | " bot_message = response[\"choices\"][0][\"message\"]\n", 372 | " messages.append(bot_message)\n", 373 | "\n", 374 | " st.session_state[\"user_input\"] = \"\" # 入力欄を消去\n", 375 | "\n", 376 | "\n", 377 | "# ユーザーインターフェイスの構築\n", 378 | "st.title(\"My AI Assistant\")\n", 379 | "st.write(\"ChatGPT APIを使ったチャットボットです。\")\n", 380 | "\n", 381 | "user_input = st.text_input(\"メッセージを入力してください。\", key=\"user_input\", on_change=communicate)\n", 382 | "\n", 383 | "if st.session_state[\"messages\"]:\n", 384 | " messages = st.session_state[\"messages\"]\n", 385 | "\n", 386 | " for message in reversed(messages[1:]): # 直近のメッセージを上に\n", 387 | " speaker = \"🙂\"\n", 388 | " if message[\"role\"]==\"assistant\":\n", 389 | " speaker=\"🤖\"\n", 390 | "\n", 391 | " st.write(speaker + \": \" + message[\"content\"])" 392 | ], 393 | "metadata": { 394 | "id": "BIsv0bMJhtrW" 395 | }, 396 | "execution_count": null, 397 | "outputs": [] 398 | } 399 | ] 400 | } -------------------------------------------------------------------------------- /python_basic/python_basic_3.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "python_basic_3.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [], 9 | "toc_visible": true, 10 | "authorship_tag": "ABX9TyOQ6B23Ohrb8vjbDOEezdIb", 11 | "include_colab_link": true 12 | }, 13 | "kernelspec": { 14 | "name": "python3", 15 | "display_name": "Python 3" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "markdown", 21 | "metadata": { 22 | "id": "view-in-github", 23 | "colab_type": "text" 24 | }, 25 | "source": [ 26 | "\"Open" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": { 32 | "id": "ewg_pUrO-m3m", 33 | "colab_type": "text" 34 | }, 35 | "source": [ 36 | "# Pythonの基礎3\n", 37 | "関数とクラス、ファイルの保存について解説します。" 38 | ] 39 | }, 40 | { 41 | "cell_type": "markdown", 42 | "metadata": { 43 | "id": "BxlxFRAm-m3o", 44 | "colab_type": "text" 45 | }, 46 | "source": [ 47 | "## ●関数\n", 48 | "**関数**を用いることで、処理を一括りにして何度も呼び出すことができます。 \n", 49 | "以下はシンプルな関数の例です。" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "metadata": { 55 | "id": "xftbx6T4-m3p", 56 | "colab_type": "code", 57 | "colab": {} 58 | }, 59 | "source": [ 60 | "def say_hello(): # defの後に関数名を記述\n", 61 | " print(\"Hello world!\") # 行頭にインデントを挿入\n", 62 | "\n", 63 | "say_hello() # 関数の呼び出し" 64 | ], 65 | "execution_count": null, 66 | "outputs": [] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "metadata": { 71 | "id": "wrO8sv-WZHuo", 72 | "colab_type": "code", 73 | "colab": {} 74 | }, 75 | "source": [ 76 | "# 練習用\n" 77 | ], 78 | "execution_count": null, 79 | "outputs": [] 80 | }, 81 | { 82 | "cell_type": "markdown", 83 | "metadata": { 84 | "id": "L8xd1JMv-m3s", 85 | "colab_type": "text" 86 | }, 87 | "source": [ 88 | "一度関数を定義しておけば、あとから何度でも呼び出すことができます。" 89 | ] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "metadata": { 94 | "id": "-Tnd7UjE-m3t", 95 | "colab_type": "code", 96 | "colab": {} 97 | }, 98 | "source": [ 99 | "def say_gm():\n", 100 | " print(\"Good morning!\")\n", 101 | "\n", 102 | "say_gm()\n", 103 | "say_gm()\n", 104 | "say_gm()" 105 | ], 106 | "execution_count": null, 107 | "outputs": [] 108 | }, 109 | { 110 | "cell_type": "code", 111 | "metadata": { 112 | "id": "cAZfsS-vZKeC", 113 | "colab_type": "code", 114 | "colab": {} 115 | }, 116 | "source": [ 117 | "# 練習用\n" 118 | ], 119 | "execution_count": null, 120 | "outputs": [] 121 | }, 122 | { 123 | "cell_type": "markdown", 124 | "metadata": { 125 | "id": "MWyBm7xfaQ1T", 126 | "colab_type": "text" 127 | }, 128 | "source": [ 129 | "## ●引数\n", 130 | "関数は、外部からの値を**引数**として受け取ることができます。 \n", 131 | "以下は、引数を伴うシンプルな関数です。" 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "metadata": { 137 | "id": "utV0XhMAafbt", 138 | "colab_type": "code", 139 | "colab": {} 140 | }, 141 | "source": [ 142 | "def say_number(a): # aが引数\n", 143 | " print(a)\n", 144 | "\n", 145 | "say_number(123)" 146 | ], 147 | "execution_count": null, 148 | "outputs": [] 149 | }, 150 | { 151 | "cell_type": "code", 152 | "metadata": { 153 | "id": "RyOkPsNFaR6o", 154 | "colab_type": "code", 155 | "colab": {} 156 | }, 157 | "source": [ 158 | "# 練習用\n" 159 | ], 160 | "execution_count": null, 161 | "outputs": [] 162 | }, 163 | { 164 | "cell_type": "markdown", 165 | "metadata": { 166 | "id": "Z_01jL1ZgIXO", 167 | "colab_type": "text" 168 | }, 169 | "source": [ 170 | "関数を呼び出す際に、( ) 内に値を渡すとそれを関数が受け取ります。 \n", 171 | " \n", 172 | "引数が複数の場合は、`,`(カンマ)で区切ります。" 173 | ] 174 | }, 175 | { 176 | "cell_type": "code", 177 | "metadata": { 178 | "id": "zPN48d8gfq0Z", 179 | "colab_type": "code", 180 | "colab": {} 181 | }, 182 | "source": [ 183 | "def add(a, b, c): # 引数は3つ\n", 184 | " d = a + b + c\n", 185 | " print(d)\n", 186 | "\n", 187 | "add(3, 4, 5)" 188 | ], 189 | "execution_count": null, 190 | "outputs": [] 191 | }, 192 | { 193 | "cell_type": "code", 194 | "metadata": { 195 | "id": "eq9RMuApiHjv", 196 | "colab_type": "code", 197 | "colab": {} 198 | }, 199 | "source": [ 200 | "# 練習用\n" 201 | ], 202 | "execution_count": null, 203 | "outputs": [] 204 | }, 205 | { 206 | "cell_type": "markdown", 207 | "metadata": { 208 | "id": "rmu22GA5hOHQ", 209 | "colab_type": "text" 210 | }, 211 | "source": [ 212 | "## ●返り値\n", 213 | "**返り値**を用いると、関数から外部に値を渡すことができます。 \n", 214 | " \n", 215 | "以下は、返り値のシンプルな例です。 " 216 | ] 217 | }, 218 | { 219 | "cell_type": "code", 220 | "metadata": { 221 | "id": "PuaerkxqhhnY", 222 | "colab_type": "code", 223 | "colab": {} 224 | }, 225 | "source": [ 226 | "def get_number():\n", 227 | " a = 123\n", 228 | " return a # 返り値\n", 229 | "\n", 230 | "b = get_number()\n", 231 | "print(b)" 232 | ], 233 | "execution_count": null, 234 | "outputs": [] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "metadata": { 239 | "id": "4rKMXPTFmH6S", 240 | "colab_type": "code", 241 | "colab": {} 242 | }, 243 | "source": [ 244 | "# 練習用\n" 245 | ], 246 | "execution_count": null, 247 | "outputs": [] 248 | }, 249 | { 250 | "cell_type": "markdown", 251 | "metadata": { 252 | "id": "FwOzg6qyiBSB", 253 | "colab_type": "text" 254 | }, 255 | "source": [ 256 | "関数の内部にreturnを記述すると、その直後の値を関数の外部に渡します。 \n", 257 | " \n", 258 | "以下は、引数と返り値を組み合わせた例です。" 259 | ] 260 | }, 261 | { 262 | "cell_type": "code", 263 | "metadata": { 264 | "id": "27VGeUNmifwo", 265 | "colab_type": "code", 266 | "colab": {} 267 | }, 268 | "source": [ 269 | "def add(a, b):\n", 270 | " c = a + b\n", 271 | " return c\n", 272 | "\n", 273 | "result1 = add(3, 4)\n", 274 | "print(result1)\n", 275 | "\n", 276 | "result2 = add(7, 8)\n", 277 | "print(result2)" 278 | ], 279 | "execution_count": null, 280 | "outputs": [] 281 | }, 282 | { 283 | "cell_type": "code", 284 | "metadata": { 285 | "id": "dDfU9UZDmwxg", 286 | "colab_type": "code", 287 | "colab": {} 288 | }, 289 | "source": [ 290 | "# 練習用\n" 291 | ], 292 | "execution_count": null, 293 | "outputs": [] 294 | }, 295 | { 296 | "cell_type": "markdown", 297 | "metadata": { 298 | "id": "ERD55Tt-mrqR", 299 | "colab_type": "text" 300 | }, 301 | "source": [ 302 | "以上のような関数を使うことで、コードの再利用が可能になります。" 303 | ] 304 | }, 305 | { 306 | "cell_type": "markdown", 307 | "metadata": { 308 | "id": "DtAbWNWw-m3y", 309 | "colab_type": "text" 310 | }, 311 | "source": [ 312 | "## ●変数のスコープ\n", 313 | "関数内で定義された変数がローカル変数、関数外で定義された変数がグローバル変数です。 " 314 | ] 315 | }, 316 | { 317 | "cell_type": "code", 318 | "metadata": { 319 | "id": "3pD2XU7t-m3y", 320 | "colab_type": "code", 321 | "colab": {} 322 | }, 323 | "source": [ 324 | "glob_1 = 123 # グローバル変数\n", 325 | "\n", 326 | "def show_number():\n", 327 | " loc_1 = 456 # ローカル変数\n", 328 | " print(glob_1, loc_1)\n", 329 | " \n", 330 | "show_number()" 331 | ], 332 | "execution_count": null, 333 | "outputs": [] 334 | }, 335 | { 336 | "cell_type": "code", 337 | "metadata": { 338 | "id": "39Zt6NeVtHiK", 339 | "colab_type": "code", 340 | "colab": {} 341 | }, 342 | "source": [ 343 | "# 練習用\n" 344 | ], 345 | "execution_count": null, 346 | "outputs": [] 347 | }, 348 | { 349 | "cell_type": "markdown", 350 | "metadata": { 351 | "id": "j4BL7N5d-m30", 352 | "colab_type": "text" 353 | }, 354 | "source": [ 355 | "ローカル変数は同じ関数内からのみアクセスできますが、グローバル変数はどこからでもアクセスできます。 \n", 356 | "\n", 357 | "以下のコードでは、関数の外でローカル変数bにアクセスしようとしているため、エラーが発生します。" 358 | ] 359 | }, 360 | { 361 | "cell_type": "code", 362 | "metadata": { 363 | "id": "7KOGz1gM-m31", 364 | "colab_type": "code", 365 | "colab": {} 366 | }, 367 | "source": [ 368 | "glob_2= 123 # グローバル変数\n", 369 | "\n", 370 | "def setNum():\n", 371 | " loc_2 = 456 # ローカル変数\n", 372 | "\n", 373 | "setNum()\n", 374 | "print(glob_2, loc_2)" 375 | ], 376 | "execution_count": null, 377 | "outputs": [] 378 | }, 379 | { 380 | "cell_type": "code", 381 | "metadata": { 382 | "id": "f5wYs01szjlc", 383 | "colab_type": "code", 384 | "colab": {} 385 | }, 386 | "source": [ 387 | "# 練習用\n" 388 | ], 389 | "execution_count": null, 390 | "outputs": [] 391 | }, 392 | { 393 | "cell_type": "markdown", 394 | "metadata": { 395 | "id": "zG9VcO-6-m35", 396 | "colab_type": "text" 397 | }, 398 | "source": [ 399 | "## ●クラス\n", 400 | "**クラス**を用いると、複数の「関数のようなもの」をまとめることができます。 \n", 401 | "この「関数のようなもの」は、メソッドと呼ばれます。\n", 402 | "\n", 403 | "Pythonでクラスを定義するためには、`class`の表記を用います。 \n", 404 | "メソッドはクラス内で定義するのですが、関数と同様にdefの直後にメソッド名を記述します。 \n", 405 | "\n", 406 | "以下の例では、`Calc`クラス内に`add`メソッドが記述されています。 \n", 407 | "クラスから**インスタンス**を生成し、このインスタンスからメソッドを呼び出すことができます。" 408 | ] 409 | }, 410 | { 411 | "cell_type": "code", 412 | "metadata": { 413 | "id": "h9YW6LdV-m36", 414 | "colab_type": "code", 415 | "colab": {} 416 | }, 417 | "source": [ 418 | "class Calc: # Calcクラス\n", 419 | " def add(self, a, b): # addメソッド\n", 420 | " print(a + b)\n", 421 | "\n", 422 | " def multiply(self, a, b): # multiplyメソッド\n", 423 | " print(a * b)\n", 424 | "\n", 425 | "cl = Calc() # インスタンスclを生成\n", 426 | "cl.add(2, 3)\n", 427 | "cl.multiply(4, 5)" 428 | ], 429 | "execution_count": null, 430 | "outputs": [] 431 | }, 432 | { 433 | "cell_type": "code", 434 | "metadata": { 435 | "id": "s-haa7_RkFGS", 436 | "colab_type": "code", 437 | "colab": {} 438 | }, 439 | "source": [ 440 | "# 練習用\n" 441 | ], 442 | "execution_count": null, 443 | "outputs": [] 444 | }, 445 | { 446 | "cell_type": "markdown", 447 | "metadata": { 448 | "id": "f83MEU1X-m38", 449 | "colab_type": "text" 450 | }, 451 | "source": [ 452 | "関数とは異なり、メソッドの最初の引数はselfと書く必要があります。 \n", 453 | " \n", 454 | "このselfを用いて、インスタンスは値を保持することができます。 \n", 455 | "インスタンス内で値を保持する変数を、**インスタンス変数**といいます。 \n", 456 | "以下の例では、`set_number`メソッドの中でインスタンス変数を設定しています。" 457 | ] 458 | }, 459 | { 460 | "cell_type": "code", 461 | "metadata": { 462 | "id": "9le-T7MT-m39", 463 | "colab_type": "code", 464 | "colab": {} 465 | }, 466 | "source": [ 467 | "class Box:\n", 468 | " def set_number(self, n1, n2):\n", 469 | " self.num1 = n1 # num1がインスタンス変数\n", 470 | " self.num2 = n2\n", 471 | " \n", 472 | "bx = Box()\n", 473 | "bx.set_number(123, 456)\n", 474 | "\n", 475 | "print(bx.num1) # インスタンス変数の値を表示\n", 476 | "print(bx.num2)\n", 477 | "\n", 478 | "bx.num1 = 999 # 値を変更\n", 479 | "print(bx.num1)" 480 | ], 481 | "execution_count": null, 482 | "outputs": [] 483 | }, 484 | { 485 | "cell_type": "code", 486 | "metadata": { 487 | "id": "jHLWfjHLnefH", 488 | "colab_type": "code", 489 | "colab": {} 490 | }, 491 | "source": [ 492 | "# 練習用\n" 493 | ], 494 | "execution_count": null, 495 | "outputs": [] 496 | }, 497 | { 498 | "cell_type": "markdown", 499 | "metadata": { 500 | "id": "ZHSv1Cbd-m3-", 501 | "colab_type": "text" 502 | }, 503 | "source": [ 504 | "インスタンス変数は、インスタンスごとに異なる値を設定することができます。 \n", 505 | "以下の例では、`Dog`クラスから`dog1`、`dog2`、2つのインスタンスを生成し、インスタンス変数にそれぞれ異なる値を設定しています。 \n", 506 | "その上で、これらのインスタンスをリストに格納し、ループ内で値を表示します。" 507 | ] 508 | }, 509 | { 510 | "cell_type": "code", 511 | "metadata": { 512 | "id": "b-oYXKYp-m3_", 513 | "colab_type": "code", 514 | "colab": {} 515 | }, 516 | "source": [ 517 | "class Dog:\n", 518 | " def set_dog(self, n, a):\n", 519 | " self.name = n\n", 520 | " self.age = a\n", 521 | " \n", 522 | "dog1 = Dog()\n", 523 | "dog1.set_dog(\"Pochi\", 5)\n", 524 | "\n", 525 | "dog2 = Dog()\n", 526 | "dog2.set_dog(\"Hachi\", 12)\n", 527 | "\n", 528 | "dogs = [dog1, dog2] # リストに格納\n", 529 | "for d in dogs:\n", 530 | " print(d.name, d.age)" 531 | ], 532 | "execution_count": null, 533 | "outputs": [] 534 | }, 535 | { 536 | "cell_type": "code", 537 | "metadata": { 538 | "id": "oLVA4jq1tCM2", 539 | "colab_type": "code", 540 | "colab": {} 541 | }, 542 | "source": [ 543 | "# 練習用\n" 544 | ], 545 | "execution_count": null, 546 | "outputs": [] 547 | }, 548 | { 549 | "cell_type": "markdown", 550 | "metadata": { 551 | "id": "VWXp1IvK7e45", 552 | "colab_type": "text" 553 | }, 554 | "source": [ 555 | "クラスを使うことで、複雑な構造を持つ処理を簡潔に記述することが可能になります。" 556 | ] 557 | }, 558 | { 559 | "cell_type": "markdown", 560 | "metadata": { 561 | "id": "iI06xAN-W94U", 562 | "colab_type": "text" 563 | }, 564 | "source": [ 565 | "## ●ファイルの保存と読み込み\n", 566 | "with構文を用いて、ファイルの読み込みや保存を簡潔に記述することができます。 \n", 567 | "以下は、文字列をファイルに保存する例です。 \n", 568 | "保存されたファイルは、サイドバーで確認することができます。" 569 | ] 570 | }, 571 | { 572 | "cell_type": "code", 573 | "metadata": { 574 | "id": "vC8DP5nV93TP", 575 | "colab_type": "code", 576 | "colab": {} 577 | }, 578 | "source": [ 579 | "greetings = \"Good morning! Good night!\"\n", 580 | "\n", 581 | "with open(\"greetings.txt\", \"w\") as f:\n", 582 | " f.write(greetings) # ファイルに保存" 583 | ], 584 | "execution_count": null, 585 | "outputs": [] 586 | }, 587 | { 588 | "cell_type": "code", 589 | "metadata": { 590 | "id": "FwhBtEkI_OBl", 591 | "colab_type": "code", 592 | "colab": {} 593 | }, 594 | "source": [ 595 | "# 練習用\n" 596 | ], 597 | "execution_count": null, 598 | "outputs": [] 599 | }, 600 | { 601 | "cell_type": "markdown", 602 | "metadata": { 603 | "id": "Tjp3EXIBXsXc", 604 | "colab_type": "text" 605 | }, 606 | "source": [ 607 | "以下は、上記で保存されたファイルを読み込んで表示する例です。" 608 | ] 609 | }, 610 | { 611 | "cell_type": "code", 612 | "metadata": { 613 | "id": "APsIqyhbVXZb", 614 | "colab_type": "code", 615 | "colab": {} 616 | }, 617 | "source": [ 618 | "with open(\"greetings.txt\", \"r\") as f:\n", 619 | " print(f.read()) # ファイルの読み込み" 620 | ], 621 | "execution_count": null, 622 | "outputs": [] 623 | }, 624 | { 625 | "cell_type": "code", 626 | "metadata": { 627 | "id": "EEvkDyzO_SXP", 628 | "colab_type": "code", 629 | "colab": {} 630 | }, 631 | "source": [ 632 | "# 練習用\n" 633 | ], 634 | "execution_count": null, 635 | "outputs": [] 636 | } 637 | ] 638 | } -------------------------------------------------------------------------------- /python_basic/python_basic_2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "python_basic_2.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [], 9 | "authorship_tag": "ABX9TyPdjxknDZNDHdnEKg4+DwZF", 10 | "include_colab_link": true 11 | }, 12 | "kernelspec": { 13 | "name": "python3", 14 | "display_name": "Python 3" 15 | } 16 | }, 17 | "cells": [ 18 | { 19 | "cell_type": "markdown", 20 | "metadata": { 21 | "id": "view-in-github", 22 | "colab_type": "text" 23 | }, 24 | "source": [ 25 | "\"Open" 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "metadata": { 31 | "id": "QK1qtAbx7DCH", 32 | "colab_type": "text" 33 | }, 34 | "source": [ 35 | "# Pythonの基礎2\n", 36 | "リストや分岐、ループなどについて学んでいきます。" 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "metadata": { 42 | "id": "BBT3UlBN7DCX", 43 | "colab_type": "text" 44 | }, 45 | "source": [ 46 | "## ●リスト\n", 47 | "**リスト**は、複数の値をまとめて扱う場合に使用します。 \n", 48 | "リストは全体を`[]`で囲み、各要素は`,`で区切ります。 " 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "metadata": { 54 | "id": "Qi_hyR077DCY", 55 | "colab_type": "code", 56 | "colab": {} 57 | }, 58 | "source": [ 59 | "a = [2011, 2012, 2013, 2014, 2015] # リストの作成\n", 60 | "\n", 61 | "print(a[0]) # 先頭から0番目の要素\n", 62 | "print(a[1]) # 先頭から1番目の要素\n", 63 | "print(a[2]) # 先頭から2番目の要素" 64 | ], 65 | "execution_count": null, 66 | "outputs": [] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "metadata": { 71 | "id": "8uCyuQHR_4M0", 72 | "colab_type": "code", 73 | "colab": {} 74 | }, 75 | "source": [ 76 | "# 練習用\n" 77 | ], 78 | "execution_count": null, 79 | "outputs": [] 80 | }, 81 | { 82 | "cell_type": "markdown", 83 | "metadata": { 84 | "id": "FsL7GD6p_xL7", 85 | "colab_type": "text" 86 | }, 87 | "source": [ 88 | "リストでは、変数名の直後に`[ ]`を記述することで各要素を取り出すことができます。 \n", 89 | "Pythonのリストはどのような値でも格納することができます。" 90 | ] 91 | }, 92 | { 93 | "cell_type": "code", 94 | "metadata": { 95 | "id": "eQyRokhrCutm", 96 | "colab_type": "code", 97 | "colab": {} 98 | }, 99 | "source": [ 100 | "b = 2016\n", 101 | "c = [b, 2017, 20.1, \"Hello\", \"Hi\"]\n", 102 | "print(c[1:4]) # 先頭から1番目以上、4番目未満の範囲" 103 | ], 104 | "execution_count": null, 105 | "outputs": [] 106 | }, 107 | { 108 | "cell_type": "code", 109 | "metadata": { 110 | "id": "GCqOwdJPFAb8", 111 | "colab_type": "code", 112 | "colab": {} 113 | }, 114 | "source": [ 115 | "# 練習用\n" 116 | ], 117 | "execution_count": null, 118 | "outputs": [] 119 | }, 120 | { 121 | "cell_type": "markdown", 122 | "metadata": { 123 | "id": "xTCNxy9IESfE", 124 | "colab_type": "text" 125 | }, 126 | "source": [ 127 | "リストの中にリストを格納することもできます。" 128 | ] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "metadata": { 133 | "id": "T1cpxD79GBcu", 134 | "colab_type": "code", 135 | "colab": {} 136 | }, 137 | "source": [ 138 | "d =[[2012, 2013, 2014], [2015, 2016, 2017]]\n", 139 | "print(d[0]) # 先頭から0番目の要素" 140 | ], 141 | "execution_count": null, 142 | "outputs": [] 143 | }, 144 | { 145 | "cell_type": "code", 146 | "metadata": { 147 | "id": "ScUcc8ycGXrW", 148 | "colab_type": "code", 149 | "colab": {} 150 | }, 151 | "source": [ 152 | "# 練習用\n" 153 | ], 154 | "execution_count": null, 155 | "outputs": [] 156 | }, 157 | { 158 | "cell_type": "markdown", 159 | "metadata": { 160 | "id": "eF1dmMxzQK0-", 161 | "colab_type": "text" 162 | }, 163 | "source": [ 164 | "リストは、作成後に要素を変更することができます。 \n", 165 | "また、appendにより要素を追加することができます。" 166 | ] 167 | }, 168 | { 169 | "cell_type": "code", 170 | "metadata": { 171 | "id": "QqTepYh6QuMa", 172 | "colab_type": "code", 173 | "colab": {} 174 | }, 175 | "source": [ 176 | "e = [\"Py\", 543.21, 79, \"thon\", [2018, 2019, 2020]]\n", 177 | "print(e)\n", 178 | "\n", 179 | "# 要素の変更\n", 180 | "e[2] = 99\n", 181 | "print(e)\n", 182 | "\n", 183 | "# 要素の追加\n", 184 | "e.append(2021)\n", 185 | "print(e)" 186 | ], 187 | "execution_count": null, 188 | "outputs": [] 189 | }, 190 | { 191 | "cell_type": "code", 192 | "metadata": { 193 | "id": "XqeoFPxMqNwb", 194 | "colab_type": "code", 195 | "colab": {} 196 | }, 197 | "source": [ 198 | "# 練習用\n" 199 | ], 200 | "execution_count": null, 201 | "outputs": [] 202 | }, 203 | { 204 | "cell_type": "markdown", 205 | "metadata": { 206 | "id": "GeQVpswkLLvU", 207 | "colab_type": "text" 208 | }, 209 | "source": [ 210 | "リストにより、多くの値を効率よく扱うことが可能になります。" 211 | ] 212 | }, 213 | { 214 | "cell_type": "markdown", 215 | "metadata": { 216 | "id": "33Tx-KRc7DCZ", 217 | "colab_type": "text" 218 | }, 219 | "source": [ 220 | "## ●タプル\n", 221 | "**タプル**はリストと同じく複数の値をまとめて扱いたいときに利用しますが、要素の追加や削除、入れ替えなどはできません。 \n", 222 | "タプルは全体を`()`で囲み、各要素は`,`で区切ります。 \n", 223 | "要素を変更する予定が無い場合は、リストよりもタプルを使用する方がベターです。 \n", 224 | "以下では、リストとタプルを比較しています。 " 225 | ] 226 | }, 227 | { 228 | "cell_type": "code", 229 | "metadata": { 230 | "id": "uMW9UFiP7DCa", 231 | "colab_type": "code", 232 | "colab": {} 233 | }, 234 | "source": [ 235 | "a = [2012, 2013, 2014] # リスト\n", 236 | "b = (2012, 2013, 2014) # タプル\n", 237 | "\n", 238 | "print(a)\n", 239 | "print(b)\n", 240 | "\n", 241 | "print(a[1])\n", 242 | "print(b[1])\n", 243 | "\n", 244 | "a[1] = 2016\n", 245 | "print(a)\n", 246 | "\n", 247 | "# b[1] = 2016 # エラーが発生\n", 248 | "# print(b)\n", 249 | "\n", 250 | "a.append(2015)\n", 251 | "print(a)\n", 252 | "\n", 253 | "# b.append(2015) # エラーが発生\n", 254 | "# print(b)" 255 | ], 256 | "execution_count": null, 257 | "outputs": [] 258 | }, 259 | { 260 | "cell_type": "code", 261 | "metadata": { 262 | "id": "htyvMHuSqsEf", 263 | "colab_type": "code", 264 | "colab": {} 265 | }, 266 | "source": [ 267 | "# 練習用\n" 268 | ], 269 | "execution_count": null, 270 | "outputs": [] 271 | }, 272 | { 273 | "cell_type": "markdown", 274 | "metadata": { 275 | "id": "KrLdlqyL7DCc", 276 | "colab_type": "text" 277 | }, 278 | "source": [ 279 | "タプルの要素を変更したり、タプルに要素を追加しようとするとエラーが発生します。" 280 | ] 281 | }, 282 | { 283 | "cell_type": "markdown", 284 | "metadata": { 285 | "id": "NkynT8abLLvF", 286 | "colab_type": "text" 287 | }, 288 | "source": [ 289 | "## ●辞書\n", 290 | "**辞書**は、キーと値の組合せでデータを格納します。  \n", 291 | "以下は、Pythonの辞書を扱う例です。 \n", 292 | "文字列をキーとして辞書を作成し、値の取得や入れ替え、要素の追加を行なっています。" 293 | ] 294 | }, 295 | { 296 | "cell_type": "code", 297 | "metadata": { 298 | "id": "_Mrxui8mLQ5P", 299 | "colab_type": "code", 300 | "colab": {} 301 | }, 302 | "source": [ 303 | "a = {\"Taro\":1985, \"Hanako\":1986} # 辞書の作成\n", 304 | "print(a[\"Taro\"]) # \"Taro\"のキーを持つ値を取得\n", 305 | "\n", 306 | "a[\"Hanako\"] = 1987 # 要素の入れ替え\n", 307 | "print(a)\n", 308 | "\n", 309 | "a[\"Jiro\"] = 1989 # 要素の追加\n", 310 | "print(a)" 311 | ], 312 | "execution_count": null, 313 | "outputs": [] 314 | }, 315 | { 316 | "cell_type": "code", 317 | "metadata": { 318 | "id": "srGuibNYsDrJ", 319 | "colab_type": "code", 320 | "colab": {} 321 | }, 322 | "source": [ 323 | "# 練習用\n" 324 | ], 325 | "execution_count": null, 326 | "outputs": [] 327 | }, 328 | { 329 | "cell_type": "markdown", 330 | "metadata": { 331 | "id": "uEXLmC08sxOD", 332 | "colab_type": "text" 333 | }, 334 | "source": [ 335 | "辞書は、キーを使って多数の値を管理したい際に使用します。" 336 | ] 337 | }, 338 | { 339 | "cell_type": "markdown", 340 | "metadata": { 341 | "id": "vOkphdpi7DCh", 342 | "colab_type": "text" 343 | }, 344 | "source": [ 345 | "## ●if文 \n", 346 | "**if**文により条件分岐を行うことができます。 \n", 347 | "ifの右側が`True`であればその次の処理が、`False`であればelseの次の処理が実行されます。 \n", 348 | "以下のコードは、`a`の値が5であれば足し算を行い、5でなければ掛け算を行います。 \n" 349 | ] 350 | }, 351 | { 352 | "cell_type": "code", 353 | "metadata": { 354 | "id": "tubP_tFRzohW", 355 | "colab_type": "code", 356 | "colab": {} 357 | }, 358 | "source": [ 359 | "a = 5\n", 360 | "\n", 361 | "if a == 5: # aと5は等しいのでifの右はTrue\n", 362 | " print(\"3+4=\")\n", 363 | " print(3+4)\n", 364 | "else:\n", 365 | " print(\"3×4=\")\n", 366 | " print(3*4)" 367 | ], 368 | "execution_count": null, 369 | "outputs": [] 370 | }, 371 | { 372 | "cell_type": "code", 373 | "metadata": { 374 | "id": "DEzLifnOsXl9", 375 | "colab_type": "code", 376 | "colab": {} 377 | }, 378 | "source": [ 379 | "# 練習用\n" 380 | ], 381 | "execution_count": null, 382 | "outputs": [] 383 | }, 384 | { 385 | "cell_type": "markdown", 386 | "metadata": { 387 | "id": "rr_1KJ0r2Os5", 388 | "colab_type": "text" 389 | }, 390 | "source": [ 391 | "分岐後の処理の行頭には、複数のスペースからなる「インデント」を挿入します。 \n", 392 | "インデントは通常半角スペース4つを使用します。 \n", 393 | " \n", 394 | "3つ以上の分岐を行う際には、`elif`を使用します。 \n" 395 | ] 396 | }, 397 | { 398 | "cell_type": "code", 399 | "metadata": { 400 | "id": "fod0Q-CY1k-8", 401 | "colab_type": "code", 402 | "colab": {} 403 | }, 404 | "source": [ 405 | "b = 4\n", 406 | "\n", 407 | "if b < 3:\n", 408 | " print(\"Hello!\")\n", 409 | "elif b < 5: # ifの右側がFalseの場合\n", 410 | " print(\"Hi!\")\n", 411 | "else: # if、elifの右側がFalseの場合\n", 412 | " print(\"Yeah!\")" 413 | ], 414 | "execution_count": null, 415 | "outputs": [] 416 | }, 417 | { 418 | "cell_type": "code", 419 | "metadata": { 420 | "id": "NzpzGvXBsnoC", 421 | "colab_type": "code", 422 | "colab": {} 423 | }, 424 | "source": [ 425 | "# 練習用\n" 426 | ], 427 | "execution_count": null, 428 | "outputs": [] 429 | }, 430 | { 431 | "cell_type": "markdown", 432 | "metadata": { 433 | "id": "6bf9rfImsqRl", 434 | "colab_type": "text" 435 | }, 436 | "source": [ 437 | "`elif`を並べることで、さらに多くの分岐を行うことが可能になります。" 438 | ] 439 | }, 440 | { 441 | "cell_type": "code", 442 | "metadata": { 443 | "id": "mgzqzezO7DCh", 444 | "colab_type": "code", 445 | "colab": {} 446 | }, 447 | "source": [ 448 | "time = 20\n", 449 | "\n", 450 | "if time < 12:\n", 451 | " print(\"Good morning!\")\n", 452 | "elif time < 17:\n", 453 | " print(\"Good afternoon!\")\n", 454 | "elif time < 21:\n", 455 | " print(\"Good evening!\")\n", 456 | "else:\n", 457 | " print(\"Good night!\")" 458 | ], 459 | "execution_count": null, 460 | "outputs": [] 461 | }, 462 | { 463 | "cell_type": "code", 464 | "metadata": { 465 | "id": "MajMrIr6uYFj", 466 | "colab_type": "code", 467 | "colab": {} 468 | }, 469 | "source": [ 470 | "# 練習用\n" 471 | ], 472 | "execution_count": null, 473 | "outputs": [] 474 | }, 475 | { 476 | "cell_type": "markdown", 477 | "metadata": { 478 | "id": "4ikn14Eq7DCj", 479 | "colab_type": "text" 480 | }, 481 | "source": [ 482 | "## ●for文\n", 483 | "**for**文を使えば、同じ処理を繰り返し実行することができます。 \n", 484 | "以下の例は、リストをとfor文を使ったループ処理です。 " 485 | ] 486 | }, 487 | { 488 | "cell_type": "code", 489 | "metadata": { 490 | "id": "qf8iaf9V7DCj", 491 | "colab_type": "code", 492 | "colab": {} 493 | }, 494 | "source": [ 495 | "a = [2001, 2002, 2003, 2004, 2005]\n", 496 | "for i in a: # iにはリストaの各要素が入る\n", 497 | " print(i + 10) # 行頭にインデントを入れる" 498 | ], 499 | "execution_count": null, 500 | "outputs": [] 501 | }, 502 | { 503 | "cell_type": "code", 504 | "metadata": { 505 | "id": "ydtFlmi62SFw", 506 | "colab_type": "code", 507 | "colab": {} 508 | }, 509 | "source": [ 510 | "# 練習用\n" 511 | ], 512 | "execution_count": null, 513 | "outputs": [] 514 | }, 515 | { 516 | "cell_type": "markdown", 517 | "metadata": { 518 | "id": "QhR-cy3d2T83", 519 | "colab_type": "text" 520 | }, 521 | "source": [ 522 | "繰り返し行う処理には行頭にインデントを挿入します。 \n", 523 | " \n", 524 | "ループ内で連番の整数を使う場合は、`range`を使用します。 \n", 525 | "以下の例では、`i`に0から5までの整数が入ります。 " 526 | ] 527 | }, 528 | { 529 | "cell_type": "code", 530 | "metadata": { 531 | "id": "BS44zQjq2cLy", 532 | "colab_type": "code", 533 | "colab": {} 534 | }, 535 | "source": [ 536 | "for i in range(0, 6): # iには0以上6未満の整数が入る\n", 537 | " print(i * 2)" 538 | ], 539 | "execution_count": null, 540 | "outputs": [] 541 | }, 542 | { 543 | "cell_type": "code", 544 | "metadata": { 545 | "id": "d38PRmcY4C-B", 546 | "colab_type": "code", 547 | "colab": {} 548 | }, 549 | "source": [ 550 | "# 練習用\n" 551 | ], 552 | "execution_count": null, 553 | "outputs": [] 554 | }, 555 | { 556 | "cell_type": "markdown", 557 | "metadata": { 558 | "id": "0vD9S7yM4Ova", 559 | "colab_type": "text" 560 | }, 561 | "source": [ 562 | "for文によるループを使うことで、冗長なコードを簡潔にまとめることが可能になります。" 563 | ] 564 | }, 565 | { 566 | "cell_type": "markdown", 567 | "metadata": { 568 | "id": "FKQ9lg_NFEoJ", 569 | "colab_type": "text" 570 | }, 571 | "source": [ 572 | "## ●while文\n", 573 | "ある条件が満たされている間ループするためには、**while**文を用います。" 574 | ] 575 | }, 576 | { 577 | "cell_type": "code", 578 | "metadata": { 579 | "id": "vFVOuNokFKV3", 580 | "colab_type": "code", 581 | "colab": {} 582 | }, 583 | "source": [ 584 | "print(\"--- 10未満 ---\")\n", 585 | "a = 0\n", 586 | "while a < 10: # aが10未満である間ループ\n", 587 | " print(a)\n", 588 | " a += 1 # aに1を加える\n", 589 | "\n", 590 | "print(\"--- 10と等しくない ---\")\n", 591 | "b = 0\n", 592 | "while b != 10: # bが10と等しくない限りループ\n", 593 | " print(b)\n", 594 | " b += 1" 595 | ], 596 | "execution_count": null, 597 | "outputs": [] 598 | }, 599 | { 600 | "cell_type": "code", 601 | "metadata": { 602 | "id": "W94f0JFR9p3p", 603 | "colab_type": "code", 604 | "colab": {} 605 | }, 606 | "source": [ 607 | "# 練習用\n" 608 | ], 609 | "execution_count": null, 610 | "outputs": [] 611 | }, 612 | { 613 | "cell_type": "markdown", 614 | "metadata": { 615 | "id": "jdyK90d_GJzn", 616 | "colab_type": "text" 617 | }, 618 | "source": [ 619 | "## ●分岐とループの組み合わせ\n", 620 | "分岐とループを組み合わせることで、条件が満たされた処理のみをループ内で実行することが可能になります。" 621 | ] 622 | }, 623 | { 624 | "cell_type": "code", 625 | "metadata": { 626 | "id": "qncEVtHrHNkM", 627 | "colab_type": "code", 628 | "colab": {} 629 | }, 630 | "source": [ 631 | "a = [] # 空のリスト\n", 632 | "for i in range(0, 10):\n", 633 | " if i%2 == 0: # 偶数であれば\n", 634 | " a.append(i)\n", 635 | "\n", 636 | "print (a)" 637 | ], 638 | "execution_count": null, 639 | "outputs": [] 640 | }, 641 | { 642 | "cell_type": "code", 643 | "metadata": { 644 | "id": "bwW7OyfbBiKR", 645 | "colab_type": "code", 646 | "colab": {} 647 | }, 648 | "source": [ 649 | "# 練習用\n" 650 | ], 651 | "execution_count": null, 652 | "outputs": [] 653 | } 654 | ] 655 | } --------------------------------------------------------------------------------