生成AIを用いたニュース収集の自動化
はじめに
株式会社MICINの情報セキュリティチームでインターンをしているkbaseです。
MICINでは、毎週の社内勉強会にて、その1週間で起きたセキュリティ関連を中心としたニュースの紹介を行なっております。勉強会に向けて1週間分のニュースを収集し、各記事を読み、そのまとめを作成するには非常に時間がかかり、手間も多いため、効率化が求められておりました。そこで、最新のニュースを自動で収集し、まとめを生成させるツールを作成したので、紹介させていただければと思います。
MICINで行なっている部内勉強会について興味のある方はぜひこちらをご参照ください。
情報セキュリティ部「部内勉強会」の取り組み
ニュース自動化ツール
概要
ニュース自動化は4要素から成り立っています。
- 収集されたニュース記事が記入されるGoogle Spreadsheet
- ニュース記事を自動収集するツール(AWS Lambda)
- ニュース記事のまとめを生成するツール(AWS Lambda)
- ニュース記事のまとめが出力されるGoogle Document
ニュース自動化ツールの全体像
ここからは、各フェーズの詳しい説明をしていきます。
1. ニュース収集
まず、Google Spreadsheetから直近1週間のニュース記事を自動収集するAWS LambdaをAmazon API Gatewayを介してREST APIで呼び出します。Google App ScriptでAWS Lambdaを呼び出すためのボタンを作成し、スプレッドシートのツールバーに追加します。これにより、ボタンをクリックするだけで関数が実行されます。
ボタンがクリックされると、まずスプレッドシートが初期化(過去の実行で記入された記事のリストが削除)されます。その後、AWS Lambdaが呼び出されます。
スプレッドシートを初期化してAWS Lambdaを呼び出し
Lambdaの実行が完了すると、スプレッドシートに直近1週間のニュース記事が記入されます。
ニュース記事を自動収集するツールの出力例
ニュース収集のAWS Lambda
こちらはPythonで実装しており、BeautifulSoup4とSeleniumを用いて以下を取得しています。
- 記事のタイトル
- 記事のURL
- 取得してきた媒体(その記事が載っていたブログ名など)
しばしば同じ記事が異なる発信元から紹介されていますが、それぞれの発信元によって記事の書き方が異なります。そのため、内容が同じであっても発信元が異なる場合は、それを取得するようにしています。具体的な実装方法としては、記事のタイトルとURLのドメインを記録した辞書を用意し、取得した全記事のタイトルと発信元を管理します。新しく取得した記事のタイトルを辞書にある各記事のタイトルと比較し、PythonのdifflibライブラリのSequenceMatcherをしようして類似度を測定します。類似度が60%以上のものを「同じ記事」と見なし、その記事の発信元がすでに辞書内にあるかを確認します。類似記事が見つかり、その発信元がすでに存在する場合は、その記事は取得しません。一方で、類似記事が辞書内に存在しても、その発信元が辞書に含まれていない場合は取得します。
2. 記事のまとめ生成
スプレッドシートにリストアップされているニュース記事の中から、ユーザがまとめを生成してほしいものについて、チェックボックスにチェックを入れます。
まとめを生成してほしい記事を選択
その後、ニュース記事のまとめを生成するAWS Lambdaを呼び出します(Amazon API Gatewayを用いてREST APIで呼び出せるようにしています)。
まとめ生成のAWS Lambdaを呼び出し
記事のまとめ生成AWS Lambda
こちらもPythonで実装しています。Azure OpenAI Serviceを使用しており、言語モデルはGPT-4oを使っています。
まず、まとめを生成するために、各記事の内容をHTTPリクエストで取得します。その後、正規表現を使って不要な情報を除外し、テキスト情報を生成系AIに渡してまとめを作成してもらいます。作成されたまとめは、指定されたGoogleドキュメントに出力するよう設定しています。
生成されたまとめの例
リクエスト先がスクレイピングを禁止している場合は、図の1つ目の記事のように「記事の内容を取得できなかった」とエラーを表示させています。
生成系AIから安定した出力を得るために
生成系AIから期待する出力を安定して得るためのコツは、抽象的な表現は避け、「具体的」かつ「明確」な指示を与えることです。こちらはOpenAIが出している例です。
悪い例
Write a poem about OpenAI.
良い例
Write a short inspiring poem about OpenAI, focusing on the recent DALL-E product launch (DALL-E is a text to image ML model) in the style of a {famous poet}
良い例の方は、何について、どのように書けばいいかが明確になっています。このように「どのような?」というのを突き詰めた命令文にすることがベストです。今回は、与えられた記事の内容のまとめを生成させることが目的であるため、以下のような命令文としました。
- ユーザから与えられた記事の内容に対して、常に簡潔かつ網羅的な要約を日本語で提供する
- 元のテキストで提示された全ての重要な点と主要な内容をカバーしつつ、情報を簡潔かつ理解しやすい形式にまとめる
- 要約には主要な内容に関連する詳細や例が含まれるようにするが、不必要な情報や繰り返した記述は避ける
- 要約の長さは元のテキストの長さや複雑さに適したものであり、重要な情報を省略することなく、明確で正確な外観を提供するべき
- 1段落で記述されるべき
実際に使用したプロンプトがこちらです。
You are a helpful assistant, always return a concise and comprehensive summary about the article given as a query from the USER in Japanese. The summary should cover all the key points and main ideas presented in the original text, while also condensing the information into a concise and easy-to-understand format. Please ensure that the summary includes relevant details and examples that support the main ideas, while avoiding any unnecessary information or repetition. The length of the summary should be appropriate for the length and complexity of the original text, providing a clear and accurate overview without omitting any important information and are written in one paragraph.
参考文献:
振り返り&今後の課題
今回作成した自動化ツールにより、従来2時間かかっていた作業が約20分に短縮されました!
これまで、最新のニュースを情報収集するために、複数のブログやサイトにアクセスし、さらに各サイトで必要に応じてそれぞれのニュースを確認する必要がありました。何度もタブを新しく開いたり、画面を移動したりする必要があり、効率的ではありませんでした。
そこで、1つの画面で全てが完結できるように実装しました。スプレッドシートから記事を取得する関数をボタンで呼び出し、最新のニュースがスプレッドシート上に全てリストアップされます。チェックした記事のまとめを生成する関数も、スプレッドシート上のボタンで呼び出せるようにしました。この作業は毎週行うため、年間で約80時間の工数削減効果があります。
本ツールは社内でエンジニアが使用することを想定して実装したため、開発期間の都合上、簡略化された実装が多々あります。直近の改良案としては、エラーハンドリングの追加やコードの最適化が挙げられます。その他、スクレイピング機能の改良や、セキュリティとは関係のない記事をフィルタリングする機能も将来的に導入していきたいです。本ツールが情報収集ツールとして、誰もが簡単に使えるものとなればいいと思っています。
Discussion