Oisix ra daichi Creator's Blog(オイシックス・ラ・大地クリエイターズブログ)

オイシックス・ラ・大地株式会社のエンジニア・デザイナーが執筆している公式ブログです。

LLMを用いた補完商品推薦の開発

こんにちは、Data Management Office、データサイエンスセクションの横山です。本ブログでは、Oisix ECサイトにおける補完商品推薦システムの開発について紹介します。

背景

Oisix ECサイトでは、「安心・安全でおいしい食品」を軸に、バリエーション豊かな食材やミールキットを取り扱っています。

食品ECにおいては、「単品購入」ではなく合わせ買いによって食体験の満足度が高まるケースが多く存在します。たとえば、カレーと福神漬け、生パスタとトマトソースといったように、一緒に購入することで料理の完成度や楽しみが向上する補完商品が多数あります。

これまでOisixでは、一部の商品について社内の知見をもとにマニュアルで補完商品を選定してきました。マニュアル作業がボトルネックになり、多くの商品に対して補完商品を推薦できていないことはより良いユーザー体験を提供する上での課題でした。

そこで、大規模言語モデル (Large Language Model, LLM) を活用し、商品のコンテンツ情報をもとに補完商品を自動的に推薦するシステムの開発しました。 LLMは商品名や説明文などの自然言語を柔軟に理解することができ、食に関する知識を豊富に備えているため、補完商品を精度高く抽出することができます。

補完商品を自動的に推薦できるようになり、それぞれの商品の詳細ページに補完商品を掲載できました。これにより、ユーザーの利便性向上とサービスの売上増加が期待されます。

補完商品推薦の例

補完商品推薦を行った例を紹介します。推薦に使う商品コンテンツの特徴と、推薦結果の具体例を説明します。

Oisix商品の特徴

Oisixの商品コンテンツの特徴を確認しましょう。Oisixの商品説明には、補完商品を考える上でのヒントとなる記述が数多く含まれている点が特徴です。


商品例1

名前:
天然マグロのたたき(ねぎとろ用)

説明:
漁獲後直ちに処理し急速凍結された鮮度・品質の良い鮪を厳選して、粒感が残るようにたたきに加工しました。
鮪本来の食感、旨みを気軽に味わっていただけるように少量パックにしてあります。
(中略)
解凍後、袋の先端の切り口をハサミ等で切り、どんぶり用や手巻き用としてお召し上がりください。
わさび、ねぎ、のり等と合わせていただくとよりおいしくお召し上がりいただけます。

マグロのたたきに対してわさび、ねぎ、のりをトッピングにすることがおすすめされています。これらは推薦対象商品に風味のバリエーションを加えることができるので、補完商品として良さそうです。


商品例2

名前:
これ一つでかんたん! タイ風ガパオごはんスパイス

説明:
風味豊かでスパイシー。ひき肉と炒めるだけでかんたんにお楽しみいただけます。
ひき肉と炒めるだけでかんたんにお楽しみいただけます。
(中略)
お召し上がり方
1. 玉ねぎ3分の1個を粗みじん切り、パプリカ3分の1個を薄切りにし、サラダ油小さじ2を温めたフライパンでしんなりするまで炒める。
2. 豚ひき肉300gを加え、色が変わるまで炒める。
3. 醤油小さじ1、本品(1袋すべて)を加え弱火で馴染ませるように1分ほど炒める。
4. 皿に適量のごはん1人前(目安:180-200g)と3を盛り付けできあがり。(好みで目玉焼きやバジルの葉を添えると、より本格的に。)

調味料の説明には、それを使った料理のレシピの記載が多く見られます。レシピで言及されている食材(上記では、ひき肉・玉ねぎ・パプリカ)は商品自体には含まれていないので、補完商品として提案することで必要な材料をもれなく準備できるようにサポートします。

上記の例では、補完商品の候補が直接言及されていますが、必ずしもそうである必要はありません。例えば、食事のシーン(朝食・おやつ・晩酌)や料理のジャンル(和食・洋食・中華)などを一般的な食の常識に基づいて抽出して、補完商品を推薦可能です。

実際の推薦結果

先に確認した商品例に対して、実際にシステムを用いて出力された補完商品は次の通りです。一番左の列が推薦対象商品で、その他の列が補完商品です。

天然マグロのたたき(ねぎとろ用)は、トッピングとしてのネギとのりに加えて、味付けに必要な醤油が補完商品に選ばれています。また、ガパオごはんスパイスの方は、ガパオライスを作るときに使う食材が補完商品になっています。このように、推薦対象商品のコンテンツから食の文脈に沿った適切な補完商品を推薦できることが確認できます。

推薦手法の詳細

LLMを活用した補完商品推薦の手法について解説します。以下は専門的な内容を含むため、技術的な背景に関心のある方を対象としています。

概要

推薦手法は大きく以下3つのステップにより構成されています。

  1. 推薦対象商品のコンテンツから補完商品のラベルを抽出
  2. ラベルに関連する候補商品を検索
  3. 推薦対象商品に対する補完商品推薦リストを作成

ステップ1: 補完商品のラベルを抽出

商品の説明文から補完商品を表すラベルを複数個抽出します。 LLMを用いて適切なラベルを抽出するため、LLMに入力するプロンプトの設計が重要です。

Oisix商品の特徴を踏まえて次の条件に合うものを補完商品であるとプロンプトで定義しました。

  • 商品の説明文で一緒に使うと良いと提案されている食品
  • 食事シーンや料理ジャンルが同じ食品
  • 説明文にレシピが記載されている場合、レシピで準備が求められている食材・調味料


以下のように補完商品推薦の品質を保証するための抽出ルールをプロンプトで指示しました。

  • ラベルは食品に関する一般名詞を用い、意味が通じる適切な抽象度で出力する
    • ブランド名や特定の商品名などの固有名詞は含めない
    • 「調味料」「野菜」「パン」などの曖昧で広すぎるカテゴリ名は避ける
  • ラベルは説明文の商品に含まれる食品自体にはしない
    • 例えば、ミールキットに含まれる食材や調味料はラベルにしない
  • ラベルは説明文の商品自体と同義なものにしない
    • 補完商品のコンセプトからはずれてしまうのと、別で開発している代替商品(似ている商品)推薦と競合するため


補完商品のラベル抽出では、ラベル名とあわせて選択理由も出力するよう設計しています。これは主に次の目的のためです。

  • 出力の妥当性を確認しやすくするため
    • LLMがなぜそのラベルを選んだのかを可視化することで、不自然な出力の原因分析やエラーの特定が容易になります。
  • プロンプトやルールの改善に活かすため
    • 選択理由から、どの観点(例:時間帯、料理ジャンル、レシピ記載など)で誤りが多いかを把握し、精度向上のための改善点を明確にできます。


最終的にLLMに入力するプロンプトは次のような構成になりました。

商品の名前・説明文から、補完商品のラベルおよびそれを選択した理由を抽出してください。

(ここで補完商品の条件を説明)
(ここで抽出ルールを説明)

入力は以下の通りです。
名前: (ここに名前を書く)
説明: (ここに説明を書く)

上記のプロンプトの前半部分は商品に寄らずに共通となっています。

先に例として挙げた商品に対して、LLMで抽出された補完商品ラベルと選択理由を以下に示します。

  • 商品名: 天然マグロのたたき(ねぎとろ用)
    • ネギ(理由: 説明文で「わさび、ねぎ、のり等と合わせていただくとよりおいしく」と明記されている)
    • 醤油(理由: ねぎとろには一般的にしょうゆをかけて食べることが多い)
    • 白米(理由:「どんぶり用」と記載があり、ねぎとろ丼として白米と組み合わせる)
  • 商品名: これ1つでかんたん! タイ風ガパオごはんスパイス
    • 豚ひき肉(理由: レシピで指定されている主要食材で、ガパオごはんの具材として必須)
    • 玉ねぎ(理由: レシピで指定されている食材でガパオごはんの具材として使用)
    • バジル(理由: レシピで本格的な仕上げとして推奨されているハーブ)

ステップ2: 候補商品を検索

Oisixでの候補商品から、先のステップで抽出した補完商品のラベルに関連するものを取得します。 LLMの応用手法のひとつであるRetrieval-Augmented Generation(RAG)では、検索技術が重要な役割を果たしています。今回の手法でも、RAGで使われているものと同様の技術を活用し、補完商品ラベルに対応する商品を効率的に検索しています。

alt text

キーワード検索に基づく手法を用いました。 具体的には、補完商品ラベルと候補商品のコンテンツを対象に、形態素解析(ツールはFugashiを利用)を行い、 得られた単語の基本形(lemma)に基づいてTF-IDFスコアを計算しました。これにより、各ラベルに関連性の高い商品を上位K件抽出しています。

形態素解析によって単語の表記揺れを抑制できる一方で、ラベルの内容によっては意味が適切に保持されない場合もありました。たとえば、一部のラベルでは語が不適切に分割されるなどの問題があったため、ラベル文字列をそのまま使った部分一致検索も併用しています。

キーワード検索のみでは、ラベルと明確な関係がない商品が検索結果に含まれてしまう場合があります。そこで、検索された商品群に対して、LLMを用いたリランキング手法を導入しました。具体的には、各商品とラベルの関連性を自然言語で評価させ、スコアに基づいて並び替えを行い、関連性の低い商品は結果から除外しています。

以下に、実際にリランキングを適用した例を示します。

ラベル: 味噌汁

候補商品0(関連度 大): ねばねば野菜のおみそ汁
候補商品1(関連度 中): 名匠が作った本気の味噌(米麦あわせ)
候補商品2(関連度 小): 味噌が香る ユッケジャンスープ 2袋(トック入り)

候補商品0はインスタント味噌汁であり、ラベル「味噌汁」に対して最も直接的かつ適切です。候補商品1は味噌そのものですが、味噌汁の材料として使用できるため、補完商品としての妥当性があります。一方、候補商品2は「味噌」という語を含むユッケジャンスープであり、ラベルが意図する「味噌汁」には該当しないため、除外すべきです。

リランキングでは、ラベル名だけでなく、そのラベルが抽出された理由も入力に含めることで、関連性の精度向上を図れるかを検証しています。たとえば「牛肉」というラベルがあっても、鍋料理であれば薄切り肉、カレーであればブロック肉が適切になるなど、文脈に応じた判断が必要なケースがあるためです。

ただし、ラベルの選定理由は商品ごとに異なるため、リランキングの件数は「ユニークなラベル数」ではなく、「商品 × ラベル」の組み合わせ数に増加します。今後は精度向上と処理コストのバランスを踏まえながら、実運用への導入を検討中です。

ステップ3: 補完商品推薦リストを作成

補完商品のラベルと、ラベルに関連する候補商品が得られた後、推薦対象商品に対する補完商品の推薦リストを作成します。

推薦リストの作成では、同じラベルに属する商品が隣り合わないように、ルールベースで順序を決定しています。以下はその処理内容を表すPythonのサンプルコードです。

def make_itemlist(
    labels: list[str],  # 補完商品のラベル
    label_to_itemlist: dict[str, list[str]],  # ラベルごとに関連する候補商品リスト
    topk: int,  # 出力する推薦リストの件数
    topk_each: int,
):
    ret = []
    for i in range(topk_each):
        for label in labels:
            itemlist = label_to_itemlist[label]
            ret.append(itemlist[i])
    return ret[:topk]

ラベルごとの候補商品リストは関連度の高い順に並んでいますが、その順番のまま推薦リストを作成すると、上位の商品ばかりが選ばれ多様性に欠ける結果になってしまいます。 そこで、リストの先頭の商品に高い重みをつけつつランダムにサンプリングを行うことで、関連度を優先しながらも異なる商品が選ばれる可能性を残し、多様性のある推薦リストを作成するようにしています。

関連する手法

ここまででは、私たちが開発したコンテンツベースな推薦方法を紹介しました。 これに対して、実運用で広く使われるのがユーザー行動ログや購買履歴を起点としたログベースの方法です。

代表的なアプローチとして次のものがあります。

  • アソシエーションルールマイニング
    • AprioriやFP-Growthによる頻出アイテムセット抽出
    • バスケット分析で「一緒に買われやすい」商品ペアを発見し、LiftやConfidenceに基づき推薦
  • 協調フィルタリング
    • アイテム共起行列を使った近傍法 (Item-Item CF)
    • Implicit Feedbackモデルで購買ログを活用

補完商品推薦の開発にあたり、item-to-item型の協調フィルタリング手法を検証しました。しかし、得られた商品ペアの多くは補完関係が薄く、実用には適さないと判断しました。

その一因として、OisixのECサイトでは「一定金額以上で送料無料」という仕組みがあり、ユーザーが関連性の低い商品を一度に購入する傾向があることが挙げられます。 例えば、まぐろとねぎのみを購入というケースはほぼ存在しなく、「まぐろ、ねぎ、ガパオごはんスパイス、豚ひき肉、ビビンバミールキット」といった商品を同時に購入するため、それぞれの補完性がわかりにくくなってしまいます。 十分な精度を得るため、ログからデータセット作成する際には補完関係のある組み合わせだけを残すことが必要だと考えます。

今後の展開

補完商品推薦のシステムは、現在も開発を続けています。手法の詳細で言及したいくつかの改善アイデアについては、精度の検証を行い導入の可否を検討していきます。また、サービスをリリースした後は、ログデータに基づきユーザーの反応を分析し、さらなる改善のヒントを探していきます。

今回のLLMを活用した手法は、推薦システムにとどまらずサービス全体のさまざまな領域に応用できる可能性があります。たとえば、Oisixでは毎週、企画に基づいて特集ページを作成しており、特定の食事シーンや料理ジャンルに関連する商品をまとめて紹介しています。こうした特集ページの作成には、多くの時間と労力がかかるのが現状です。しかし、商品の特徴や文脈、商品同士の関係性をLLMが理解し、特集内容を自動的に生成できるようになれば、作業負担を大きく軽減できると考えています。

おわりに

本記事では、Oisix ECサイトにおける補完商品推薦システムの開発について紹介しました。商品のコンテンツ情報を活用し、LLMを用いて補完商品を推薦する手法を採用しました。実際の推薦結果も確認でき、ユーザーにとって有益な商品推薦を実現できることがわかりました。

我々は本記事で説明した機能以外でも推薦・需要予測・生成AI活用に関わる開発をしており、一緒に働いていただけるデータサイエンティストやMLエンジニアの方を募集しています。カジュアルに話すだけでも大丈夫なので、興味がある方はご連絡ください。

Oisix ra daichi Creator's Blogはオイシックス・ラ・大地株式会社のエンジニア・デザイナーが執筆している公式ブログです。

オイシックス・ラ・大地株式会社では一緒に働く仲間を募集しています