{
  "title": "PineconeとLLMを使ったEコマース向けハイブリッド検索",
  "excerpt": "従来の情報検索手法と、大規模言語モデル（LLM）やマネージドベクターデータベースであるPineconeといった機械学習モデルを組み合わせて、Eコマースアプリケーション向けの強力なハイブリッド検索システムを構築する方法を学びます。検索精度の向上、パーソナライゼーション、ロングテールクエリの処理、インフラ管理の簡素化など、Eコマースにおけるハイブリッド検索のメリットをご紹介します。",
  "content_html": "<p>関連性の高い商品を検索して見つけることは、Eコマースサイトにおいて極めて重要な要素です。迅速かつ正確な検索結果を提供できるかどうかは、ユーザーの満足度が高まるか、不満が生まれるかを分ける重要な分岐点となります。近年、自然言語理解とベクター検索技術の進歩により、高度な検索システムがより身近で効率的なものとなり、ユーザー体験の向上とコンバージョン率の改善につながっています。</p>\n\n<p>このブログ記事では、高性能ベクター検索エンジンであるPineconeと、ドメイン特化型にファインチューニングされた言語モデルを使って、Eコマース向けのハイブリッド検索システムを実装する方法を解説します。この記事を読み終える頃には、ハイブリッド検索についての深い理解だけでなく、実際に実装するための実践的なステップバイステップガイドも手に入るでしょう。</p>\n\n<h2>ハイブリッド検索とは？</h2>\n\n<img src=\"/assets/images/pinecone_hybrid_index.jpg\" class=\"post-img\" width=\"2360\" height=\"921\" alt=\"Pinecone Hybrid Index\">\n<span class=\"post-img-caption\">シンプルなPineconeハイブリッドインデックスの概要図</span>\n\n<p>実装に入る前に、ハイブリッド検索が何を意味するのかを簡単に理解しましょう。ハイブリッド検索は、従来の検索（スパースベクター検索）とベクター検索（デンスベクター検索）の両方の強みを組み合わせて、幅広いドメインでより優れた検索パフォーマンスを実現するアプローチです。</p>\n\n<p>デンスベクター検索は、テキストデータから高品質なベクターエンベディングを抽出し、類似性検索を実行して関連性の高い文書を見つけます。しかし、ドメイン特化型のデータセットでファインチューニングされていない場合、ドメイン外のデータに対して苦戦することがよくあります。</p>\n\n<p>一方、従来の検索は、TF-IDF（単語頻度・逆文書頻度）やBM25のようなスパースベクター表現を使用し、ドメイン特化型のファインチューニングを必要としません。新しいドメインに対応できる一方で、単語間の意味的な関係を理解できないことや、デンス検索の持つ知能が欠けていることがパフォーマンスの限界となります。</p>\n\n<p>ハイブリッド検索は、両方のアプローチの弱点を軽減するために、単一のシステム内でそれらを組み合わせることで、デンスベクター検索のパフォーマンスの可能性と、従来の検索のゼロショット適応性を活用しようとします。</p>\n\n<p>ハイブリッド検索の基本的な理解ができたところで、実装の詳細に入りましょう。</p>\n\n<h2>ハイブリッド検索システムの構築</h2>\n\n<p>ハイブリッド検索システムを実装するために、以下のステップを解説します：</p>\n\n<ol>\n<li>ドメイン特化型言語モデルの活用</li>\n<li>スパースベクターとデンスベクターの作成</li>\n<li>Pineconeのセットアップ</li>\n<li>ハイブリッド検索パイプラインの実装</li>\n<li>クエリの実行とパラメータの調整</li>\n</ol>\n\n<h3>1. ドメイン特化型言語モデルの活用</h3>\n\n<p>近年、OpenAIのGPTやCohereなどの大規模な事前学習言語モデルは、自然言語理解や生成を含む様々なタスクでますます人気を集めています。これらのモデルは、ドメイン特化型のデータでファインチューニングすることで、パフォーマンスを向上させ、Eコマースの商品検索などの特定のタスクに適応させることができます。</p>\n\n<p>この例では、ファインチューニングされたドメイン特化型言語モデルを使用して、商品とクエリのデンスベクターエンベディングを生成します。ただし、他のモデルを選択したり、特定のドメインに基づいて独自のカスタムエンベディングを作成したりすることもできます。</p>\n\n<pre><code class=\"language-python\">import torch\nfrom transformers import AutoTokenizer, AutoModel\n\n# 事前学習済みのドメイン特化型言語モデルを読み込む\nmodel_name = \"your-domain-specific-model\"\ntokenizer = AutoTokenizer.from_pretrained(model_name)\nmodel = AutoModel.from_pretrained(model_name)\n\n# 商品説明のデンスベクターエンベディングを生成する\ntext = \"Nike Air Max sports shoes for men\"\ninputs = tokenizer(text, return_tensors=\"pt\")\nwith torch.no_grad():\n    outputs = model(**inputs)\n    dense_embedding = outputs.last_hidden_state.mean(dim=1).numpy()\n</code></pre>\n\n<h3>2. スパースベクターとデンスベクターの作成</h3>\n\n<p>ハイブリッド検索では、Eコマースデータに対してスパースベクター表現とデンスベクター表現の両方が必要です。これらのベクターを生成する方法を説明します。</p>\n\n<h4>スパースベクター</h4>\n\n<p>TF-IDFやBM25のようなスパースベクター表現は、トークン化、ストップワードの除去、ステミングなどの標準的なテキスト処理技術を使用して作成できます。スパースベクターを生成する例として、ボキャブラリーマトリックスを使用する方法があります。</p>\n\n<pre><code class=\"language-python\"># この関数は、商品説明のリストのスパースベクター表現を生成します\ndef generate_sparse_vectors(text):\n    '''商品説明のリストに対するスパースベクター表現を生成します\n\n    Args:\n        text (list): 商品説明のリスト\n\n    Returns:\n        sparse_vector (dict): インデックスと値の辞書\n    '''\n    sparse_vector = bm25.encode_queries(text)\n    return sparse_vector\n\nfrom pinecone_text.sparse import BM25Encoder\n\n# BM25エンコーダーを作成し、データをフィットさせる\nbm25 = BM25Encoder()\nbm25.fit(new_df.full_data)\n\n# スパースベクターを作成する\nsparse_vectors = []\nfor product_description in product_descriptions:\n    sparse_vectors.append(generate_sparse_vectors(text=product_description))\n</code></pre>\n\n<h4>デンスベクター</h4>\n\n<p>デンスベクター表現は、事前学習済みまたは独自のドメイン特化型言語モデルを使用して生成できます。先ほどの例では、ドメイン特化型言語モデルを使用して商品説明のデンスベクターエンベディングを生成しました。</p>\n\n<pre><code class=\"language-python\">def generate_dense_vector(text):\n    '''商品説明のリストに対するデンスベクターエンベディングを生成します\n\n    Args:\n        text (list): 商品説明のリスト\n\n    Returns:\n        dense_embedding (np.array): デンスベクターエンベディングのNumPy配列\n    '''\n    # テキストをトークン化し、PyTorchテンソルに変換する\n    inputs = tokenizer(text, return_tensors=\"pt\")\n    # 事前学習済みモデルでエンベディングを生成する\n    with torch.no_grad():\n        outputs = model(**inputs)\n        dense_vector = outputs.last_hidden_state.mean(dim=1).numpy()\n    return dense_vector\n\n# 商品説明のリストに対するデンスベクターエンベディングを生成する\ndense_vectors = []\nfor product_description in product_descriptions:\n    dense_vectors.append(generate_dense_vector(text=product_description))\n</code></pre>\n\n<h3>3. Pineconeのセットアップ</h3>\n\n<p>Pineconeは、ハイブリッド検索をサポートする高性能なベクター検索エンジンです。スパースベクターとデンスベクターの両方に対して単一のインデックスを作成でき、異なるデータモダリティ間の検索クエリをシームレスに処理します。</p>\n\n<p>Pineconeを使用するには、アカウントに登録し、Pineconeクライアントをインストールし、APIキーと環境を設定する必要があります。</p>\n\n<pre><code class=\"language-python\"># Pineconeハイブリッド検索インデックスを作成する\nimport pinecone\n\npinecone.init(\n    api_key=\"YOUR_API_KEY\",  # app.pinecone.io\n    environment=\"YOUR_ENV\"  # コンソール内でAPIキーの横に記載\n)\n\n# Pineconeハイブリッド検索インデックスを作成する\nindex_name = \"ecommerce-hybrid-search\"\npinecone.create_index(\n    index_name = index_name,\n    dimension = MODEL_DIMENSION,  # デンスモデルの次元数\n    metric = \"dotproduct\"\n)\n# インデックスに接続する\nindex = pinecone.Index(index_name=index_name)\n# インデックスの統計情報を表示する\nindex.describe_index_stats()\n</code></pre>\n\n<h3>4. ハイブリッド検索パイプラインの実装</h3>\n\n<p>スパースベクターとデンスベクターの生成が完了し、Pineconeのセットアップも済んだので、ハイブリッド検索パイプラインを構築できます。このパイプラインには以下のステップが含まれます：</p>\n\n<ol>\n<li>Pineconeインデックスへの商品データの追加</li>\n<li>スパースベクターとデンスベクターの両方を使用した結果の取得</li>\n</ol>\n\n<pre><code class=\"language-python\">def add_product_data_to_index(product_ids, sparse_vectors, dense_vectors, metadata=None):\n    \"\"\"Pineconeインデックスに商品データをアップサートします。\n\n    Args:\n        product_ids (`list` of `str`): 商品ID。\n        sparse_vectors (`list` of `list` of `float`): スパースベクター。\n        dense_vectors (`list` of `list` of `float`): デンスベクター。\n        metadata (`list` of `list` of `str`): オプションのメタデータ。\n\n    Returns:\n        None\n    \"\"\"\n    batch_size = 32\n\n    # 商品IDをバッチ単位でループ処理する\n    for i in range(0, len(product_ids), batch_size):\n        i_end = min(i + batch_size, len(product_ids))\n        ids = product_ids[i:i_end]\n        sparse_batch = sparse_vectors[i:i_end]\n        dense_batch = dense_vectors[i:i_end]\n        meta_batch = metadata[i:i_end] if metadata else []\n\n        vectors = []\n        for _id, sparse, dense, meta in zip(ids, sparse_batch, dense_batch, meta_batch):\n            vectors.append({\n                'id': _id,\n                'sparse_values': sparse,\n                'values': dense,\n                'metadata': meta\n            })\n\n        # ベクターをPineconeインデックスにアップサートする\n        index.upsert(vectors=vectors)\n\nadd_product_data_to_index(product_ids, sparse_vectors, dense_vectors)\n</code></pre>\n\n<p>データのインデックス化が完了したので、ハイブリッド検索クエリを実行できます。</p>\n\n<h3>5. クエリの実行とパラメータの調整</h3>\n\n<img src=\"/assets/images/pinecone_hybrid_query.jpg\" class=\"post-img\" width=\"2360\" height=\"892\" alt=\"Pinecone Hybrid Query\">\n<span class=\"post-img-caption\">シンプルなPineconeハイブリッドクエリの概要図</span>\n\n<p>ハイブリッド検索クエリを実行するために、クエリ、上位結果の数、そしてデンスベクター検索とスパースベクター検索のスコア間の重み付けを制御するalphaパラメータを受け取る関数を作成します。</p>\n\n<pre><code class=\"language-python\">def hybrid_scale(dense, sparse, alpha: float):\n    \"\"\"凸結合を使用したハイブリッドベクターのスケーリング\n\n    alpha * dense + (1 - alpha) * sparse\n\n    Args:\n        dense: 浮動小数点数を表す配列\n        sparse: `indices`と`values`の辞書\n        alpha: 0から1の間の浮動小数点数。0はスパースのみ、1はデンスのみ\n    \"\"\"\n    if alpha < 0 or alpha > 1:\n        raise ValueError(\"Alpha must be between 0 and 1\")\n    # スパースベクターとデンスベクターをスケーリングしてハイブリッド検索用ベクターを作成する\n    hsparse = {\n        'indices': sparse['indices'],\n        'values':  [v * (1 - alpha) for v in sparse['values']]\n    }\n    hdense = [v * alpha for v in dense]\n    return hdense, hsparse\n\ndef search_products(query, top_k=10, alpha=0.5):\n    # スパースクエリベクターを生成する\n    sparse_query_vector = generate_sparse_vector(query)\n\n    # デンスクエリベクターを生成する\n    dense_query_vector = generate_dense_vector(query)\n\n    # ハイブリッドクエリベクターを計算する\n    dense_query_vector, sparse_query_vector = hybrid_scale(dense_query_vector, sparse_query_vector, alpha)\n\n    # Pineconeを使用して商品を検索する\n    results = index.query(\n        vector=dense_query_vector,\n        sparse_vector=sparse_query_vector,\n        top_k=top_k\n    )\n\n    return results\n</code></pre>\n\n<p>この関数を使用して、Eコマースデータセット内の関連性の高い商品を検索できます。</p>\n\n<pre><code class=\"language-python\">query = \"running shoes for women\"\nresults = search_products(query, top_k=5)\n\nfor result in results:\n    print(result['id'], result['metadata']['product_name'], result['score'])\n</code></pre>\n\n<p>alphaパラメータの異なる値を試すことで、特定のドメインに最適なスパースベクター検索とデンスベクター検索のバランスを見つけることができます。</p>\n\n<h2>まとめ</h2>\n\n<p>このブログ記事では、Pineconeとドメイン特化型言語モデルを使用して、Eコマース向けのハイブリッド検索システムを構築する方法を解説しました。ハイブリッド検索により、従来の検索とベクター検索の両方の強みを組み合わせることができ、多様なドメインにおける検索パフォーマンスと適応性を向上させることができます。</p>\n\n<p>この記事で提供されたステップとコードスニペットに従うことで、Eコマースサイトの特定の要件に合わせた独自のハイブリッド検索システムを実装できます。Pineconeの探索を始めて、今日からEコマースの検索体験を向上させましょう！</p>\n\n<h2>参考文献</h2>\n\n<ul>\n<li><a href=\"https://colab.research.google.com/github/pinecone-io/examples/blob/master/search/hybrid-search/ecommerce-search/ecommerce-search.ipynb\">Pineconeを使ったハイブリッド検索技術によるEコマース検索（Google Colabノートブック）</a>: Pineconeのハイブリッド検索技術を使用したEコマース検索の実装を紹介する実践ガイド。</li>\n<li><a href=\"https://docs.pinecone.io/docs/ecommerce-search\">Pinecone Eコマース検索ドキュメント</a>: Eコマース検索システム構築のための公式Pineconeドキュメント。</li>\n<li><a href=\"https://colab.research.google.com/github/pinecone-io/examples/blob/master/pinecone/sparse/bm25/bm25-vector-generation.ipynb\">Pineconeを使用したBM25ベクター生成（Google Colabノートブック）</a>: Pineconeを使用してBM25スパースベクターを生成するガイド。</li>\n<li><a href=\"https://github.com/pinecone-io/pinecone-text\">GitHub上のPinecone Textリポジトリ</a>: Pineconeを使用したテキスト処理とベクター生成のリソース集。</li>\n<li><a href=\"https://www.pinecone.io/learn/hybrid-search-intro/\">PineconeのWebサイトでのハイブリッド検索入門</a>: Pineconeの機能におけるハイブリッド検索の概要、メリット、ユースケース。</li>\n</ul>",
  "source_hash": "sha256:e66aaa4db1667d84e791217c8e94d2c0fb0ed99f7181b65b37a84e72ae3181ef",
  "model": "moonshotai/kimi-k2.6",
  "generated_at": "2026-08-07T05:27:30.049536+00:00"
}