LLM x Slack x Notion で論文インプットを効率化し、社内ナレッジ蓄積もできるようにした話
はじめに
株式会社 neoAI の大坂洋豊です。東京大学に在学中で、松尾・岩澤研究室に所属しています。AI ソリューション事業部として、プロジェクトマネジメントを行いながら、研究開発組織 neoAI Research として先端技術の実践に取り組んでいます。
今回は、弊社の Slack 上で論文のインプットを効率化するために開発した LLM Bot についてご紹介します。開発したのは2023年で、当時は NotebookLM のようなサービスがまだ存在しなかったため、社内では論文の概要をスピーディーに把握できる点で重宝されていました。また、その要約結果を社内のデータベースに蓄積できるという機能もあるため、弊社のナレッジ基盤を支えている存在でもあります。
AI ソリューション事業部についてはこちらを参照ください。
背景と課題
論文を読む文化の重要性
AI ソリューション事業部では、常に最新の技術動向や研究成果を追いつつも、クライアントに対して適切なソリューションを提供する必要があります。論文は、技術の根幹を成す知識や学術的な裏付けを持っているため、情報源として非常に重要です。しかし、実際に論文を読み込むにはさまざまな壁があり、そのままでは社員全体へのインプットが十分に行き届かないという現実がありました。
課題①:情報の膨大さ
-
多すぎる選択肢
最新の研究は日々発表され、数多くの論文が存在します。それぞれのメンバーが、定常業務に加えて、どの論文を読むべきか、どれが自分たちにとって有用なのかを判断して論文を読むのは、非常に大きな負担になっていました。 -
専門性の高さ
論文の内容は高度な専門用語や複雑な理論が含まれており、読み進めるのに集中力と時間を要します。
https://arxiv.org/pdf/2210.00881 より
AI に関する論文の発行数は2020年に入ってから急速に増加しています。
課題②:読むこと自体のハードル
-
時間の制約
日常業務やプロジェクトが忙しい中、じっくりと論文を読む時間をそれぞれのメンバーが生み出すのは困難でした。会社としても、キャッチアップに時間をかけすぎて、社会への実装が遅れるというのは本意ではありません。 -
理解の難しさ
専門的な内容が多いため、初学者や異なる分野のメンバーには理解が難しく、単に読むだけでなく、その内容を議論・共有するハードルも高くなっていました。
AI ソリューション事業部では、喫緊の課題解決に注力することが前提となる中、AI の最先端技術をバリューとして事業を展開する弊社においては、メンバー全員が論文から得られる知見を効率的に収集することで、より高度な提案や実装に繋げることができると考えています。
解決策:LLM Bot の開発
こうした背景を受け、「論文の URL を Slack に投稿するだけで、タイトル、要約、さらには関連する Q&A を自動生成し、会社全体でシェアできる仕組み」を作ることを発想しました。
この仕組みにより、メンバーは膨大な論文情報に圧倒されることなく、その Slack チャンネルやデータベースを見ることで、効率的に知識を吸収できるようになります。
Bot の特徴
-
自動要約
論文の全文から重要なポイントを抽出し、短い要約として提示します。これにより、時間のないメンバーでも論文の概要を瞬時に把握できます。 -
Q&A 生成
要約だけでなく、論文の内容に基づいた質問と回答を生成することで、疑問点の解消や議論のきっかけを提供します。 -
統合された情報共有
Slack 上で直接やり取りが完結するだけでなく、生成した情報は Notion に自動登録され、後からの参照や共有が容易になります。
実際に使用されている場面はこんな感じです。社内では「neoSearcher」という名称で親しまれています。
Magentic-One を投げてみました
このように、メタデータが付与された上で、Notion のデータベースに自動で蓄積されます。
社内の Notion に蓄積された様子
使用ツール
以下のツールを組み合わせてシステム全体を構築しました。それぞれの選定理由を簡単に書いておきます。
AWS Lambda
AWS Lambda は、イベント駆動型でコードを実行できるサーバーレス環境です。Slack からのイベントをトリガーとして Lambda 関数が起動し、必要な処理を高速かつスケーラブルに実行します。今回はそこまで大きなシステムではないため、簡単に作成できる AWS Lambda を採用しました。
Slack API
Slack API を利用して、ユーザーからのメッセージ(app_mention など)を Lambda に転送し、Bot の各種動作をトリガーします。Slack 上で Bot の応答を投稿するだけでなく、対話形式でのやり取りも可能です。
Notion API
Notion API は、外部アプリケーションやサービスが Notion のデータにアクセスし、操作することを可能にするインタフェースです。操作も簡単で、python パッケージも提供されています。
構成・処理フロー
以下は、LLM Bot の構成図と、処理フローをシンプルに示したシーケンス図です。
Bot の開発手順
Slack API x AWS Lambda の Slack Bot 開発に関しては、すでに多くの記事が出ているため、そちらを参考にしました。少し前の記事になりますが、個人的には こちらの記事 がわかりやすかったです。
以下の手順で進めていきます。記事に載っているところに関しては簡単な説明にとどめています。
各ツールのセットアップ
【AWS 側の準備】
1. AWS Lambda から関数を作成
AWS マネジメントコンソールから新しい Lambda 関数を作成します。ランタイムは Python を選択し、以下のような簡単なコードで初期設定を行います。
def lambda_handler(event, context):
# SlackのEvent APIの認証
if "challenge" in event:
return event["challenge"]
return "OK"
2. API Gateway の設定
Lambda をトリガーするために API Gateway を作成し、エンドポイントを取得します。これを Slack のイベント受信 URL として設定します。この URL は次に Slack 側の準備をする際に使用します。
【Slack 側の準備】
1. Slack API から Bot User OAuth Token を取得する
こちら にアクセスして、「Create an App」から「From Scratch」を選択し、Bot の名前と作成するワークスペースを選択します。すると、以下のようなアプリの設定画面に遷移するはずです。
ここで、OAuth & Permissions > Add an OAuth Scope から、以下の権限を付与します。
ここまでの設定が終わったら、「OAuth & Permissions > Install to {your_workspace}」 を押してアプリを Slack ワークスペースにインストールします。
すると、Bot User OAuth Token が表示されるので、こちらを取得してください。
2. API Gateway で生成した URL の認証を行う
API Gateway の URL を Slack アプリのイベントサブスクリプションに登録し、必要なイベントを設定します。今回は Bot がメンションされた際にメッセージを返すようにしたいので、app_mention をつければ OK です。
【Notion 側の準備】
1. Integration の作成
Notion の開発者向け設定で Integration を作成し、Internal Integration Token を取得します。
2. データベース ID の取得
社内で共有するための Notion データベースを作成し、その ID を控えます。Lambda 内で Notion API を使って生成情報の登録や更新を行います。
Notion データベースに新たにページを作成したり、更新したりする処理については、以下の記事が参考になるかと思います。
いざ、実装
ここまで完成してしまえば、あとはもう LLM を呼び出して一連の処理の流れを実装するだけです。
今回は実装の部分まで細かくは触れないことにしますが、先に示したシーケンス図の流れに沿って簡単に実装を示していきます。
実際に動作させるためのコード例はこんなイメージです。
1. Slack イベントの検証と処理
Lambda 関数では、まず Slack から送信されるイベントの challenge
を検証し、その後、イベントの内容(メッセージ本文やブロック内の情報)を解析します。以下はその一例です:
import json
def lambda_handler(event, context):
# Slack Event API の認証
if "challenge" in event:
return {
'statusCode': 200,
'body': event["challenge"]
}
# イベント内容の解析
slack_event = json.loads(event["body"])
# URL抽出やLLM呼び出しなどの処理をここに実装
return {
'statusCode': 200,
'body': "Event Processed"
}
2. LLM の呼び出し処理
論文の URL から取得したテキストを LLM に渡し、タイトル、要約、タグ、インデックス、さらに Q&A を生成します。以下は、エラーハンドリングも含めたリクエスト例です。
from openai import OpenAI
client = OpenAI()
def get_llm_summary(content: str) -> str:
"""
与えられたテキストコンテンツから、タイトル、要約、キーポイントとなる Q&A を生成する。
"""
completion = client.chat.completions.create(
model="gpt-4o", # 使用するモデル。必要に応じて変更してください。
messages=[
{
"role": "system",
"content": (
"You are a summarization assistant. Given an academic paper content, "
"generate a title, a concise summary, and a set of key Q&A that capture "
"the essential points."
)
},
{
"role": "user",
"content": content
}
]
)
return completion.choices[0].message.content
3. Notion へのデータ登録
生成された結果を Notion API を使ってデータベースに登録します。以下は基本的な呼び出しの例です。
import os
from notion_client import Client
def get_notion_client():
return Client(auth=os.environ["NOTION_KEY"])
def add_notion_content(paper):
client = get_notion_client()
properties = {
"title": {"title": [{"text": {"content": paper.title}}]},
"url": {"url": paper.url},
"summary": {"rich_text": [{"text": {"content": paper.brief_digest}}]},
"tag": {"multi_select": [{"name": tag} for tag in paper.category]},
}
children = [{"object": "block", "type": "table_of_contents", "table_of_contents": {}}]
for question, answer in paper.summary.items():
children.append({
"object": "block",
"type": "callout",
"callout": {
"color": "default",
"icon": {"emoji": "❓"},
"rich_text": [{"text": {"content": question}}],
"children": [{
"object": "block",
"paragraph": {"rich_text": [{"text": {"content": answer}}]}
}]
}
})
return client.pages.create(
parent={"database_id": os.environ["NOTION_DATABASE_ID"]},
properties=properties,
children=children,
)
かなりざっくりとした紹介ですが、この部分を自由にカスタマイズできるのは嬉しいポイントです。最初は arXiv のに論文のみ対応していましたが、現在では異なるサイトの pdf や英語記事の要約などにも対応しています。
導入後の変化
論文インプットに対するハードルの低下
LLM Bot 導入以前は、膨大な論文の中から有用な情報を選び出し、各自で内容を読み解くのが大きな負担でした。しかし、Bot による自動要約と Q&A 生成により、各論文のエッセンスが迅速に把握できるようになり、論文インプットのハードルが大幅に低下しました。
情報アーカイブの充実
生成された要約や Q&A は Notion に自動で蓄積され、後の議論や新規プロジェクトの資料として活用されています。これにより、社内の知識基盤が強化され、継続的な情報共有とディスカッションが促進されています。
どんどん蓄積されていく論文の情報をボードビューで見ることができます。
まとめ
本記事では、社内における論文インプットの課題に対し、LLM Bot を活用することで得られた成果とその開発プロセスについて簡単に紹介しました。
膨大な情報量と専門性の高さ、そして日常業務の制約という課題を、最新の技術を用いた自動要約と Q&A 生成で解消することで、メンバー全体の情報収集効率と議論の質が飛躍的に向上しました。
おわりに
こちらのテックブログは、画像生成やLLM 開発などを通して、社内の技術力を先導している neoAI の研究組織「neoAI Research」メンバーで執筆しています。
「未来を創る生成AIの先駆者になろう」
neoAI では最先端技術を駆使するプロフェッショナル集団として、業務効率化を超えて社会に新たな価値を創出していきます。あなたの好奇心と可能性を、neoAI で開花させてみませんか?
【現在採用強化中です!】
・AIエンジニア/PM職
・Biz Dev
・自社プロダクトエンジニア職
・オープンポジション
【詳しい採用情報はこちらから!】
Discussion