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

164 Views

July 23, 25

スライド概要

【講演内容】
ECプラットフォーム「EC-CUBE」のデータベースとしてHeatWave MySQLを利用し、一斉検索機能を使って、簡単に「意味ベースの商品検索」ができるのか――


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

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

profile-image

HeatWavejpは、MySQL HeatWave の良さを知っていただき、参加者同士でノウハウやナレッジを共有できるユーザーコミュニティです。参加者同士のつながりを深めるため、以下の活動を行ってまいります。 COMMUNICATION *Slackやconnpassを活用したユーザー同士のコミュニケーションの場の提供 EVENT *オンライン/オフラインでのMeetupセミナーや勉強会の開催(隔月程度) SHARING *製品情報や最新アップデート、リリース情報の共有 INTERACT *参加者のコミュニティ・ネットワークやユーザー同士の交流を促進

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

EC-CUBE × EC-CUBEにベクトル検索を組み込んでみた

2.

自己紹介 株式会社スマートスタイル AI Platform Lab 福本 誠 趣味 フットサル 子供のサッカー観戦

3.

EC-CUBEって何? https://www.ec-cube.net/ 35,000+ 180万+ No.1 稼働店舗数 ダウンロード数 日本での市場シェア EC-CUBEの信頼性を示す要因 オープンソースの強み 活発な開発コミュニティ 多数のインテグレートパートナー 日本市場への最適化

4.

EC-CUBEって何? 提供形態 ダウンロード版 クラウド版 無料でダウンロード・利用可能 サーバー環境の構築・管理が不要 サーバー環境の準備から設定まで自社で行う必要あり カスタマイズの自由度はダウンロード版より制限あり 動作環境要件(最新のEC-CUBE4.3) PHP要件 サポートバージョン:PHP 8.1 〜 8.3 データベース要件(MySQL以外も使える) サポートバージョン:MySQL 8.0

5.

サポートしてないバージョンで あっても、普通に動くんじゃね?

6.

検証環境 OCI Region(東京) Availability Domain VCN Public Subnet Private Subnet EC-CUBE Virtual Machine データベースのバージョン:9.3.1 Always Free

7.

やりたいこと 前提 「商品名」「商品説明」のテキストを結合してベクトル化 対象フィールド: Name (商品名) description_detail (商品詳細画面に表示する説明文) description_list (商品一覧に表示する説明文) 1 商品一覧画面の並び替え機能強化 ユーザー体験の向上 2 商品詳細画面のレコメンデーション クロスセル効果 テーブル定義 : https://ec4.umebius.com/tables/dtb_product

8.

実装概要 ベクトルデータの保存 管理者画面の商品情報登録時と更新時に、「商品名」「商品説明」のテキストを結合してベクトル化した情報を dtb_product_vector に保持する 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件を表示する

9.

実装概要 ベクトルデータの保存(SQL) 管理者画面の商品情報登録時は、こんな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` = ?

10.

実装概要 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 ?

11.

実装概要 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

12.

実装方法の調査 プラグイン形式で実装 EC-CUBEへの機能追加は、プラグイン形式にするとよいらしい https://doc4.ec-cube.net/plugin_development 理由: 拡張性と保守性の確保 コミュニティでの再利用性 売れる! 現在時点で、2,000件以上のプラグインが存在している https://www.ec-cube.net/products/list.php 今回の内容と近しいようなプラグインもあったけど、ベクトル検索ではない 商品詳細画面で表示商品の関連商品を表示するプラグイン https://www.ec-cube.net/products/detail.php?product_id=2963 (ユーザの商品詳細画面の表示履歴を保存して、その情報を元に表示するらしい) 商品詳細画面で表示商品と同じカテゴリの商品を表示するプラグイン https://www.ec-cube.net/products/detail.php?product_id=1858

13.

実装方法の調査 プラグイン形式で実装 プラグインのスケルトンを作成 # bin/console eccube:plugin:generate エラーの原因 超簡単なベクトルストアを使用するサンプルプログラムを実装 EC-CUBEではDB操作にDoctrineというORマッパーを使用 ↑ プラグインのインストール この子「vector」データ型を認識できない! # 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.

14.

実際の実装 プラグイン形式での実装をやめる Doctrine DBAL にカスタム型(Vector)を登録すれば、エラーは回避できるかも? より簡単に実装する為にプラグイン形式での実装を断念 EC-CUBEを極める気もないので、実装はAI頼り(課金無し) ここらへんを無料で使える範囲で ・Chat GPT ・Gemini ・Claude (Claude Code使ってみたい) 試行錯誤したこと 思ったように動くコードを返してくれない 「EC-CUBE4.3で」と言っても、EC-CUBE3の実装形式でほぼ返される 何度も「こんなエラーがでました」→「正しくはこうでした」を繰り返す もはや、どのファイルにどの更新をしたものが動いているのか分からない…

15.

デモ

16.

まとめ ベクトル型の項目をそのまま値を取得するには、EC-CUBE側で取得する際は工夫が必要。 Doctrineが次のMySQLの次のLTSバージョンに対応すれば考慮不要になるはず 最新のEC-CUBEでは、HeatWaveの最新バージョン9.3.1でも使用できそう Always Free を活用することもできる https://www.oracle.com/jp/heatwave/free/ HeatWaveを使えば、AI機能を簡単に実装できる (EC-CUBEの実装をある程度知っていれば…) 商品説明をSEO対策として有効なキーワードを含めるような形式での提案 機械学習を用いた売り上げや在庫状況の予測 etc…

17.

Database & Cloud Technology Company