Make組ブログ

Python、Webアプリや製品・サービス開発についてhirokikyが書きます。

ChatGPTを非同期でPythonから利用する方法

ShodoがChatGPTに対応しましたね。

最近注目されている自然言語処理技術の一つChatGPT。本記事ではPythonからChatGPTを非同期で扱う方法についてご紹介します。

実はこの記事もChatGPTに書いてもらい、僕が加筆し、Shodoで校正しています。

ChatGPTと非同期で扱う話

ChatGPTとは、人工知能の一種であるGPTを用いた、対話型の自然言語処理技術のことです。

APIも公開されて最高!なわけですが、 いかんせんレスポンスが遅いため面倒です
通常、数ミリ秒の世界で生きているわけですが、ChatGPTのAPIは30秒以上ふつうにかかります。同期的なWebサーバーで返答を待ってしまうと、ワーカーが長時間待ってしまうのであまり嬉しくありません。

そこで非同期で扱うことが大事になります。

そう。PythonのAsyncです!Async最高!

ChatCompletion.acreateを使おう!

openaiというPythonライブラリを使うことで、ChatGPTをPythonで利用できます。openai.ChatCompletion.create という関数を使う例をよく見ますが、非同期の ChatCompletion.acreate という関数を使いましょう!

import openai

res = await openai.ChatCompletion.acreate({...})

オプションなどは create と同じです(参考 https://platform.openai.com/docs/guides/chat

また stream=True というオプションを渡すことで非同期ジェネレーターで受け取れます。すごい。ChatGPTのWeb版のように、文字がどんどん書かれるようなUIを作る場合に必須となります。

Djangoでの利用例

ChatGPTを非同期で扱う場合、FastAPIやDjangoといった非同期対応のWebフレームワークを使うのがおすすめです。以下はDjangoを用いてChatGPTを利用する例です。

class GPTView(View):
    async post(request):
        res = await openai.ChatCompletion.acreate({...})
        return JsonResponse({"text": res["choices"][0]["message"]["content"]})

これで uvicorn などで起動すれば、ちゃんと非同期で扱ってくれます。Django最高!
AsyncStreamResponseDjango 4.2からの対応のようですので、それも楽しみですね。

エラーハンドリングの仕方やDjangoRestFrameworkで非同期をやる方法などは今後気が向けば書きます。

まとめ

ChatGPTをPythonから利用する方法について、 ChatCompletion.acreate という非同期の関数を紹介しました。また、非同期をWebで扱う場合はFastAPIやDjangoがおすすめです。

この記事もChatGPTとShodoのAIのおかげで書きましたが、書き始めの下書きと誤字や間違いのチェックがあるだけで、気がすごく楽ですね。

執筆:Kiyohara Hiroki (@hirokiky)
Shodoで執筆されました