テキストと画像の検索を行うNodeJS AIアプリを構築する
NodeJS AIアプリを作成して、テキストと画像の検索をする
ベクトル検索は、生成AIの魔法をアプリケーションに取り入れる強力な方法です。そして、適切なツールを持っていれば、それほど難しくありません。ここでは、stargate-mongooseとJSON APIを使用して、DataStax Astra DB(およびベクトル検索)対応のNodeJSアプリケーションを構築する簡単な方法を紹介します。
私はDataStax Stargateチームの新しいエンジニアです。Stargateチームの最初のチケットは、StargateのAPIを使用してデモアプリを開発するという伝統的なものです。Stargateの新しいJSON APIとMongooseドライバーであるstargate-mongooseを使用して、両方を活用したnodeJSアプリを構築することにしました。
コンピュータとカメラは私の2つの情熱です。コードの行でも写真をフレームする行でも、私は論理と芸術的な創造性を楽しんでいます。それで、私の2つの情熱を組み合わせるために、作品を整理するためのPhotography-Siteを構築することにしました。AIアプリにするために、Astra DBのベクトル類似検索機能を組み込むことも決めました。
Stargate-MongooseとJSON API
私は特にJavaScriptに精通しているわけではありませんが、このアプリの構築は比較的容易でした。
Mongooseは広く使用されているオブジェクトデータマッピングツールであり、しばしばMongoDBドライバーとペアで使用され、活発なJavaScript開発者コミュニティを誇っています。オープンソースのAPIフレームワークであるStargateは、stargate-mongooseという新しいMongooseドライバーを提供しています。これはMongooseの代替ドライバーであり、Stargateの新しいJSON APIに基づいています。JSON APIはStargateのための独立したマイクロサービスであり、JSONドキュメントベースのインターフェースを使用してCassandraクラスタに格納されたデータにアクセスする機能を提供します。
この協力関係により、Mongoose開発者はオープンソースのソリューションを手に入れ、Apache Cassandraの進化における重要な進展となることができます。stargate-mongooseはMongooseと新しいJSON APIとの協力により、JavaScript開発者に優れたJSON指向のデータモデル体験とCassandraのスケーラビリティとパフォーマンスを提供します。
ベクトル検索
Stargate JSON APIとStargate-Mongooseは、Astra Vector Searchを完全にサポートしており、AIモデルに特定の情報のセットを見つける能力を与えています。このプロセスの重要な側面の1つは、異なるオブジェクトまたはエンティティ間の類似性を表すために使用される浮動小数点数のセットである埋め込みベクトルを保存する能力です。Astra DB Vector Searchは、この機能をサーバーレスのAstra DBデータベースに統合しています。
アーキテクチャ
デモアプリは、Expressウェブアプリケーションフレームワークを使用して開発されたNode.jsアプリケーションです。Stargate-MongooseをMongooseドライバーとして使用して、Astra DBからすべてのデータ(ベクトルを含む)を格納および取得します。Stargate-Mongooseは、Astra DBにアクセスするためにStargate JSON APIに依存しています。
ベクトル検索の部分に関しては、アプリはOpenAIの埋め込みAPIを使用してテキスト埋め込みベクトルを生成し、Google MediaPipeを使用して画像埋め込みベクトルを生成します。これに関する詳細は後ほど説明します。
Photography-Siteアプリのウォークスルー
ここでは、アプリがサポートするさまざまな操作と、これを可能にするいくつかの主要なAPI呼び出しを紹介します。
基本機能
このアプリでは、カテゴリごとの画像の閲覧、最新の画像の探索、ランダムな画像の表示、画像の追加、および画像名での画像の検索などの基本的な機能をサポートしています。
アプリはホームページでカテゴリごとに画像を表示します。Stargate-Mongooseを使用してAstra DBにデータを格納および取得するためには、まずデータモデルを構築する必要があります。その後、単純なfindメソッドでデータを取得できます。
アプリは、写真モデルを使用して写真のリストを取得すると、ホーム画面に表示します:
特定の写真をクリックすると、写真の名前、カテゴリ、および説明などの詳細情報が表示されます。
裏側では、これはMongooseのfindById
メソッドを使用してAstra DBから対象の写真を取得しています。
const photo = await Photo.findById(photoId);
アプリでは、写真の追加も可能です。写真の名前、説明、カテゴリ、および写真イメージ自体を入力します。
ユーザーが「写真を追加」をクリックすると、アプリは新しいPhotoオブジェクトを作成し、saveメソッドを呼び出します。データはAstra DBに保存されます。
テキスト類似検索
このアプリは、テキストの類似性に基づいて写真を検索することができます。欲しい写真や風景を説明して入力し、検索することができます。裏では、テキスト埋め込みとDatastaxベクトル検索が使用されています。
写真を追加するたびに、データモデルのフィールドとして写真の説明が必要です。この説明テキストを取得し、OpenAIテキスト埋め込みAPIを呼び出して対応する埋め込みベクトルを取得します。同様に、テキスト類似検索を行う場合も、検索テキストの埋め込みベクトルを取得します。その後、ベクトル検索を使用して類似性検索を行うために、findとsortメソッドを使用することができます。
const description_embedding = await getTextEmbedding(searchTerm); cosnt photos = await Photo.find({}).sort({ $vector: { $meta: description_embedding } }).limit(3);
次のスクリーンショットでは、「牛が食べる場所」と検索しました。その結果、2つの写真が表示されました。それらは両方とも草を含み、草食動物がいくらか写っています。そのため、テキスト類似検索の結果は意味があります。
画像類似検索
テキスト類似検索の他に、興味深い別の機能として画像類似検索があります。まず、画像埋め込みベクトルを生成する必要があります。この場合、Google MediaPipeを使用して画像埋め込みを生成し、特定のモデルはmobilenet_v3_large.tfliteです。これを実行するために、NodeJS環境でPythonスクリプトを実行するためにpython-shellに依存します。画像埋め込みベクトルを取得した後、ベクトル検索を行うことができます。
ここでは、「夕焼けの中の車」という画像があります。これを検索して類似した画像の結果を取得することができます。
ご覧のように、3つの結果があります。すべて夕焼けの色調であり、いずれも一定のパターンに従っています。上部が明るい空であり、下部が暗い地面です。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles