コンテンツにスキップ
Zenn Dev Ryo Kawamata Articles 98b7cc1c67ad0c

LangChain を使って Hacker News の日本語要約 Bluesky ボットを作ってみた

  • URL: https://zenn.dev/ryo_kawamata/articles/98b7cc1c67ad0c
  • 日付: 2026-06-26
  • Tier: Tier 3
  • 要旨: LangChainとFirebase Cloud Functionsを使ってHacker Newsのトップ記事を日本語要約しBlueskyに定期投稿するボットを構築した事例。PuppeteerWebBaseLoaderでページ本文を取得し、LangChainのSummarization Chain(map_reduce方式)でGPT-3.5による要約を生成して投稿する。詰まりどころとして、PuppeteerWebBaseLoaderのデフォルトがinnerHTMLを取得するためinnerTextに変更する必要があること、loadAndSplitでドキュメントを分割しないとトークン超過エラーが発生することの2点が挙げられている。Bluesky APIの300文字制限に合わせて句点で要約文を分割してスレッド投稿する仕組みも実装している。

詳細

システム構成

  • Firebase Cloud Functionsの定期実行をトリガー
  • Hacker News APIからトップ記事を取得
  • LangChain(GPT-3.5)で日本語要約を生成
  • Bluesky APIで記事タイトル+リンクをポスト、スレッドに要約を追加投稿
  • Firestore で投稿履歴を管理(重複投稿防止)

LangChain実装の詰まりどころ

  1. PuppeteerWebBaseLoaderのテキスト取得設定
  • デフォルトではdocument.body.innerHTMLを使用するため、HTMLタグも要約対象に含まれトークンを無駄消費
  • evaluateオプションでdocument.body.innerTextを指定する必要がある
  1. loadAndSplitの利用が必須
  • ドキュメントをloadSplit()で分割しないとSummarization Chainの恩恵を受けられない
  • 文章量の多いページではモデルの最大トークン数を超過してエラーが発生する
  • LangChainのSummarization Chainは分割されたドキュメントを再帰的に要約(map_reduce)

Bluesky投稿の実装

  • 1投稿の文字数上限が300文字
  • 要約文が300文字を超える場合は「。」「、」の句点を起点に分割してスレッド投稿