ローカルLLMを活用!論文読み会の候補選択をもっと効率的に
本記事は、Japan Digital Design Advent Calendar 2024 の4日目の記事になります。
はじめまして、三菱UFJフィナンシャル・グループ(以下MUFG)の戦略子会社であるJapan Digital Design(以下JDD)でMUFG AI Studio(以下M-AIS)に所属し、データサイエンティストをしている林です。
今回はローカルLLMを活用した業務効率化に向けての取り組みについて、紹介したいと思います。
はじめに
データサイエンティストが集まるM-AISでは、学会の最新トレンドをキャッチアップするため定期的に論文読み会を開催しています。
論文読み会の開催において、最初の課題は「どの論文を読むか」の選定です。事前に誰がどの論文を読むか決める必要があるのですが、多くの論文はタイトルのみだと内容が分かりにくく、論文の内容を確認するためにアブストなどを読む必要があるため、論文選択に時間を費やしてしまう傾向がありました。それを解消するために、読みたい論文をより効率的に選択できるような仕組みを、ローカルLLM※を活用して、部内で開発しました。
この記事では、開発した仕組みの概要について説明していきます。
今回ローカルLLMで実現したいことは下記2つです:
① 論文アブストの要約
② 要約したアブストの英日翻訳
実現したいことの例を1つ挙げると、このようなイメージになります↓
事前準備
GPU性能が高めの端末(最低限はわからないのですが、筆者はM3 Pro メモリ36GBのMacbookを使いました)
pythonが動く環境(筆者は3.12の環境を使用してます)
Ollama※のインストール
いくつか選択肢はあると思いますが、Ollama※はモデルの網羅性が高く、インターフェイスが1番シンプル且つ実装が簡単だったので、今回はOllama※を通じてローカルLLMを使います。
データ準備
ICLR学会に投稿された論文アブストを抽出するために、今回はOpenReviewのAPIを使います。
下記のコマンドで、OpenReview APIをインストールします:
pip install openreview-py
OpenReviewのpythonライブラリをインストール後、ライブラリをimportし下記のようにclientを設定します。
usernameとpasswordは空欄で大丈夫です。
import openreview
clientv2 = openreview.api.OpenReviewClient(
baseurl='https://api2.openreview.net',
username="", #空欄で大丈夫です
password="" #空欄で大丈夫です
)
ICLR 2024の情報を抽出したい場合は、venueidを下記のように設定します:
venue_id = 'ICLR.cc/2024/Conference'
submissions = clientv2.get_all_notes(content={f'venueid':{venue_id}}, details='directReplies')
データ抽出方法の詳細については公式ドキュメントのHow to Get All Submissions を参照してください。ICLR以外でも、OpenReview上に載っている学会であれば、venue_idの部分のみ編集することで抽出可能です。
submissionの中身をdataframeへ変換した結果が↓になります。
論文のタイトル、キーワード、評価など論文に関する情報を抽出することができました!論文評価(Ratings)やレビューの字数など分析すると面白そうなデータが沢山ある中、今回欲しいアブスト(abstract)のデータも見事抽出することができました。
次に、実際にローカルLLMを使って抽出した論文のアブストを要約していきたいと思います。
ローカルLLMによるアブスト要約
Ollama上にはllama、mistralなどと有名なモデルが多く公開されています。
今回は2024年7月に公開されたGoogle社の最新軽量モデルGemma 2を使います。公式発表によると、軽量ながらサイズが2倍以上のモデルに匹敵する、むしろ超える精度を出すことができる性能を持つモデルだそうです。
Ollamaをインストーラーでインストールした後、terminalで下記のコマンドを打つと、Ollamaからgemma 2のモデルをダウンロードすることができます:
% ollama pull gemma2
無事ダウンロードされたか確認するために、下記のコマンドでgemma 2を起動し動作確認を行います:
% ollama run gemma2
gemma 2と会話してみます、あなたは誰?who are youと聞いてみます:
I am Gemma ... と問題なく動作しているのを確認できました。
それではgemma 2 にアブストの要約を行なってもらいましょう。
今回はLLMアプリを構築するためのフレームワークとして、LangChain※を使用します。
langchain_communityのpythonライブラリを用いることで直接Ollamaのモデルを読み込むことができます。下記のコマンドでライブラリをインストールし、モデルを読み込みます:
pip install langchain-community
モデルを読み込む:
from langchain_community.llms import Ollama
llm = Ollama(model="gemma2")
要約を実行してもらうためのプロンプトを設定します:
from langchain_core.prompts import ChatPromptTemplate
prompt_translate = ChatPromptTemplate.from_messages(
[("system", "You are a helpful assistant that summarizes the text into a paragraph, no more than 50 words."),
("human", "{context}")]
)
最後に要約を実行してもらいます:
abstract = "要約したい論文のアブスト"
chain_translate = prompt_translate | llm
summary = chain_translate.invoke({"context": abstract})
print(summary) #要約の出力
試しに、こちらの論文のアブストを要約させてみました:
元のアブストと比べると、文字数が明らかに減少したのが分かります。
今回はかなりシンプルなプロンプトで要約を行ってもらいましたが、より細かく指示を与えることでもう一段精緻に要約することができるかもしれないです。
ちなみにですが、推論速度を計測してみた結果、Gemma 2の推論速度はかなり優秀で、1件要約するのに要する時間は約4秒程度でした(筆者はM3 Pro 36GBのMacbook Proを使っています)。
要約したアブストの英日翻訳
より論文内容を理解しやすくするため、先ほど要約したアブストを日本語へ翻訳していきます。
先ほどの要約と比べて実行手順に大きな変化はありません、唯一変更したのはプロンプトの部分です:
prompt_translate = ChatPromptTemplate.from_messages(
[("system", "You are a helpful assistant that translates English to Japanese. Please only include translated text in the output."),
("human", "{context}")]
)
同じ例で翻訳を実行させてみました:
試しにmistralのモデルで同じ翻訳タスクを与えてみたのですが、違和感がある日本語が出力されていました。一方、Gemma 2は多言語のタスク向けに作成されていないにも関わらず、訓練データに多言語データが含まれているおかげなのか、より自然な日本語が出力されてました。
最後のステップとして、上記で説明した一連の処理を自動的にループ実行する仕組みを構築しました。ローカルLLMによる要約と翻訳を自動で行えるようにし、ICLRの論文リンクなど有用の情報も含めて同じExcelへ一括出力します。どの論文を読むか、日本語のアブスト要約を参考にすることでより効率的に選定できることができるようになります。
まとめ
今回はローカルLLMを活用して、論文選択を効率化してみました。
最近のローカルLLMはオンラインのLLMに匹敵する高い精度を持ち、実験や実装も気軽にできるようになりましたので、機会があれば是非ローカルLLMを活用し、新しいアイデアや取り組みに挑戦してみてください。
以上、林でした。
最後までご覧いただきありがとうございました。
Japan Digital Design株式会社では、一緒に働いてくださる仲間を募集中です。カジュアル面談も実施しておりますので下記リンク先からお気軽にお問合せください。
この記事に関するお問い合わせはこちら
M-AIS
Yuichi Hayashi