🪿

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

2023/07/04に公開

便利なので使ってみてくださいー!

🤖 作ったもの

Hacker News のトップ記事の日本語要約を定期投稿する Bluesky のボットを作りました。

https://bsky.app/profile/hacker-news-jp.bsky.social

以下画像のように、Hacker News の記事のタイトルとリンクを投稿。そして、そのスレッドに記事内容の日本語要約も投稿してくれます。

コードはすべてこちらで公開しています。

https://github.com/kawamataryo/bsky-hacker-news-jp

💘 モチベーション

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経由で使い記事の要約文を生成しています。

https://js.langchain.com/docs/modules/chains/other_chains/summarization

PuppeteerWebBaseLoaderを使って、記事の内容から Document を作成、それを summarization に渡すけです。LangChain すごい。

https://github.com/kawamataryo/bsky-hacker-news-jp/blob/main/functions/src/clients/openAIClient.ts#L16-L72

Web ページのテキストを取得する PuppeteerWebBaseLoader の使い方で 2 つ詰まりどころがありました。

1 つ目は取得テキストの指定です。
当初、PuppeteerWebBaseLoader に何も option を与えず使っていたのですが、そうすると、うまく要約できないことが頻発しました。

PuppeteerWebBaseLoader のデフォルトでは、ページ情報の取得にdocument.body.innerHTMLを使われるため、要約に関係ないページの HTML タグ含めすべてを要約対象に入っていたことが原因でした。

https://github.com/hwchase17/langchainjs/blob/8ddf206998f323ae2785371a6d0fdfabdf5a7ba2/langchain/src/document_loaders/web/puppeteer.ts#L61-L63

これではトークンも無駄に消費してしまいお財布に痛いので、document.body.innerTextを使うように evaluate オプションを指定しました。

https://github.com/kawamataryo/bsky-hacker-news-jp/blob/main/functions/src/clients/openAIClient.ts#L46-L67

2 つ目はLoadAndSplitメソッドの利用です。
PuppeteerWebBaseLoader のドキュメントには、Loadの方で記載されているので間違えた人がいるかもしれません(私😇)。しかしloadAndSplitでドキュメントを分割しなければ、Summarization Chain を利用する旨味がありません。

Summarization Chain は、分割された document を再起的に要約する Chain です。とくにページの文章量が多い場合は、ドキュメントを分割しないと、モデルの最大トークン数を超過してしまい実行時エラーが発生します。トークン制限がきついモデルを使う場合は、必ずLoadAndSplitを使いましょう。

https://github.com/kawamataryo/bsky-hacker-news-jp/blob/main/functions/src/clients/openAIClient.ts#L70

記事要約のスレッド投稿

LangChain で作成した要約文は、Bluesky の API を使って記事のスレッドに投稿しています。
実装コードはこちらです。

https://github.com/kawamataryo/bsky-hacker-news-jp/blob/main/functions/src/services/bskyService.ts#L173-L192

Bluesky の投稿文字数の条件は 300 文字なので、要約文が 300 文字を超える場合は、要約文を分割して投稿しています。自然に読めるようの句点を起点に要約文を分割しています。

https://github.com/kawamataryo/bsky-hacker-news-jp/blob/main/functions/src/services/bskyService.ts#L133-L171

分割のコードはほぼすべて ChatGPT に書いてもらいました。最高便利。

おわりに

Twitter の API 制限等々の影響か、最近 Bluesky が盛り上がってきて楽しいです。Hacker News Bot も便利なのでぜひ使ってみてくださいー!

https://bsky.app/profile/hacker-news-jp.bsky.social

自分のアカウントはこちら。ボットやツールなど色々作ってます。

https://bsky.app/profile/kawamataryo.bsky.social

Discussion