FILEMAKER

FileMaker で AI やってみた (2) - テキスト編

昨年 2024 年 6 月にリリースされた Claris FileMaker 2024(バージョン 21.0.1)から、新しい AI 関連のスクリプトステップおよび関数が追加されました。
前回のブログ(「FileMaker で AI やってみた (1) - 準備編」)では、オープンソース LLM を利用するための準備についてご紹介しました。今回は引き続き Claris エンジニアリングブログで紹介されている手順に従って、セマンティック検索を実行するカスタム App を実際に作ってみましょう。FileMaker ビギナーズ & ジュニアズのみなさん、さあ、ご一緒に。

今回の旅路:

  • ゴール:テキストに対するセマンティック検索を実装する
  • オープンソース LLM を使ってセマンティック検索(テキスト)
  • さて、次は

1. ゴール:テキストに対するセマンティック検索を実装する

前回のブログでは、次のエンジニアリングブログの前半に記載されている手順に沿って、オープンソースモデルサーバーを起動できるようにしました。

オープソースモデルサーバーは、OpenAI のような外部のサービスを使うのではなく、Hugging Face のリポジトリで公開されているオープンソースモデルをローカルにダウンロードして使うためのものです。
今回は、このエンジニアリングブログの後半に記載されている手順に沿って、テキストに対するセマンティック検索をカスタム App に実装します。
(イメージに対するセマンティック検索については、次回のブログでご紹介します!)

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

2. オープンソース LLM を使ってセマンティック検索(テキスト)

埋め込みベクトルの生成と保存
エンジニアリングブログでは「オープンソース LLM の設定」をした後、FileMaker 2024 で動作が確認されている LLM モデルと、セマンティック検索を行うための AI 関連スクリプトステップと関数を紹介しています。
「埋め込みモデル」の表には FileMaker 2024 で動作確認済みのモデルが列挙されています。ここで挙げられているのは、テキスト用のみです。オープンソースモデルは 4 つ挙げられていますが、詳しくは SBERT.net の Pretrained Models ページを見てね、とあります。
一方、Open_Source_LLM フォルダの README ファイル(readme.txt)には、お勧めモデルとして以下の 2 つが挙げられていました。

  • all-MiniLM-L12-v2
  • multi-qa-MiniLM-L6-cos-v1

SBERT.net のページによると、上記の「all-MiniLM-L12-v12」は「多様なユースケース向けに調整されたオールラウンドモデル」、「multi-qa-MiniLM-L6-cos-v1」の方は「セマンティック検索用モデル(Semantic Search Models)」だそうです。どちらでも「セマンティック検索」できるとは思うのですが、せっかくなので、アピールしている後者を使用してみます。
ちなみに、Hugging Face にある他のモデルも使用はできるそうです。その場合は、Open_Source_LLM/shared フォルダに入っている「fm_LLMOS_ModelSettings.json」ファイルにそのモデル情報を記述します。すると、オープンソースモデルサーバーが自動的にそのモデルをダウンロードして使用できるようになるのだそうです。ただし、上記以外のモデルについては Claris では動作確認していないのでご注意ください。
なお、FileMaker 2024 でサポートしているモデルについては「Claris FileMaker 2024 動作環境」に最新情報が記載されているので、こちらもチェックしてください。

この後、エンジニアリングブログにはスクリプトステップの使い方が記載されていますが、これは実際にやりながら確認していくことにしましょう。

例: オープンソース LLM を使った会議検索
エンジニアリングブログの「例: OpenAI を使った会議検索」セクションでは、サンプル App の「会議」App をベースに、OpenAI モデルを使ったセマンティック検索を実装しています。
このブログでは、OpenAI ではなくオープンソース LLM モデルを使って同じことをやってみます。

「ステップ 1. 『会議』App を作成する」と「ステップ 2. 埋め込みベクトル用のフィールドを追加する」は、エンジニアリングブログの言うとおりにします。

次の「ステップ 3」から、エンジニアリングブログとは少し違ってきます。といっても、あまり変わりはありませんのでご心配なく。

ステップ 3. 埋め込みベクトル用のスクリプトを作成して実行する
このステップ 3 では「メモデータ埋め込み」スクリプトを作成します。このスクリプトでは、ステップ 2 で追加した「メモ_埋め込み」フィールド(オブジェクトフィールド)に、「メモ」フィールドに保存されたテキストの埋め込みベクトルを追加します。
スクリプトでは、[AI アカウント設定] スクリプトステップと [対象レコードに埋め込みを挿入] スクリプトステップを使います。[対象レコードに埋め込みを挿入] スクリプトステップを使用することにより、対象レコードのすべてのレコードに対して一気に埋め込みベクトルを作成して挿入することができます(ちなみに、現在のレコードに対してのみ埋め込みベクトルを作成する場合は [埋め込みを挿入] スクリプトステップを使います)。
[対象レコードに埋め込みを挿入] スクリプトステップのオプションには、次の内容を指定します。

  • [アカウント名:] “ta”( [AI アカウント設定] スクリプトステップで指定したもの)
  • [埋め込みモデル:] “multi-qa-MiniLM-L6-cos-v1”
  • [ソースフィールド] “会議::メモ”
  • [ターゲットフィールド] “会議::メモ_埋め込み”(ステップ 2 で追加)
  • [ターゲット内容を置換] 選択
  • [引数:] (指定しません)

前回のブログで作成した [AI アカウント設定] スクリプトステップのスクリプトに追加する形で作ると、「メモデータ埋め込み」スクリプトは以下のようになります。

では、このスクリプトを実行してみましょう。
スクリプトが特にエラーなく終了すると、オープンソースモデルサーバーを実行しているターミナル(macOS)は、次のような表示が出ます。

今回はローカルで実行しているのでループバックアドレス「127.0.0.1」のエンドポイント「/v1/embeddings HTTP/1.1」から、「200 OK」が返ってきています。このとき、「会議」テーブルの「メモ_埋め込み」フィールドにもデータ(.fve データ)が格納されていれば万事 OK です。やったー。
ちなみに、もしここで「無効な AI リクエスト」(エラー番号: 882)が出たら、正しい API キー(JWT トークン)が [AI アカウント設定] スクリプトステップに正しく設定されているかを確認してください(私は最初 API キーが正しく作られてなかったらしく、いきなりこれを食らって泣きそうになりました)。

ステップ 4. セマンティック検索用のスクリプトを作成して実行する
このステップ 4 では、いよいよセマンティック検索を実行するスクリプトを作成します。ついでに、エンジニアリングブログのこの後に記載された「付録:コサイン類似度の収集」の内容も同時にやってしまいましょう。

要になる [セマンティック検索を実行] スクリプトステップでは、クエリー(検索条件)として [自然言語](テキスト)か [ベクトルデータ] (埋め込みベクトル)のどちらかを指定できますが、ここでは [自然言語]を設定します。エンジニアリングブログでは話を簡単にするためにスクリプトステップの中にクエリーテキストを直接書き込んでいますが、ここでは FileMaker ビギナーズ & ジュニアズのみなさんの日頃の学習の成果を発揮し、[カスタムダイアログを表示] スクリプトステップを使って入力できるようにしてみましょう。
なお、下図のコード例では、カスタムダイアログの入力フィールド 2 で類似度の閾値を入力できるようにしています。
類似度(コサイン類似度)は -1 から 1 の間の実数値です。類似度が 1 に近い値だと意味的によく似ていて、0 の場合は意味的に関係がない、-1 に近いと意味的に反対、という意味になります。例として文章の類似度を考えると、「りんごは赤い」と「明日のプレゼンが憂鬱だ」は内容に(おそらく)関連がないため、類似度は 0 に近くなるでしょう。一方、「プレゼンは憂鬱」と「プレゼンが楽しみ過ぎる」は内容的に正反対なので、類似度は -1 に近くなると思われます。ただし、実際の類似度の値は使用するモデルによって異なります。

次の [エラー処理] スクリプトステップは、この下でエラー処理(セマンティック検索の結果が無かった場合)をするためのものです。
その次の [セマンティック検索を実行] スクリプトステップには、次のオプションを設定します。

  • [クエリー:] [自然言語] を選択
  • [アカウント名:] “ta”( [AI アカウント設定] スクリプトステップで指定したもの)
  • [埋め込みモデル:] “multi-qa-MiniLM-L6-cos-v1”(埋め込みベクトルを作成したときのものと同じもの)
  • [テキスト:] カスタムダイアログで取得して変数に設定した値($query)
  • [レコードセット] [すべてのレコード]
  • [ターゲットフィールド] “会議::メモ_埋め込み”(ステップ 2. で追加)
  • [返される数] 「3」を指定
  • [コサイン類似度条件] [次の値より大きい] を選択
  • [コサイン類似度の値] カスタムダイアログで取得して変数に設定した値($th_similarity)

これにより、ユーザが入力したテキスト($query)に対して、「会議::メモ」フィールド(埋め込みベクトルは「会議::メモ_埋め込み」フィールド)の内容が、ユーザが指定した閾値($th_similarity)よりも類似度が大きいレコードをセマンティック検索することができるはずです。返されるレコードは、類似度が大きい順に「3」 件です。コサイン類似度の条件を満たすものが 3 件以下の場合は、条件を満たすすべてのレコードが検索結果になります。

なお、セマンティック検索が正常に実行された結果、指定された類似度条件に合致するレコードがデータベースに存在しない場合は、FileMaker の「401」エラー(「検索条件に一致するレコードがありません」)が返ります。なるほど、「AI 関連スクリプトステップ」といえども、やはり「検索」なんですね。
というわけで、我らが FileMaker テキスト(「Claris FileMaker ガイドブック - 基礎編」)に忠実に、Get ( 最終エラー ) 関数でエラーを取得し、「401」エラーの場合とそうでない場合とでそれぞれ異なるメッセージを出力します。以下、相当粗っぽいコードですが、テスト用ということでご容赦をば。
類似度の計算で使う GetEmbedding 関数CosineSimilarity 関数の使い方については、エンジニアリングブログや FileMaker Pro ヘルプを参照してください。

できました。びっくりするくらい簡単じゃなかったですか?

テキストのセマンティック検索を実行する
スクリプトができたので実行してみます。その前にカスタム App(「会議」App)にテストデータを入力します。
今回は、どこかの会社(≠ Claris)の会議データを 7 件入力しました(この会社ではどうやら新規採用を検討しているようです)。

新規採用も重要なのですが、それはさておき、心躍る社内イベントについての会議が行われていないかを調べるため、「社内イベント」でセマンティック検索してみます。
まず類似度の閾値を「0.4」で検索してみました。したらば、なんと結果がゼロでした。「401」エラーを拾ってカスタムダイアログに表示されている実際の類似度の値を見てみると、ずいぶん小さい値になっているようです。類似度の閾値をもう少し小さくするとヒットするレコードがありそうですね。

そこで、今度は類似度の閾値を「0.3」にしてみました。すると今度は 2 件がヒットしました!

スクリプト実行後の検索結果のレコード(対象レコード)を見てみると、ほう。
1 件目のレコード(類似度「0.392485..」)はレクリエーション・デーについてのようです。「社内イベント」ですね。念のため、「メモ」フィールド内に「社内イベント」という用語は入っていません。
2 件目のレコード(類似度「0.347393..」)は HP 更新の話のようですが、うーん、「社長の写真の撮り直し」はやっぱり、重要「社内イベント」ですかね!?

この時、セマンティック検索にヒットしなかったレコードはいずれも、新規社員採用方針だとか採用計画だとか、あまりイベント感がない内容でした。ですので、なんとか「セマンティック検索 = 検索クエリーの意図と文脈上の意味を解釈した検索」を実行したと言って良いかもしれません。
ひとまず、テキストに対するセマンティック検索は成功です!

3. さて、次は

次は、画像(イメージ)のセマンティック検索をやってみます。画像のセマンティック検索は、テキストで画像を検索したり、画像で画像を検索できたりする、ある意味、夢のような検索です。うまくできるかな?

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

次回は、「FileMaker で AI やってみた (3) - イメージ編」です!