🦥

3日間でテック記事のAI要約・翻訳メディアをつくってみました

2023/10/05に公開1

つくったもの

Tech Sloths
🔗 Tech Sloths

英語のテックブログなどを中心に、OpenAI APIにより要約と翻訳を行いメディア化しました。
AIによる、記事の内容を活かした「アイディアや導入例」の提案なども掲載しています。

開発した背景

  • 日々アップデートされる技術情報、どこから手をつけるかわからなくなりがちだった
  • テックブログは長文が多くて読むのに時間がかかる印象があった
  • 英語の文章を読む心理的ハードルの高さがあった
  • OpenAI API Function calling について知り、何かやりたかった

使用した技術

フロントエンド

なるべく工数を割かずにサービスのフロントを用意したかったので、Notion上に作成したPageをWebサイト公開する機能の利用を決めました。

バックエンド

言語

  • Python

OpenAI APIのライブラリを利用したかったので、Python を選択しました。(Node.js libraryもあります)
また、APIサーバーを構築するためにFast APIを利用しています。

Database

生成記事を保存しています。

API

要約や翻訳元のデータとなるサイトのURLを取得しています。

記事の要約、翻訳、記事をもとにしたアイディアの提案、データ整形(JSON化)などに利用しています。

生成した記事データの入稿に利用しています。

クラウドサービス

APIサーバー用のインスタンスを立てています。

新しい記事を追加するために、一定間隔で、APIリクエストを行なうために利用しています。

その他、画像素材など

主に、Notionのカバー画像の生成に使いました。

3日間の開発記

Day 1. 9/30

明け方眠れなかったので、OpenAI APIで個人開発しようと思い立ちました。

エンジニアと人生コミュニティSlack

やったこと

  • URLの内容を取得し、OpenAIで要約・翻訳する処理のコードをざっくり書く
  • フロントをどうつくるか検討し、一番手のかからないNotionの利用に決定
  • どんな内容をOpenAIに生成させるかを検討し、Notionページ内の表示項目を策定
  • Notion APIのインターフェースの確認

Day 2. 10/1

この時点でだいぶ形になり、LLMの記事生成から入稿まで一連の流れができていました。

エンジニアと人生コミュニティSlack

やったこと

  • Feedly APIでURL一覧を取得を実装
  • Notion APIを使ったデータ入稿を実装
  • 前日作ったAPIに、上記の実装を連結
  • Cloud Runにデプロイ
  • Cloud Schedulerでスケジュール設定

Day 3. 10/3

リリースノート系のコンテンツは文章量が多く、Token制限のために、OpenAIによる要約に失敗していました。そのため、細かいチューニングを入れることにしました。

エンジニアと人生コミュニティSlack

やったこと

  • LangChain(ライブラリ)を使って長い文章をチャンクし、チャンクごとに要約するように修正
  • 生成記事の内容の最終調整

そして、完成 🎉

エンジニアと人生コミュニティSlack

たいへんだったこと

Notion API のリクエストパラメータの生成

Notion ページは「タイトル」や「作成日」などのページプロパティと、ページ内容の「見出し」や「文章」「画像」などの各「ブロック」で構成されています。
それぞれ指定したい場合のパラメータ構造が微妙に異なるため、慣れないうちはドキュメントを行ったり来たりする必要があり、大変だと思いました。

OpenAIのモデル指定をうっかり忘れて、$70💸


10/2に、料金が跳ね上がっている部分があります。長文対応のため、LangChainの処理を追加した日です。その際の実装ミスにより料金が上がっています。

OpenAIクラスを利用していたのですが、下記のようにモデル名を明示的に指定しない場合、text-davinci-003がデフォルト指定されます。

from langchain import OpenAI
llm = OpenAI()

text-davinci-003はGPT-3.5モデルの中でも高品質ですが、gpt-3.5-turbo の10倍のコストがかかります。

これを防ぐためには、モデル名を明示するか

from langchain import OpenAI
llm = OpenAI(model_name="gpt-3.5-turbo")

gpt-3.5-turboがデフォルト指定されるChatOpenAIクラスを利用すればよかったのでした。

from langchain.chat_models import ChatOpenAI
openai = ChatOpenAI()

感想

今回の個人開発を経験するまで「LLMを使ったサービスを作るのは、なんとなくむずかしそう・・・」という印象を持っていました。ですが、3日間で形にできたことで、LLMを利用したサービスは思ったよりも簡単に作れるというのが最も大きな気づきでした。

以上です🎉
ありがとうございました。

Discussion

mu babamu baba

これ素晴らしいなって思ってから、数ヶ月。非テックな僕は導入できずにいる。
これ自体を1つのSaasとして有料で提供して欲しい。そしたらRSSでフィードを登録するより簡単に、
今は無くアンテナサイトが構築できるのに...
Notionをフロントエンドにしているから、話題性もありそうだし