LangChain を使って Hacker News の日本語要約 Bluesky ボットを作ってみた
便利なので使ってみてくださいー!
🤖 作ったもの
Hacker News のトップ記事の日本語要約を定期投稿する Bluesky のボットを作りました。
以下画像のように、Hacker News の記事のタイトルとリンクを投稿。そして、そのスレッドに記事内容の日本語要約も投稿してくれます。
コードはすべてこちらで公開しています。
💘 モチベーション
Geek な人々が使っている Hacker News から海外の最新情報を得たい!でも英語が絶望的に苦手 & Hacker News のデザインが質素すぎて購読するのがしんどい。という理由から、怠惰に情報を得られる手段として作りました。
今のところストレスなく情報を得られているので、作ってよかったなと思っています。
🛠️ 技術的なポイント
簡単に構成と、詰まったところを紹介します。
構成図
構成は以前記事にしたGitHub Trending Botとほぼ同じです。
Firebase Cloud Functions の定期実行をトリガーに、Hacker NewsのAPI から記事を取得、LangChain で日本語要約を作成し、Bluesky の API を使って投稿しています。重複投稿を防ぐために、投稿履歴は Firestore に保存しています。
LangChainでの要約
OpenAI の GPT-3.5 を LangChain のsummarization経由で使い記事の要約文を生成しています。
PuppeteerWebBaseLoaderを使って、記事の内容から Document を作成、それを summarization に渡すけです。LangChain すごい。
Web ページのテキストを取得する PuppeteerWebBaseLoader の使い方で 2 つ詰まりどころがありました。
1 つ目は取得テキストの指定です。
当初、PuppeteerWebBaseLoader に何も option を与えず使っていたのですが、そうすると、うまく要約できないことが頻発しました。
PuppeteerWebBaseLoader のデフォルトでは、ページ情報の取得にdocument.body.innerHTML
を使われるため、要約に関係ないページの HTML タグ含めすべてを要約対象に入っていたことが原因でした。
これではトークンも無駄に消費してしまいお財布に痛いので、document.body.innerText
を使うように evaluate オプションを指定しました。
2 つ目はLoadAndSplit
メソッドの利用です。
PuppeteerWebBaseLoader のドキュメントには、Load
の方で記載されているので間違えた人がいるかもしれません(私😇)。しかしloadAndSplit
でドキュメントを分割しなければ、Summarization Chain を利用する旨味がありません。
Summarization Chain は、分割された document を再起的に要約する Chain です。とくにページの文章量が多い場合は、ドキュメントを分割しないと、モデルの最大トークン数を超過してしまい実行時エラーが発生します。トークン制限がきついモデルを使う場合は、必ずLoadAndSplit
を使いましょう。
記事要約のスレッド投稿
LangChain で作成した要約文は、Bluesky の API を使って記事のスレッドに投稿しています。
実装コードはこちらです。
Bluesky の投稿文字数の条件は 300 文字なので、要約文が 300 文字を超える場合は、要約文を分割して投稿しています。自然に読めるよう。
や、
の句点を起点に要約文を分割しています。
分割のコードはほぼすべて ChatGPT に書いてもらいました。最高便利。
おわりに
Twitter の API 制限等々の影響か、最近 Bluesky が盛り上がってきて楽しいです。Hacker News Bot も便利なのでぜひ使ってみてくださいー!
自分のアカウントはこちら。ボットやツールなど色々作ってます。
Discussion