🐾 claw-stack

最終更新: 2026年3月 · ソース: info-pipeline

ライブ・インテリジェンス・フィード

7 つのプラットフォームから AI・テクノロジーコンテンツを収集し、キーワードフィルタリングと関連性スコアリングを適用し、重複を排除して、下流エージェントが利用できる統一 JSON/Markdown レポートを生成する Python パイプライン。

← モジュール概要

概要

info-pipeline は、7 つの異質なプラットフォームから AI・テクノロジーコンテンツを集約し、スコア付き・重複排除済みの単一フィードにまとめます。各プラットフォームには専用のコレクターがあり、出力を共通スキーマに正規化します。フィルター/スコアラー段階でグローバルキーワードマッチングと関連性スコアリング(0〜100)を適用し、レポートを出力します。出力は機械可読 JSON と人間可読 Markdown レポートです。

目的

AI の動向を把握するには、多くの異質なソースを同時に監視する必要があります。新しいリポジトリは GitHub、コミュニティ議論は Hacker News と Reddit、研究解説は YouTube、新ツールは Product Hunt、初期シグナルは Twitter/X、英語ソースが見落とす中国の動向は中国プラットフォームから収集します。7 つのプラットフォームを手動でこなすのは時間がかかり、一貫性も欠けます。

既存のアグリゲーター(RSS リーダー、Feedly など)は人間可読フィードを生成しますが、機械可読構造化データではありません。AI リサーチエージェントには、クエリし推論できる、スコア付き・重複排除済み・正規化されたフィードが必要です。このパイプラインは、エージェント利用向けに設計されたフォーマットでそのフィードを提供します。

アーキテクチャ

パイプラインは 4 つのステージで構成されます:

[コレクター — 並列実行]
  → GitHub Trending、Hacker News、Reddit、YouTube、
    Product Hunt、X/Twitter、中国プラットフォーム(MCP 経由)
  → 各コレクターが統一スキーマに正規化

[フィルター / スコアラー]
  → グローバルキーワードリストとのキーワードマッチング
  → 関連性スコア 0〜100(キーワード密度 + プラットフォームシグナル)
  → URL による重複排除、次にタイトル類似度による重複排除

[レポートライター]
  → 統一 JSON(全アイテム)
  → Markdown レポート(上位 N アイテム)

データソース:

プラットフォーム 言語 備考
GitHub Trending EN 直近 N 日間のスター/フォーク数でフィルタリングしたトピック別リポジトリ
Hacker News EN トップストーリー、最低スコアでフィルタリング
Reddit EN 複数の AI サブレディット — API キー不要
YouTube EN Data API v3 経由で設定したチャンネルプレイリスト
Product Hunt EN GraphQL API 経由の日次新製品
X / Twitter EN キーワード検索 — Basic API ティアが必要(低ボリューム)
中国プラットフォーム ZH 知乎・36kr・掘金・少数派・InfoQ・Bilibili(trends-hub MCP 経由)

コード構成:

コンポーネント 責務
collectors/base.py 共通フェッチ・リトライ・レートリミットロジックを持つ BaseCollector
collectors/*.py プラットフォームごとに 1 ファイル — 各自が BaseCollector を継承
collectors/__init__.py ALL_COLLECTORS レジストリ — 有効なコレクターを全て登録
filters/scorer.py キーワードフィルタリング、関連性スコアリング(0〜100)、重複排除
main.py エントリーポイント — コレクター実行とレポート生成をオーケストレート

全ソースのすべてのアイテムが同じ JSON スキーマを共有します:

{
  "title": "記事 / プロジェクトタイトル",
  "url": "https://...",
  "source": "github",
  "score": 85,
  "published_at": "2026-02-18T10:00:00Z",
  "summary": "短い説明または抜粋",
  "tags": ["llm", "open-source"]
}

主要な設計上の決定

統一出力スキーマ — ソースで正規化する

各コレクターの役割は、プラットフォームの出力をコレクターを出る前に共通スキーマに正規化することです。スコアラーとレポートライターは共通スキーマのみを扱い、プラットフォーム固有のロジックを持ちません。これにより、新しいソースの追加は単一の fetch() メソッドを持つ新しいクラスを実装するだけで済みます。

コード駆動ではなく設定駆動

キーワード、プラットフォームパラメーター、ソース選択は全て YAML 設定ファイルに格納されます。フィードのチューニングにコード変更は不要です。追跡するトピックを素早く変更したり、HN の最低スコアなどプラットフォーム固有の閾値を調整する際に重要です。

API キー未設定時のグレースフルデグラデーション

API キーが設定されていないコレクターはエラーではなく警告でスキップされます。パイプラインは設定済みのソースから引き続き出力を生成します。7 つの API 認証情報を全て用意しなくても、パイプラインを部分的に(例:GitHub + HN のみ)実行できます。

中国プラットフォームに MCP を使用 — 直接スクレイピングを回避

中国のテックプラットフォーム(知乎・36kr・掘金)は複雑なボット対策があり、公式の英語 API もありません。trends-hub MCP サービスがこれらのソースを別途処理し、パイプラインはプラットフォーム固有のスクレイパーを実装する代わりにツールとして呼び出します。

自分でビルドする方法

1. まず統一スキーマを定義する

コレクターを書く前に、全コレクターが生成しなければならない出力スキーマを定義します。最低限必要なフィールドは title、url、source、score、published_at、summary です。後でフィールドを追加すると全コレクターの更新が必要になります。

2. リトライとレートリミットロジックを持つ BaseCollector を実装する

レートリミットとエラー時リトライは全プラットフォームコレクターに必要です。これらはベースクラスに配置します。各具体的なコレクターは、プラットフォームのデータを取得して共通スキーマにマッピングする方法だけを実装すればよく、HTTP エラーやレートリミットの処理は不要です。

3. スコアリングはシンプルに — キーワード密度 + プラットフォーム重み

キーワードマッチ数(テキスト長で正規化)にプラットフォーム固有のエンゲージメントシグナル(GitHub スター、HN スコア、Reddit アップボート)を加えた 0〜100 のスコアで十分です。LLM ベースのスコアリングは追加しないこと — 多くのユースケースでは、比例した品質向上なしにレイテンシとコストが増加します。

4. まず URL で重複排除、次にタイトル類似度で

同じ記事が複数のプラットフォームに現れることがよくあります。URL 重複排除は完全一致の重複を捕捉します。タイトル類似度(単純な単語の重複で十分)は、同じ記事がプラットフォーム間でわずかに異なる URL やタイトルでリンクされているケースを捕捉します。

5. Twitter API レートリミットは実際の制約

Basic Twitter/X API ティアには厳格な月次リクエスト制限があります。max_results を低く保ち(1 回あたり 10〜15)、他のコレクターよりも実行頻度を下げます。レートリミットに達してもパイプライン全体の実行をブロックしないよう、グレースフルに失敗するコレクターを構築してください。

よくある質問

一部のソースのみで実行できますか?

はい。API キーが設定されていないソースは、実行全体を失敗させずに警告でスキップされます。特定のコレクターを直接実行することもできます。Reddit と Hacker News は API キー不要でそのまま動作します。

関連性スコアはどのように機能しますか?

スコアラーは設定されたグローバルキーワードのうち何個がタイトルとサマリーに現れるかを確認します。キーワードに一致しないアイテムはフィルターで除外され、マッチはスコアを最大 100 まで引き上げます。元のプラットフォームエンゲージメント指標(スター、HN スコア、アップボート)も考慮されます。

中国プラットフォーム向けの trends-hub MCP とは何ですか?

中国プラットフォームコレクターは trends-hub サービス(別のオープンソースプロジェクト)の MCP ツールを呼び出して、知乎トレンド・36kr・掘金などのデータを取得します。中国プラットフォームソースを動作させるには、そのサービスをローカルで実行している必要があります。

Authors: Qiushi Wu & Orange 🍊