LLM+OCRでほぼ全自動の論文解説XBot作成した
モチベーション
最近、論文解説系のbotをよく見かけるようになりましたよね。
私もこれを見て、「LLMを使えばある程度自動で作れるんじゃない?」と思ったんです。
でも、よく考えてみると、LLMだけだと文章の解説しかできないんですよね。
論文解説で本当に大事なのは、論文の図表(figure)などの視覚的な情報だと私は思っています。
それがないと、いくら文章だけ説明されても、イメージがつかみにくいですからね。
なので最初は、PDFから画像を抽出するために、<XObject>タグなどを使って図表を取得しようとしたんです。でも、arXivの論文だとこの方法が全然うまくいかなくて、がっかりしちゃいました。
諦めかけていたところ、Unstructuredというライブラリを発見しました。このライブラリを使えば、OCRを用いて図表を抽出することができます。
そこで、思い切って自分で論文解説botを作ってみることにしました。
LLMとUnstructuredを組み合わせれば、図表を含めた論文解説botが作れるのではないかと考えたからです。構成は以下です。
実際に作ってみた結果、ある程度の論文解説botを作ることができました。
本記事では、そのBotの紹介と工夫した点について紹介していきます。
作ったBotの紹介
作ったXのBotはこれです!
名前は「ぽっぽ博士」にしました。なんとなくいい感じの名前だと思いません?
このBotは、arXivの論文を要約と図表(figure)で解説します。
ポストの内容はLLMが作成し、図表の切り抜きはOCRでやっています。
主にLLM関連の論文をピックアップして投稿しています。投稿する論文は、私が自分の論文ストックから選んでいます。
論文のURLをBotに渡すだけで、ポストの内容作成から図表の切り抜き、そしてポストまで全部自動でやってくれちゃいます。
投稿のタイミングは、私が朝、お昼、夕方で投稿するように意識して選んでいます。
今後は、ツイートのインプレッション(閲覧数)などからBotが自動で論文を選定して、投稿できるようにしたいと思っています。
使用した技術スタック
- 言語:Python
- LLM:Claude3 Opus
- OCR:Unstructured
- フレームワーク/ライブラリ
- LangChain: Claude3つかってポスト用の論文要約を作成させた
- tweepy: ポストするためのapiを簡単に操作するために使った。
- pillow: 切り抜いたfigureからはcaptionが抜けているので、figureにキャプションを書き込むように使った。
- Unstructured: figureの切り抜きをするために使った。
- 以下の記事で使い方書いています。
本筋ではないですが、パッケージ管理にはryeを使用しています。
Poetry+pyenvでなんとかやってましたが、ryeの方がpythonバージョン管理がしやすかったです。
良すぎてpyenv消しました。
rye使う前までは、poetry最強って気持ちでしたが、今はryeの方がいい感じだと思ってます。
苦戦した点・どうやって解決したか
140字制限問題
- 苦戦した点
XのAPIでは140字しか受け付けてくれない。Premiumに入ってもAPIは別みたい。普通にbasicプランに年間契約してしまって損した。まあbasicは高くないので、いいんですが。事前にちゃんと調べなかった自分が悪いですね
Your Tweet text is too long. For more information on how Twitter determines text length see https://github.com/twitter/twitter-text.
これ最初は140字以内で要約してもらうしかないかあーーって思っていました。
でも140字で論文解説って情報量絶対入らないんですよね。
- 解決方法
なので、500字程度で要約させて140時で分割することにしました。具体的には以下です。
- まず、論文を500字程度で要約させる。
- 次に、要約した内容を140字ごとに分割する。
- 最後に、分割した内容をリプライとして順番に送信する。
140字では収まりきらない論文の要約も、XのAPI経由で投稿できるようになりました!
確かに、ちょっと読みにくいので他の解決策を探したいと思います。
分割してリプライする方式は以下のような感じで見えます!
抜き出したFigureにキャプションが入ってない問題
- 苦戦した点
Unstructuredというライブラリを使って論文から図表を抽出しても抜き出したFigureの中にキャプションが含まれていないんです。
Unstructuredでキャプションを文字として抽出することはできるのですが、図表とキャプションを紐付けるのは一苦労です。さらにはFigureの中にキャプションを書き込まないといけません。
- 解決方法
解決策としては、
- ルールベースでFigureとキャプションを紐付け
- Figureの画像を下に白画像を貼り付けその上にキャプションを書き込む
Pillowで画像処理してFigureの中にキャプションをくっつけて見ました。いい感じです。
(referenced by https://arxiv.org/pdf/2402.05120.pdf)
紐付けの方法については、こちらの記事で詳しく触れているので、ぜひチェックしてみてください。
一週間運用してどれぐらいフォロワーが伸びた?
今はなんとフォロワー1人。しかも無差別にフォローするタイプのアカウントです。
結論から言うと全く伸びませんでした。
伸びないどころか、Xからスパム疑惑をかけられる始末。
疑惑は抗議して解消されましたが、それから全然インプレッションも伸びなくなりました。
内容も親しみが出るように関西弁にしたりしたのですが、全然でした。
以下あたりが原因なのかなと思ったりしています。
- 投稿内容に違和感がある
- 投稿される画像の切り抜きが丁寧ではない時がある
- Botっぽい
気長に修正して解決していこうと思います。
今後の方針
これからもアカウントの運用は継続していこうと思います。
それにあたって以下の方針で改善していきたいと思っています。
- 現状要約内容を単に140字で区切るだけだと結構読みづらいので、プロンプトチューニングで140字づつで、意味のある区切りの文章にする。
- インプレッションの数を測って、Xユーザーが気になってるものの論文を探すようにする。
- 上記ができたらサーバーにのせてbotを完全自動化する
この辺りはやりたいです。
最後に
こっちがわたしのXのアカウントやで。よかったらフォローして!
@hudebakonosoto
Discussion