ChatGPT を使ってちょうど読んでいた論文を3行まとめにしてもらった

ChatGPTの使い方よりも目的の文章を取得することが難しいこともあるというお話です。
2023.03.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ChatGPT は論文要約にも有効と聞いていたので OpenAI の API の勉強がてら試してみました。いい感じに要約できるのか?を試してみます。

ゲノミクス分野のクラウド利用動向を調査するために以下の論文を読んだところでした。クラウド活用の動向を知れて面白かったのでご興味あれば是非リンク先をご確認ください。

適時調べつつ時間かけてメモを取っていたところ、最終的にメモが長くなり3行まとめが欲しくなりました。OpenAI の API を使ったことがなかったので3行まとめを出力するために使ってみたところ、個人的には満足な3行まとめが仕上がりましたのでその過程を紹介します。

1. NHGRIのGenomic Data Science Analysis, Visualization, and Informatics Lab-space(AnVIL)は、統合されたコンピューティング環境を提供しており、多くの人々が共有するためのゲノムデータのストレージ、管理、分析ができます。
2. AnVILは、従来のデータ共有モデルを逆転させ、データ移動を必要とせず、セキュリティ対策も実施しています。AnVILを使用することで、共有コンピューティングリソースを利用して、スケーラブルな研究が可能になります。
3. AnVILは、Terra、Gen3、Galaxy、RStudio/Bioconductor、Dockstore、Jupyterなどのコンポーネントを搭載しており、共有データセットにもアクセスできます。今後も、AnVILは、相互運用性、責任あるデータ共有などの新機能を実装していく予定です。

3行まとめをお願いしてみた

真っ先に思いついたのは「Web スクレイピングして文章を取得して OpenAI API に投げれば目的達成」の予定だったのですが、論文掲載元の PubMed Central(PMC)の利用規約を確認すると Web スクレイピングはダウンロードの制限事項に抵触すると思われるので控えます。代替えのアクセス手段の案内もありましたが、そちらの規約も確認すると時間がかかりそうなのでプログラマブルに論文へのアクセスの道は早々に諦めました。

今回使用する OpenAI API モデルはgpt-3.5-turboです。論文全文を一度に要約するのは文字数(トークン)の関係で難しそうです。 ですので、論文冒頭にサマリーが用意されていましたので、サマリーの文章を対象に3行まとめへ変換してみることにしました。せっかく著者の方がサマリーを用意してくださっているのに3行でまとめとは横着し過ぎな気もしますがやっていきます。

論文へのプログラマブルなアクセスは規約確認が大変で諦めたため、シンプルにテキストをコピーしてスクリプトへ渡すことにします。当初の計画とは大きく方向転換し、もはや API を使う理由がなくなってしまったのですが API の使い方も学びたいのでやっていきます。

OpenAI API の準備

以下の記事を参考に Python で実行環境を用意しました。API の基本的な使い方は以下の記事だけで試せるようになったのでオススメです。

サンプルスクリプト

引数で要約したいテキストを渡して、設定した条件のもと ChatGPT3.5 による要約をお願いしてみました。せっかくなので日本語への翻訳を一緒にやってもらいます。1行あたりの文字数の制限を少なくしてしまうといまいち内容がわからなくなったため、ある程度の文字数は出力してもらう必要があるように感じました。

summary.py

import os
import sys
import openai

# APIキーの設定
openai.api_key = os.environ["OPENAI_API_KEY"]

system_parameter = """```
あなたは生物学者です。以下の制約条件と、入力された文章をもとに最高の要約を出力してください。

制約条件:
・文章は簡潔にわかりやすく。
・箇条書きで3行で出力。
・1行あたりの文字数は80文字程度。
・重要なキーワードは取り逃がさない。
・要約した文章は日本語へ翻訳。

期待する出力フォーマット:
1.
2.
3.

```"""
args = sys.argv
text = args[1]

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "system", "content": system_parameter},
        {"role": "user", "content": text},
    ],
)
print(response.choices[0]["message"]["content"].strip())

プロンプトの設定は以下の記事を参考に試行錯誤した結果、現在の設定に落ち着きました。ときたま翻訳されず英語のまま出力されてしまうのでプロンプトの使い方が鍵なんですね。

スクリプト実行

引数でサマリーの文章をそのまま渡しています。文字数が多いため省略します。

$ python summary.py "The NHGRI Genomi...(略)"

いい感じに要約できています。内容が内容なので誰にでもわかる説明は難しいとは思うのですがお見事です。個人的にはゲノムデータ共有方法の考え方を改めた点が印象的でした。その点も2行目できちんと拾えています。この点は論文内で画像付きで紹介されていますのでご興味あればご確認いただければ幸いです。あとは各コンポーネント名も拾えているのは高評価です。自分用のメモの3行まとめには充分な出来栄えです。

実行結果

1. NHGRIのGenomic Data Science Analysis, Visualization, and Informatics Lab-space(AnVIL)は、統合されたコンピューティング環境を提供しており、多くの人々が共有するためのゲノムデータのストレージ、管理、分析ができます。
2. AnVILは、従来のデータ共有モデルを逆転させ、データ移動を必要とせず、セキュリティ対策も実施しています。AnVILを使用することで、共有コンピューティングリソースを利用して、スケーラブルな研究が可能になります。
3. AnVILは、Terra、Gen3、Galaxy、RStudio/Bioconductor、Dockstore、Jupyterなどのコンポーネントを搭載しており、共有データセットにもアクセスできます。今後も、AnVILは、相互運用性、責任あるデータ共有などの新機能を実装していく予定です。

3行まとめを出力してもらっても難しいのは内容が正しいかの判定です。私は一度目を通しているので「あー、そうね、そう書いてあったはよく短くまとめたわ」と思えるのですが、目を通していないと本当に書いたあったことを要約して3行まとめになっているのか不安です。

ですが、論文掲載サイトの規約を確認して問題なければ、新着論文を要約か3行まとめを自動出力するように仕込んおき、興味のある内容だったら本文確認してみる運用にすると日々の時間節約に良さそうです。

またしても横着し過ぎな気もするなと思ったのですが、すでに実装されている方がいらっしゃるので同じ気持ち方はいらっしゃるようでした。

上記の記事はarXivで公開されている論文を対象にしていました。こちらにも biology の論文が公開されているようなので、規約さえ確認すれば上記の記事を参考に実装は容易かと思います。

おわりに

本当は AWS と絡めて Lambda でスクレイピングしてから要約して Slack へ出力的な内容にしたかったのですが、規約を確認するのが大変で諦めてしまったので次回はもう少し複雑なものをやっていきたいです。 OpenAI API の使い方を学ぶついでにちょうどやりたかった要約を ChatGPT に任せて、プロンプトの設定を触って遊んでいたら自分の苦手な要約作業が終わってしまい、時代の流れを感じます。