{
  "title": "使用 Pinecone 和 LLM 构建电商混合搜索系统",
  "excerpt": "学习如何通过结合传统信息检索方法与机器学习模型(如大语言模型 LLM)和托管向量数据库 Pinecone,为电商应用构建强大的混合搜索系统。探索混合搜索在电商领域的优势,包括提升搜索相关性、个性化、处理长尾查询以及简化基础设施管理。",
  "content_html": "<p>搜索和查找相关产品是电商网站的关键组成部分。提供快速准确的搜索结果可以决定用户满意度的高低。随着自然语言理解和向量搜索技术的最新进展,增强型搜索系统变得更加易用和高效,从而带来更好的用户体验和更高的转化率。</p>\n\n<p>在这篇博文中,我们将探讨如何使用 Pinecone(一个高性能向量搜索引擎)和经过微调的领域特定语言模型来实现电商混合搜索系统。读完本文后,您不仅能深入理解混合搜索,还将获得一份实用的分步实施指南。</p>\n\n<h2>什么是混合搜索?</h2>\n\n<img src=\"/assets/images/pinecone_hybrid_index.jpg\" alt=\"Pinecone Hybrid Index\" class=\"post-img\" width=\"2360\" height=\"921\" />\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 这样的大规模预训练语言模型在各种任务中越来越受欢迎,包括自然语言理解和生成。这些模型可以在领域特定数据上进行微调,以提高其性能并适应特定任务,例如电商产品搜索。</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>混合搜索需要为我们的电商数据提供稀疏和密集向量表示。我们现在将描述如何生成这些向量。</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 key 旁边找到\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\" alt=\"Pinecone Hybrid Query\" class=\"post-img\" width=\"2360\" height=\"892\" />\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 == 仅稀疏\n               1 == 仅密集\n    \"\"\"\n    if alpha &lt; 0 or alpha &gt; 1:\n        raise ValueError(\"Alpha 必须在 0 和 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>然后我们可以使用此函数在电商数据集中搜索相关产品。</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 和领域特定语言模型为电商构建混合搜索系统。混合搜索使我们能够结合传统搜索和向量搜索的优势,提高跨不同领域的搜索性能和适应性。</p>\n\n<p>通过遵循本文提供的步骤和代码片段,您可以实现适合您电商网站特定需求的混合搜索系统。立即开始探索 Pinecone,改善您的电商搜索体验!</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 混合搜索技术的电商搜索(Google Colab Notebook)</a>: 展示使用 Pinecone 混合搜索技术实现电商搜索的实用指南。</li>\n<li><a href=\"https://docs.pinecone.io/docs/ecommerce-search\">Pinecone 电商搜索文档</a>: 构建电商搜索系统的官方 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 Notebook)</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 网站上的混合搜索介绍</a>: 在 Pinecone 功能背景下对混合搜索、其优势和用例的概述。</li>\n</ul>",
  "source_hash": "sha256:c8b3789c888127b9f8404365e651e80624c4177f346d2aef54a3b185e2cd138b",
  "model": "claude-sonnet-4-5-20250929",
  "generated_at": "2026-01-15T20:04:10.484714+00:00"
}