Next.js × FastAPIでLLMアプリを作成した

投稿日 2023-10-02
最終更新日 2023-11-18

先日、OpenAIのAPIを利用したクイズアプリを作成しました。
成果物の概要やアプリを作った感想等を書いていきます。

アプリの概要

以下のような挙動になっています


クイズ作成中の画面


クイズ解答中の画面

仕様は以下の通りです。

  1. 文章からLLMモデルを利用してクイズを作成することができます。
  2. 作成したクイズを解くことができます。
  3. 問題は4択クイズを1〜5問作成できます。
  4. モデルとして「GPT3.5Turbo」、「GPT3.5Turbo-16k」 ( + コンテナ版のみ「GPT4」を利用することができます。


このアプリの利用方法

アプリ版とコンテナ版があります。

アプリ版の利用方法

以下のURLにアクセスすることで簡単に利用できます。
https://chatgpt-choicequiz-maker.vercel.app/

コンテナ版の利用方法

Dockerが実行できる環境と各自OpenAI APIの発行が必要です。
以下のgithubリポジトリのREADME.mdに従ってください。
https://github.com/matsunagadaiki151/chatgpt-choicequiz-maker

アプリ版は無料で利用可能ですが、デプロイ環境の仕様上初回のクイズ作成に2分ほど時間がかかります。
また、ユーザー全体の利用頻度に応じて使用できない可能性がある、GPT-4が使えない等いくつかの制約があります。
もし、安定的に利用したい場合はコンテナ版の利用をお勧めします。(多少の課金が発生します)

なぜ作ろうと思ったか

多くの教科書には章末問題があると思います。これらは資格などの勉強において、内容の定着に大きく貢献します。 そこでネット上のあらゆる情報に章末問題があればより学習効率が上がるのは?と考え、そこでLLMが使えると思いました。

技術スタック

言語

  • Python

フレームワーク

  • FastAPI
  • LangChain

開発環境

  • Poetry
  • black
  • flake8
  • isort
  • mypy

LLM

  • OpenAI (gpt-3.5-turbo)

デプロイ

・Docker(コンテナ版)
・Vercel(フロントエンド)
・render(バックエンド)

技術スタック図は以下になります。



クイズの作成の際はFunction Callingを利用して所定の形式の応答が生成されやすいようにしています。
クイズの内容や、ユーザが選択したオプション等は、Recoilでグローバル管理しています。

作ってみた感想

動くものができてからの開発が長かった

動くもの自体は3週間程度でできましたが、それ以降の作業に2ヶ月ほどの時間を費やしました。具体的には、バグ修正・機能追加・デプロイ環境の選定などです。正直、デプロイはしましたがまだまだ追加できる機能はあると思っています。時間と質はトレードオフであることを実感しました。

今後やりたいこと

実務でも使えるデプロイ環境で動作させる

今回は無料のrenderでデプロイを行いましたが、やはりマシンのスペックが低かったり、頻繁にコールドスタートが発生したりと問題はいくつかありました。そのため、ECSやAzure Container Service等でデプロイできるようにできたら良さそうだと思いました。(もちろんお金はかかりますが) また、今回バックエンドをパブリックでデプロイしているため、URLを知っていればアプリ経由でなくともAPIを叩けるようになってしまっています。そのため、プライベートな環境で所定のURLからのみアクセスできるようなインフラを構築してみたいです。

Open AI以外のLLMの利用

今回はおそらく一番メジャーであろうOpenAIのAPIを利用してLLMを呼び出しました。しかし、実際は先述のプライベートな環境で動作させたいので、クラウド事業者のLLMサービスを使った方がいいように感じます。具体的にはAzure Open AIや先日リリースされたAmazon Bedrock等です。また、Llama2などのオープンソースのLLMをGPUサーバーで稼働させるのも面白いと思いました。(個人でやるには高すぎますが)


今回は以上になります。まだまだいろいろ機能が拡張できそうですが、似たようなアプリがすでにあるのと他に学びたい技術がたくさんあるため、一旦はこれで完成とします。機会があれば追加できる機能を実装したいです。