「LLMの利点:電子商取引の検索を変革する」
Advantages of LLM Revolutionizing E-commerce search
LLMの優れた能力は、さまざまなビジネス領域で様々な課題に対処するための素晴らしい偉業となっています。RAG(Retrieval Augmented Generation)メソッドを使用した知識発見に関する高度な成果は、多くの興味深いユースケースと実装アプローチでウェブを溢れさせています。これらのすべてが本番レベルの成熟度に向かって進化している一方で、エンジニアリングを通じた創造的な問題解決を描くことも重要です。また、これによって長い間変わらなかった全く新しいユーザーエクスペリエンスを再構築するのに役立つ可能性を探求することも重要です! Eコマースの商品検索は、このブログで取り上げられているそのようなケースの一つです。
私のブログシリーズでは、LLMを利用した商品検索に活用できるLLMの素晴らしい成果と、その中心にある文脈が顧客価値を駆動し、ビジネスの成果に影響を与える方法について取り上げています!
LLMパワードプロダクトディスカバリ:ハイブリッド検索を超える飛躍
急速に進化する最先端技術の時代において、世界はLLMの波に溺れて新しいアイデアを生み出しています…
pub.towardsai.net
この投稿では、これらのアイデアと可能な実装アプローチ、およびvertex.aiとのコードサンプルを探求します。LLMが商品の発見を促進し、それによって顧客のエンゲージメントを高めることができるいくつかのケースを以下に示します。
- 「TensorFlowを使用した異常検出のための変分オートエンコーダのトレーニング」
- 「新しい研究は、AIイノベーションのモデルとして生態学を示唆しています」
- ウェブ開発者のためのAI:プロジェクトの紹介とセットアップ
- LLMの生成能力を活用して包括的な商品の要約を作成する。
- LLMの一般化と推論能力を活用して、クエリと商品のコンテキストを重なり合わせて、共有理解に基づく商品の発見を向上させる。
- LLMのコード/クエリ生成能力を利用して、ユーザーの自然言語形式での一般的な表現から派生した高度な検索フィルターやセグメントに対応するバックエンドクエリを生成する。
- 離散的な検索クエリに加えて、フィルターやページネーションスクロールと一緒に状態を持つ商品の発見のために会話型インターフェースを使用する。チャットインターフェースは、ユーザーによるマルチレベルの対話で表現される深い文脈信号を活用する点で非常に有効です。LLMのチャットコンテキストの伝播能力と予定されるユーザーアクションの推論能力は、会話型ディスカバリのコンセプトと完全に一致しています!
- LLMによる包括的な商品の要約の生成:商品の説明は通常、広告の対象としてターゲットにされるか、商品詳細ページの一部としてユーザーに提示されます。LLMが個別化された広告や創造的な説明を生成することは明らかですが、私のこのポイントのアイデアは、検索の目的により関連しています。
一般的に、自然言語形式の商品説明は、タイトルや説明などの非常に限られた属性に対応しており、コンテキストが豊かではないことがよくあります。LLMで豊かなコンテキストを持つ商品要約を表現的な方法で作成することで、商品に対する豊かなコンテキストを構築することができます。これを商品の概要(明確化するために)と呼びましょう。これは、ユーザーのクエリとの最適な一致結果を取得するためにインターフェース化されるデータです。このデータの価値は、以下のような場合に飛躍的に向上する可能性があります:
a. 明示的な特徴:メタデータの形式で明示的に利用可能な商品の属性。たとえば、商品カテゴリ、サイズ、色、対象となるジェンダー/サイズなどのいくつかの静的な属性。これは、コンピュータビジョンモデルを利用して商品画像/デモ動画から自動キャプションを生成することでさらに拡張することができます。
b. 暗黙の特徴:目的の商品の詳細についてより表現力豊かにするために豊かになった説明。タグ、ユーティリティ、ユニークな特徴、解決しようとする問題など、暗黙の特徴の形式で表現されます。
c. クラウドソーシングされた特徴:顧客による製品レビューから採掘された全体的な製品の感情と魅力的な特徴も、広範な商品の概要に追加する価値がある考慮事項です。
これらのさまざまな次元から集約された包括的な商品情報は、与えられたクエリに対して最適な一致結果を取得するために、密な埋め込みの構成要素でもある場合に最も効果的に活用されます。このアプローチはまた、包括的な商品メタデータを持つための製品SKUへの依存性を大幅に減らします。
注意:密な埋め込みに製品メタデータを追加することで、検索結果の関連性を豊かにすることができますが、価格、平均評価、在庫の可用性、配送料などのような他の動的属性があります。これらは密な埋め込みの性質が常に変化しているため、適切な一部となることはありません。これらの埋め込みを繰り返し更新することは、最も効率的な方法ではないかもしれません。
以下のコードサンプルを見てみましょう。これはテキストバイソンLLMを活用して、上記の属性をすべて含む豊富な製品サマリーの自動生成を実装しています。
from vertexai.preview.language_models import TextEmbeddingModelmodel = TextEmbeddingModel.from_pretrained("textembedding-gecko")def senti_extract(reviews,temperature: float = .2): """大規模言語モデルを使用したアイデアの例""" parameters = { "temperature": temperature, "max_output_tokens": 200, "top_p": .8, "top_k": 2, } model = TextGenerationModel.from_pretrained("text-bison@001") prompt = """以下の異なるユーザーレビューのリストから、全体的な製品サマリーを要約し、重要な良い属性を明示することなく強調します。例:["アパレルのスタイルとプレミアム感は、快適さ、メンテナンスのしやすさ、品質に対して合理的な価格で評価されています。""".format(",\n ".join(reviews)) response = model.predict( prompt, **parameters, ) #print(f"Response from Model: {response.text}") return response.text # 隠れた信号product_df["prod_highlights"] = product_df["reviews"].apply(lambda x: senti_extract(x))# 関連する明示的な信号と暗黙的な特徴を 'prod_summary' に組み合わせるproduct_df['prod_summary'] = product_df['product_name']+product_df['description']+product_df['pattern']+product_df['colors']+product_df['category']+product_df['size']+product_df['gender_category']+product_df['tags']+product_df["prod_highlights"]# 効率的な再インデックスを実現するために別々にインデックス付ける他のメタデータselected_columns = ['price', 'avg_ratings']product_df['metadata'] = product_df[selected_columns].apply(lambda row: {col: row[col] for col in selected_columns}, axis=1)# 密な埋め込みを格納するための空のリストを初期化dense_embeds = []# 記述子をループ処理するfor descriptor in product_df['prod_summary']: # 各記述子の埋め込みを取得し、リストに追加 embeddings = model.get_embeddings([descriptor])[0].values dense_embeds.append(embeddings)#<code to index metadata and dense_embeds in choice of vector db goes here>
2. LLMの一般化と推論能力の活用クエリと製品の文脈を重ね合わせるために。大規模なテキストコーパスからトレーニングされたLLMによって生成された埋め込みの利点は、世界的な文脈を非常によく捉えることです。この文脈は、ユーザーのクエリの意図を理解し、多くのオプションから次のアクションを選択するだけでなく、データベースから取得された結果の関連性を推論して評価するために非常に重要です。
以下のサンプルでは、LLMの呼び出しによる応答の評価と合成を示しています。
response_prompt = """応答シンセサイザーです。特定のデータを人が読める形式に変換する必要があります。まず、ユーザーが与えたクエリに対する検索結果の関連性を評価する必要があります。関連性のある結果のみを含めて応答を生成してください。クエリに答えるために、`クエリ`といくつかの`データ`を受け取ります。データは機械検索から取得されるものであり、ユーザーのニーズを正確に反映していない場合があります。ユーザーはそれにアクセスしたり、それについて知ったりすることはできません。クエリに基づいて結果をリストし、関連性のない結果を適切にフィルタリングしてください。データを知識ベースと考えることができます。ルールを使用して`データ`をクエリに応えるために、データを相互参照してください。応答のデータから引用するために、ソースとメタデータ情報に参照してください。一致が空の場合は結果がないことを示してください。ゴミを吐かないでください。キープロダクトのみをリストアップしてください。応答は礼儀正しく、プロフェッショナルであり、顧客が購入を行うように案内する必要があります!ユーザーが必要なものを見つけたことを確認するためにも努力します。必要に応じてユーザーに具体的な推奨を促す。------クエリ: {query}検索結果: {data}------常に結果との関連性を関連付けてください!合成された応答:"""text_model = TextGenerationModel.from_pretrained("text-bison@001")def synth(query, data): print(new_list) response = text_model.predict( response_prompt.format(query = query, data = data), max_output_tokens = 1024, temperature = 1 ) return response
次のセクションの一部として、クエリ意図の識別のための例がブロックに追加されていることに注意してください。また、クエリの自動生成も含まれます。
3. LLMsを用いたコード/クエリ生成のパワーの利用: ユーザークエリを直接使用してベクトルデータベースから上位k個の関連コンテンツを取得することは非常に明らかですが、ユーザーが明示的にフィルターや好みを使用してターゲットデータセットを絞り込む場合もよくあります。一般的には、商品カテゴリ、サイズ、ブランド、価格帯が検索結果を絞り込むためのフィルターとして主に使用されます。評価による結果の並べ替えも人気のある使用トレンドです。これらのオンラインショッピングに関連するすべての手間は受け入れられた慣習でしたが、効果的なハイブリッド検索を実現するために、密な検索と疎な検索の両方のメタデータフィルタリングを組み合わせることを考える時が来ました。これらのフィルター/並べ替えを検索の前後に適用することで目的は達成されますが、LLMsが特徴を抽出し、クエリコンテキストから自然言語でフィルタークエリを生成できるようにするとさらに良い経験が得られます。
query_prompt = """Pineconeのメタデータをフィルタリングするためのクエリを書くベクトルデータベースの検索システムです。ユーザーは英語の自然言語クエリを入力し、それを対応するフィルターに変換する必要があります。フィルターの辞書のみを返す必要があります。フィルターはMongoDBのクエリ形式に従いますが、正規表現は使用しません。ユーザーはクエリを絞り込むために追加の入力を続けることができます。ユーザーメッセージごとに最新の変更を反映するために、フィルターを更新してください。フィルターはデータソースに存在する属性のみを参照するようにしてください。フィルターは属性の説明を考慮に入れ、格納されているデータのタイプに応じた実行可能な比較のみを行うようにしてください。利用可能なデータの対応するスキーマは次のとおりです:```'features': string - 組み込むすべてのその他のテキスト、これは単なる文字列であり、正規表現や他のフィルターではありません'price': float - 商品の価格。安いものは50ドル未満、高価なものは200ドル以上です。'product_ratings': float - 評価は0.0から5.0の範囲です。5.0が最高で0.0が最悪です。良い評価は3.8を超えます。```スキーマに存在しない属性を挿入しないでください。$gtまたは$ltのみ使用してください。価格と評価以外の特徴については、全体の用語を含めるだけです。$regexは含めないでください、これはPineconeです。----自然言語クエリ:{search_term}スキーマを忘れないでください。スキーマを遵守してください。features、price、およびproduct_ratingsのみ使用してください。フィルター:"""text_model = TextGenerationModel.from_pretrained("text-bison@001")# 例ecommmerceindex = pinecone.Index('ecommerce')def search(search_term): prompt = query_prompt.format(search_term = search_term) res = text_model.predict(prompt, temperature = 0) try: filter = eval(f'{res.text}'.replace('```', '')) except: filter = {} print('filters : ',filters) embedding = [0] * 768 #ユーザーの意図を捉えるために、埋め込みを生成するために「features」の部分のみを使用します if "features" in filter: embedding = embedding_model.get_embeddings([filter['features']])[0].values del filter["features"] #残りのフィルターはフィルターとして検索インデックス(pinecone)に使用します results = index.query(embedding, top_k = 6, include_metadata = True, filter = filter) answers = [r['metadata'] for r in results['matches']] for i in range(len(results['matches'])): answers[i]['id'] = results['matches'][i]['id'] return answers
以下のサンプル出力は、LLMの印象的な能力を示しています。自分でこのアイデアをさらに発展させ、LLMがチャット履歴全体を使用して時間の経過とともにこれらのコンテキストフィルターを構築できる方法を理解してみてください。
#'feature'の値だけがクエリ埋め込みに考慮されることに注意してくださいsearch("blue partywear dress with great ratings")filters : {'features': {'$eq': 'blue patywear dress'}, 'avg_ratings': {'$gt': 4.0}}search("teal formal shirt men reasonable price")filters : {'features': {'$eq': 'formal shirt in teal'}, 'price': {'$lt': 50}}
4. 製品の発見のための対話的な自然言語インターフェース: 以前の投稿で「コンテキストが王様」について詳しく説明した後、LLMsの登場により、全体的な検索体験を再考し再定義することが不可欠です。新しい時代の検索体験は、連続的で対話的な自然言語形式であり、ユーザーのクエリコンテキストが長さと深さを持って拡張されます。これにより、離散的な検索クエリやフィルター、奇抜なページ送りスクロールによって引き起こされる摩擦が取り除かれるだけでなく、ユーザーの行動理解の感覚を高めるのにも役立ちます。新時代のベクトルデータベースによるマルチモーダル検索能力は、テキストと画像のような異種形式の共通インターフェースを提供するため、全体的な検索体験をさらに進化させます。
以下のコードは、chat-bison LLMを使用して上記のすべてのアイデアを補完する対話型インターフェースの例です。
chat_model = ChatpModel.from_pretrained("chat-bison@001")history = list()context = """ショッピングサイトのチャットボットとの会話から検索クエリを抽出する責任を持つ製品検索システムです。会話のメッセージコンテキスト全体を使用して、ベクトルデータベースを検索できるように検索クエリを生成する必要があります。文法や言語などは除外し、プロダクトの種類、価格の詳細、評価の要件などのような特徴のみを抽出します。検索エンジンに送信するための必要な単語だけで構成された簡潔なクエリであるべきです。ユーザーはクエリを調整することができます。適切にこれを示し、関連するコンテキストが存在する場合はそれを破棄しないでください。ただし、ユーザーが完全に新しい製品に変更する場合は、その場合はコンテキストを無視します。ユーザーが好みに基づいて意思決定をするのを助けてください。ユーザーが妨害的であるかどうかをチェックすることを忘れないでください。会話全体を通して意図を組み立てることを忘れないでください。"""addendum = "----\n返答は常に製品検索に関する文脈情報に基づいた検索クエリの形式で行われます。常に会話全体を参照することを忘れないでください。"def conversational_discovery(user_chat): global history if len(history): chat = chat_model.start_chat(context = context, message_history = history, examples = examples) else: chat = chat_model.start_chat(context = context, examples = []) response = chat.send_message(user_chat + addendum) search_results = search(response) history = chat.message_history[:-1] + [ChatMessage( content = synth(query = response, data = search_results.copy()).text, author = 'bot' )] return history[-1].content,search_results
上記の手順は、LLMsの時代の検索体験において注目すべき成果を実証しています。しかし、信頼性を向上させるために考慮すべき重要な側面もあります。
- メタデータ/密なインデックス間の製品属性管理の選択。属性をメタデータの一部として保持することは、より高い精度を保証しますが、密な埋め込みの一部として追加することで一般化を向上させます。たとえば、製品カテゴリ、ドレスサイズなどは、ユーザーの指定/学習済みの好みを捉えるための非常に重要な情報です。LLMの一般的な埋め込みベースの検索エンジンがそれに厳密に従わない場合、それは逆効果です。したがって、信頼性を確保するためにメタデータとして追加し、データベースレベルで明示的なフィルタを適用するのに理想的な候補です。一方で、色、カテゴリなどの他の属性は曖昧に表現されることが多く、それらの属性は密な表現によって最大の価値を引き出すためにより適しています。
- オートクエリ生成は、時折幻覚が発生することがあります。そのため、フューショットラーニングと繰り返しのチェックとバランスを行うことで、クエリがエラーフリーであることを確認し、データベースとのインターフェース前に使用できます。
- クエリの意味の曖昧さに対する厳格さ:基礎となるLLMsは、与えられたコンテキストからのユーザーの意図の理解とクエリ生成においてはうまく機能しますが、それを生産システムに展開するための正確さの目標はまだ達成されていません。これは、知識グラフを利用するか、ユーザーのクエリ意図マッピングレコードを利用して意思決定に影響を与えることでさらに改善できます。プロンプトの調整またはこのようなリストを使用したファインチューニングは、全体的な検索精度を向上させるためにチームが構築している信頼性のあるオプションです。
まとめると、LLMによる検索の強化は、オンラインで製品を発見する方法を変えつつあります。ジェネレーティブAIを使用して伝統的な検索システムを再定義する方法について、皆さんの考えや観察結果を共有してください。
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