FILEMAKER

FileMaker で AI やってみた (3) - イメージ編

昨年 2024 年 6 月にリリースされた Claris FileMaker 2024(バージョン 21.0.1)から、新しい AI 関連のスクリプトステップおよび関数が追加されました。
前回のブログ(「FileMaker で AI やってみる (2) - テキスト編」)では、FileMaker ビギナーズ & ジュニアズのみなさんにオープンソース LLM を使ってセマンティック検索を実行する方法を、Claris エンジニアリングブログの内容に沿ってご紹介しました。
今回は、前回とは別の Claris エンジニアリングブログで紹介されている手順に従って、イメージ(画像)に対するセマンティック検索を実行するカスタム App を実際に作ってみましょう。今回もびっくりするくらい簡単なので、FileMaker ビギナーズ & ジュニアズのみなさん、さささ、ご一緒に。

今回の旅路:

  • ゴール:イメージに対するセマンティック検索を実装する
  • さっそく始めましょう!
  • オープンソース LLM を使ってセマンティック検索(イメージ)
  • できました

1. ゴール:イメージに対するセマンティック検索を実装する

前回のブログでは、テキストに対するセマンティック検索を紹介するエンジニアリングブログに沿って、サンプル App の「会議」App にセマンティック検索を実行するスクリプトを追加してみました。このスクリプトを実行すると、クエリーのテキストが含まれていないデータでも「意味的に類似」しているものとして検索することができました。
今回は、2024 年 11 月に公開された次の Claris エンジニアリングブログに沿ってセマンティック検索をイメージに対して実行してみます。

このエンジニアリングブログによると、セマンティック検索を使って言葉(テキスト)で画像を検索したり、画像を使って意味的に類似した画像を検索したりすることができるようになるようです。いつも置き場所がうろ覚えで「こんな画像があったはずなんだけど」と延々と探し続けていた身には、なんだか夢のようですね。

使用した環境は、macOS Sequoia 15.3.1、Claris FileMaker Pro 2024(バージョン 21.1.1.41)です。FileMaker Server 2024(バージョン 21.1.1.40)の環境も使いますが、前回と同様、必須ではありません。

2. さっそく始めましょう!

オープンソースモデルサーバーの設定と開始
このエンジニアリングブログも、オープンソースモデルサーバーの設定から始まります。
しかし、前のブログを経た私たちは既にオープンソースサーバーを手に入れています!(まだの方は、前の前のブログ「FileMaker で AI やってみた (1) - 準備編」をご参照ください)
ですので、このセクションは飛ばしてしまっても実質的に問題ありません。
ただ、このエンジニアリングブログでの設定方法は一部が前のブログとは異なっているので、その部分について補足しておきます。



7. 「Open_Source_LLM」フォルダ内の「requirements.txt」ファイルから Python ライブラリの依存関係をインストールします:
pip install jwt
pip uninstall PyJWT
pip install PyJWT
pip install -r requirements.txt


pip は Python のパッケージ管理ツールで、「pip install <パッケージ名>」で指定したパッケージをインストール、「pip uninstall <パッケージ名>」で指定したパッケージをアンインストールすることができます。
エンジニアリングブログが書かれた時期や執筆者によるところが大きいのですが、このステップの上 3 つの pip コマンドは前のエンジニアリングブログには入っていませんでした。では、これは何をするものでしょう?
前のブログで作成した環境は使わず、新しい Conda 環境でこれらを実行すると、まず 2 行目の pip コマンドで警告が出ます。

WARNING: Skipping PyJWT as it is not installed.

一方、以前のブログで作った既存の Conda 環境で実行すると上記警告は出ず、アンインストールが実行されます。この後に 3 行目の pip コマンドを実行すると、最新版の PyJWT がインストールされます。
つまり、2 行目は Conda 環境に既に PyJWT がインストールされていたらいったんアンインストールし、3 行目で最新版の PyJWT でインストールして置き換えるということになります。
その後、4 行目の pip コマンドで requirement.txt に記載されている複数のパッケージが一度にインストールされます。

その他は、前のブログ(「FileMaker で AI やってみた (1) - 準備編」)と同じです。実際のところ、前のブログで既にオープンソースモデルサーバーが実行できるようになっていますので、その Conda 環境を使ってオープンソースモデルサーバーを起動しましょう。
> python ./server/fm_LLMOS_StartServer.pyc

3. オープンソース LLM を使ってセマンティック検索

例 1: テキストを使用したイメージの検索
まずは、テキストを使ってイメージを検索するカスタム App を作成します。エンジニアリングブログの例では、テキスト「熊」で検索すると、クマのイメージ(画像)が保存されているレコードを検索するようなものです。それにしても「熊」を検索するってどういう状況なんでしょうね?

ステップ 1. コンテンツ管理 App を作成する & ステップ 2. 埋め込みベクトルのフィールドを追加する
ここでは、サンプル App の「コンテンツ管理」App を使用します。
この App の「コンテンツ管理」テーブルには、オブジェクトタイプの「ファイルオブジェクト」フィールドが定義されており、ここにイメージオブジェクトを保存することができます。
この「ファイルオブジェクト」フィールドの内容を変換した埋め込みベクトルを保存するフィールドとして「イメージ_埋め込み」フィールド(オブジェクトタイプ)を追加しておきます(「ステップ 2」)。

ここでは、「コンテンツ管理」App のサンプルデータとして、Claris の業種別サンプル App のアイコン画像を 95 件登録してみました。どんなアイコン画像があるのかは、業種別サンプル App の無料ダウンロードページを覗いてみてください。

ステップ 3. 埋め込みベクトル(を生成する)スクリプトを作成して実行する
埋め込みベクトルを生成するスクリプトは、前のブログで作成したものとほぼ同じです。違いは、指定するモデルだけです。
画像に対するセマンティック検索するためのモデルは、FileMaker 2024 では次の 3 つについて動作が確認されています

  • clip-ViT-L-14
  • clip-ViT-B-32
  • clip-ViT-B-32-multilingual-v1

ここでは「clip-ViT-L-14」を使用します。モデルの詳しい仕様は、Hugging Face のページを参照してください。
なお、上記のモデルの中には Open_Source_LLM/shared フォルダの「fm_LLMOS_ModelSettings.json」ファイルに記載されていないものもありますが、このファイルに追記することによってオープンソースモデルサーバーが自動的にダウンロードしてくれるようですので、ご興味のある方は試してみてください。

このステップで作成する「イメージデータの埋め込み」スクリプトは、以下のようになります。見ての通り、前のブログの「メモデータ埋め込み」スクリプトステップとほぼ同じですね。

実行してみましょう!

今回は、アイコン画像と言えどもイメージなので情報量が多いせいか、ちょっと時間がかかります(実行しているマシンのファンも久々にうなりました)。でも、エンドポイント「/v1/embeddings/image HTTP/1.1」(テキストの時とは違いますね)から「200 OK」が返ってきているので、埋め込みベクトル作成は成功しているようです。やったー。

ステップ 4. セマンティック検索(を実行する)スクリプトを作成して実行する
続いて、テキストでイメージを検索するセマンティック検索を実行するスクリプトを作成します。これも前のブログで作成したものとほぼ同じで、違いはやはり、モデルだけです。モデル名を変数にしてスクリプトを使い回せばよかったですね。
というわけで、前のブログで作成したスクリプト(「セマンティック検索」)をちょっと変更し、モデル名を変数($LLmodel_name)で指定できるようにしました。下の図に現れていない 13 行目以降は前のスクリプトとほぼ同じです(1 か所、モデル名を指定しているところがあるので注意!)。こういうささやかな工夫が我々 FileMaker ビギナーズ & ジュニアズの醍醐味ですね、ふふふ。

テキストを使用したイメージ検索を実行
できあがったら、即実行。今回は、クエリーのテキストとして「食べ物」(日本語)、類似度の閾値を「0.7」に指定してみました。
これで実行すると、オープンソースモデルサーバーを起動したターミナルにリクエストの結果(「200 OK」)がすごい勢いで流れていきます。その結果は!

…お眼鏡にかなうイメージはなかったようです。類似度の閾値が強気すぎたかもと思い、「0.5」「0.3」と下げていっても結果は同じでした。最後に「0.1」にすると…。

おお、さすがに 3 件出ました。これはヒットしたレコードのうち、類似度が高い順の上位 3 件です。見せてもらうか、その上位 3 件とやらを!

上から「おにぎり」(順当)、「幕の内弁当」(順当)、「獅子頭」(えっ)!
…「獅子頭」…はっ、この画像は遠目に見ると「ハンバーガー」に見えなくもない…かも。(そうなのか?)

ともあれこれは、弊社の業務において、新しい業種別サンプル App の新しいアイコン画像が既存のアイコンと被らないか確認することとかに使えるかもしれません(売り込んでみよう)。
ただ、「おにぎり」の画像ですらテキスト「食べ物」との類似度が「0.19」なので、このモデルでは今回のデータに対して全体として類似度が低めに出るのかもしれません。訓練済みのモデルをそのまま使っているので、この辺は仕方ないのでしょう。

例 2: イメージを使用したイメージの検索
次は、現在のレコードのイメージに類似したイメージの検索です。「類似」画像検索ですね。
エンジニアリングブログに書かれているように、別に現在のレコードのイメージでなくてもよく、iPhone で撮影した写真を使うこともできますし、別の画像ファイルを挿入することもできます。
この辺の工夫は、日頃から学習に勤しんでいる FileMaker ビギナーズ & ジュニアズのみなさんにお任せするとして、ここではブログのとおりにやってみます。

ステップ 5. セマンティック検索(を実行する)スクリプトを作成して実行する
スクリプト自体は、直前に作成した「イメージのセマンティック検索(テキスト)」スクリプトを複製し、ちょっと変更するだけで済みます。
具体的には、[セマンティック検索を実行] スクリプトステップの [クエリー:] オプションを [ベクトルデータ] に変更し、これによって新たに出現する [ベクトル:] オプションに「コンテンツ管理::イメージ埋め込み」フィールドを指定するだけです。オプション全体は次のようになります。

  • [クエリー:] [ベクトルデータ] を選択
  • [ベクトル:] 「コンテンツ管理::イメージ埋め込み」を指定
  • [レコードセット] [すべてのレコード]
  • [ターゲットフィールド] 「コンテンツ管理::イメージ埋め込み」を指定
  • [返される数] 「3」を指定
  • [コサイン類似度条件] [次の値より大きい] を選択
  • [コサイン類似度の値] カスタムダイアログで取得して変数に設定した値($th_similarity)

上の図に現れていない 13 行目以降で、このスクリプトでは使っていない変数($query)が入っているところが 1 か所ありますので、ご注意ください(どうあしらうかはお任せします)。

イメージを使用したイメージ検索を実行
さて、実行してみましょう。
今回ちょっと、すごいな、と思ったのですが、これが結構すごいんです(日本語が崩壊するほど…)。
まず、「白襟とネクタイ」のイメージ(下図の左上)が保存されている現在のレコードで、類似度の閾値「0.7」(上のテキストによる検索のときよりも強気です)を指定してスクリプトを実行してみました。
すると、検索結果(下図の右下)のうち、現在のレコード(検索条件そのもの)以外の 2 件はすべて、白襟とネクタイっぽい画像でした。それぞれの類似度も、上のテキストを使用したイメージ検索のときよりも大きい値です(「0.7」以上)。

もう一つ、今度は「絆創膏」のイメージ(下図の左上)が保存されている現在のレコードで、類似度の閾値「0.7」を指定して実行してみました。
実は、このアイコン画像集には絆創膏とイメージレイアウトがよく似た鉛筆とかナイフとか体温計のイメージが含まれていたので、正直それが上位に検索されると予想していました。
ところが、実際の検索結果はなんと、ばってん貼りの絆創膏のイメージと、病院で看護士さんが持っているようなバインダーのイメージでした(下図右)。確かに「医療」という文脈で類似しているのですが、「セマンティック検索」とはそこまで「セマンティック検索」してくれるものなのか? なんだかキツネにつままれたような気分です。

試しに、上の「絆創膏」にレイアウトが似ている「鉛筆」のイメージのレコードでセマンティック検索してみたら、なんと絆創膏は出てこず、メモ帳や電球(「アイデア」?)などのレコードが出てきました(下図右)。今回の検索は上位 5 件まで出力するようにオプションを変更していますが、絆創膏レコードはこの 5 件の中には出てきていません。今回は文房具とか学校とかの文脈で検索されたのでしょうか?
うーん、奥が深い、というのか、「セマンティック検索」、恐るべし。

取りあえず、今回もひとまずイメージに対するセマンティック検索は成功でしょう!

4. できました

今回のブログ・シリーズでは、エンジニアリングブログの内容に沿って、オープンソース LLM を使ったテキストと画像のセマンティック検索を実行してみました。
実際のところ、今回使ったモデルが答える「類似している」「類似してない」にイマイチ共感できないところもあったのですが、画像はなかなか情報量が多いコンテンツなので、何を探したいのかをしっかりと相手(モデル)に伝えきれていなかったのかもしれません。そうだとすると、思った通りの結果が出なくても仕方がないですね(人間も同じですね)。
ただ、それ以上に「きみ、それも探してきたんか」と驚くような検索結果も出ているので、使い方によっては、なかなか将来が楽しみな技術です。
今後、FileMaker でどのような「AI 技術」が使えるようになるかはまだわかりませんが、近い将来、みなさんがお持ちの既存のカスタム App と連携して、目を見張るような機能が実現できるようになるといいですね!

それではどちらさまも、bon voyage!

なお、このブログ・シリーズでご紹介しているセマンティック検索は、FileMaker 2024(画像のセマンティック検索はバージョン 21.1.1 以降)でご利用いただけます。これよりも前のバージョンをお使いの方は、最新の無料評価版をダウンロードしてご利用ください。