🤖

【ChatGPT API】RSSフィードのページ内容を要約するPythonアプリを作る

2023/03/04に公開

この記事では、ChatGPT APIの活用事例を紹介します。RSSフィードの各ページの内容をChatGPT APIで要約し、その内容をまとめて出力するPythonアプリを実装しました。

output
アプリの出力イメージ

概要

ChatGPTのAPIが公開されたことで、ChatGPTを活用したアプリがどんどん登場していますね。

ブラウザ版のChatGPTと比べて、自作システムの出力をAIに連携したり、AIへの問い合わせを繰り返し実行したり、といった機能を実装しやすくなりそうです。

そこで今回は、ChatGPT APIを使用したRSSフィードの要約アプリをPythonで開発してみました。このアプリは、RSSフィードのページ内容をChatGPT APIを用いて自動的に要約し、結果を一覧表示します。

ChatGPT APIについて

ChatGPT APIは、ブラウザ版のChatGPTと同様に、OpenAIが提供している自然言語処理のAPIです。ブラウザ版のChatGPTとは異なり、APIを使用することで、より高度な自然言語処理を行うことができます。ChatGPT APIを使用することで、文章の要約や生成、自然言語に基づくタスクを簡単に実現できます。

https://openai.com/blog/introducing-chatgpt-and-whisper-apis

開発手順

今回のアプリはNotionAIを活用してソースコードを記述しました。この記事では、ソースの中身よりも、AIを活用したプログラミングについて重点的に記載します。

ソースコードはGitHubで公開しているので、必要に応じてご参照ください。

https://github.com/tanny-pm/chatgpt-rss-summarizer

環境

このアプリを開発するには、Python 3.6以降と、requests、beautifulsoup4、openaiなどのライブラリが必要です。これらのライブラリは、pipを使用して簡単にインストールできます。

feedparser = "^6.0.10"
requests = "^2.28.2"
beautifulsoup4 = "^4.11.2"
openai = "^0.27.0"
python-dotenv = "^1.0.0"
termcolor = "^2.2.0"

また、ChatGPTのデベロッパーズサイトからAPIキーを発行しておきます。

仕様を書く

ここからはNotion AIを活用してプログラミングを行います。まずはじめにアプリの仕様を記述します。今回は以下のような仕様にしました。

RSS要約アプリの仕様

  • RSSフィードの内容を取得する。
    • RSSフィードのURLは変数で与える。
  • それぞれの記事のURLにアクセスし、内容を取得する。
  • 記事の内容をChatGPT APIを用いて要約する。
  • 記事のタイトル、要約、URL、発行日を一覧で出力する。
    • タイトルは青色の太字にする。

AIに依頼する

NotionAIに対して「上記の仕様を満たすpythonスクリプトを書いて」と依頼することで、ソースコードを出力できます。修正すべき点はありますが、そのままでも正しく動きそうなソースコードになっています!

ChatGPT APIをコールする部分は利用するエンジンなどが誤っているため、このあとに公式リファレンスを参照して修正します。

NotionAIで生成したソースコード
import feedparser
import requests
import json
import openai
import os
from bs4 import BeautifulSoup
from termcolor import colored
from dotenv import load_dotenv

load_dotenv()

openai.api_key = os.getenv('OPENAI_API_KEY')

def summarize_article(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, "html.parser")
    text = soup.get_text().replace('\\n', '')
    prompt = (f"Please summarize the following article in one sentence:\\n{text}")
    response = openai.Completion.create(
        engine="text-davinci-002",
        prompt=prompt,
        max_tokens=60,
        n=1,
        stop=None,
        temperature=0.5,
    )
    summary = response.choices[0].text.strip()
    return summary

def summarize_feed(feed_url):
    feed = feedparser.parse(feed_url)
    for entry in feed.entries:
        title = colored(entry.title, 'blue', attrs=['bold'])
        url = entry.link
        date = entry.published
        summary = summarize_article(url)
        print(f"{title}\\n{summary}\\n{url}\\n{date}\\n")

if __name__ == '__main__':
    feed_url = input("Enter the RSS feed URL: ")
    summarize_feed(feed_url)

ソースコードを修正する

まず、ChatGPT APIをコールする部分を修正します。API利用料を把握するために、トークンも出力するように関数を作成しました。

rss_summarizer.py
def ask_to_chatgpt(prompt: str, sys_setting: str = "") -> tuple[str, int]:
    try:
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": sys_setting},
                {"role": "user", "content": prompt},
            ],
        )
        message = response["choices"][0]["message"]["content"]
        token = int(response["usage"]["total_tokens"])
        return (message, token)
    except Exception as e:
        raise Exception(e)

次に、メインの処理を修正します。ここは主に、ページコンテンツの取得や、API利用料の出力の箇所を修正しました。おおまかな流れはAIの出力をそのまま使えるので、非常に実装がスムーズです。

rss_summarizer.py
def summarize_feed(num_of_articles: int):
    fee: float = 0.0
    feed = feedparser.parse(RSS_URL)

    for entry in feed.entries[0:num_of_articles]:
        try:
            response = requests.get(entry.link)
        except Exception as e:
            print(f"Open article Error: {e}")
            continue

        soup = BeautifulSoup(response.text, "html.parser")
        text_p: list[str] = [s.get_text() for s in soup.find_all("p")]
        content: str = " ".join(text_p)

        prompt: str = f"このテキストの内容を200文字程度の日本語で要約する:\n{content} "
        try:
            answer, token = ask_to_chatgpt(prompt)
            fee += token * 0.000002
        except Exception as e:
            print(f"ChatGPT API Error: {e}")
            continue

        print(colored(f"Title: {entry.title}", "blue", attrs=["bold"]))
        print(f"Summary: {answer}")
        print(f"URL: {entry.link}")
        print(f"Date: {entry.published}")
        print("")

    print(f"\n\nAPI usage fee: {fee:.4f}$")

if __name__ == "__main__":
    summarize_feed(5)

実行結果

上記のコードを実行すると、以下のように、与えられたRSSフィードのページ内容が要約されます。(私が書いたZennの記事のRSSフィードでテストしました)

いかがでしょうか?記事の概要をとても理解しやすくなったと思います。うまく活用できれば情報収集の効率がアップしそうです。

出力例(改行を加えています)
Title: GitHub CodespacesでZennの執筆環境を構築する
Summary: 本文は、VS Code Conference JP 2022-2023での体験から、GitHub Codespaces
上でZennの執筆環境を簡単に構築する手順を紹介する。手順は、ローカルPCでZenn CLIを利用して
執筆環境を構築する方法を前提に従い、コンテナ上に移植する方法が主である。また、Codespaces
とはGitHubのクラウド上にホストされた開発環境であり、Dev Containersとの連携によりプロジ
ェクトを閲覧や編集が可能であることが説明されている。手順はVS Code GUIを利用して簡便に設定
でき、プロジェクトの共同開発において恩恵をもたらすと述べられている。
URL: https://zenn.dev/tanny/articles/35ce3b76b219fd
Date: Sat, 21 Jan 2023 12:49:29 GMT

Title: Beautiful Soupで店舗情報を取得してGoogleマップに表示する
Summary: ブランドサイトに掲載されている「取扱店舗」情報をWEBスクレイピングで取得し、Goog
leマップで可視化する方法が紹介されている。通販の普及により、実物を見たい場合やネットで販売
されていない商品を探す際に、メーカーのサイトから店舗情報を取得することが多いが、住所や店名
の情報がずらりと並ぶだけで地図上にマッピングされていないことが多い。取得した店舗情報をGoog
leマップに表示することで、周辺の店舗を探しやすくなる。また、スクレイピング処理について詳細
に解説され、CSVファイルの作成方法やGoogleマップへのアップロード方法も紹介されている。
URL: https://zenn.dev/tanny/articles/401e35d7a12b24
Date: Mon, 16 Jan 2023 14:04:35 GMT

...省略...

課題

記事の内容をすべてChatGPTに読み込ませるため、API利用料が少し気になります。記事の長さに依存しますが、1記事あたり1000~2000トークン程度を消費していました。

まとめ

本記事では、ChatGPT APIを使用したRSSフィードの要約アプリについて解説しました。このアプリを活用することで、大量の情報を効率的に収集できます。

たとえば、自分が興味のある分野のニュースサイトやブログなどをRSSフィードでまとめて登録し、そのフィードをこのアプリで要約することで、短時間で最新情報を把握できます。また、ビジネスの観点からも、競合他社の情報やトレンドを把握できます。

今回は、要約結果をターミナル上に出力するだけに留めました。この内容をSlackやNotionAIなどに連携すれば、より実用的に活用できそうです。

参考文献

https://platform.openai.com/docs/api-reference/introduction

GitHubで編集を提案

Discussion