ChatGPTを用いて論文アブスト自動要約収集アプリを作ってみた。
株式会社GA technologies、AISCの山内です。
ChatGPTのAPIが登場してしばらく経ちました。
若干遅刻気味ではありますが、私もChatGPT APIを用いてアプリを作ってみたので、作ったアプリの紹介をさせてください!
また、できるだけChatGPTを利用しながらコーディングすることを心がけました。どのようにChatGPTを使い倒したのかも紹介するので、是非最後まで読んでいただけると幸いです!
アプリの概要
今回作成したのは、以下の機能を備えたアプリです!
最新論文を日時で収集する。
収集した論文のアブストをChatGPTを用いて要約する。
要約したアブストと論文の本文リンクを一覧表示する。
具体的には、以下のようなアプリです!
以下のように、サブカテゴリでフィルタすることができます!(computer scienceカテゴリのサブカテゴリのみ)
また、キーワードによる検索機能も実装しています。
検索フォームに検索ワードを入れることで、そのワードに類似するアブストを持つ論文を表示することができます!例えば、以下は医療というワードを用いて検索をした結果です!
アーキテクチャ
アーキテクチャは以下のようになっています!
大きな特徴としては、Amplifyを用いたserverlessな構成になっていることです。
AISCでは最近、アプリ開発にAmplifyを用いることが推奨されています。
理由としては、
ホスティングや認証、データベース連携をserverlessで導入できる。
コストミニマムになることはもちろん、スケーラビリティに優れ、セキュリティ向上の効果も狙える。
などが挙げられます。
AISCで作るアプリは、MVP(Minimum Viable Product)であることが多いので、Amplifyと相性が良いと思われます。
工夫した点
本アプリで工夫した点を紹介します!
コーディングにChatGPTを使い倒す
コーディングを行う際、できるだけChatGPTを利用して工数を削減しました。具体的には、以下の手順でコーディングを行いました。
作りたい機能を思い描く。
思い描いた機能を具体化する。
具体化した機能を表現する文章を作成する。
ChatGPTに投げる。
返ってきたコードを理解する。
コードを修正する。
自分の理解通りに動いたならOK。
1では、作りたい機能を漠然と思い浮かべます。
例えば、arXivの論文を収集するlambdaを作りたい。みたいな感じです。
2では、思い描いた機能を具体化します。
例えば、pythonを用いて、arXivのAPIを叩いて取得した論文をjsonファイルとしてS3に保存したい。
みたいな感じです。
3では、具体化した機能を文章として表現します。
例えば、次のような文章です。
あくまで個人の感想ですが、Aが終わったらB、Bが終わったらC、みたいな感じでフローを意識しながら箇条書きすると、かなり精度高くコーディングしてくれる印象があります。
その後、4、5、6でChatGPTに文章をなげ、返ってきたコードを理解、修正します。
ここで気をつけるべきは、返ってきたコードをそのまま使えるわけではないということです。あくまでも、「少し修正すればやりたいことができるコード」 が返ってくることが多いです。
なので、しっかりと理解し修正する工程は必要だなと思いました。
修正が終わったら、7で動作確認です。うまく動けばOKですが、エラーなどの想定と違う挙動が出たらデバッグを行います。デバッグについても、ググる必要がありそうなら、ググる前にChatGPTを利用しました。
キーワード検索機能にEmbeddingを用いる。
本アプリのキーワード検索機能にはEmbeddingを用いました。
Embeddingとは、意味情報を持つベクトルのことです。
具体的には、検索キーワードをEmbedding化し、キーワードのEmbeddingと類似度が高いEmbeddingを持つ論文を検索する仕組みを実装しました。
この仕組みにより、例えば、アブスト内に「医療」という単語が出てこなかったとしても、医療に関係するっぽいアブストの論文が検索できます。とあるキーワードに関連する論文をざっくりと探したい際に使える機能だと思います。
Embedding化には、OpenAIが提供しているEmbeddingsを使用しました。
また、類似度計算には、Metaが提供しているfaissを使用しました。
faissはEmbeddingの類似度計算によく用いられるライブラリで、高速なのが特徴です。(ただ、今回はそこまで大きなベクトルを扱うわけではないので、大きな恩恵があるわけではありません。)
実装は以下の記事がわかりやすく参考になりました!
終わりに
ChatGPTのようなLLMを用いることで、コーディングがかなり楽になったなぁと感じます。個人的に一番便利に感じた使い方は、「bulmaを使ってレイアウトを良さげに整えて」みたいなゆるい指示でCSSをつけてもらうことです。個人の勉強で作るアプリや、MVPならCSSはこれで十分だと感じました。
今後もLLMが使える場面では、積極的に使い倒していきたいと思います。