スクエニ ITエンジニア ブログ

ベクトル検索を応用したアプリケーションをつくろう!

こんにちは、ホシイです 👋

以前の記事 で、ベクトル検索を気軽に試す例をご紹介しました。しかしこのベクトル検索、実際どのような用途に役立つのでしょうか。前回はアイディア次第… と濁して終わりましたが、今回はひとつその具体例を考えてみましょう。

Image captioning

前回の記事では、database (Redis) に保存されたテキストデータに対して embedding を生成し、それを用いて検索する例を実行してみました。テキストに対して検索するというのは想像がしやすいですが、対象がテキストであればなんなら正規表現などを用いても検索ができるものなので、そこまでありがたみを感じないかもしれません。

ということで、今回は画像を対象にしてみます。テキストで画像を検索するようなサービスをつくれたらいろいろと可能性が広がりそうです。

web を検索すると、AI を用いて画像キャプションを生成する例などもよく見られるようになりました。
例: Using GPT4 with Vision to tag and caption images

OpenAI が何かと話題ではありますが、今回はわたしの都合で、利用しやすい Vertex AI の API を使用してみます。

やることは こちら の例のままです。Python の環境と、サンプルの画像ファイルがあれば準備が整います。(Google Cloud は billing 有効で認証ありの前提で… 🙏)

こんな感じの AI の例としてよく使われている画像 を適当に用意して実行してみたところ、以下のような結果が得られました。

$ python app.py 
['an astronaut is riding a horse on mars']

よさそうです!

システム全体の構成案

Google Cloud を使って、画像ファイルの保存と検索のシステムを検討してみました。(実証していません。仮想のものです)

  1. Image uploader service は、エンドユーザーが upload した画像ファイルを受け取り、Cloud Storage に保存します。また、database にそのファイルについてのエントリを保存します。この時点では embedding (vector) は空です。別の service に embedding 生成を指示するために、必要な情報を Pub/Sub に送信して処理を終わります。
  2. Embedding generator service は、Pub/Sub からコマンドを受け取り、対象の画像ファイルを Cloud Storage から取得して image caption を生成し、さらにその embedding を生成します。これには Vertex AI の API を使えますし、他の AI service を用いることももちろんできます。生成した embedding は database の該当行に update します。
  3. Search service は、ユーザーの入力したテキストを受け取り、embedding を生成、それを条件にして database に保存されたものに対しベクトル検索をかけます。得られた結果にもとづいて、Cloud Storage に保存された画像を取得してユーザーに表示します。

これで実現ができそうです。ここで使う database は、前回の記事でもご紹介した Redis を使ってもよいですし、Google Cloud でも Big Query などベクトル検索に対応した database がいろいろとありますので用途に合ったものを選んでみてください。
また、Embedding generator service は Cloud Run でなくてもよさそうです。一件ずつ時間がかかる処理なので、batch 的なものを使ってもよいかもしれません。

ちなみに、今回参照したページ にも書かれている (そのうち更新によって消えるかもですが) ように、新しく発表された Gemini API では複数画像の処理なども可能なようです。すこしだけ試してみましたが、実装が非常にかんたんな上に様々な使い方ができそうでした。また機会がありましたら例をご紹介したいと思います。

Vertex AI の費用については こちら にまとまっています。今回の Imagen - Visual Captioning は $0.0015/image とあります。従量で安価から始められますし、使い方によっては結構リーズナブルに感じます。厳密には text の in/out でもう少しかかりますので、使用するときにはよくご確認ください。

考えられる用途

アイディア次第ですが、こういったことに使えそうに思います。

  • ユーザー投稿画像がルールに沿ったものか自動的に検査する
  • 監視カメラの映像を順次テキスト化し、条件によって通報する
  • アーカイブに蓄積された画像を内容によって tag 付け・分類する
  • 日々追加される画像の内容を逐次 Slack に通知する

ちなみに試しに、世間的によく知られている (著作権の対象となる) キャラクターが入った画像を使用して image captioning を実行してみたところ、しっかりそのキャラクター名も入った caption が得られました。特定の AI service に限られるかもしれませんし将来にわたってその回答が得られるかは確実ではありませんが、特定のキャラクターが入った画像であれば〜 といった条件での動作もある程度期待できそうです。

まとめ

ベクトル検索を用いた実用的なシステムを検討してみました。今回は残念ながら実運用している例ではありませんが、(認証や権限など) いくらか追加で検討が必要な点がありそうなものの、じゅうぶんに実現が可能そうです。

ただ、やりたいことに対してちょっとたいへんだなーという印象はあります。Cloud Storage に雑に保存した画像が直接ベクトル検索できれば済むのでは…? という本末転倒な感想を述べて終わりとさせていただきます 😇 それではまた 👋

この記事を書いた人

記事一覧
SQUARE ENIXでは一緒に働く仲間を募集しています!
興味をお持ちいただけたら、ぜひ採用情報ページもご覧下さい!