😋

AI駆動型暗号通貨ニュース分析システムを作った話 - Google Cloud × Gemini 2.5 Flash活用事例

に公開

はじめに

海外の暗号通貨ニュースを自動で翻訳・要約し、マーケットインパクトを分析するWebアプリケーションを開発しました。Google CloudのVertex AIとGemini 2.5 Flashを活用し、完全自動化されたニュース分析パイプラインを構築した技術的な取り組みについて共有します。

🔗 デモサイト: https://news-front-120035357891.asia-northeast1.run.app/

システム概要

解決したい課題

  • 海外暗号通貨ニュースの言語障壁
  • 大量のニュース記事から重要な情報を抽出する手間
  • 市場に与える影響度の定量的評価の困難さ

アーキテクチャ全体像

技術スタック

バックエンド

  • Python: RSS収集・AI処理
  • Google Vertex AI: Gemini 2.5 Flash
  • BigQuery: データ永続化
  • Spring Boot: API層
  • Google Cloud Run: サーバーレスホスティング

フロントエンド

  • React 19 + TypeScript
  • React Bootstrap: UIコンポーネント
  • Docker: コンテナ化

核心となる技術実装

1. RSS自動収集システム

# crypto_rss_parser.py の要点
import feedparser
import requests
from dateutil import parser

class CryptoRSSParser:
    def __init__(self):
        self.sources = [
            'https://www.coindesk.com/arc/outboundfeeds/rss/',
            'https://bitcoinmagazine.com/.rss/full/',
            'https://cointelegraph.com/rss'
        ]
    
    def fetch_articles(self, limit=10):
        # 各RSSソースから記事を取得
        # HTMLタグ除去とタイムスタンプ正規化
        # BigQueryへの重複チェック付き保存

2. Vertex AI バッチ処理

# process_news.py の核心部分
def create_batch_job(input_uri, output_uri):
    job = aiplatform.BatchPredictionJob.create(
        job_display_name="crypto-news-translation",
        model_name="publishers/google/models/gemini-2.5-flash-002",
        input_config={
            "instances_format": "jsonl",
            "gcs_source": {"uris": [input_uri]}
        },
        output_config={
            "predictions_format": "jsonl", 
            "gcs_destination": {"output_uri_prefix": output_uri}
        }
    )
    return job

3. AI分析プロンプト設計

def create_translation_prompt(article):
    return f"""
以下の英語記事を分析してください:

タイトル: {article['title']}
内容: {article['content']}

以下のJSON形式で回答してください:
{{
  "title_jp": "日本語タイトル",
  "summary_jp": "200文字以内の要約",
  "impact": "市場影響度(-10〜+10の整数)"
}}

影響度の基準:
- 規制関連: ±8〜10
- 技術革新: ±5〜7
- 価格予測: ±3〜5
- 一般ニュース: ±1〜3
"""

4. Spring Boot API層

@RestController
@RequestMapping("/api/news")
public class NewsController {
    
    @GetMapping("/translations")
    public Page<Translation> getTranslations(
        @RequestParam(defaultValue = "0") int page,
        @RequestParam(defaultValue = "10") int size
    ) {
        return newsService.getTranslations(page, size);
    }
    
    @GetMapping("/summaries") 
    public Page<Summary> getSummaries(
        @RequestParam(defaultValue = "0") int page,
        @RequestParam(defaultValue = "10") int size
    ) {
        return newsService.getSummaries(page, size);
    }
}

5. React リアルタイム更新

const NewsListComponent: React.FC = () => {
    const [articles, setArticles] = useState<NewsArticle[]>([]);
    
    useEffect(() => {
        const fetchNews = async () => {
            const response = await axios.get('/api/news/translations');
            setArticles(response.data.content);
        };
        
        fetchNews();
        const interval = setInterval(fetchNews, 5 * 60 * 1000); // 5分間隔
        
        return () => clearInterval(interval);
    }, []);
    
    return (
        <Container>
            {articles.map(article => (
                <NewsCard key={article.url} article={article} />
            ))}
        </Container>
    );
};

技術的な工夫点

1. スケーラブルなAI処理

課題: 大量の記事を効率的に処理する必要があった

解決策: Vertex AI Batch Prediction Jobsを採用

  • JSONL形式での並列処理
  • コスト効率の良いバッチ処理
  • 自動スケーリング

2. データ整合性の確保

課題: 重複記事の防止と処理済みデータの管理

解決策: BigQueryでの重複チェック機能

-- 重複チェッククエリ例
SELECT COUNT(*) as count 
FROM `bitcoinnewscraper.News.source_data` 
WHERE url = @article_url

3. リアルタイム性の実現

課題: 最新情報の迅速な配信

解決策: 段階的更新システム

  • サマリー: 1分間隔更新
  • 個別記事: 5分間隔更新
  • 無限スクロール対応

4. 影響度の定量化

課題: 主観的な市場影響を数値化

解決策: AI による-10〜+10スケール評価

  • 規制関連: 高影響度
  • 技術革新: 中影響度
  • 価格予測: 低〜中影響度

運用上の工夫

エラーハンドリング

def process_with_retry(func, max_retries=3):
    for attempt in range(max_retries):
        try:
            return func()
        except Exception as e:
            if attempt == max_retries - 1:
                raise e
            time.sleep(2 ** attempt)  # 指数バックオフ

コスト最適化

  • Vertex AIのtemperature: 0.2設定で安定した出力
  • BigQueryのパーティション分割でクエリ効率化
  • Cloud Runの自動スケーリング活用

学んだこと・課題

成功ポイント

  1. Gemini 2.5 Flashの高い翻訳・要約精度
  2. バッチ処理による大量データ処理の効率化
  3. Google Cloudエコシステムの統合の容易さ

改善点

  1. リアルタイム処理の導入検討
  2. より高度な市場分析アルゴリズム
  3. ユーザー固有の設定機能

まとめ

Google CloudとGemini 2.5 Flashを活用することで、複雑なAI分析パイプラインを効率的に構築できました。特に:

  • 自動化: RSS収集からAI分析まで完全自動化
  • スケーラビリティ: クラウドネイティブな設計
  • 精度: AIによる高品質な翻訳・要約
  • リアルタイム性: 継続的な情報更新

暗号通貨市場の情報収集効率を大幅に向上させる実用的なシステムを実現できました。

参考リンク

皆さんも是非、Google CloudとGemini APIを活用したAIアプリケーション開発に挑戦してみてください!

Discussion