Microsoft MVPの三宅和之氏

三宅和之氏(以下、三宅):今スライドが映っていると思いますが、Cosmos DBに特化したBuildの話をしようかなと思います。

まずは簡単に自己紹介ですね。三宅と申します。ゼンアーキテクツという、Microsoft Azureのパートナーをやっている会社の代表をやっています。個人的にはMicrosoft MVPをAzureでいただいています。仕事は、Azureのアーキテクチャ設計をやっているのですが、やはりその中でも今日の話であるCosmos DBがすごく好きで、そこを中心にけっこう扱っている感じです。

フロントエンドもけっこう好きで、Vue.jsのユーザーグループの運営のお手伝いをしたりしています。写真をいろいろセレクトしてきました。Scott(Scott Guthrie氏)がする話とか、先ほどのCopilot Stack のスライドが一番気に入っているので、撮った写真を持ってきました。下にあるのがCosmos DB絡みで、この3人で写っている写真の真ん中にいるのが、Mark Brownという、Cosmos DBのPM、プロダクトマネジャーですね。

彼は今回5つぐらいセッションを持っていたのですが、その中からVector Searchの話とか、あとはハンズオンを実施させてもらう中で直接話をしたり、手を動かしたりしてきたので、その報告をさせていただこうかなと思います。

Azure Cosmos DBとは何か?

今日出席されている方が全員Azureを使っているわけではないと思っているので、Cosmos DBのアップデートの話をする前に、簡単にAzure Cosmos DBは何か? というのを少しだけ話します。これを話し出すと僕は3日ぐらい話せます(笑)。今日はそれをこのページだけで3分ぐらいに凝縮しないと詰まってくるので、とりあえず飛ばしていきますね。

Cosmos DBは、Azure上のNoSQLのデータベースと言われていたのですが、今はそういう言い方ではなく、データベース基盤という言い方のほうが合っていそうです。というのも2022年、これでPostgreSQLが動くようになったんですよ。なのでNoSQL基盤と言えなくなったんですね。Azure上で動くハイパースケールなデータストアという言い方が正しいのかなと思っています。

その上で、最近サポートされたPostgreSQLだけじゃなく、Cassandra、MongoDBなどOSSで親しまれているデータベースや、あとはNoSQL APIというネイティブな、バリバリ速いやつですね。一番カリカリにチューニングされたAPIで僕は大好きなのですがあって、いろいろな用途に合わせていろいろなAPI経由でデータベースが使えるようになっています。

特徴的なところはレイテンシですね。10ms以下のレイテンシというのが保証されています。SLAで定義されています。なのでこれ以上は遅れないようになっている感じです。簡単に言うとメチャクチャ速い。語彙力がないですけど(笑)。信頼性もすごく高くて、標準で99.99パーセントのフォーナインを達成していますが、その時点でわりとだいたいの要件を満たすことが多いんじゃないかと思います。

ですが、これをとあるオプション、具体的には書き込みリージョンを2つ以上にすると99.999パーセントのファイブナイン。これはわりと驚異的な数値。これを達成できるところまで引き上げるオプションもあります。なので、爆速でものすごく信頼性が高いと思ってもらえれば。あとはスケールもクラウドネイティブなアーキテクチャなので、データベースはスケールで伸び縮みするのにけっこう時間がかかったりするのですが、これは数秒であっという間に変わっていきます。

(スライドを示して)あとは一番右に書いてあるAzureと各サービスの統合。これはもう当然ですよね。

「Microsoft Build 2023」で発表された大量のアップデート

というところで本当に駆け足になりましたが、まずはアップデートの話をしていきましょう。今Cosmos DBの特徴をいろいろ話しましたが一言で言うと、ChatGPTの基盤にもできるデータベースです。それでなんとなくどれぐらいの規模感に耐えられるのかとか、パフォーマンスを含めてイメージを持ってもらえるんじゃないかなと思います。

基調講演か基調講演のその次だったか忘れましたが、このスライドもドンッと出てきて、「Azureで動いていますよ!」「その中でもCosmos DBを使っていますよ!」と、あえてプロダクト名がここにあるというのが胸アツでしたね。それぐらいを支えられるものとして非常に信頼性が高く、あらゆるところに対応できるデータベースですというところをちょっと付け加えさせてください。

司会者:ここはけっこう盛り上がりましたよね。

三宅:盛り上がりましたよね。

話者:一瞬沸き上がりましたよね。

三宅:メチャクチャ盛り上がっていましたね。それでアップデートなんですが、とんでもない量でした(笑)。今までもCosmos DBはけっこうがんばっているほうだと思っていて、きちんとイベントごとにアップデートを整理して出してくれるタイプなんですが、感覚的に毎年、半年ぐらいに1回で、5つ前後なんですよね。

今回は数えていませんが、10以上あります。しかも内容が濃い。もちろん今日これを全部説明する時間はありませんが、その中でも「待ってました!」というぐらい熱いアップデートが3つあります。それに関しては、これからかいつまんで説明したいと思いますが、とにかく量も多いし内容も濃かったというのが今回のアップデートでした。

Cosmos DBがベクトル検索をサポートするようになった

まず、先ほどの大嶋さん(大嶋悠司氏)の話と何も調整していないのですが、なんとなく空気を感じたので、これから説明しようかなと思って持ってきています。先ほど紹介がありましたが、Cosmos DBが今回ベクトル検索、Vector Search……日本語でどう言うか誰か決めてほしいですね。「ベクトル」と言うべきか「ベクター」と言うべきか。

司会者:難しいですね(笑)。

三宅:とりあえず「ベクトル検索」と私は言っていますが、これをサポートするようになりました。全部がCosmos DBで使えるというわけではなく、先ほど「いろいろなAPIを使えますよ」という話をしましたが、Cosmos DBの中のとりあえずはこのMongoDB API(vCore)で使えるようになっています。まだPublic Previewですね。

ただこれは公式ドキュメントがあって、当然日本語化されています。Cosmos DBは、実はドキュメントがメチャクチャ充実しているんですよ。日本語化もあっという間にされて、すぐに使えるようになっています。これを見ながら使えるので、みなさんもすぐに触れるようになります。しかもサンプルコードもあって、これは時間があったらお見せしようかなと思いますが普通に動きます。

ベクトル検索はこんな感じでやるのかと、わかりやすいですね。(スライドを示して)Cosmos DBがサポートしているベクトル検索の仕様はこんな感じです。私も専門家ではないので「これは何ですか?」と言われても細かく説明ができません。そこはちょっと詳しい人にお任せしますが、今はこれぐらいの仕様になっていますよ。参考にしてみてください。2,000次元って多いんですか? 少ないんですか? 普通なんですかね?

これも多少(他のセッションに)被る話ですが、私もこのCopilot Stackには非常に感銘を受けて、メチャクチャ腹落ちしました。ベクトル検索はちょっと説明が被っちゃうので飛ばしますが、groundingの部分に該当している。そこの1つの選択肢としてCosmos DBが使えるようになりましたということですね。この図に照らし合わせて「あ、ここのアップデートなのか」と、捉えていただければいいかなと思います。

実はベクトル検索は、先ほど説明があったようにCosmos DB以外にもCognitive Searchが今回のBuildで追加になったのですが、もともとそれ以外にもCache for Redisのエンタープライズと、Buildの1ヶ月ぐらい前にAzure Data Explorerでも使えるようになっていますよという発表がありました。

今は私の知る限りで、ネイティブなAzureのSearchとしてはこの合計4つでVector Searchが使えるので、用途や好みに合わせて使ったらいいんじゃないかなと思います。

先ほど大嶋さんから紹介があったように、通常のキーワード検索と組み合わせてハイブリッド検索をやりたければ、Azure Cognitive Searchが良いでしょうし、通常のアプリケーションのデータと一緒にMongoDBのような今まで普通に使っていたNoSQLの一部としてベクトル検索を使いたければ、Cosmos DBが合っているでしょうし、それ以外にRedisもData Explorerがあるのでいろいろと比較しながら使っていったらいいんじゃないかなと思います。

だけど、まだまだ増えるような気がしています。個人的にはぜひCosmos DBのハイパースケールで99.999パーセント達成しているNoSQLのAPIで、出てくれないかなと希望として思っています。

ベクトル検索の利用イメージ

(スライドを示して)Vector Searchのアーキテクチャのサンプルコードが紹介されていて、こんな感じで動くものになっています。ボタン1つで全部がデプロイされるようなコードが公開されているので、よかったらやってみてください。

その中でこのVector Search……ベクトル検索の位置は(スライドを示して)この右下のCosmos DBのところですね。ここにベクトルのインデックスを作るコード、MongoDBのCosmos DBがデプロイされて、適宜OpenAIのEmbedding APIとやり取りをしながらVector Dataを作ったり検索したりするサンプルです。

もうちょっと細かく見て、何をやっているかというところなんですが、このCosmos DBのベクトル検索には2つの局面があって、まずはそのデータを登録しないといけません。ベクトル検索ができるようにそのインデックスを登録しないといけません。(スライドを示して)その登録の流れは、だいたいこんな感じになっていて、まずはCosmos DBをベクトルのデータではなく生のデータとしてアプリケーションから保存をしたり、バックグラウンドで保存されたりします。

普通のCosmos DBのNoSQLのAPIを使っていて、そこにデータが保存されたらどんどん更新されます。Cosmos DBには私がイチオシのChange Feedという機能があって、更新にどんどん反応して別の処理ができる機能があります。そこでデータが更新されたら、それに合わせてインデックスを作らないといけません。

Azure Functionsが自動的に起動して、Azure FunctionsがOpenAIのEmbeddingを叩いて、ベクトルデータを作って、Cosmos DBのMongoDBのAPIが作成して、そっちに保存して検索をできるようにするというのが、アプリケーションのデータが更新されるたびに裏で走っています。

このChange Feedはすごく優秀で、ここまで登録されるのに1秒かかるか・かからないかぐらいです。ほぼリアルタイムにどんどんベクトルデータが作成されます。(スライド)右側のUI/UXの例は、アプリサービスの例で、Blazorかなにかで動かしています。

チャットのUIを作って、質問が自然言語で入力されるとその質問を今度はベクトル検索をするので、自然言語で入った質問をまたここでOpenAIを叩いて変換して、Cosmos DBがMongoDBに検索を依頼して、返ってきたものをさらに今度はCompletionsで回答を生成してUIに出していくサンプルコードになっています。

チラッとだけお見せしましょうか。こんな感じ。これはBlazorで作っているチャットUIで、動きますが日本語対応が微妙です。入力はコピペでやりますが、どんなデータが入っているかというと、自転車のカタログデータベースみたいな感じです。「どういう自転車を売っていますか?」というのを聞けるUIになっています。

ここで先ほどの流れを表示します。検索データのインデックスはできています。チャットで「どんな自転車が売っていますか?」とやると、ブランディングされたデータから答えてくれるので、カタログデータベースに入っている情報から「ロードバイクとツーリングバイクが売っていますよ」みたいな話をしてくれます。決して、ChatGPTに一般情報を聞いているわけではない。そこがgroundingをしているところで非常に大きな意味を持ちます。

その中でどんどん掘り下げていって、「ロードバイクの一番安いのを教えてよ」と聞くと、もちろんサクッと教えてくれます。これは、全部Cosmos DBのMongoDBに聞きに行っています。1つ前のやつです。

こんな感じで、本当に通常のデータベースのデータと生成AIと組み合わせた典型的な使い方ができます。こんなものがサンプルコードどおりに作れちゃいます。サンプルコード(のリンク)が(スライドの)ここに貼ってありますので、興味がある方はGitHubにアクセスして、デプロイボタンをポチっと押せばすぐに出来上がりますのでやってみてください。

(次回へつづく)