Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[HeatWavejpMeetup#14] EC-CUBEにベクトル検索を組み込んでみた [福...

[HeatWavejpMeetup#14] EC-CUBEにベクトル検索を組み込んでみた [福本 誠 氏(スマートスタイル)]

【講演内容】
ECプラットフォーム「EC-CUBE」のデータベースとしてHeatWave MySQLを利用し、ベクトル検索機能を用いて、簡単に“意味ベースの商品検索”ができるのか――。
従来の単純なキーワード検索とは異なり、商品情報をベクトル化し、入力されたキーワードの意味に応じて商品リストを自動的に並べ替える仕組みの実装を試してみます。

【発表者】
株式会社スマートスタイル データテクノロジー本部
福本 誠 氏

【イベント情報】
HeatWavejp Meetup #14
https://heatwavejp.connpass.com/event/360186/

More Decks by HeatWavejp(MySQL HeatWave Japan User Group)

Other Decks in Technology

Transcript

  1. 検証環境 OCI Region(東京) Availability Domain VCN Public Subnet Private Subnet

    Virtual Machine データベースのバージョン:9.3.1 Always Free EC-CUBE
  2. やりたいこと 前提 「商品名」「商品説明」のテキストを結合してベクトル化 対象フィールド: Name (商品名) description_detail (商品詳細画面に表示する説明文) description_list (商品一覧に表示する説明文)

    テーブル定義 : https://ec4.umebius.com/tables/dtb_product 1 商品一覧画面の並び替え機能強化 ユーザー体験の向上 2 商品詳細画面のレコメンデーション クロスセル効果
  3. 実装概要 ベクトルデータの保存 CREATE TABLE dtb_product_vector ( product_id INT UNSIGNED PRIMARY

    KEY, description_vector VECTOR(1024), FOREIGN KEY (product_id) REFERENCES dtb_product(id) ON DELETE CASCADE ); 1 商品一覧画面の並び替え機能強化 フロント画面の商品一覧画面にある並び替えのリストボックスに「キーワード順」を追加する 並び替えのリストボックス下にキーワードを入力する為のテキストボックスを追加する 「キーワード順」で並べ替える際は、入力されたキーワードをベクトル化して、ベクトル距離が近い順に並び替えする 2 商品詳細画面のレコメンデーション 詳細画面を表示している商品とベクトル距離が近い商品のベクトル距離が近い商品の先頭3件を表示する 管理者画面の商品情報登録時と更新時に、「商品名」「商品説明」のテキストを結合してベクトル化した情報を dtb_product_vector に保持する 略)
  4. 実装概要 ベクトルデータの保存(SQL) INSERT INTO `dtb_product_vector` (`product_id`, `description_vector`) VALUES( ?, `sys`.`ML_EMBED_ROW`

    ( `CONCAT` ( COALESCE(?, ''), ' ', COALESCE(?, ''), ' ', COALESCE(?, '') ), `JSON_OBJECT` ('model_id', 'multilingual-e5-small') ) ) 管理者画面の商品情報登録時は、こんなSQLを実行する UPDATE `dtb_product_vector` SET `description_vector` = `sys`.`ML_EMBED_ROW` ( `CONCAT` ( COALESCE(?, ''), ' ', COALESCE(?, ''), ' ', COALESCE(?, '') ), `JSON_OBJECT` ('model_id', 'multilingual-e5-small') ) WHERE `product_id` = ? 管理者画面の商品情報更新時は、こんなSQLを実行する
  5. 実装概要 1 商品一覧画面の並び替え機能強化(SQL) 「キーワード順」で並べ替える際は、まずは入力されたキーワードをベクトル化して、、、 SELECT CAST(`sys`.`ML_EMBED_ROW` (?, `JSON_OBJECT` ('model_id', 'multilingual-e5-small'))

    AS BINARY) AS `embedded_vector` SELECT (略・・・) ,`DISTANCE` (`d1_`.`description_vector`, ?, 'COSINE') AS `sclr_1` FROM `dtb_product` `d0_` (略・・・) INNER JOIN `dtb_product_vector` `d1_` ON (`d0_`.`id` = `d1_`.`product_id`) WHERE (略・・・) ORDER BY `sclr_1` ASC LIMIT ? その後ベクトル距離計算をする
  6. 実装概要 2 商品詳細画面のレコメンデーション(SQL) 詳細画面を表示している商品とベクトル距離が近い商品を抽出するには、こんなSQLを実行する SELECT (略・・・) `DISTANCE` ( `pv`.`description_vector`, (

    SELECT `description_vector` FROM `dtb_product_vector` WHERE `product_id` = ? ), 'COSINE' ) AS `similarity_score` FROM `dtb_product` `p` INNER JOIN `dtb_product_vector` `pv` ON `p`.`id` = `pv`.`product_id` (略・・・) WHERE `p`.`id` != ? (略・・・) ORDER BY `similarity_score` ASC LIMIT 3
  7. 実装方法の調査 プラグイン形式で実装 プラグインのスケルトンを作成 # bin/console eccube:plugin:generate 超簡単なベクトルストアを使用するサンプルプログラムを実装 プラグインのインストール # bin/console

    eccube:plugin:install --code=ProductVector In PluginService.php line 305: Unknown database type vector requested, Doctrine¥DBAL¥Platforms¥MySQL80Platform may not support it. In AbstractPlatform.php line 451: Unknown database type vector requested, Doctrine¥DBAL¥Platforms¥MySQL80Platform may not support it. エラーの原因 EC-CUBEではDB操作にDoctrineというORマッパーを使用 この子「vector」データ型を認識できない! ↑
  8. 実際の実装 プラグイン形式での実装をやめる Doctrine DBAL にカスタム型(Vector)を登録すれば、エラーは回避できるかも? EC-CUBEを極める気もないので、実装はAI頼り(課金無し) ここらへんを無料で使える範囲で ・Chat GPT ・Gemini

    ・Claude (Claude Code使ってみたい) 試行錯誤したこと 思ったように動くコードを返してくれない 何度も「こんなエラーがでました」→「正しくはこうでした」を繰り返す 「EC-CUBE4.3で」と言っても、EC-CUBE3の実装形式でほぼ返される もはや、どのファイルにどの更新をしたものが動いているのか分からない… より簡単に実装する為にプラグイン形式での実装を断念