MongoDBで自然言語からクエリを生成する #MongoDB #MongoDBCompass #MongoDBAtlas
MongoDBテクニカルサポートの山森です。
MongoDBのGUIクライアントである「MongoDB Compass」で、面白い機能がPablic Previewで追加されていたので、ブログに書くことにしました。
一言で言うと、自然言語からMongoDBクエリを生成する機能です。「Which movies were released in 2000?(2000年に公開された映画はどれ?)」のように人間が扱う言語(自然言語)をMongoDBクエリに変換してくれます。
MongoDBクエリはSQLではなく、MongoDB独自のものです。SQLとMongoDBクエリの対比表も公式から提供されてはいますが、ほとんどのエンジニアにとって、新しいクエリを覚えるのは楽ではないかと思います。
MongoDB Compassとは
MongoDBには公式で2つのクライアントが用意されています。ひとつがMongoDB Shell(mongosh)、もうひとつが今回紹介する「MongoDB Compass」(以下 Compass)です。以下のサイトからダウンロードできます。
https://www.mongodb.com/ja-jp/products/tools/compass
mongoshとCompassの違いは、CLIかGUIかです。
mongoshはCLIなので、GUI環境がないLinuxでも使えます。CompassはGUIクライアントですが、実はCompassにmongoshが使えるターミナルがあるので(下画像参照)、使用する端末がGUI環境ならばCompassを入れておけばだいたい大丈夫です。
Compassでできること
接続文字列があれば、複数のMongoDB Serverに接続できます。セルフホステッド版、MongoDB Atlas問わず接続可能です。
接続後はMongoDB Server内部のデータベース、コレクションをGUIで閲覧することができます。これはセルフホステッド版のMongoDB Server(Enterprise Advance)に接続して、sample_airbnbデータベース内のlistingsAndReviewsというドキュメントを見ている画面です。
ドキュメントに対してMongoDBのクエリ実行、集計パイプラインの生成・実行、スキーマの分析、登録されているインデックスの確認など、だいたいのことができます。
Compassの紹介はこれぐらいにして、今回追加された機能について見ていきましょう。
自然言語からクエリを生成する
該当機能のドキュメントはコチラです。
さっそく試してみましょう。クエリを実行する所に「Generate Query」と出ているのでクリックします。
MongoDB Atlasへのログインが求められます。アカウントがない方は、こちらから事前にサインアップまで済ませておいてください。Atlasへのサインアップは無料です(クラスタをデプロイするまでは課金されません)。
ポリシーが提示されます。「Agree and continue」をクリックすると使えるようになります。
今回使用するデータベースとドキュメントはAirbnbのレビューのデータです。MongoDB Atlasのサンプルデータとして使用されているものなので、MongoDB Atlasにサインアップ後、クラスター(無料のM0も含む)を構築すれば、だれでも見られます。
今回は、この機能がセルフホステッドのMongoDBでも動くか試したかったので、事前にAtlasからデータをエクスポートし、ローカルで構築したMongoDB Serverにmongoimportを使ってインポートしています。
対応している自然言語は英語のみです。英文の変換はGoogle翻訳を使いました。
「ベッドが3つ以上あり、アメニティにヘアドライヤーがあり、価格が300以下の物件を、価格でソートした結果を10件教えて」と聞いてみました。いい感じにクエリが生成されていますね。
「Find」を押して実行してみます。10件抽出されました。
この機能は集計パイプライン(Aggregation Pipeline)でも使えます。
「住所がポルトガルの物件の価格の平均は?」と聞いてみました。$matchと$groupでパイプラインが生成されているのが分かります。
平均価格を出してくれました。
Explainを実行すると今回生成されたクエリの実行計画を見ることができます。今回のクエリは「COLLSCAN(全コレクションの検索)」なので、インデックスを使用しなかったことが分かります。
総括
かなりいい感じにクエリを生成してくれることが分かりました。個人的には、MongoDB独自の機能である集計パイプラインにも使えるのが非常に良いと思います。
生成AIによって生成されたクエリを鵜呑みにするのは良くないですが、たたき台として作成し、 Explainを使ってインデックスが効いているか確認しつつ、効率の良いクエリを模索する。という使い方が できそうだなと思いました。また良さそうな機能があれば紹介しますね。