ショッピファイの製品推奨アプリに生成AIを導入する
生成AIを導入して、ショッピファイの製品推奨アプリを更に進化させる
電子商取引の販売業者は、商品推奨システムの概念にはよく知られています。ただし、従来の実装には制約があります。ここでは、それがどのようにして Shopifyの 商品推奨アプリケーションで生成的AIを利用したかについて詳しく説明します。
アプローチはシンプルでした。システム全体を実装するために、わたしはただ2つのGenAIのプロンプトを使用しました。これらの2つのプロンプトについて詳細に説明し、LLMの幻覚に取り組む中で直面した課題についても議論します。また、DataStaxのVector Search機能とLangStreamフレームワークをどのように活用して全体的な設計を単純化したかも示します。
プロダクト推奨システムとは何ですか?
プロダクト推奨システムは、ショッピングの旅のさまざまなポイントで消費者にプロダクトの提案を提供します。ショッピングカートや商品の詳細ページで提案されます。ShopifyのSearch and Discoveryアプリケーションでは、プロダクトの提案は「関連商品」と「併せて購入されています」という2つの一般的なカテゴリに分類されます。これらのカテゴリは、それぞれ似たような商品と補完的な商品を表しています。
従来の推奨システムでは、ヒューリスティックスやルールベースのロジックを使用して、顧客がショッピングカートに商品を入れたときなどの特定のコンテキストに基づいて商品を絞り込んで、推奨商品のセットを作成します。商品のカテゴリ、ベンダー、価格などの商品の詳細情報は、フィルタリングの基準として使用されます。
- 「Javaを使用した脳コンピュータインターフェース(BCI)アプリケーションの開発:開発者のためのガイド」
- 出生前診断の革命:PAICSディープラーニングシステムが神経超音波画像から胎児の頭蓋内奇形の検出を強化する方法をご覧ください
- 「機械学習における10種類のクラスタリングアルゴリズム」
プロジェクトの調査
ShopifyのSearch and Discoveryアプリのドキュメントを読む中で、補完的な商品を手動で指定する必要があることがわかりました。これは、フィルタリングルールに基づいて自動的に生成された類似の商品とは対照的です。
Shopifyアプリに補完的な商品をプログラムで指定する方法を見つける必要がありました。いくつかの実験の結果、解決策を見つけました。商品の推奨データは、商品カタログの各商品のメタデータフィールドとしてShopifyに保存されています。正しいメタデータを見つけるために、ShopifyのGraphQLインタフェースを使用しました。まだインストールしていない場合は、ShopifyのGraphiQLアプリをインストールしてください。これにより、GraphQLクエリを試すことができます。
次のクエリを使用して、Shopify Search and Discoveryアプリのユーザーインターフェースを介して補完的な商品の指定がされた商品のメタデータフィールドのリストを取得しました。
例:ShopifyのGraphQLクエリで商品のメタデータフィールドを取得する
上記のGraphQLクエリにより、2つのメタデータフィールドが取得されました。類似商品用のものと補完的な商品用のものです。
例:ShopifyのGraphQLクエリレスポンスで商品の推奨メタデータフィールドを表示する
補完のメタデータフィールドの値を変更するために、次のGraphQLミューテーションクエリを実行できます。このメタデータを設定することで、「併せて購入されています」ウィジェットが商品の詳細ページで有効になり、設定した補完的な商品セットが表示されます。
ただし、Shopifyはプライベートな名前空間に属する既存のメタデータフィールドを変更することはできません。トリックは、特定の商品に対してフィールドが存在するかどうかをチェックし、存在しない場合は削除してからフィールドの操作を再作成するか、フィールドを追加することです。
例:ShopifyのGraphQLミューテーションクエリで商品のメタデータフィールドの値を更新する
Shopifyアプリの概要
GenAI商品推奨システムを作成するための主な取り組みは、Shopifyエコシステムとの統合です。この作業の一部として、Shopify Admin UIを作成して、販売業者が商品の推奨プレビューをトリガーし、商品カタログに商品の推奨を適用できるようにしました。
LangStreamプロジェクトを使用して、各商品の推奨を処理するバックエンドソリューションを実装しました。LangStreamは、製品の推奨ワークフローのさまざまな段階を実行するためのバッチ処理システムを提供してくれました。YAML構成の一連のパイプラインを使用して、データ処理パイプラインを指定して推奨ワークフローのさまざまなステージを実行できました。
以下の図は、AIベースの推奨を生成するための主なワークフローを示しています。販売業者はShopify GenAIの推奨アプリのUI経由でこのワークフローをトリガーします。このワークフローは、推奨を生成するための製品セットの各製品ごとに一度実行されます。
注意:先ほどの解決策では、2つのLLMプロンプトのみを使用したことを述べました。図中の「補完製品タイプマッピング」の参照テーブルは、これらのプロンプトの1つに基づいて生成されます。後で詳しく説明します。
製品推奨のワークフローには、以下の6つのステップがあります:
- 指定されたソース製品に対して製品推奨が要求されます。
- ソース製品タイプに基づいて、参照テーブルから補完製品タイプのセットが取得されます。指定された補完製品タイプの候補製品のセットが生成されます。
- ソース製品の説明は、LLM埋め込みAPIに渡され、埋め込みベクトルが生成されます。埋め込みベクトルは、ベクトルDB内で類似する製品を検索するために使用されます。類似するとは、意味的に近い製品を指します。たとえば、ゴルフボールはゴルフクラブよりも犬の首輪に意味的に近いです。
- クエリの入力には、(3)の埋め込みベクトルと補完製品タイプのリストが含まれます。検索結果には、補完製品の候補セットと、各製品に関するさまざまなメタデータ(タイトル、価格、ベンダー、製品説明など)が含まれます。
- (4)の候補製品の詳細、推奨を生成するための指示、結果のフォーマットの指示を含むLLMプロンプトが作成されます。プロンプトはLLM Chat APIに送信され、製品推奨が生成されます。
- (5)からのLLMの応答は、ソース製品の補完製品メタデータを更新するために使用される有効なShopify製品IDのセットに後処理されます。
ベクトルデータベースの設定
ベクトルデータベースには、Shopify商人のストア内の製品のメタデータが含まれています。ベクトルDBに格納されているデータの目的は、候補製品のベクトル検索を可能にすることです。このタイプの検索をShopify APIを使用して実行することはできません。また、ベクトルDBに製品のメタデータを保存することで、このデータに対して後続のShopify APIクエリを実行する必要がなくなります。ベクトルDBをShopifyの製品データベースと同期させる方法は、別のブログ投稿のトピックです。
以下の手順では、製品ごとに5つのメタデータを含むテーブルを作成します。メタデータはShopifyから取得され、製品説明を入力としてLLM埋め込みAPIを呼び出すことでベクトル値が計算されます。
- 製品ID(Shopifyから)
- 製品の説明(Shopifyから)
- 製品のタイトル(Shopifyから)
- 製品の価格(Shopifyから)
- 製品のタイプ(Shopifyの製品タイプの値)
- 製品のベクトル(LLM埋め込みAPIから)
- この例では、OpenAIの埋め込みモデル(text-embedding-ada-002)が生成する1536次元のベクトルを使用しています。
- 例:ベクトル検索可能な製品テーブルと関連インデックスの設定のためのAstra DB CQLコマンド
製品メタデータでベクトルDBをポピュレートするためには、ワンタイムのインポート操作と、データベースを商人の製品カタログと同期させるための後続の更新が必要です。商人はShopifyから製品カタログをCSVファイルとしてエクスポートし、それを選択したインポートプログラムにフィードすることができます。
ここでは、ホームグロウンなソリューションの実装やLangChainとCassIOの組み合わせを含む、いくつかの適切な選択肢があります。選択するソリューションによっては、インポートされたそれぞれの製品説明に対して埋め込みベクトル値を計算する必要があります。
補完製品タイプの計算のためのGenAIプロンプト
補完製品タイプの参照テーブルを作成するために、LLMを活用することができます。補完製品の検索では、どのカテゴリの製品がよく組み合わさるかを見つけることが重要です。この組み合わせプロセスは通常、実世界の経験を持つ人間が選択可能な選択肢に基づいて合理的な補完製品のリストを作成することで処理されます。
この問題領域は、LLMの世界理解を適用して合理的な推奨を生成するために優れた対象です。以下のテーブルは、補完製品のマッピングの良い例です。
例:補完製品タイプ参照テーブル
Shopifyストアのすべての製品には、製品の「タイプ」属性が含まれています。製品タイプの値は任意であり、ストアオペレータによって設定されます。Shopify Storefront APIに対してGraphQLクエリを実行することで、商人の製品カタログのすべての製品タイプのリストを取得することができます。
例: 商品タイプに対するShopify GraphQLクエリ
例: 商品タイプの結果
上記の商品タイプの情報を使用して、補完的な商品タイプのペアリングを自動的に生成するためのLLMプロンプトを作成できます。
注意: LLMの応答の出力は、結果を抽出するために解析できる形式の整形されたJSONドキュメントであることを望みます。プロンプトには、次のパラメータが含まれます:
{{ MAX_COMPLEMENTARY_CATEGORIES }}
— 商品タイプごとに生成される補完タイプの数を制限する値{{ COMMA_SEP_LIST_OF_PRODUCT_CATEGORIES }}
— ショッピングストアのすべての利用可能な商品タイプカテゴリのコンマ区切りリスト{{ CUSTOM_NATURAL_LANGUAGE_RULES }}
— 推奨動作を変更するために商人が提供する1つ以上の自然言語ルール
例のLLMプロンプト: 補完的な商品カテゴリを生成
商品の推奨事例のためのGenAIプロンプト
推奨事例を生成するためのLLMプロンプトには、すべての候補商品の商品メタデータを含める必要があります。最終的な推奨事例の文脈として、これらの商品をLLMに使用したいです。このアプローチは、検索増強生成(RAG)と呼ばれます。
LLMプロンプト自体に取り組む前に、候補商品のメタデータを取得するVector検索クエリを見てみましょう。次のVectorクエリは、候補商品のリストを選定するために使用できます。クエリの入力には、次の値を計算したことを前提としています:
- ソース商品の説明の埋め込みベクトル
- ソース商品の補完的な商品タイプのリスト
例のVector検索CQLクエリ: 候補商品の推奨リストを生成
候補商品の検索結果を使用して、商品推奨のためのLLMプロンプトを生成できます。プロンプトテンプレートには、すべての必要なデータのパラメータが含まれます。さらに、プロンプトには、希望の推奨結果の出力形式を生成するための手順も含まれています。
-
{{ MAX_RECOMMENDATIONS }}
— 提供された商品リストから選択する候補商品の最大数。このパラメータは、下のプロンプトテンプレート内でも2回使用されます。2回目の使用では、推奨事例の数を明確にすることでLLM幻覚を減らすことが目的です。 -
{{ PRODUCT_DESCRIPTION }}
— 推奨を作成しているソース商品の説明 -
{{ PRODUCT_TITLE }}
— 推奨を作成しているソース商品のタイトル -
{{ PRODUCT_PRICE }}
— 推奨を作成しているソース商品の価格 -
フィールド
{{ PRODUCT_METADATA_N_.. }}
— 各候補商品のデータでこれらのフィールドを置き換えます。Vector検索の結果からデータを使用します。注意: カスタムの推奨手順では、商品タイプ、価格、または商品の説明に関連する情報など、このメタデータを参照できます。 -
{{ CUSTOM_INSTRUCTIONS_FOR_PRODUCT_FILTERING }}
— このセクションには、商品メタデータを参照する一連のカスタム推奨ルールが含まれることがあります。例えば:- 「1月から2月の間、ブランドXの商品をおすすめします。」
- “常に同じブランドの商品をおすすめするようにしてください”
-
{{ CURRENT_DATE }}
— 現在の日付を追加の文脈情報として挿入できます。上記のカスタムルールでは、特定の期間中に推奨をアクティベートする言語が含まれる場合があります。
例のLLMプロンプト: 商品推奨を生成
LLMの推奨応答の後処理
使用されるLLMチャットモデルによっては、このプロンプトによって異なる結果が生成される場合があります。私たちはOpenAIのChatGPT 3.5 TurboとChatGPT 4.0を使用しましたが、ほとんどの場合安定したJSONドキュメントの構造が得られました。結果を改善するために様々なプロンプトエンジニアリング手法を使用することができます。その後、コードはJSONの結果を解析して、以前に概説したShopify GraphQLの戦略を使用して商品の推奨メタデータを更新できます。
LLM幻覚の解消の難しさ
LLMチャットシステムからの応答は、時折予期せぬ出力や捏造されたデータを生成する場合があります。製品の推奨プロンプトを使用して作業する際に、私は幻覚のパターンをいくつか経験しました。以下のセクションでは、失敗シナリオとそれぞれの対処方法について説明します。
捏造データに基づく無効な推奨
推奨結果に含まれるいくつかまたはすべての推奨製品IDは、LLMによって作り上げられたものであり、RAGのコンテキストからは取得されていません。
- 候補商品のリストが要求された推奨数よりも少ない場合、LLMが結果を捏造することがよく観察されました。
- 推奨結果は、候補商品数が最大推奨数の2倍以上である場合に最も安定しました。
不正なJSON出力
LLMは、JSONドキュメント応答の周囲に自由形式のテキストを含めていました。
- ほとんどの場合、含まれるJSONドキュメントには有効な推奨結果が含まれていたため、テキストからJSONドキュメントの構造を解析し、それ以外の部分を無視することができました。
予期しないJSONドキュメントの構造
JSONドキュメントの構造は非常に安定していましたが、LLMがフィールド名を思い込んだり、配列構造を含んだりすることがありました。
- フィールド名は、キャピタライズが異なる場合や、ダッシュとアンダースコアなどの区切り文字が異なる場合があります。
- これらの問題の対処策として、一般的に見つかるフィールド名の2つ以上のバリエーションに対する処理を追加しました。
- 製品の推奨を含む配列の構造は、時には異なる親階層を持つことがあります。解析されたJSONドキュメントの構造をテストし、適切な応答を処理することで、全体的な成功率が向上しました。
外部参照データを使用したLLMエージェント応答のチェイニング
LLMのクエリ結果を別のLLMプロンプトの入力に連結することは、追加の課題となります。問題は、プロンプト1のRAG入力がプロンプト2に無効な参照データを生成する場合にさらに悪化します。
製品の推奨の場合、候補商品のCQL検索を実行する際に、LLMによって生成された補完的な製品カテゴリのセットをCQLクエリ制約として使用します(`product_type IN (?)`節の値として)。
LLMが補完的な`product_type`の値をわずかに変更したり、元の有効な値のセット(RAG入力)に完全に含まれていない値を生成した可能性があります。そのため、実際の製品タイプとLLMによって生成された製品タイプの値との間には不一致が生じる可能性があります。
- この種の幻覚に対する推奨システムの堅牢性を向上させるための1つの戦略は、インデックスアナライザの実装により、検索基準の厳格性を緩めることです。
ステミングなどの技術を使用すると、LLMの幻覚によるわずかな変化を伴う実際の製品メタデータ値との一致確率を向上させることができます:
ステミングの例は、「ランナー」と「ランニング」を一致させることを許可することです。
例:SAIインデックスアナライザの設定:ステミングの有効化
製品推奨システムの将来は、個人化と顧客エンゲージメントのための可能性にあふれています。AIと自然言語処理を統合することで、これらのシステムの精度を向上させるだけでなく、顧客のショッピング体験を大幅に向上させることができます。
次回のブログ記事では、LangStreamの活用方法と推奨ワークフローの実装についてさらに詳しく説明し、フレームワークが提供する安全かつ拡張性のあるソリューションについても紹介します。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- FlashAttentionアルゴリズムの深い探求-パート3
- 見逃せない7つの機械学習アルゴリズム
- 人工知能の進歩:成均館大学の革新的なメモリシステム「Memoria」が長いシーケンスの複雑なタスクにおけるトランスフォーマーのパフォーマンスを向上させます
- シュナイダーエレクトリックは、SageMakerでのリトリーバルアグメントドLLMsを活用して、ERPシステムのリアルタイムの更新を確実にしています
- 「23/10から29/10までの最も重要なコンピュータビジョン論文トップ」
- 光を乗りこなす:Sunswift RacingがWorld Solar Challenge Raceで輝く
- 人間のフィードバックからの強化学習(RLHF)