エンジニアやWeb制作者にとって、技術情報のキャッチアップは避けて通れません。しかし、RSSリーダーを開くと未読が数百件…という状況に疲弊している方も多いのではないでしょうか。

世の中には情報収集を自動化するツールやサービスがありますが、多くは「RSSからSlackやDiscordに通知する」だけ。それならFeedlyで十分ですし、結局は大量の記事から自分で選別する必要があります。

そこで今回は、AIが記事を自動でスコアリングし、興味のある記事だけを自分のサイトに表示する 自動化システムを作りました。さらに、リンククリック, Like/Dislikeボタンでフィードバックすることで、AIの採点精度が向上していく仕組みです。


    API『RSS Portal』

    RSS Portal のスクリーンショット

    RSS Portal
    AIがRSS記事をスコアリングし、興味のある記事だけを表示するWordPress連携システム

    主な機能

    機能 説明
    RSS自動取得 登録した技術ブログから記事を自動収集(6時間ごと)
    AIスコアリング 各記事を1〜5点で自動評価
    AI要約生成 記事の要約を130文字以内で生成
    Like/Dislike リンククリック, Like/Dislike クリックをフィードバックとしてAI学習に活用
    Dislike非表示 興味のない記事は次回から表示しない
    WordPress連携 自分のサイトに埋め込み可能

    システム構成

    ┌─────────────────────────────────────────────────────────────────┐
    │                         サーバー                                │
    │                                                                 │
    │  ┌─────────────┐    ┌─────────────────────────────────────┐    │
    │  │   Cron      │    │         Python FastAPI              │    │
    │  │  (6時間毎)   │───▶│                                     │    │
    │  └─────────────┘    │  1. RSS取得 (feedparser)            │    │
    │                     │  2. AIスコアリング (Gemini API)      │    │
    │                     │  3. SQLiteに保存                    │    │
    │                     │  4. JSON出力                        │    │
    │                     └─────────────────────────────────────┘    │
    │                                    │                           │
    │                                    ▼                           │
    │                     ┌─────────────────────────────────────┐    │
    │                     │          API (port 8001)            │    │
    │                     │          /api/rss-portal/           │    │
    │                     └─────────────────────────────────────┘    │
    │                                    │                           │
    │                                    ▼                           │
    │  ┌─────────────────────────────────────────────────────────┐   │
    │  │                WordPress / 静的サイト                    │   │
    │  │                                                         │   │
    │  │   [JavaScript] ─fetch─▶ /api/rss-portal/articles        │   │
    │  │                                                         │   │
    │  │   [評価ボタン] ─POST─▶ /api/rss-portal/feedback         │   │
    │  └─────────────────────────────────────────────────────────┘   │
    └─────────────────────────────────────────────────────────────────┘
    

    技術スタック

    役割 技術
    バックエンド Python FastAPI + uvicorn
    データベース SQLite
    RSS取得 feedparser
    AIスコアリング Gemini API(Gemini 2.0 Flash)
    フロントエンド WordPress(JavaScriptで埋め込み)

    AIスコアリングの仕組み

    スコアリングの基準

    AIには「興味のある分野」と「興味のない分野」を事前に設定しておきます。

    興味のある分野の例:

    • WordPress開発・カスタマイズ・プラグイン開発
    • AIコーディング(Claude Code, Cursor等)
    • Web制作全般(HTML/CSS/JavaScript)
    • 具体的な実装例・コード例がある記事

    興味のない分野の例:

    • モバイルアプリ開発
    • ゲーム開発
    • 日記・体験談・ポエム的な内容
    • 「まとめてみた」だけで具体的な実装がない記事

    フィードバック学習

    リンクをクリック、Like/Dislikeボタンを押すと、その情報がデータベースに記録されます。次回のスコアリング時には、過去にLikeした記事・Dislikeした記事がAIのプロンプトに含まれ、より精度の高いスコアリングが行われます。

    # スコアリング時にフィードバックを活用
    liked_articles = get_liked_articles(5)  # 過去5件のLike記事
    disliked_articles = get_disliked_articles(5)  # 過去5件のDislike記事
    
    prompt = f"""
    【過去に高評価した記事】
    {liked_articles}
    
    【過去に低評価した記事】
    {disliked_articles}
    
    この傾向を踏まえて、以下の記事を評価してください...
    """
    

    Gemini API 運用コスト

    このシステムの大きなメリットは、運用コストが非常に安いことです。

    API料金(Gemini 2.0 Flash)

    項目 料金
    1記事あたり 約$0.0001〜0.0005
    1日100記事処理 約$0.01〜0.05
    月間コスト 約$0.30〜1.50(約50〜200円)

    実際の運用では、月額$1の上限設定で十分に収まっています。

    サーバー費用

    レンタルサーバー「カラフルボックス」共用サーバー(月額500〜1,000円程度)で動作可能です。VPSや専用サーバーは不要です。


    実装のポイント

    1. RSS取得(feedparser)

    import feedparser
    
    def fetch_rss(feed_url):
        feed = feedparser.parse(feed_url)
        articles = []
        for entry in feed.entries:
            articles.append({
                'title': entry.get('title', ''),
                'link': entry.get('link', ''),
                'summary': entry.get('summary', ''),
                'published': entry.get('published', '')
            })
        return articles
    

    2. AIスコアリング(Gemini API API)

    import requests
    
    def score_article(title, summary, user_interests, user_dislikes):
        prompt = f"""
        以下の記事を1-5のスコアで評価してください。
        
        【ユーザーの興味】
        {user_interests}
        
        【ユーザーが興味のない分野】
        {user_dislikes}
        
        【記事情報】
        タイトル: {title}
        概要: {summary}
        
        JSON形式で回答: {{"score": 数値, "reason": "理由", "summary": "130文字以内の要約"}}
        """
        
        response = requests.post(
            f"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key={API_KEY}",
            headers={"Content-Type": "application/json"},
            json={
                "contents": [{"parts": [{"text": prompt}]}],
                "generationConfig": {"temperature": 0.1, "maxOutputTokens": 500}
            }
        )
        return response.json()
    

    3. フロントエンド(JavaScript)

    fetch('/api/rss-portal/articles')
      .then(res => res.json())
      .then(data => {
        data.articles.forEach(article => {
          // スコア3以上の記事のみ表示
          if (article.score >= 3) {
            renderArticle(article);
          }
        });
      });
    
    function sendFeedback(articleId, type) {
      fetch('/api/rss-portal/feedback', {
        method: 'POST',
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify({article_id: articleId, feedback: type})
      });
    }
    

    まとめ

    RSS Portalは、以下の課題を解決するために作りました。

    課題 解決策
    興味のない記事が多い スコアリングでフィルタリング
    要約がない/読みにくい AI生成の日本語要約
    学習しない Like/Dislikeで精度向上
    外部サービス依存 自分のサイトに設置可能

    「情報収集の自動化」というと、SlackやDiscordへの通知が一般的ですが、それだけでは結局手動で選別する必要があります。AIによるスコアリングと学習機能を自動化することで、欲しい情報だけが届くシステムを実現できました。


    関連記事

    続・RSS×AIで情報収集を自動化!採点&学習する自分好みの情報ポータルの作り方 RSS Portalを運用して見つかった課題(古い記事の表示、同一フィードの偏り)を改善。14日制限、フィード別表示制限、投稿日順ソートを実装し、GitHubでOSS公開しました。  続きを読む

    参考リンク