Today I Learned というアプリを作りました
はじめに
Today I Learned というアプリを作りました
LLMとのチャット履歴から自動的に「今日、何を学んだのか」を要約し、ダッシュボードで振り返りができるアプリです
以下の動画を見ると、なんとなく使い方がわかるのではないかと思います
開発の経緯
私がフルタイムのWEBエンジニアとして働くようになったのは2023年の春でした
それまでは10年ほど大学院生として教育工学の研究をしていたのですが、その時は学習者向けのダッシュボードの開発を通して学習者の支援を行うツールの開発を行っていました
就職してからは大学時代の研究とは無縁の生活を送っていたのですが、人よりも遅れてIT業界に入った分、エンジニア独特の文化というものが、なんだか私にとっては新鮮なもののように感じられました
そのうちの一つが、 Today I Learned (以下、TIL) という文化でした
私は会社で勤務した日はできるだけ日報を書いて、その日やったことをチーム内外に共有するように努めています。そこまではエンジニアに限らずどの職種でも比較的ポピュラーな習慣かもしれません。
しかし、いつからかは正確には覚えていないのですが、私は日報に「今日学んだこと」というセクションを追加して、今日やったこととは別に、業務の中で今日知識として学んだことを日報でシェアするようになっていました
こうした習慣を続けていくうちに、私はこれがエンジニア界隈で広く見られるTILという文化の一種だということに気づきました
TILとは
これは私がインターネットで調べた話になります。少々回りくどいかもしれませんが、興味のある方はお付き合いください。
TILの起源は2008年頃にさかのぼります。ある記事によれば、Redditというソーシャルニュースサイトで「today-i-learned」というトピックが作成されたことが始まりとされています[1]。
その後、特にソフトウェア開発者コミュニティにおいて、GitHubに「til」リポジトリを作成し、日々の学びをMarkdown形式で記録する慣行が広まったそうです。特に Josh Branchaudさんのjbranchaud/til[2]というレポジトリが、TILの普及に大きく貢献したとされています[3]。
というわけで、TILの本質は、RedditのTILトピックの説明に端的に表現されています[4]
TIL does not aim for in-depth and serious discussion about a subject, but rather is more interested in a pop-knowledge overview of some minutiae of a field.
ここにはTILは対象についての深い議論を交わすことが目的なのではなく、「知識の前段階(pre-knoeledge)」に対する興味だと定義されています
正しいか正しくないかは一旦置いておいて、今日私はこれを学んだんだということをシェアすることにTILの本質があると私は理解しています
TILアプリの仕組み
ここまでTILの歴史と定義について見てきましたが、ここで私が開発したTILアプリの仕組みについて簡単に説明します
システム全体の概要はこんな感じになっています(https://app.napkin.ai/ を使って作りました)
- アプリ本体はNextJSを使ってVercelにホストされています
- 知識の保存先としてFirestoreを使っています
- ユーザーの認証にはFirebaseAuthenticationを使っています
ここまでは、私が尊敬している koki-develop さんの thredot というサービスを参考に技術選定をしました
で、肝心のチャットから知識を抽出する部分なんですが、ここはOpenAI APIを使うことで実装しています。
具体的にはこのファイルに書いてあるdigest api がそれに当たります
ここで以下のようにプロンプトを指定することで、ユーザーが何を学んだのかをLLMとのチャット履歴から判定しています
const completion = await openai.beta.chat.completions.parse({
model: "gpt-4o-2024-08-06",
messages: [
{
role: "system",
content:
"Extract what the user learned from the chat to the bot in 100 words. Provide the response in plain text without using any markdown formatting. Use the same language as the user's input for the summary.",
},
...messages,
],
response_format: zodResponseFormat(Knowledge, "knowledge"),
});
そもそも知識の抽出元としてLLMとのチャットを使っているので、都合LLMを2段階で呼び出していることになります
冗長に思えるかもしれませんが、知識を得るための手段としてチャットを使うことで、ユーザーが何を知りたかったのかが明確になるという利点があります
おわりに: なぜインターフェースを英語にしたのか
と、ここまでつらつらと書いて見たんですが、実際にアプリを触ってもらえればわかるとおり、TILアプリのインターフェースは完全に英語となっています
理由としては、TILという文化がもともとアメリカで始まった文化なので、海外の人に使ってもらえたらそれはそれで嬉しいという思いと、私自身が過去研究をしていく中で、(残念ながら)日本語で良いものを作ってもグローバルではほとんど評価されないという現実を見てきたからです
ソースコードは公開しているので、もちろん必要に応じで自分でローカライズしていただいたり、セルフホストしてデータを手元に置いていただくのは大歓迎です
何かありましたらIssueやPull Requestもお待ちしております!
Discussion