Titanium の採用技術と、その先に見えたもの

Titanium は、生成AIを活かした文章生産用のエディタとして作った。

前回の記事ではコンセプトや思想的な話を中心に書いたので、今回はもう少し実装寄りの話をご紹介。

バックエンドは Firebase を全面的に採用した

Titanium のバックエンドは、全面的に Firebase を使った。100%Firebaseでバックエンドを作ったのは初めてだった。

Firebase は、いわゆる mBaaS(Mobile Backend as a Service)と呼ばれるサービスのひとつで、

  • 認証
  • データベース
  • サーバーサイド処理
  • ファイル置き場
  • 静的ホスティング

といった機能をまとめて提供してくれる。

生成AIまわりも Firebase でかなり完結する

今回やってみて良かったのは、生成AIまわりもFirebase の中で完結できたことだ。

Google Cloud には Vertex AI という生成AIプラットフォームがあるが、Firebase にはそれをラップした Firebase AI Logic という仕組みが用意されていた。

これを使うと、Firebaseの中で

  • Gemini を使った文章生成
  • テキストの埋め込み(embedding)の作成

といったことが、ほぼノーコンフィグで利用できる。

Firestore 単体でベクトル検索までできるのはありがたい

もうひとつ良かった点が、Firestore がデフォルトでベクトル検索に対応しているところだ。

embeddingに関しては何らか他のデータベースに格納することを覚悟してたので、嬉しい誤算だった。

Firebaseを全面的に使ったアーキテクチャ

コアとなる機能は次のようになっている。

Firestoreにはノート本文、ノート全体のembedding、Markdownの見出しごとに分割した「セクション」ごとのembeddingを保存するデータ構造になっている。

Cloud Functionで - ノート保存時の各embedding再計算 - テキストを受け取り、そのテキストの埋め込み表現を計算し似たノートを検索 - 複数のノートを指定し混ぜ合わせたノートをgeminiで生成

ノートに関してはフロントエンド側で、数秒入力がないと自動更新をかけている。 更新毎にembedding再計算関数を呼び、カーソルが違うセクションに動けば類似ノート検索をし、Mixボタンが押されたらノート生成 という流れ。

いまいちだったところ

とはいえ、すべてが良かったわけではない。

前提として書いておくと、今回 Titanium のコードは、ほぼすべて生成AIに書かせている。
自分は設計や指示、レビューに回っていて、手でコードを書くことはほとんどしていない。

なので「動いてはいるが、自分が完全には理解していないコード」もある。

特に影響が大きかったのが、Firestore のセキュリティルール周りだ。

Firestore のルールはかなり分かりにくい

Firestore のセキュリティルールは独特で、正直かなり分かりにくい。

JavaScript や Python のサブセットだったらもう少し直感的だったかもしれないが、実際には独自DSLになっている。

今回に関しては、この Firestore ルールも生成AIに書かせている。
読む限り大丈夫だとは思うが自分では書けない。

これまでは、理解できていないコードを本番で使うことにはかなり抵抗があった。
しかし生成AI前提の開発では、
こうした割り切りをどこまで許容するのか、という新しい問題が出てきている気がする。

embedding API と Firestore の連携が惜しい

もうひとつ気になったのが、embedding API と Firestore の連携だ。

Firestore のベクトル型は 2048次元が上限になっている。
一方で、

  • Vertex AI を直接使う場合は、埋め込みの次元を選べる
  • Firebase AI Logic 経由だと、なぜか3072次元から変更できない

という仕様になっている。

埋め込みを得て、そのまま Firestore に格納するのは、非常によくありそうなユースケースだと思うのだが、ここが噛み合っていない。

結局どうしたかというと、
3072次元の embedding を生成したあと、特定の1024次元を落として 2048次元にする、
というかなり力技な対応を取ることになった。

生成AIと Web / アプリ開発のこれから

今回は、生成AIを使って、生成AIを使うサービスを実際に作ってみた。
その過程で、今後のソフトウェア開発について考えることがあった。

ちなみに、これまでも既存プログラムの機能追加やリファクタリングでは、コーディングエージェントを全面的に使ってきたが、ゼロからアプリを作ったのは今回が初めて。

最近は、

  • 「SaaS is dead」と言われたり
  • バイブコーディングで、素人でもそれっぽい画面が作れたり

といった話をよく聞く。 実際のところどうなのだろうか、、?

日本のスタートアップでよく見る、特定ユースケース向けのAIエージェント系プロダクト。
それらは今後「ChatGPTでできるよね」となる気がする。

一方で、さまざまなドメインに対応するバックエンドを、 きちんと保守・運用するのは、まだバイブコーディングだけでは難しいと思っていた。

そのためこれまでは、ヘッドレスSaaSが今後来るのではないか、ということを考えていた。

たとえばメディアサイトを作る場合でも、
WordPress のようなフルスタックなCMSではなく、Contentful のようなヘッドレスCMSをバックエンドとして使い、フロントエンド側はバイブコーディングで自由に作り込む、というということがプログラミングができなくてもできてしまう。

ただ、今回 Firebase を使ってみて、もはやバックエンドまで含めて、バイブコーディングでも充分アプリが作れてしまうのでは?とも思った。

そういう学びがある経験となった。