{
  "title": "Busca Híbrida para E-Commerce com Pinecone e LLMs",
  "excerpt": "Aprenda como construir um poderoso sistema de busca híbrida para aplicações de e-commerce combinando métodos tradicionais de recuperação de informação com modelos de machine learning como Language Models (LLMs) e Pinecone, um banco de dados vetorial gerenciado. Descubra os benefícios da busca híbrida para e-commerce, incluindo relevância de busca aprimorada, personalização, tratamento de consultas de cauda longa e gerenciamento de infraestrutura simplificado.",
  "content_html": "<p>Buscar e encontrar produtos relevantes é um componente crítico de um site de e-commerce. Fornecer resultados de busca rápidos e precisos pode fazer a diferença entre alta satisfação do usuário e frustração. Com os recentes avanços em compreensão de linguagem natural e tecnologias de busca vetorial, sistemas de busca aprimorados tornaram-se mais acessíveis e eficientes, levando a melhores experiências do usuário e taxas de conversão aprimoradas.</p>\n\n<p>Neste post, exploraremos como implementar um sistema de busca híbrida para e-commerce usando Pinecone, um mecanismo de busca vetorial de alto desempenho, e modelos de linguagem específicos de domínio ajustados. Ao final deste post, você não apenas terá uma compreensão sólida da busca híbrida, mas também um guia prático passo a passo para implementá-la.</p>\n\n<h2>O que é Busca Híbrida?</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\">Visão de alto nível de um Índice Híbrido Pinecone simples</span>\n\n<p>Antes de mergulhar na implementação, vamos entender rapidamente o que significa busca híbrida. Busca híbrida é uma abordagem que combina os pontos fortes tanto da busca tradicional (busca vetorial esparsa) quanto da busca vetorial (busca vetorial densa) para alcançar melhor desempenho de busca em uma ampla gama de domínios.</p>\n\n<p>A busca vetorial densa extrai embeddings vetoriais de alta qualidade de dados de texto e realiza uma busca por similaridade para encontrar documentos relevantes. No entanto, frequentemente tem dificuldades com dados fora do domínio quando não é ajustada em conjuntos de dados específicos do domínio.</p>\n\n<p>Por outro lado, a busca tradicional usa representações vetoriais esparsas, como frequência de termo-frequência inversa de documento (TF-IDF) ou BM25, e não requer nenhum ajuste específico de domínio. Embora possa lidar com novos domínios, seu desempenho é limitado por sua incapacidade de entender relações semânticas entre palavras e carece da inteligência da recuperação densa.</p>\n\n<p>A busca híbrida tenta mitigar as fraquezas de ambas as abordagens combinando-as em um único sistema, aproveitando o potencial de desempenho da busca vetorial densa e a adaptabilidade zero-shot da busca tradicional.</p>\n\n<p>Agora que temos uma compreensão básica da busca híbrida, vamos mergulhar em sua implementação.</p>\n\n<h2>Construindo um Sistema de Busca Híbrida</h2>\n\n<p>Cobriremos as seguintes etapas para implementar um sistema de busca híbrida:</p>\n\n<ol>\n<li>Aproveitando Modelos de Linguagem Específicos de Domínio</li>\n<li>Criando Vetores Esparsos e Densos</li>\n<li>Configurando o Pinecone</li>\n<li>Implementando o Pipeline de Busca Híbrida</li>\n<li>Fazendo Consultas e Ajustando Parâmetros</li>\n</ol>\n\n<h3>1. Aproveitando Modelos de Linguagem Específicos de Domínio</h3>\n\n<p>Nos últimos anos, modelos de linguagem pré-treinados em larga escala como GPT da OpenAI e Cohere tornaram-se cada vez mais populares para uma variedade de tarefas, incluindo compreensão e geração de linguagem natural. Esses modelos podem ser ajustados em dados específicos de domínio para melhorar seu desempenho e se adaptar a tarefas específicas, como busca de produtos de e-commerce.</p>\n\n<p>Em nosso exemplo, usaremos um modelo de linguagem específico de domínio ajustado para gerar embeddings vetoriais densos para produtos e consultas. No entanto, você pode escolher outros modelos ou até criar seus próprios embeddings personalizados com base em seu domínio específico.</p>\n\n<pre><code class=\"language-python\">import torch\nfrom transformers import AutoTokenizer, AutoModel\n\n# Load a pre-trained domain-specific language model\nmodel_name = \"your-domain-specific-model\"\ntokenizer = AutoTokenizer.from_pretrained(model_name)\nmodel = AutoModel.from_pretrained(model_name)\n\n# Generate dense vector embeddings for a product description\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. Criando Vetores Esparsos e Densos</h3>\n\n<p>A busca híbrida requer representações vetoriais esparsas e densas para nossos dados de e-commerce. Agora descreveremos como gerar esses vetores.</p>\n\n<h4>Vetores Esparsos</h4>\n\n<p>Representações vetoriais esparsas, como TF-IDF ou BM25, podem ser criadas usando técnicas padrão de processamento de texto, como tokenização, remoção de stopwords e stemming. Um exemplo de geração de vetores esparsos pode ser alcançado usando uma matriz de vocabulário.</p>\n\n<pre><code class=\"language-python\"># This function generates sparse vector representations of a list of product descriptions\ndef generate_sparse_vectors(text):\n    '''Generates sparse vector representations for a list of product descriptions\n\n    Args:\n        text (list): A list of product descriptions\n\n    Returns:\n        sparse_vector (dict): A dictionary of indices and values\n    '''\n    sparse_vector = bm25.encode_queries(text)\n    return sparse_vector\n\nfrom pinecone_text.sparse import BM25Encoder\n\n# Create the BM25 encoder and fit the data\nbm25 = BM25Encoder()\nbm25.fit(new_df.full_data)\n\n# Create the sparse vectors\nsparse_vectors = []\nfor product_description in product_descriptions:\n    sparse_vectors.append(generate_sparse_vectors(text=product_description))\n</code></pre>\n\n<h4>Vetores Densos</h4>\n\n<p>Representações vetoriais densas podem ser geradas usando modelos de linguagem pré-treinados ou personalizados específicos de domínio. Em nosso exemplo anterior, usamos um modelo de linguagem específico de domínio para gerar embeddings vetoriais densos para uma descrição de produto.</p>\n\n<pre><code class=\"language-python\">def generate_dense_vector(text):\n    '''Generates dense vector embeddings for a list of product descriptions\n\n    Args:\n        text (list): A list of product descriptions\n\n    Returns:\n        dense_embedding (np.array): A numpy array of dense vector embeddings\n    '''\n    # Tokenize the text and convert to PyTorch tensors\n    inputs = tokenizer(text, return_tensors=\"pt\")\n    # Generate the embeddings with the pre-trained model\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# Generate dense vector embeddings for a list of product descriptions\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. Configurando o Pinecone</h3>\n\n<p>Pinecone é um mecanismo de busca vetorial de alto desempenho que suporta busca híbrida. Ele permite a criação de um único índice para vetores esparsos e densos e lida perfeitamente com consultas de busca em diferentes modalidades de dados.</p>\n\n<p>Para usar o Pinecone, você precisará criar uma conta, instalar o cliente Pinecone e configurar sua chave de API e ambiente.</p>\n\n<pre><code class=\"language-python\"># Create a Pinecone hybrid search index\nimport pinecone\n\npinecone.init(\n    api_key=\"YOUR_API_KEY\",  # app.pinecone.io\n    environment=\"YOUR_ENV\"  # find next to api key in console\n)\n\n# Create a Pinecone hybrid search index\nindex_name = \"ecommerce-hybrid-search\"\npinecone.create_index(\n    index_name = index_name,\n    dimension = MODEL_DIMENSION,  # dimensionality of dense model\n    metric = \"dotproduct\"\n)\n# connect to the index\nindex = pinecone.Index(index_name=index_name)\n# view index stats\nindex.describe_index_stats()\n</code></pre>\n\n<h3>4. Implementando o Pipeline de Busca Híbrida</h3>\n\n<p>Com nossos vetores esparsos e densos gerados e o Pinecone configurado, agora podemos construir um pipeline de busca híbrida. Este pipeline inclui as seguintes etapas:</p>\n\n<ol>\n<li>Adicionar dados de produtos ao índice Pinecone</li>\n<li>Recuperar resultados usando vetores esparsos e densos</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    \"\"\"Upserts product data to the Pinecone index.\n\n    Args:\n        product_ids (`list` of `str`): Product IDs.\n        sparse_vectors (`list` of `list` of `float`): Sparse vectors.\n        dense_vectors (`list` of `list` of `float`): Dense vectors.\n        metadata (`list` of `list` of `str`): Optional metadata.\n\n    Returns:\n        None\n    \"\"\"\n    batch_size = 32\n\n    # Loop through the product IDs in batches.\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        # Upsert the vectors into the Pinecone index.\n        index.upsert(vectors=vectors)\n\nadd_product_data_to_index(product_ids, sparse_vectors, dense_vectors)\n</code></pre>\n\n<p>Agora que nossos dados estão indexados, podemos realizar consultas de busca híbrida.</p>\n\n<h3>5. Fazendo Consultas e Ajustando Parâmetros</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\">Visão de alto nível de uma Consulta Híbrida Pinecone simples</span>\n\n<p>Para fazer consultas de busca híbrida, criaremos uma função que recebe uma consulta, o número de melhores resultados e um parâmetro alpha para controlar a ponderação entre as pontuações de busca vetorial densa e esparsa.</p>\n\n<pre><code class=\"language-python\">def hybrid_scale(dense, sparse, alpha: float):\n    \"\"\"Hybrid vector scaling using a convex combination\n\n    alpha * dense + (1 - alpha) * sparse\n\n    Args:\n        dense: Array of floats representing\n        sparse: a dict of `indices` and `values`\n        alpha: float between 0 and 1 where 0 == sparse only\n               and 1 == dense only\n    \"\"\"\n    if alpha &lt; 0 or alpha &gt; 1:\n        raise ValueError(\"Alpha must be between 0 and 1\")\n    # scale sparse and dense vectors to create hybrid search vecs\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    # Generate sparse query vector\n    sparse_query_vector = generate_sparse_vector(query)\n\n    # Generate dense query vector\n    dense_query_vector = generate_dense_vector(query)\n\n    # Calculate hybrid query vector\n    dense_query_vector, sparse_query_vector = hybrid_scale(dense_query_vector, sparse_query_vector, alpha)\n\n    # Search products using 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>Podemos então usar esta função para buscar produtos relevantes em nosso conjunto de dados de e-commerce.</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>Experimentar com diferentes valores para o parâmetro alpha ajudará você a encontrar o equilíbrio ideal entre busca vetorial esparsa e densa para seu domínio específico.</p>\n\n<h2>Conclusão</h2>\n\n<p>Neste post, demonstramos como construir um sistema de busca híbrida para e-commerce usando Pinecone e modelos de linguagem específicos de domínio. A busca híbrida nos permite combinar os pontos fortes tanto da busca tradicional quanto da busca vetorial, melhorando o desempenho de busca e a adaptabilidade em diversos domínios.</p>\n\n<p>Seguindo as etapas e trechos de código fornecidos neste post, você pode implementar seu próprio sistema de busca híbrida adaptado aos requisitos específicos do seu site de e-commerce. Comece a explorar o Pinecone e melhore sua experiência de busca de e-commerce hoje!</p>\n\n<h2>Referências</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\">Ecommerce Search using Hybrid Search Techniques in Pinecone (Google Colab Notebook)</a>: Um guia prático mostrando a implementação de busca de e-commerce usando técnicas de busca híbrida do Pinecone.</li>\n<li><a href=\"https://docs.pinecone.io/docs/ecommerce-search\">Pinecone Ecommerce Search Documentation</a>: Documentação oficial do Pinecone para construção de sistemas de busca de e-commerce.</li>\n<li><a href=\"https://colab.research.google.com/github/pinecone-io/examples/blob/master/pinecone/sparse/bm25/bm25-vector-generation.ipynb\">BM25 Vector Generation using Pinecone (Google Colab Notebook)</a>: Um guia para gerar vetores esparsos BM25 usando Pinecone.</li>\n<li><a href=\"https://github.com/pinecone-io/pinecone-text\">Pinecone Text Repository on GitHub</a>: Uma coleção de recursos de processamento de texto e geração de vetores usando Pinecone.</li>\n<li><a href=\"https://www.pinecone.io/learn/hybrid-search-intro/\">Introduction to Hybrid Search on Pinecone's Website</a>: Uma visão geral da busca híbrida, seus benefícios e casos de uso no contexto das capacidades do Pinecone.</li>\n</ul>",
  "source_hash": "sha256:c8b3789c888127b9f8404365e651e80624c4177f346d2aef54a3b185e2cd138b",
  "model": "claude-sonnet-4-5-20250929",
  "generated_at": "2026-01-15T20:04:18.034708+00:00"
}