🤖

LLM+OCRでほぼ全自動の論文解説XBot作成した

2024/04/23に公開

モチベーション

最近、論文解説系のbotをよく見かけるようになりましたよね。
私もこれを見て、「LLMを使えばある程度自動で作れるんじゃない?」と思ったんです。
でも、よく考えてみると、LLMだけだと文章の解説しかできないんですよね。
論文解説で本当に大事なのは、論文の図表(figure)などの視覚的な情報だと私は思っています。
それがないと、いくら文章だけ説明されても、イメージがつかみにくいですからね。
なので最初は、PDFから画像を抽出するために、<XObject>タグなどを使って図表を取得しようとしたんです。でも、arXivの論文だとこの方法が全然うまくいかなくて、がっかりしちゃいました。
諦めかけていたところ、Unstructuredというライブラリを発見しました。このライブラリを使えば、OCRを用いて図表を抽出することができます。
そこで、思い切って自分で論文解説botを作ってみることにしました。
LLMとUnstructuredを組み合わせれば、図表を含めた論文解説botが作れるのではないかと考えたからです。構成は以下です。

実際に作ってみた結果、ある程度の論文解説botを作ることができました。
本記事では、そのBotの紹介と工夫した点について紹介していきます。

作ったBotの紹介

作ったXのBotはこれです!
https://twitter.com/teach_about_pap

名前は「ぽっぽ博士」にしました。なんとなくいい感じの名前だと思いません?
この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の切り抜きをするために使った。
      • 以下の記事で使い方書いています。

https://zenn.dev/yamada_quantum/articles/17aff55dedbaf1

本筋ではないですが、パッケージ管理には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時で分割することにしました。具体的には以下です。

  1. まず、論文を500字程度で要約させる。
  2. 次に、要約した内容を140字ごとに分割する。
  3. 最後に、分割した内容をリプライとして順番に送信する。

140字では収まりきらない論文の要約も、XのAPI経由で投稿できるようになりました!
確かに、ちょっと読みにくいので他の解決策を探したいと思います。
分割してリプライする方式は以下のような感じで見えます!

抜き出したFigureにキャプションが入ってない問題

  • 苦戦した点

Unstructuredというライブラリを使って論文から図表を抽出しても抜き出したFigureの中にキャプションが含まれていないんです。
Unstructuredでキャプションを文字として抽出することはできるのですが、図表とキャプションを紐付けるのは一苦労です。さらにはFigureの中にキャプションを書き込まないといけません。

  • 解決方法

解決策としては、

  1. ルールベースでFigureとキャプションを紐付け
  2. Figureの画像を下に白画像を貼り付けその上にキャプションを書き込む
    Pillowで画像処理してFigureの中にキャプションをくっつけて見ました。いい感じです。

    (referenced by https://arxiv.org/pdf/2402.05120.pdf)

紐付けの方法については、こちらの記事で詳しく触れているので、ぜひチェックしてみてください。
https://zenn.dev/yamada_quantum/articles/17aff55dedbaf1#unstructuredを使った図・テーブル・キャプション抽出を実装

一週間運用してどれぐらいフォロワーが伸びた?

今はなんとフォロワー1人。しかも無差別にフォローするタイプのアカウントです。
結論から言うと全く伸びませんでした。
伸びないどころか、Xからスパム疑惑をかけられる始末。
疑惑は抗議して解消されましたが、それから全然インプレッションも伸びなくなりました。
内容も親しみが出るように関西弁にしたりしたのですが、全然でした。
以下あたりが原因なのかなと思ったりしています。

  • 投稿内容に違和感がある
  • 投稿される画像の切り抜きが丁寧ではない時がある
  • Botっぽい

気長に修正して解決していこうと思います。

今後の方針

これからもアカウントの運用は継続していこうと思います。

それにあたって以下の方針で改善していきたいと思っています。

  • 現状要約内容を単に140字で区切るだけだと結構読みづらいので、プロンプトチューニングで140字づつで、意味のある区切りの文章にする。
  • インプレッションの数を測って、Xユーザーが気になってるものの論文を探すようにする。
  • 上記ができたらサーバーにのせてbotを完全自動化する

この辺りはやりたいです。

最後に

こっちがわたしのXのアカウントやで。よかったらフォローして!
@hudebakonosoto

https://twitter.com/hudebakonosoto

Discussion