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最高!
AsyncStreamResponse
はDjango 4.2からの対応のようですので、それも楽しみですね。
エラーハンドリングの仕方やDjangoRestFrameworkで非同期をやる方法などは今後気が向けば書きます。
まとめ
ChatGPTをPythonから利用する方法について、 ChatCompletion.acreate
という非同期の関数を紹介しました。また、非同期をWebで扱う場合はFastAPIやDjangoがおすすめです。
この記事もChatGPTとShodoのAIのおかげで書きましたが、書き始めの下書きと誤字や間違いのチェックがあるだけで、気がすごく楽ですね。
執筆:Kiyohara Hiroki (@hirokiky)
(Shodoで執筆されました)