3
3

More than 1 year has passed since last update.

chatGPT apiをPython3で使用してみた

Last updated at Posted at 2023-03-08

はじめに

2023年03月08日にchatGPTのAPIがリリースされました。
気になったのでPythonを使用し、リクエストを飛ばして遊んでみたいと思います。

詳しくはchatGPT公式ドキュメントを参考にしてください。

ゴール

今回のゴールはchatGPTのAPIを使用して質問を投げることです。

環境

今回はDocker + ubuntu上で開発をしていますが、Pythonが動作すればどの環境でも問題ありません。

本環境は前提としてwindows10にwsl2を用いてubuntu環境を構築しています。

Docker Desktop for windows
Docker version 20.10.22
Docker Compose version v2.15.1
VS vode
Python version 3.11
Fastapi version latest

構成

ディレクトリ構成です。

chatGPT
    |── docker-compose.yml
    |── .env
    └── api
         |── app.py
         └── Dockerfile

準備

open apiサイトからAPIキーを発行します。
open api のアカウントが必要なためアカウントを所持していない方は登録してください。
image.png

docker-compose.ymlの作成

chatGPTディレクトリ直下に作成します。docker-composeコマンドを使用する際の設定ファイルです。

docker-compose.yml
version: '3'

services:
  api:
    build:
      context: ./api
      dockerfile: ./Dockerfile
    ports:
      - "8002:8002"
    restart: on-failure
    tty: true
    volumes:
      - ./api/:/app
    env_file:
      - ./.env

networks:
  default:
    name: chatGPT
    external: true
  • env_file
    APIキーを.envファイルに記述し、Compose内に環境変数を展開するための設定を行う。

Dockerfileの作成

apiディレクトリ直下にdockerコンテナをビルドするDockerfileを作成します。
今回はchatGPTへリクエストを送信するだけなため、使用頻度の低いツールやライブラリを除外した最小パッケージであるslimを指定していますが、特に気にする必要はありません。

Dockerfile
FROM python:3.11-slim-bullseye
ENV PYTHONUNBUFFERED 1

RUN pip install --upgrade pip
RUN pip install fastapi uvicorn
RUN pip install requests 
RUN pip install openai
RUN pip install aiohttp

RUN mkdir /app
COPY ./ /app
WORKDIR /app

ENTRYPOINT ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8002"]

EXPOSE 8002

環境変数の設定(.envファイル)

chatGPTディレクトリ直下に.envファイルを作成し、APIキーを配置するパスの環境変数を設定します。

env
#open api key
OPENAI_API_KEY=先ほど発行したAPIキー

Python実装

続いてPythonでの実装に移ります。といってもほぼopen api公式サンプルと変化はありません。

chatGPT APIを使用するために必要なライブラリはos, openaiなのですが、今回はFastAPIを使用してJsonレスポンスを行うためfastapi系ライブラリもインポートしています。

app.py
import os
import openai
from fastapi import (FastAPI, status)
from fastapi.responses import JSONResponse
from pydantic import BaseModel

openai.api_keyでAPIキーを指定するためos.getenvで.envに記述したAPIキーを認識させます。

openai.api_key = os.getenv("OPENAI_API_KEY")

chatGPTにリクエストを送信するためにはChatCompletionというオブジェクトを使用する必要があり、リクエストボディにはmodelmessagesは記述必須となっています。ほかにも複数引数が用意されているので気になる方は公式ドキュメントを参照ください。

completion = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[body.dict()]
        )

実際にはmessagesへ下記のようなjson形式のリクエストが入りますが今回はここをリクエストボディとしています。

messages
messages=[{"role": "user", "content": "Hello!"}]

このcontentにchatGPTへ送るリクエスト内容を記述します。今回はHello!と入力しchatGPTからの回答を見てみましょう。


▼以下コード全体像▼

app.py
app = FastAPI()
openai.api_key = os.getenv("OPENAI_API_KEY")

class request_body(BaseModel):
    role: str
    content: str

@app.post("/chatGPT")
async def chatGPT(body: request_body):
    
    try:
        completion = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[body.dict()]
        )

        return JSONResponse(content=completion, status_code=status.HTTP_200_OK)
    except Exception as e:
        print(e)
        return JSONResponse(content={"error": "internal server error"}, status_code=status.HTTP_500_INTERNAL_SERVER_ERROR)

いざ検証!!

curlコマンドから以下を実行します。

curl -X POST localhost:8002/chatGPT -H "Content-Type: application/json" -d '{"role": "user", "content": "Hello!"}'

レスポンスはこんな感じ
contentの部分がchatGPTから質問に対しての回答である。正常に動作できていることを確認。

response
{
    "id": "chatcmpl-6rmUmikIKgYUNXRcgSE54p4elhFVs",
    "object": "chat.completion",
    "created": 1678275820,
    "model": "gpt-3.5-turbo-0301",
    "usage": {
        "prompt_tokens": 9,
        "completion_tokens": 11,
        "total_tokens": 20
    },
    "choices": [
        {
            "message": {
                "role": "assistant",
                "content": "\n\nHello! How can I assist you today?"
            },
            "finish_reason": "stop",
            "index": 0
        }
    ]
}

おまけ

chatGPTにケーキの作り方を聞いてみた

curl -X POST localhost:8002/chatGPT -H "Content-Type: application/json" -d '{"role": "user", "content": "ケーキの作り方を教えて"}'

非常に読みにくいが、しっかりとレスポンスが返ってきました。

response
{
    "id": "chatcmpl-6rmvz0EhoL7oOnx94hRV9rdhLaaNb",
    "object": "chat.completion",
    "created": 1678277507,
    "model": "gpt-3.5-turbo-0301",
    "usage": {
        "prompt_tokens": 20,
        "completion_tokens": 417,
        "total_tokens": 437
    },
    "choices": [
        {
            "message": {
                "role": "assistant",
                "content": "\n\n材料(20cm丸型分量)\n\n・薄力粉 100g\n・コーンスターチ 20g\n・卵黄 2個分\n・卵白 2個分\n・グラニュー糖 80g\n・サラダ油 大さじ1\n・牛乳 50ml\n\n作り方\n\n1.薄力粉とコーンスターチを混ぜてふるいにかける。\n\n2.卵黄をボウルに入れて泡立て器で混ぜる。グラニュー糖を少しずつ加え、白っぽくなるまでよく混ぜる。油、牛乳を加えてさらに混ぜる。\n\n3.1の粉を2に加え、ゴムべらで切るように混ぜる。\n\n4.別のボウルに卵白を入れ、泡立て器でツノが立つまでしっかりと泡立てる。\n\n5.3に1/3の量の4を加え、ゴムべらで丁寧に混ぜる。\n\n6.残りの4を半分に分け、2回に分けて入れ、ゴムべらで切るように混ぜる。\n\n7.生地を20cm丸型に入れ、170度に温めたオーブンで40分焼く。\n\n8.焼きあがったら取り出し、型から外して冷まして完成。"
            },
            "finish_reason": "stop",
            "index": 0
        }
    ]
}

おわりに

PythonによるchatGPT APIの基本的な使用方法を紹介しました。
まだ応答速度が割と遅く複雑な質問になってくるほど応答時間がかかりそうなので活用する場を精査する必要がありそうです。

指摘事項などがありましたら遠慮なくコメントお願いします!!

参考サイト

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3