Cómo usamos la búsqueda semántica para hacer que nuestra búsqueda fuera 10 veces más inteligente
En Tokopedia, entendemos que el valor de nuestro corpus de productos solo se desbloquea cuando nuestros compradores pueden encontrar productos que sean relevantes para ellos, por lo que nos esforzamos por mejorar la relevancia de los resultados de búsqueda.
Para impulsar aún más ese esfuerzo, estamos introduciendo la búsqueda por similitud en Tokopedia. Si vas a la página de resultados de búsqueda en dispositivos móviles, encontrarás un botón “…” que muestra un menú que te da la opción de buscar productos similares al producto.
Búsqueda basada en palabras clave
Tokopedia Search utiliza Elasticsearch para la búsqueda y clasificación de productos. Para cada solicitud de búsqueda, primero consultamos Elasticsearch, que clasifica los productos según la consulta de búsqueda. ElasticSearch almacena cada palabra como una secuencia de números que representan códigos ASCII (o UTF) para cada letra. Construye un índice invertido para descubrir rápidamente qué documentos contienen palabras de la consulta del usuario y luego encuentra la mejor coincidencia entre ellos usando varios algoritmos de puntuación. Estos algoritmos de puntuación prestan poca atención a lo que significan las palabras, sino más bien a la frecuencia con la que aparecen en el documento, lo cerca que están unas de otras, etc. La representación ASCII obviamente contiene suficiente información para transmitir la semántica (después de todo, nosotros, los humanos, podemos entenderla). Desafortunadamente, no existe un buen algoritmo para que la computadora compare palabras codificadas en ASCII por su significado.
Representación vectorial
Una solución a esto sería idear una representación alternativa, que nos diga no solo sobre las letras contenidas en la palabra, sino también algo sobre su significado. Por ejemplo, podríamos codificar con qué otras palabras se usa frecuentemente nuestra palabra (representada por el contexto probable). Entonces asumiríamos que contextos similares representan cosas similares e intentaríamos compararlos usando métodos matemáticos. Incluso podríamos encontrar una forma de codificar oraciones completas por su significado.
La representación vectorial también revela el significado de las palabras en comparación con la representación ASCII.
Seleccionar un motor de búsqueda por similitud de embeddings
Ahora que tenemos vectores de características, el problema restante es cómo recuperar, del gran volumen de vectores, aquellos que son similares al vector objetivo. En lo que respecta al motor de búsqueda de embeddings, probamos una POC en varios motores disponibles en Github; algunos de ellos son FAISS, Vearch, Milvus.
Preferimos Milvus a otros motores basándonos en los resultados de las pruebas de carga. Por un lado, hemos utilizado FAISS antes en otros equipos y, por lo tanto, nos gustaría probar algo nuevo. En comparación con Milvus, FAISS es más una biblioteca subyacente, por lo que no es muy conveniente de usar. A medida que aprendimos más sobre Milvus, finalmente decidimos adoptar Milvus por sus dos características principales:
Milvus es muy fácil de usar. Todo lo que necesitas hacer es descargar su imagen Docker y actualizar los parámetros según tu propio escenario.
Admite más índices y cuenta con documentación de soporte detallada.
En pocas palabras, Milvus es muy amigable para los usuarios y la documentación es bastante detallada. Si te encuentras con algún problema, normalmente puedes encontrar soluciones en la documentación; de lo contrario, siempre puedes obtener soporte de la comunidad de Milvus.
Servicio de clúster Milvus
Después de decidir usar Milvus como motor de búsqueda de vectores de características, decidimos usar Milvus para uno de nuestros casos de uso del servicio de Ads, donde queríamos hacer coincidir palabras clave con baja tasa de llenado con palabras clave de alta tasa de llenado. Configuramos un nodo independiente en un entorno de desarrollo (DEV) y comenzamos a servir; había estado funcionando bien durante unos días y nos estaba dando métricas de CTR/CVR mejoradas. Si un nodo independiente fallara en producción, todo el servicio dejaría de estar disponible. Por lo tanto, necesitamos desplegar un servicio de búsqueda de alta disponibilidad.
Milvus proporciona tanto Mishards, un middleware de fragmentación de clústeres, como Milvus-Helm para la configuración. En Tokopedia usamos playbooks de Ansible para la configuración de infraestructura, así que creamos un playbook para la orquestación de la infraestructura. El siguiente diagrama de la documentación de Milvus muestra cómo funciona Mishards:
Cómo funciona Mishards.
Mishards propaga en cascada una solicitud desde upstream hacia sus submódulos dividiendo la solicitud de upstream, y luego recopila y devuelve los resultados de los subservicios a upstream. La arquitectura general de la solución de clúster basada en Mishards se muestra a continuación:
Arquitectura general de Mishards.
La documentación oficial proporciona una introducción clara a Mishards. Puedes consultar Mishards si te interesa.
En nuestro servicio de palabra clave a palabra clave, implementamos un nodo con escritura habilitada, dos nodos de solo lectura y una instancia de middleware Mishards en GCP, usando Milvus ansible. Hasta ahora ha sido estable. Un componente enorme de lo que hace posible consultar de manera eficiente los conjuntos de datos de millones, miles de millones o incluso billones de vectores de los que dependen los motores de búsqueda por similitud es la indexación, un proceso de organización de datos que acelera drásticamente la búsqueda en big data.
¿Cómo acelera la indexación vectorial la búsqueda por similitud?
Los motores de búsqueda por similitud funcionan comparando una entrada con una base de datos para encontrar objetos que sean los más similares a la entrada. La indexación es el proceso de organizar datos de manera eficiente, y desempeña un papel importante para hacer útil la búsqueda por similitud al acelerar drásticamente las consultas que consumen mucho tiempo en grandes conjuntos de datos. Después de indexar un conjunto masivo de datos vectoriales, las consultas pueden dirigirse a clústeres, o subconjuntos de datos, que tienen más probabilidades de contener vectores similares a una consulta de entrada. En la práctica, esto significa que se sacrifica cierto grado de precisión para acelerar las consultas en datos vectoriales realmente grandes.
Se puede hacer una analogía con un diccionario, donde las palabras se ordenan alfabéticamente. Al buscar una palabra, es posible navegar rápidamente a una sección que solo contiene palabras con la misma inicial, lo que acelera drásticamente la búsqueda de la definición de la palabra de entrada.
¿Qué sigue, preguntas?
Blog_How we used semantic search to make our search 10x smarter_5.jpeg
Como se muestra arriba, no hay una solución que se adapte a todo; siempre queremos mejorar el rendimiento del modelo utilizado para obtener los embeddings.
Además, desde un punto de vista técnico, queremos ejecutar múltiples modelos de aprendizaje al mismo tiempo y comparar los resultados de los diversos experimentos. Sigue atento a este espacio para obtener más información sobre nuestros experimentos, como búsqueda de imágenes y búsqueda de videos.
Referencias:
- Documentación de Mishards:https://milvus.io/docs/v0.10.2/mishards.md
- Mishards: https://github.com/milvus-io/milvus/tree/master/shards
- Milvus-Helm: https://github.com/milvus-io/milvus-helm/tree/master/charts/milvus
Este artículo de blog se republica desde: https://medium.com/tokopedia-engineering/how-we-used-semantic-search-to-make-our-search-10x-smarter-bd9c7f601821
Lee otras historias de usuarios para aprender más sobre cómo crear cosas con Milvus.
Sigue leyendo

Build Multimodal Search for 3D Assets with Tripo and Zilliz Cloud
Generate 3D assets with Tripo, then search them by text, image, and metadata with multimodal embeddings and Zilliz Cloud.

Introducing Loon: A New Storage Engine for Vector Data That Never Stops Changing
Loon is a new storage engine for Milvus 3.0 and Zilliz Vector Lakebase, built to manage evolving vector datasets with ColumnGroups, row ID alignment, and Manifests.

Vector Databases vs. Document Databases
Use a vector database for similarity search and AI-powered applications; use a document database for flexible schema and JSON-like data storage.



