{
  "title": "Búsqueda Híbrida para E-Commerce con Pinecone y LLMs",
  "excerpt": "Aprende a construir un potente sistema de búsqueda híbrida para aplicaciones de e-commerce combinando métodos tradicionales de recuperación de información con modelos de aprendizaje automático como los Modelos de Lenguaje (LLMs) y Pinecone, una base de datos vectorial gestionada. Descubre los beneficios de la búsqueda híbrida para el e-commerce, incluyendo mayor relevancia en los resultados, personalización, manejo de consultas de cola larga y una gestión de infraestructura más sencilla.",
  "content_html": "<p>Buscar y encontrar productos relevantes es un componente crítico de cualquier sitio web de e-commerce. Ofrecer resultados de búsqueda rápidos y precisos puede marcar la diferencia entre una alta satisfacción del usuario y su frustración. Con los recientes avances en comprensión del lenguaje natural y tecnologías de búsqueda vectorial, los sistemas de búsqueda mejorados se han vuelto más accesibles y eficientes, lo que lleva a mejores experiencias de usuario y mayores tasas de conversión.</p><p>En esta entrada del blog, exploraremos cómo implementar un sistema de búsqueda híbrida para e-commerce utilizando Pinecone, un motor de búsqueda vectorial de alto rendimiento, y modelos de lenguaje específicos del dominio ajustados. Al final de esta entrada, no solo tendrás una sólida comprensión de la búsqueda híbrida, sino también una guía práctica paso a paso para implementarla.</p><h2>¿Qué es la Búsqueda Híbrida?</h2><p><img src=\"/assets/images/pinecone_hybrid_index.jpg\" alt=\"Pinecone Hybrid Index\" class=\"post-img\" width=\"2360\" height=\"921\" /><br/><span class=\"post-img-caption\">Vista general de un Índice Híbrido simple de Pinecone</span></p><p>Antes de adentrarnos en la implementación, entendamos rápidamente qué significa la búsqueda híbrida. La búsqueda híbrida es un enfoque que combina las fortalezas de la búsqueda tradicional (búsqueda de vectores dispersos) y la búsqueda vectorial (búsqueda de vectores densos) para lograr un mejor rendimiento de búsqueda en una amplia variedad de dominios.</p><p>La búsqueda de vectores densos extrae embeddings vectoriales de alta calidad a partir de datos de texto y realiza una búsqueda de similitud para encontrar documentos relevantes. Sin embargo, a menudo tiene dificultades con datos fuera del dominio cuando no ha sido ajustada en conjuntos de datos específicos del dominio.</p><p>Por otro lado, la búsqueda tradicional utiliza representaciones de vectores dispersos, como la frecuencia de término-frecuencia inversa de documento (TF-IDF) o BM25, y no requiere ningún ajuste específico del dominio. Si bien puede manejar nuevos dominios, su rendimiento está limitado por su incapacidad para comprender las relaciones semánticas entre palabras y carece de la inteligencia de la recuperación densa.</p><p>La búsqueda híbrida intenta mitigar las debilidades de ambos enfoques combinándolos en un único sistema, aprovechando el potencial de rendimiento de la búsqueda de vectores densos y la adaptabilidad zero-shot de la búsqueda tradicional.</p><p>Ahora que tenemos una comprensión básica de la búsqueda híbrida, profundicemos en su implementación.</p><h2>Construyendo un Sistema de Búsqueda Híbrida</h2><p>Cubriremos los siguientes pasos para implementar un sistema de búsqueda híbrida:</p><ol><li>Aprovechar Modelos de Lenguaje Específicos del Dominio</li><li>Crear Vectores Dispersos y Densos</li><li>Configurar Pinecone</li><li>Implementar el Pipeline de Búsqueda Híbrida</li><li>Realizar Consultas y Ajustar Parámetros</li></ol><h3>1. Aprovechar Modelos de Lenguaje Específicos del Dominio</h3><p>En los últimos años, los modelos de lenguaje preentrenados a gran escala como GPT de OpenAI y Cohere se han vuelto cada vez más populares para una variedad de tareas, incluyendo la comprensión y generación del lenguaje natural. Estos modelos pueden ajustarse con datos específicos del dominio para mejorar su rendimiento y adaptarse a tareas específicas, como la búsqueda de productos en e-commerce.</p><p>En nuestro ejemplo, utilizaremos un modelo de lenguaje específico del dominio ajustado para generar embeddings de vectores densos para productos y consultas. Sin embargo, puedes elegir otros modelos o incluso crear tus propios embeddings personalizados según tu dominio específico.</p><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()</code></pre><h3>2. Crear Vectores Dispersos y Densos</h3><p>La búsqueda híbrida requiere representaciones de vectores tanto dispersos como densos para nuestros datos de e-commerce. A continuación, describiremos cómo generar estos vectores.</p><h4>Vectores Dispersos</h4><p>Las representaciones de vectores dispersos, como TF-IDF o BM25, pueden crearse utilizando técnicas estándar de procesamiento de texto, como tokenización, eliminación de palabras vacías y stemming. Un ejemplo de generación de vectores dispersos se puede lograr utilizando una matriz de vocabulario.</p><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))</code></pre><h4>Vectores Densos</h4><p>Las representaciones de vectores densos pueden generarse utilizando modelos de lenguaje preentrenados o personalizados específicos del dominio. En nuestro ejemplo anterior, utilizamos un modelo de lenguaje específico del dominio para generar embeddings de vectores densos para una descripción de producto.</p><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))</code></pre><h3>3. Configurar Pinecone</h3><p>Pinecone es un motor de búsqueda vectorial de alto rendimiento que admite la búsqueda híbrida. Permite la creación de un único índice para vectores dispersos y densos, y maneja sin problemas las consultas de búsqueda en diferentes modalidades de datos.</p><p>Para usar Pinecone, necesitarás registrarte para obtener una cuenta, instalar el cliente de Pinecone y configurar tu clave API y entorno.</p><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()</code></pre><h3>4. Implementar el Pipeline de Búsqueda Híbrida</h3><p>Con nuestros vectores dispersos y densos generados y Pinecone configurado, ahora podemos construir un pipeline de búsqueda híbrida. Este pipeline incluye los siguientes pasos:</p><ol><li>Agregar datos de productos al índice de Pinecone</li><li>Recuperar resultados utilizando vectores dispersos y densos</li></ol><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)</code></pre><p>Ahora que nuestros datos están indexados, podemos realizar consultas de búsqueda híbrida.</p><h3>5. Realizar Consultas y Ajustar Parámetros</h3><p><img src=\"/assets/images/pinecone_hybrid_query.jpg\" alt=\"Pinecone Hybrid Query\" class=\"post-img\" width=\"2360\" height=\"892\" /><br/><span class=\"post-img-caption\">Vista general de una Consulta Híbrida simple de Pinecone</span></p><p>Para realizar consultas de búsqueda híbrida, crearemos una función que recibe una consulta, el número de resultados principales y un parámetro alpha para controlar la ponderación entre las puntuaciones de búsqueda de vectores densos y dispersos.</p><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 < 0 or alpha > 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</code></pre><p>Luego podemos usar esta función para buscar productos relevantes en nuestro conjunto de datos de e-commerce.</p><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'])</code></pre><p>Experimentar con diferentes valores para el parámetro alpha te ayudará a encontrar el equilibrio óptimo entre la búsqueda de vectores dispersos y densos para tu dominio específico.</p><h2>Conclusión</h2><p>En esta entrada del blog, demostramos cómo construir un sistema de búsqueda híbrida para e-commerce utilizando Pinecone y modelos de lenguaje específicos del dominio. La búsqueda híbrida nos permite combinar las fortalezas de la búsqueda tradicional y la búsqueda vectorial, mejorando el rendimiento de búsqueda y la adaptabilidad en dominios diversos.</p><p>Siguiendo los pasos y fragmentos de código proporcionados en esta entrada, puedes implementar tu propio sistema de búsqueda híbrida adaptado a los requisitos específicos de tu sitio web de e-commerce. ¡Comienza a explorar Pinecone y mejora tu experiencia de búsqueda en e-commerce hoy mismo!</p><h2>Referencias</h2><ul><li><a href=\"https://colab.research.google.com/github/pinecone-io/examples/blob/master/search/hybrid-search/ecommerce-search/ecommerce-search.ipynb\">Búsqueda en E-commerce usando Técnicas de Búsqueda Híbrida en Pinecone (Google Colab Notebook)</a>: Una guía práctica que muestra la implementación de búsqueda en e-commerce usando las técnicas de búsqueda híbrida de Pinecone.</li><li><a href=\"https://docs.pinecone.io/docs/ecommerce-search\">Documentación de Búsqueda en E-commerce de Pinecone</a>: Documentación oficial de Pinecone para construir sistemas de búsqueda en e-commerce.</li><li><a href=\"https://colab.research.google.com/github/pinecone-io/examples/blob/master/pinecone/sparse/bm25/bm25-vector-generation.ipynb\">Generación de Vectores BM25 usando Pinecone (Google Colab Notebook)</a>: Una guía para generar vectores dispersos BM25 usando Pinecone.</li><li><a href=\"https://github.com/pinecone-io/pinecone-text\">Repositorio de Pinecone Text en GitHub</a>: Una colección de recursos de procesamiento de texto y generación de vectores usando Pinecone.</li><li><a href=\"https://www.pinecone.io/learn/hybrid-search-intro/\">Introducción a la Búsqueda Híbrida en el sitio web de Pinecone</a>: Una descripción general de la búsqueda híbrida, sus beneficios y casos de uso en el contexto de las capacidades de Pinecone.</li></ul>",
  "source_hash": "sha256:f09363badfd4924a9411fd2609843f051dfe9d9075b8e2234d98f12960ae9336",
  "model": "claude-sonnet-4-6",
  "generated_at": "2026-05-08T19:45:16.151542+00:00"
}