研究者のためのDiscord Bot「ThesisHerald」を作った!論文を自動配信&AI要約
研究者として論文を追いかけていると、「毎日どんどん新しい論文が出てきて追いつけない...」という悩みがつきものだ。そこで、最新論文を自動で配信してくれるDiscord Bot「ThesisHerald」を作ってみた。
プロジェクト情報
- GitHub: https://github.com/sserada/ThesisHerald
- 言語: Python 3.11+
- 主な技術: discord.py, arXiv API, Anthropic Claude API
来春からデータサイエンティストとして働く予定の技術オタク。
『知りたい』気持ちで質問を止められない、好奇心旺盛な学生。
なぜThesisHeraldを作ったのか
論文情報ってTwitterとかで流れてくるよね?わざわざBot作る必要あるの?
確かにTwitterやRSSフィードでも論文情報は得られるんだけど、問題がいくつかあるんだ。
まず、情報が散らばりすぎていて管理が大変。Twitterのタイムラインだと他の情報に埋もれちゃうし、RSSリーダーは開くのが面倒。それに、論文のアブストラクトは英語が多いから、内容を把握するのに時間がかかるんだよね。
たしかに!英語読むのしんどい...
だから、Discordという普段から使うプラットフォームで、自動的に新しい論文を通知して、しかもAIで要約してくれるBotがあったら便利だと思ったんだ。研究室のメンバーとも情報共有しやすいしね。
なるほど!チーム全体で最新論文をキャッチアップできるんだ!
ThesisHeraldの主な機能
で、このBotって何ができるの?
大きく分けて3つの機能がある。まず、毎日決まった時間に新しい論文を自動配信する機能。次に、AIを使った会話型の論文検索機能。最後に、論文の内容を多言語で要約する機能だ。
AI使ってるんだ!すごそう!
1. 自動配信機能
一番基本的な機能が、定期的な論文配信だ。arXivっていう論文アーカイブから、指定したカテゴリやキーワードに関連する新着論文を毎日取得して、Discordのチャンネルに通知する。
arXivって何?聞いたことあるけど...
arXiv(アーカイヴって読む)は、主に物理学、数学、コンピュータサイエンスなどの分野の論文を無料で公開しているプレプリントサーバーなんだ。査読前の論文も公開されていて、最新の研究をいち早くキャッチできるんだよ。
査読前!?それって信頼できるの?
良い指摘だね。確かに査読前だから、内容の正確性は完全には保証されていない。でも、研究の最先端を知るには最適な場所なんだ。実際、多くのトップ研究者が論文を投稿と同時にarXivにもアップロードしてる。
ThesisHeraldでは、arXivのカテゴリ(例えば、cs.AI=人工知能、cs.LG=機械学習など)を指定して、関連する論文だけを取得できるんだよ。
毎日配信って言ってたけど、時間は決まってるの?
デフォルトでは毎日午前9時に配信されるように設定してあるんだけど、これは設定ファイルで変更できる。それに、/notifyコマンドを使えば、手動でいつでも最新論文を取得することもできるんだ。
自分のペースで確認できるんだね!
2. 会話型検索機能
次に紹介したいのが、/askコマンドを使った会話型検索機能だ。これがこのBotの目玉機能と言える。
会話型検索って、どういうこと?
普通の検索だと、キーワードを入力して、ヒットした論文のリストが返ってくるよね。でも、会話型検索は違う。自然な質問文で聞けば、AIが関連する論文を探して、その内容を要約して答えてくれるんだ。
え!?論文の内容まで教えてくれるの!?
そうなんだ。例えば、「Transformerアーキテクチャの最新の改良手法は?」って聞くと、AIが関連する論文を検索して、その内容をまとめて答えてくれる。しかも、どの論文から情報を取ったかも教えてくれるんだよ。
それって、どうやって実現してるの?
Claude APIを使ったRAGシステムを実装してるんだ。
RAG?また難しい用語が...
ごめんごめん。RAGは「Retrieval-Augmented Generation」の略で、検索した情報を使ってAIが回答を生成する仕組みなんだ。簡単に言うと、「まずGoogle検索してから、その結果を見ながら答えを書く」っていう感じ。
具体的には、(1) ユーザーの質問を受け取る、(2) arXivとWeb検索で関連論文を探す、(3) 見つけた論文をClaudeに渡す、(4) Claudeが論文の内容を参照しながら回答を生成する、というプロセスだ。
なるほど!だから最新の論文の内容も答えられるんだね
その通り!AIだけだと学習データの範囲内でしか答えられないけど、RAGを使えば、最新の論文情報にもアクセスできるんだ。
3. 多言語要約機能
3つ目の機能が、論文の要約機能だ。/summarizeコマンドで論文のURLを指定すると、その論文の内容をAIが要約してくれる。
要約って、日本語でもできるの?
もちろん!7つ以上の言語に対応してるんだ。日本語、英語、韓国語、中国語、スペイン語、フランス語、ドイツ語など。設定ファイルで好きな言語を指定できる。
すごい!英語の論文を日本語で要約してもらえるんだ!
そうなんだ。論文のアブストラクトって、専門用語が多くて読むのに時間がかかるよね。要約機能を使えば、数秒で論文の概要を把握できるから、効率的に論文をスクリーニングできるんだよ。
でも、要約って精度はどうなの?間違った内容を要約されたら困るんじゃ...
良い指摘だね。確かに、AIの要約は100%正確とは限らない。だから、要約はあくまで「論文を読むかどうかの判断材料」として使うのがおすすめだ。興味がある論文は、必ず元の論文を読んで確認することが大切だよ。
それに、ThesisHeraldの要約では、元の論文のURLも一緒に表示されるから、すぐに原文を確認できるようになってるんだ。
技術スタックと実装のポイント
このBot作るのって難しかった?どんな技術使ってるの?
主にPython 3.11以上を使って開発してるんだ。Pythonを選んだのは、Discord Bot開発の定番ライブラリ「discord.py」が使えることと、AIやAPIとの連携が簡単だから。
discord.pyでのBot開発
Discord Botの本体は、discord.pyっていうライブラリで実装してる。これを使うと、スラッシュコマンド、メッセージ送信、スレッド作成なんかが簡単にできるんだ。
スラッシュコマンドって何?
Discordで「/」から始まるコマンドのことだよ。例えば、/askとか/summarizeみたいな。ユーザーが入力しやすいし、自動補完も効くから、使い勝手がいいんだ。
あ、ゲームのコマンドみたいなやつだ!
そうそう!discord.pyでは、@app_commands.command()というデコレータを使って、簡単にスラッシュコマンドを定義できる。例えば、こんな感じだ。
@app_commands.command(name="ask", description="Ask a question about research papers")
async def ask_command(interaction: discord.Interaction, question: str):
# 質問処理のロジック
await interaction.response.send_message("Searching for papers...")
async、await?何それ?
非同期処理っていう仕組みだよ。Discord Botは複数のユーザーからのリクエストを同時に処理する必要があるから、非同期処理を使って効率的に動かすんだ。
arXiv APIとの連携
論文情報を取得するには、arXiv APIを使ってる。これは無料で使えて、論文のメタデータや本文にアクセスできるんだ。
メタデータって何?
論文のタイトル、著者、アブストラクト、公開日、カテゴリなんかの情報だよ。本文じゃなくて、論文の「情報」って感じかな。
arXiv APIでは、カテゴリやキーワードを指定して検索できる。例えば、「cs.AI」っていうカテゴリで最新の論文を取得したり、「Transformer」っていうキーワードで検索したりできるんだ。
便利そう!でも、APIって難しくない?
arXiv APIは、RESTful APIっていう標準的な形式で提供されてて、使いやすいんだ。Pythonのrequestsライブラリを使えば、簡単にデータを取得できる。
ただし、一つ注意点がある。arXiv APIには、1回のリクエストで取得できる論文数に制限があるんだ。だから、大量の論文を取得する場合は、ページネーション(ページ分け)を使って、複数回リクエストする必要があるんだよ。
Anthropic Claude APIの活用
AIの部分は、Claude使ってるって言ってたよね?
そう、AnthropicのClaude APIを使ってる。ClaudeはGPTと並ぶ高性能なLLM(大規模言語モデル)で、特に長文の理解と要約が得意なんだ。
LLMって何?ChatGPTみたいなやつ?
そうそう、ChatGPTと同じ種類のAIだよ。LLMは「Large Language Model」の略で、大量のテキストデータを学習した、言語を理解して生成できるAIモデルのことなんだ。
ClaudeのAPIは、プロンプトを送ると、AIが生成したテキストを返してくれる。論文の要約や質問への回答生成に使ってるんだよ。
API使うのってお金かかるの?
うん、Claudeの場合、使った分だけ課金される従量課金制なんだ。トークン数(文字数みたいなもの)に応じて料金が決まる。論文の要約だと、1回あたり数円〜数十円くらいかな。
意外と安い!でも、使いすぎたら怖いね...
そうだね。だから、ThesisHeraldでは、環境変数でAPIキーを管理して、使いたい人だけが設定できるようにしてるんだ。それに、要約機能はオプションだから、APIキーなしでも基本機能(論文配信)は使えるよ。
Ryeによる依存関係管理
パッケージ管理は何使ってるの?
Ryeっていう比較的新しいパッケージマネージャーを使ってるんだ。
Rye?pip とか poetry じゃダメだったの?
pip や poetry も使えるんだけど、Ryeは Python のバージョン管理と仮想環境の管理が一つのツールでできて、セットアップが簡単なんだ。特に、複数のPythonプロジェクトを管理してる人には便利だよ。
Ryeを使うと、rye syncっていうコマンド一つで、必要な依存パッケージを全部インストールできる。それに、pyproject.tomlっていうファイルで依存関係を管理できるから、プロジェクトの再現性が高いんだ。
簡単にセットアップできるのはいいね!
実装で工夫した点
開発中に工夫したこととか、苦労したことってある?
いくつかあるよ。まず、論文の配信結果をスレッドで管理するようにしたのは、大きな工夫の一つだ。
スレッドベースの結果表示
最初は、検索結果や論文リストを普通のメッセージとして送信してたんだけど、複数の論文が一気に流れると、チャンネルが埋まっちゃうんだよね。
確かに!メッセージがどんどん流れちゃうと見にくいね
だから、メインのメッセージに対してスレッドを作って、そこに詳細な結果を投稿するようにしたんだ。例えば、「今日の新着論文:5件」っていうメインメッセージを送って、スレッドの中に各論文の詳細を書く感じ。
整理されてて見やすそう!
それに、スレッド内で議論もできるから、チームメンバーで「この論文面白そう!」みたいなコメントも残せるんだよ。
多言語対応の実装
多言語対応も工夫したポイントだ。最初は日本語だけで要約してたんだけど、英語圏のユーザーや、他の言語を使う研究者もいるから、設定で言語を選べるようにしたんだ。
どうやって多言語対応したの?
Claudeに送るプロンプトで、「この論文を日本語で要約してください」みたいに言語を指定するだけだよ。Claudeは多言語に対応してるから、指定した言語で要約を生成してくれる。
設定ファイル(.env)にTRANSLATION_LANGUAGE=jaみたいに書いておけば、自動で指定した言語で要約されるんだ。
めっちゃ簡単!AIすごい!
エラーハンドリングとリトライ機能
API連携では、エラーハンドリングもしっかり実装する必要があるんだ。ネットワークが不安定だったり、APIの制限に引っかかったりすることがあるからね。
API の制限って何?
多くのAPIには、「1分間に何回までリクエストできる」みたいなレート制限があるんだ。これを超えると、一時的にアクセスできなくなっちゃう。
えー、それって困るね
だから、エラーが起きたら自動でリトライする機能を実装してるんだ。一定時間待ってから、もう一度リクエストを送る感じ。それでもダメなら、ユーザーにエラーメッセージを表示するようにしてる。
セットアップ方法
このBot、自分でも使ってみたい!どうやってセットアップするの?
セットアップは意外と簡単だよ。大きく分けて、(1) Discord Botの作成、(2) プロジェクトのクローンとインストール、(3) 環境変数の設定、(4) Botの起動、という4ステップだ。
1. Discord Botの作成
まず、Discord Developer Portalっていうサイトで、Botを作成する必要があるんだ。
Developer Portal?難しそう...
大丈夫、手順通りにやれば簡単だよ。
- Discord Developer Portal(https://discord.com/developers/applications)にアクセス
- 「New Application」ボタンをクリック
- Botの名前を入力
- 左メニューから「Bot」を選択
- 「Add Bot」をクリック
- 「Token」をコピー(これが重要!)
このTokenが、Botを動かすための「鍵」みたいなものなんだ。
Tokenって、誰かに見られたらダメなやつ?
その通り!Tokenが漏れると、他の人があなたのBotを勝手に操作できちゃう。だから、絶対にGitHubとかに公開しちゃダメだよ。
2. プロジェクトのクローンとインストール
次に、GitHubからプロジェクトをクローンして、必要なパッケージをインストールする。
git clone https://github.com/sserada/ThesisHerald.git
cd ThesisHerald
rye sync
rye syncで、必要なPythonパッケージが全部インストールされるんだ。
一行でインストールできるんだ!便利!
3. 環境変数の設定
次に、.envファイルを作って、設定を書き込む。
cp .env.example .env
.env.exampleっていうサンプルファイルをコピーして、.envを作る感じだね。
その中に、さっきのTokenを書くの?
そうそう!.envファイルには、こんな感じで設定を書くんだ。
DISCORD_BOT_TOKEN=your_discord_bot_token_here
ANTHROPIC_API_KEY=your_anthropic_api_key_here
TRANSLATION_LANGUAGE=ja
ARXIV_CATEGORIES=cs.AI,cs.LG
DISCORD_BOT_TOKENには、さっきコピーしたTokenを貼り付ける。ANTHROPIC_API_KEYは、AI機能を使いたい場合だけ必要だよ。
Anthropic API Keyって、どこで手に入るの?
Anthropicの公式サイト(https://www.anthropic.com/)でアカウントを作って、API Keyを発行できる。ただし、クレジットカードの登録が必要で、使った分だけ課金される仕組みだよ。
もし、AI機能を使わないなら、ANTHROPIC_API_KEYは設定しなくてもOK。基本的な論文配信機能は使えるからね。
4. Botの起動
最後に、Botを起動するだけだ。
rye run python -m thesisherald.main
これで、Botが起動して、Discordサーバーに接続されるんだ。
わくわく!ちゃんと動くかな?
Botが正常に起動すると、ターミナルに「Logged in as ThesisHerald#1234」みたいなメッセージが表示されるはずだよ。Discordサーバーでも、Botがオンライン状態になってるのが確認できる。
使い方の例
実際にどうやって使うの?コマンドとか教えて!
いくつか基本的なコマンドを紹介するね。
毎日の論文配信
Botを起動すると、デフォルトで毎朝9時に新着論文が自動配信される。特に操作は必要ないよ。
楽ちん!毎朝起きたら論文が届いてるんだ
そうそう!手動で最新論文を取得したい場合は、/notifyコマンドを使う。
/notify
これで、即座に最新論文が配信されるんだ。
会話型検索
/askコマンドで、論文について質問できる。
/ask Transformerの最新の改良手法は?
こんな感じで自然な質問文を入力すると、AIが関連論文を検索して、要約して答えてくれるんだよ。
すごい!普通に話しかけるだけでいいんだ!
論文の要約
/summarizeコマンドで、特定の論文を要約できる。
/summarize https://arxiv.org/abs/2304.12345
arXivの論文URLを指定すると、数秒で要約が生成されるんだ。
日本語で要約されるの?
そう、.envファイルで設定した言語で要約される。日本語ならTRANSLATION_LANGUAGE=ja、英語ならTRANSLATION_LANGUAGE=enって設定すればOKだよ。
今後の展望
このBotって、今後どう進化させるつもり?
いくつか追加したい機能があるんだ。まず、週次の研究ダイジェスト機能。毎週末に、その週に出た論文の中で特に注目すべきものをまとめて配信する感じ。
週末にまとめて確認できるんだ!忙しい人に良さそう
次に、論文の比較機能も追加したいと思ってる。複数の論文を比較して、「この手法とあの手法、何が違うの?」みたいな質問に答えられるようにしたい。
それから、検索フィルタリングの強化も考えてる。著者名、会議名、公開日の範囲なんかで絞り込めるようにしたいんだ。
他には?
パフォーマンスモニタリング機能も追加したいね。どのコマンドが一番使われてるか、平均応答時間はどれくらいかとか、使用状況を把握できるようにしたい。
あとは、他の論文アーカイブへの対応も検討してる。今はarXivだけだけど、PubMed(医学系)やbioRxiv(生物学系)にも対応できたら、もっと幅広い分野の研究者に使ってもらえると思うんだ。
どんどん便利になりそう!
開発を通じて学んだこと
このプロジェクトを通じて、いくつか重要なことを学んだんだ。
どんなこと?
まず、APIとの連携の重要性だね。Discord API、arXiv API、Claude API、それぞれ使い方が違うから、ドキュメントをちゃんと読むことが大切だって実感した。
次に、非同期処理の難しさ。複数のユーザーからのリクエストを同時に処理するには、async/awaitをちゃんと理解する必要がある。最初は同期処理で書いてたんだけど、パフォーマンスが悪くて、非同期に書き直したんだ。
書き直すの大変だったんじゃない?
うん、結構大変だった。でも、書き直したおかげで、複数のコマンドを同時に実行しても、サクサク動くようになったんだよ。
あとは、エラーハンドリングの大切さも学んだ。本番環境では、予想外のエラーがたくさん起きる。ネットワークエラー、APIのレート制限、不正な入力...全部に対応しないと、ユーザーが困っちゃうからね。
たくさん学べたんだね!
それから、ドキュメントを書くことの重要性も実感した。自分だけが使うならいいけど、他の人にも使ってもらいたいなら、README.mdやセットアップ手順をちゃんと書かないといけない。
オープンソースプロジェクトとして公開することで、他の開発者からフィードバックをもらえるのも良い経験になったよ。
まとめ
ThesisHeraldは、研究者のための論文配信・要約Botとして、arXiv APIとAIを活用して開発した。自動配信、会話型検索、多言語要約という3つの主要機能によって、効率的に最新論文をキャッチアップできるようになってるんだ。
技術的には、discord.pyでのBot開発、arXiv APIとの連携、Claude APIを使ったRAGシステムの実装など、実践的なスキルを身につけることができた。
このBot、誰でも使えるの?
もちろん!GitHubで公開してるから、誰でも自由に使える。ライセンスはMITだから、商用利用も含めて自由に使ってOKだよ。
研究室やチームで論文情報を共有したい人、最新の研究動向を追いかけたい人には、特におすすめだ。セットアップも簡単だから、ぜひ試してみてほしい。
面白そう!私も使ってみる!
ありがとう!バグ報告や機能リクエストも大歓迎だから、GitHubのIssueで気軽に連絡してね。みんなで育てていけるプロジェクトにしていきたいと思ってるんだ。
参考リンク
- GitHub: https://github.com/sserada/ThesisHerald
- Discord Developer Portal: https://discord.com/developers/applications
- arXiv API: https://arxiv.org/help/api/
- Anthropic Claude: https://www.anthropic.com/
- discord.py Documentation: https://discordpy.readthedocs.io/