{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "authorship_tag": "ABX9TyOR8OpXk+/aLh4M9l6X1GSa", "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "<a href=\"https://colab.research.google.com/github/yenlung/Python-AI-Book/blob/main/%E5%86%92%E9%9A%AA%E5%89%AF%E6%9C%AC06_%E7%94%A8OpenAI_API%E6%89%93%E9%80%A0%E8%87%AA%E5%B7%B1%E7%9A%84ChatGPT.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" ] }, { "cell_type": "markdown", "source": [ "這裡是因為 Colab 改版, 目前才需要這麼複雜的安裝。" ], "metadata": { "id": "bG0F5F6c8SPC" } }, { "cell_type": "code", "source": [ "!pip install -U tensorflow-probability\n", "!pip install typing-extensions --upgrade\n", "!pip install gradio\n", "!pip install langchain\n", "!pip install openai" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "_WMPaHnE46ao", "outputId": "5dfef721-3f53-4661-d39a-efff197fb2c9" }, "execution_count": 1, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Requirement already satisfied: tensorflow-probability in /usr/local/lib/python3.10/dist-packages (0.22.0)\n", "Collecting tensorflow-probability\n", " Downloading tensorflow_probability-0.23.0-py2.py3-none-any.whl (6.9 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.9/6.9 MB\u001b[0m \u001b[31m18.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: absl-py in /usr/local/lib/python3.10/dist-packages (from tensorflow-probability) (1.4.0)\n", "Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.10/dist-packages (from tensorflow-probability) (1.16.0)\n", "Requirement already satisfied: numpy>=1.13.3 in /usr/local/lib/python3.10/dist-packages (from tensorflow-probability) (1.23.5)\n", "Requirement already satisfied: decorator in /usr/local/lib/python3.10/dist-packages (from tensorflow-probability) (4.4.2)\n", "Requirement already satisfied: cloudpickle>=1.3 in /usr/local/lib/python3.10/dist-packages (from tensorflow-probability) (2.2.1)\n", "Requirement already satisfied: gast>=0.3.2 in /usr/local/lib/python3.10/dist-packages (from tensorflow-probability) (0.5.4)\n", "Requirement already satisfied: dm-tree in /usr/local/lib/python3.10/dist-packages (from tensorflow-probability) (0.1.8)\n", "Installing collected packages: tensorflow-probability\n", " Attempting uninstall: tensorflow-probability\n", " Found existing installation: tensorflow-probability 0.22.0\n", " Uninstalling tensorflow-probability-0.22.0:\n", " Successfully uninstalled tensorflow-probability-0.22.0\n", "Successfully installed tensorflow-probability-0.23.0\n", "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.10/dist-packages (4.5.0)\n", "Collecting typing-extensions\n", " Downloading typing_extensions-4.9.0-py3-none-any.whl (32 kB)\n", "Installing collected packages: typing-extensions\n", " Attempting uninstall: typing-extensions\n", " Found existing installation: typing_extensions 4.5.0\n", " Uninstalling typing_extensions-4.5.0:\n", " Successfully uninstalled typing_extensions-4.5.0\n", "Successfully installed typing-extensions-4.9.0\n", "Collecting gradio\n", " Downloading gradio-4.10.0-py3-none-any.whl (16.6 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m16.6/16.6 MB\u001b[0m \u001b[31m54.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting aiofiles<24.0,>=22.0 (from gradio)\n", " Downloading aiofiles-23.2.1-py3-none-any.whl (15 kB)\n", "Requirement already satisfied: altair<6.0,>=4.2.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (4.2.2)\n", "Collecting fastapi (from gradio)\n", " Downloading fastapi-0.105.0-py3-none-any.whl (93 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m93.1/93.1 kB\u001b[0m \u001b[31m16.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting ffmpy (from gradio)\n", " Downloading ffmpy-0.3.1.tar.gz (5.5 kB)\n", " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", "Collecting gradio-client==0.7.3 (from gradio)\n", " Downloading gradio_client-0.7.3-py3-none-any.whl (304 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m304.8/304.8 kB\u001b[0m \u001b[31m41.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting httpx (from gradio)\n", " Downloading httpx-0.25.2-py3-none-any.whl (74 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m75.0/75.0 kB\u001b[0m \u001b[31m11.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: huggingface-hub>=0.19.3 in /usr/local/lib/python3.10/dist-packages (from gradio) (0.19.4)\n", "Requirement already satisfied: importlib-resources<7.0,>=1.3 in /usr/local/lib/python3.10/dist-packages (from gradio) (6.1.1)\n", "Requirement already satisfied: jinja2<4.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (3.1.2)\n", "Requirement already satisfied: markupsafe~=2.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (2.1.3)\n", "Requirement already satisfied: matplotlib~=3.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (3.7.1)\n", "Requirement already satisfied: numpy~=1.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (1.23.5)\n", "Collecting orjson~=3.0 (from gradio)\n", " Downloading orjson-3.9.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (138 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m138.7/138.7 kB\u001b[0m \u001b[31m7.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from gradio) (23.2)\n", "Requirement already satisfied: pandas<3.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (1.5.3)\n", "Requirement already satisfied: pillow<11.0,>=8.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (9.4.0)\n", "Collecting pydantic>=2.0 (from gradio)\n", " Downloading pydantic-2.5.2-py3-none-any.whl (381 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m381.9/381.9 kB\u001b[0m \u001b[31m50.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting pydub (from gradio)\n", " Downloading pydub-0.25.1-py2.py3-none-any.whl (32 kB)\n", "Collecting python-multipart (from gradio)\n", " Downloading python_multipart-0.0.6-py3-none-any.whl (45 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m45.7/45.7 kB\u001b[0m \u001b[31m6.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: pyyaml<7.0,>=5.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (6.0.1)\n", "Collecting semantic-version~=2.0 (from gradio)\n", " Downloading semantic_version-2.10.0-py2.py3-none-any.whl (15 kB)\n", "Collecting tomlkit==0.12.0 (from gradio)\n", " Downloading tomlkit-0.12.0-py3-none-any.whl (37 kB)\n", "Requirement already satisfied: typer[all]<1.0,>=0.9 in /usr/local/lib/python3.10/dist-packages (from gradio) (0.9.0)\n", "Requirement already satisfied: typing-extensions~=4.0 in /usr/local/lib/python3.10/dist-packages (from gradio) (4.9.0)\n", "Collecting uvicorn>=0.14.0 (from gradio)\n", " Downloading uvicorn-0.24.0.post1-py3-none-any.whl (59 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m59.7/59.7 kB\u001b[0m \u001b[31m10.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from gradio-client==0.7.3->gradio) (2023.6.0)\n", "Collecting websockets<12.0,>=10.0 (from gradio-client==0.7.3->gradio)\n", " Downloading websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (129 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m129.9/129.9 kB\u001b[0m \u001b[31m18.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: entrypoints in /usr/local/lib/python3.10/dist-packages (from altair<6.0,>=4.2.0->gradio) (0.4)\n", "Requirement already satisfied: jsonschema>=3.0 in /usr/local/lib/python3.10/dist-packages (from altair<6.0,>=4.2.0->gradio) (4.19.2)\n", "Requirement already satisfied: toolz in /usr/local/lib/python3.10/dist-packages (from altair<6.0,>=4.2.0->gradio) (0.12.0)\n", "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.19.3->gradio) (3.13.1)\n", "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.19.3->gradio) (2.31.0)\n", "Requirement already satisfied: tqdm>=4.42.1 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.19.3->gradio) (4.66.1)\n", "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (1.2.0)\n", "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (0.12.1)\n", "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (4.46.0)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (1.4.5)\n", "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (3.1.1)\n", "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib~=3.0->gradio) (2.8.2)\n", "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas<3.0,>=1.0->gradio) (2023.3.post1)\n", "Collecting annotated-types>=0.4.0 (from pydantic>=2.0->gradio)\n", " Downloading annotated_types-0.6.0-py3-none-any.whl (12 kB)\n", "Collecting pydantic-core==2.14.5 (from pydantic>=2.0->gradio)\n", " Downloading pydantic_core-2.14.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.1/2.1 MB\u001b[0m \u001b[31m77.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: click<9.0.0,>=7.1.1 in /usr/local/lib/python3.10/dist-packages (from typer[all]<1.0,>=0.9->gradio) (8.1.7)\n", "Collecting colorama<0.5.0,>=0.4.3 (from typer[all]<1.0,>=0.9->gradio)\n", " Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)\n", "Collecting shellingham<2.0.0,>=1.3.0 (from typer[all]<1.0,>=0.9->gradio)\n", " Downloading shellingham-1.5.4-py2.py3-none-any.whl (9.8 kB)\n", "Requirement already satisfied: rich<14.0.0,>=10.11.0 in /usr/local/lib/python3.10/dist-packages (from typer[all]<1.0,>=0.9->gradio) (13.7.0)\n", "Collecting h11>=0.8 (from uvicorn>=0.14.0->gradio)\n", " Downloading h11-0.14.0-py3-none-any.whl (58 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m58.3/58.3 kB\u001b[0m \u001b[31m9.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: anyio<4.0.0,>=3.7.1 in /usr/local/lib/python3.10/dist-packages (from fastapi->gradio) (3.7.1)\n", "Collecting starlette<0.28.0,>=0.27.0 (from fastapi->gradio)\n", " Downloading starlette-0.27.0-py3-none-any.whl (66 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m67.0/67.0 kB\u001b[0m \u001b[31m10.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from httpx->gradio) (2023.11.17)\n", "Collecting httpcore==1.* (from httpx->gradio)\n", " Downloading httpcore-1.0.2-py3-none-any.whl (76 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m76.9/76.9 kB\u001b[0m \u001b[31m9.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: idna in /usr/local/lib/python3.10/dist-packages (from httpx->gradio) (3.6)\n", "Requirement already satisfied: sniffio in /usr/local/lib/python3.10/dist-packages (from httpx->gradio) (1.3.0)\n", "Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio<4.0.0,>=3.7.1->fastapi->gradio) (1.2.0)\n", "Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (23.1.0)\n", "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (2023.11.2)\n", "Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (0.32.0)\n", "Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.10/dist-packages (from jsonschema>=3.0->altair<6.0,>=4.2.0->gradio) (0.13.2)\n", "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib~=3.0->gradio) (1.16.0)\n", "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.10/dist-packages (from rich<14.0.0,>=10.11.0->typer[all]<1.0,>=0.9->gradio) (3.0.0)\n", "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.10/dist-packages (from rich<14.0.0,>=10.11.0->typer[all]<1.0,>=0.9->gradio) (2.16.1)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub>=0.19.3->gradio) (3.3.2)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub>=0.19.3->gradio) (2.0.7)\n", "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.10/dist-packages (from markdown-it-py>=2.2.0->rich<14.0.0,>=10.11.0->typer[all]<1.0,>=0.9->gradio) (0.1.2)\n", "Building wheels for collected packages: ffmpy\n", " Building wheel for ffmpy (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for ffmpy: filename=ffmpy-0.3.1-py3-none-any.whl size=5579 sha256=00aa266b7affb906e664f30017d2db8771f2632ef4021f1aa372f33e407d3e43\n", " Stored in directory: /root/.cache/pip/wheels/01/a6/d1/1c0828c304a4283b2c1639a09ad86f83d7c487ef34c6b4a1bf\n", "Successfully built ffmpy\n", "Installing collected packages: pydub, ffmpy, websockets, tomlkit, shellingham, semantic-version, python-multipart, pydantic-core, orjson, h11, colorama, annotated-types, aiofiles, uvicorn, starlette, pydantic, httpcore, httpx, fastapi, gradio-client, gradio\n", " Attempting uninstall: pydantic\n", " Found existing installation: pydantic 1.10.13\n", " Uninstalling pydantic-1.10.13:\n", " Successfully uninstalled pydantic-1.10.13\n", "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", "lida 0.0.10 requires kaleido, which is not installed.\n", "llmx 0.0.15a0 requires cohere, which is not installed.\n", "llmx 0.0.15a0 requires openai, which is not installed.\n", "llmx 0.0.15a0 requires tiktoken, which is not installed.\u001b[0m\u001b[31m\n", "\u001b[0mSuccessfully installed aiofiles-23.2.1 annotated-types-0.6.0 colorama-0.4.6 fastapi-0.105.0 ffmpy-0.3.1 gradio-4.10.0 gradio-client-0.7.3 h11-0.14.0 httpcore-1.0.2 httpx-0.25.2 orjson-3.9.10 pydantic-2.5.2 pydantic-core-2.14.5 pydub-0.25.1 python-multipart-0.0.6 semantic-version-2.10.0 shellingham-1.5.4 starlette-0.27.0 tomlkit-0.12.0 uvicorn-0.24.0.post1 websockets-11.0.3\n", "Collecting langchain\n", " Downloading langchain-0.0.351-py3-none-any.whl (794 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m794.3/794.3 kB\u001b[0m \u001b[31m11.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: PyYAML>=5.3 in /usr/local/lib/python3.10/dist-packages (from langchain) (6.0.1)\n", "Requirement already satisfied: SQLAlchemy<3,>=1.4 in /usr/local/lib/python3.10/dist-packages (from langchain) (2.0.23)\n", "Requirement already satisfied: aiohttp<4.0.0,>=3.8.3 in /usr/local/lib/python3.10/dist-packages (from langchain) (3.9.1)\n", "Requirement already satisfied: async-timeout<5.0.0,>=4.0.0 in /usr/local/lib/python3.10/dist-packages (from langchain) (4.0.3)\n", "Collecting dataclasses-json<0.7,>=0.5.7 (from langchain)\n", " Downloading dataclasses_json-0.6.3-py3-none-any.whl (28 kB)\n", "Collecting jsonpatch<2.0,>=1.33 (from langchain)\n", " Downloading jsonpatch-1.33-py2.py3-none-any.whl (12 kB)\n", "Collecting langchain-community<0.1,>=0.0.2 (from langchain)\n", " Downloading langchain_community-0.0.4-py3-none-any.whl (1.5 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.5/1.5 MB\u001b[0m \u001b[31m20.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting langchain-core<0.2,>=0.1 (from langchain)\n", " Downloading langchain_core-0.1.1-py3-none-any.whl (190 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m190.6/190.6 kB\u001b[0m \u001b[31m24.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting langsmith<0.1.0,>=0.0.70 (from langchain)\n", " Downloading langsmith-0.0.72-py3-none-any.whl (46 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m46.3/46.3 kB\u001b[0m \u001b[31m6.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: numpy<2,>=1 in /usr/local/lib/python3.10/dist-packages (from langchain) (1.23.5)\n", "Requirement already satisfied: pydantic<3,>=1 in /usr/local/lib/python3.10/dist-packages (from langchain) (2.5.2)\n", "Requirement already satisfied: requests<3,>=2 in /usr/local/lib/python3.10/dist-packages (from langchain) (2.31.0)\n", "Requirement already satisfied: tenacity<9.0.0,>=8.1.0 in /usr/local/lib/python3.10/dist-packages (from langchain) (8.2.3)\n", "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (23.1.0)\n", "Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.10/dist-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (6.0.4)\n", "Requirement already satisfied: yarl<2.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (1.9.4)\n", "Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (1.4.0)\n", "Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.10/dist-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (1.3.1)\n", "Collecting marshmallow<4.0.0,>=3.18.0 (from dataclasses-json<0.7,>=0.5.7->langchain)\n", " Downloading marshmallow-3.20.1-py3-none-any.whl (49 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m49.4/49.4 kB\u001b[0m \u001b[31m7.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hCollecting typing-inspect<1,>=0.4.0 (from dataclasses-json<0.7,>=0.5.7->langchain)\n", " Downloading typing_inspect-0.9.0-py3-none-any.whl (8.8 kB)\n", "Collecting jsonpointer>=1.9 (from jsonpatch<2.0,>=1.33->langchain)\n", " Downloading jsonpointer-2.4-py2.py3-none-any.whl (7.8 kB)\n", "Requirement already satisfied: anyio<5,>=3 in /usr/local/lib/python3.10/dist-packages (from langchain-core<0.2,>=0.1->langchain) (3.7.1)\n", "Requirement already satisfied: packaging<24.0,>=23.2 in /usr/local/lib/python3.10/dist-packages (from langchain-core<0.2,>=0.1->langchain) (23.2)\n", "Requirement already satisfied: annotated-types>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from pydantic<3,>=1->langchain) (0.6.0)\n", "Requirement already satisfied: pydantic-core==2.14.5 in /usr/local/lib/python3.10/dist-packages (from pydantic<3,>=1->langchain) (2.14.5)\n", "Requirement already satisfied: typing-extensions>=4.6.1 in /usr/local/lib/python3.10/dist-packages (from pydantic<3,>=1->langchain) (4.9.0)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2->langchain) (3.3.2)\n", "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2->langchain) (3.6)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2->langchain) (2.0.7)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2->langchain) (2023.11.17)\n", "Requirement already satisfied: greenlet!=0.4.17 in /usr/local/lib/python3.10/dist-packages (from SQLAlchemy<3,>=1.4->langchain) (3.0.2)\n", "Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.10/dist-packages (from anyio<5,>=3->langchain-core<0.2,>=0.1->langchain) (1.3.0)\n", "Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio<5,>=3->langchain-core<0.2,>=0.1->langchain) (1.2.0)\n", "Collecting mypy-extensions>=0.3.0 (from typing-inspect<1,>=0.4.0->dataclasses-json<0.7,>=0.5.7->langchain)\n", " Downloading mypy_extensions-1.0.0-py3-none-any.whl (4.7 kB)\n", "Installing collected packages: mypy-extensions, marshmallow, jsonpointer, typing-inspect, jsonpatch, langsmith, dataclasses-json, langchain-core, langchain-community, langchain\n", "Successfully installed dataclasses-json-0.6.3 jsonpatch-1.33 jsonpointer-2.4 langchain-0.0.351 langchain-community-0.0.4 langchain-core-0.1.1 langsmith-0.0.72 marshmallow-3.20.1 mypy-extensions-1.0.0 typing-inspect-0.9.0\n", "Collecting openai\n", " Downloading openai-1.5.0-py3-none-any.whl (223 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m223.7/223.7 kB\u001b[0m \u001b[31m7.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: anyio<5,>=3.5.0 in /usr/local/lib/python3.10/dist-packages (from openai) (3.7.1)\n", "Requirement already satisfied: distro<2,>=1.7.0 in /usr/lib/python3/dist-packages (from openai) (1.7.0)\n", "Requirement already satisfied: httpx<1,>=0.23.0 in /usr/local/lib/python3.10/dist-packages (from openai) (0.25.2)\n", "Requirement already satisfied: pydantic<3,>=1.9.0 in /usr/local/lib/python3.10/dist-packages (from openai) (2.5.2)\n", "Requirement already satisfied: sniffio in /usr/local/lib/python3.10/dist-packages (from openai) (1.3.0)\n", "Requirement already satisfied: tqdm>4 in /usr/local/lib/python3.10/dist-packages (from openai) (4.66.1)\n", "Requirement already satisfied: typing-extensions<5,>=4.5 in /usr/local/lib/python3.10/dist-packages (from openai) (4.9.0)\n", "Requirement already satisfied: idna>=2.8 in /usr/local/lib/python3.10/dist-packages (from anyio<5,>=3.5.0->openai) (3.6)\n", "Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio<5,>=3.5.0->openai) (1.2.0)\n", "Requirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from httpx<1,>=0.23.0->openai) (2023.11.17)\n", "Requirement already satisfied: httpcore==1.* in /usr/local/lib/python3.10/dist-packages (from httpx<1,>=0.23.0->openai) (1.0.2)\n", "Requirement already satisfied: h11<0.15,>=0.13 in /usr/local/lib/python3.10/dist-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai) (0.14.0)\n", "Requirement already satisfied: annotated-types>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from pydantic<3,>=1.9.0->openai) (0.6.0)\n", "Requirement already satisfied: pydantic-core==2.14.5 in /usr/local/lib/python3.10/dist-packages (from pydantic<3,>=1.9.0->openai) (2.14.5)\n", "Installing collected packages: openai\n", "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", "llmx 0.0.15a0 requires cohere, which is not installed.\n", "llmx 0.0.15a0 requires tiktoken, which is not installed.\u001b[0m\u001b[31m\n", "\u001b[0mSuccessfully installed openai-1.5.0\n" ] } ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "R3_lAzjzz4w6" }, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "source": [ "### 1. 使用 OpenAI 的 API\n", "\n", "我們先來安裝 `openai` 套件, 還有快速打造 Web App 的 `gradio`。" ], "metadata": { "id": "Ch-GA2w63pjm" } }, { "cell_type": "code", "source": [ "# 本來在這裡裝 openai 和 gradio, 但前面已經裝了\n", "#\n", "#!pip install openai\n", "#!pip install gradio" ], "metadata": { "id": "hAR65--V8IMH" }, "execution_count": 3, "outputs": [] }, { "cell_type": "markdown", "source": [ "### 2. 申請自己的 OpenAI API 金鑰\n", "\n", "請先申請自己的 OpenAI API 金鑰\n", "\n", "[`https://platform.openai.com`](https://platform.openai.com)\n", "\n", "\n" ], "metadata": { "id": "18IBt0Ph-k0u" } }, { "cell_type": "markdown", "source": [ "### 3. 使用 ChatGPT API\n", "\n", "首先使用 `openai` 套件。" ], "metadata": { "id": "RdQWlryD3sWO" } }, { "cell_type": "code", "source": [ "from openai import OpenAI" ], "metadata": { "id": "AE_hxsf7_xnw" }, "execution_count": 4, "outputs": [] }, { "cell_type": "markdown", "source": [ "把自己的金鑰貼上。" ], "metadata": { "id": "gnl3KyX5oOsv" } }, { "cell_type": "code", "source": [ "client = OpenAI(\n", " # defaults to os.environ.get(\"OPENAI_API_KEY\")\n", " api_key=\"你的 API 金鑰\",\n", ")" ], "metadata": { "id": "j1JpbbMV6XUj" }, "execution_count": 5, "outputs": [] }, { "cell_type": "markdown", "source": [ "ChatGPT API 的重點是要把之前對話的內容送給 ChatGPT, 然後他就會有個適當的回應!\n", "\n", "角色 (`role`) 一共有三種, 分別是:\n", "\n", "* `system`: 這是對話機器人的「人設」\n", "* `user`: 使用者\n", "* `assistant`: ChatGPT 的回應" ], "metadata": { "id": "2QvMR3uRph__" } }, { "cell_type": "code", "source": [ "prompt = \"我今天心情很不好。\"\n", "\n", "messages = [{\"role\":\"system\", \"content\":\"你是一個非常溫暖的對話機器人,回應都簡短,儘量不要超過二十個字,而且有同理心。\"},\n", " {\"role\": \"user\", \"content\": prompt}]" ], "metadata": { "id": "fMVm-Wf9lV1Y" }, "execution_count": 6, "outputs": [] }, { "cell_type": "code", "source": [ "messages" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "iyBTn_gvfodo", "outputId": "cc3b9053-2c18-4e63-dd2d-03bab5ec70e9" }, "execution_count": 7, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[{'role': 'system', 'content': '你是一個非常溫暖的對話機器人,回應都簡短,儘量不要超過二十個字,而且有同理心。'},\n", " {'role': 'user', 'content': '我今天心情很不好。'}]" ] }, "metadata": {}, "execution_count": 7 } ] }, { "cell_type": "markdown", "source": [ "現在我們來接 ChatGPT 的回應。" ], "metadata": { "id": "L7jPL2CsqrPh" } }, { "cell_type": "code", "source": [ "chat_completion = client.chat.completions.create(\n", " messages=messages,\n", " model=\"gpt-3.5-turbo\",\n", ")" ], "metadata": { "id": "3jRMTUR-56FI" }, "execution_count": 8, "outputs": [] }, { "cell_type": "code", "source": [ "chat_completion" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "FYwlEV9Q7RsJ", "outputId": "18a65a25-c82a-4881-9791-496cb3d952dc" }, "execution_count": 9, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "ChatCompletion(id='chatcmpl-8XT4spSlQ6esL4VNGZQlbmEy39i50', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='怎麼了?可以跟我分享嗎?', role='assistant', function_call=None, tool_calls=None))], created=1702987290, model='gpt-3.5-turbo-0613', object='chat.completion', system_fingerprint=None, usage=CompletionUsage(completion_tokens=16, prompt_tokens=77, total_tokens=93))" ] }, "metadata": {}, "execution_count": 9 } ] }, { "cell_type": "code", "source": [ "chat_completion.choices[0].message.content" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "id": "Xegd9iGW6G5T", "outputId": "9e7a2a19-69af-4421-925a-348ec4bc00dd" }, "execution_count": 10, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'怎麼了?可以跟我分享嗎?'" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" } }, "metadata": {}, "execution_count": 10 } ] }, { "cell_type": "code", "source": [ "reply = chat_completion.choices[0].message.content" ], "metadata": { "id": "VSADO3xzmJ2n" }, "execution_count": 11, "outputs": [] }, { "cell_type": "code", "source": [ "reply" ], "metadata": { "id": "75i8fwTdmejU", "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "outputId": "df8bd843-429c-4552-d9f0-caba9ae02678" }, "execution_count": 12, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'怎麼了?可以跟我分享嗎?'" ], "application/vnd.google.colaboratory.intrinsic+json": { "type": "string" } }, "metadata": {}, "execution_count": 12 } ] }, { "cell_type": "code", "source": [ "messages.append({\"role\":\"assistant\", \"content\":reply})" ], "metadata": { "id": "9rXEzCU3gfDn" }, "execution_count": 13, "outputs": [] }, { "cell_type": "code", "source": [ "messages" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "vlxRhJCSgqab", "outputId": "b2d510c5-7af5-410e-8d39-409e81c2cc1f" }, "execution_count": 14, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[{'role': 'system', 'content': '你是一個非常溫暖的對話機器人,回應都簡短,儘量不要超過二十個字,而且有同理心。'},\n", " {'role': 'user', 'content': '我今天心情很不好。'},\n", " {'role': 'assistant', 'content': '怎麼了?可以跟我分享嗎?'}]" ] }, "metadata": {}, "execution_count": 14 } ] }, { "cell_type": "markdown", "source": [ "### 4. 打造一個可以一直說下去的 ChatGPT" ], "metadata": { "id": "dGRAYC-Krbmm" } }, { "cell_type": "code", "source": [ "icon = \"(*゚▽゚*): \"\n", "messages = [{\"role\":\"system\", \"content\":\"你是一個非常溫暖的對話機器人,回應都簡短,儘量不要超過二十個字,而且有同理心。\"}]\n", "\n", "while True:\n", " prompt = input('> ')\n", " if 'bye' in prompt:\n", " print('再見, 下次再聊!')\n", " break\n", " messages.append({\"role\": \"user\", \"content\": prompt})\n", " chat_completion = client.chat.completions.create(\n", " messages=messages,\n", " model=\"gpt-3.5-turbo\",\n", " )\n", "\n", " reply = chat_completion.choices[0].message.content\n", " print(icon + reply)\n", " print()\n", " messages.append({\"role\": \"assistant\", \"content\": reply})" ], "metadata": { "id": "fKG21EHhk9UF", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "8fc8331e-981a-4b54-c0aa-c3e0a2c59b3a" }, "execution_count": 15, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "> 我覺得很難過\n", "(*゚▽゚*): 為什麼呢?可以跟我說說嗎?\n", "\n", "> Python 都不會寫\n", "(*゚▽゚*): 沒關係,學習一門程式語言需要時間和練習。你可以從基礎開始,慢慢學習,我相信你能掌握Python的!加油!\n", "\n", "> 同學都排擠我\n", "(*゚▽゚*): 這讓你感到不舒服。試著與他們溝通,或尋找其他人與你有共同興趣的朋友。你不是孤單的,我在這裡支持你。\n", "\n", "> 先這樣, bye\n", "再見, 下次再聊!\n" ] } ] }, { "cell_type": "markdown", "source": [ "### 5. 最後用 `gradio` 打造 ChatGPT 網路應用程式!" ], "metadata": { "id": "5ZTlA5mBr3CO" } }, { "cell_type": "code", "source": [ "import gradio as gr" ], "metadata": { "id": "xv7nvjfDj3f2" }, "execution_count": 16, "outputs": [] }, { "cell_type": "code", "source": [ "messages = [{\"role\":\"system\", \"content\":\"你是一個非常溫暖的對話機器人,回應都簡短,儘量不要超過二十個字,而且有同理心。\"}]\n" ], "metadata": { "id": "-N3HEyOlB5ZD" }, "execution_count": 17, "outputs": [] }, { "cell_type": "code", "source": [ "def pipi(prompt, history):\n", " history = history or []\n", " global messages\n", "\n", " messages.append({\"role\": \"user\", \"content\": prompt})\n", " chat_completion = client.chat.completions.create(\n", " messages=messages,\n", " model=\"gpt-3.5-turbo\",\n", " )\n", " reply = chat_completion.choices[0].message.content\n", " messages.append({\"role\": \"assistant\", \"content\": reply})\n", " history = history + [[prompt, reply]]\n", "\n", " return history, history" ], "metadata": { "id": "_-VewlGBiJuE" }, "execution_count": 18, "outputs": [] }, { "cell_type": "code", "source": [ "chatbot = gr.Chatbot()" ], "metadata": { "id": "VjE_RCr1jZc2" }, "execution_count": 19, "outputs": [] }, { "cell_type": "code", "source": [ "iface = gr.Interface(pipi,\n", " inputs=[\"text\", \"state\"],\n", " outputs=[chatbot, \"state\"],\n", " title=\"療癒系拍拍機器人\",\n", " description=\"你有什麼心事, 歡迎來找我聊聊 :)\")" ], "metadata": { "id": "LVrcuUpYjwP0" }, "execution_count": 22, "outputs": [] }, { "cell_type": "code", "source": [ "iface.launch(share=True)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 612 }, "id": "xQDaCtzxkCD7", "outputId": "f4f91768-38a0-410f-ef82-30cd77754623" }, "execution_count": 23, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Colab notebook detected. To show errors in colab notebook, set debug=True in launch()\n", "Running on public URL: https://a070a50d7289189f1f.gradio.live\n", "\n", "This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "<IPython.core.display.HTML object>" ], "text/html": [ "<div><iframe src=\"https://a070a50d7289189f1f.gradio.live\" width=\"100%\" height=\"500\" allow=\"autoplay; camera; microphone; clipboard-read; clipboard-write;\" frameborder=\"0\" allowfullscreen></iframe></div>" ] }, "metadata": {} }, { "output_type": "execute_result", "data": { "text/plain": [] }, "metadata": {}, "execution_count": 23 } ] }, { "cell_type": "code", "source": [], "metadata": { "id": "M5bBETHIkFGB" }, "execution_count": null, "outputs": [] } ] }