Como usamos a busca semântica para tornar nossa busca 10x mais inteligente
Na Tokopedia, entendemos que o valor do nosso corpus de produtos só é desbloqueado quando nossos compradores conseguem encontrar produtos que são relevantes para eles, por isso nos esforçamos para melhorar a relevância dos resultados de busca.
Para promover esse esforço, estamos introduzindo a busca por similaridade na Tokopedia. Se você acessar a página de resultados de busca em dispositivos móveis, encontrará um botão “...” que abre um menu que oferece a opção de buscar produtos semelhantes ao produto.
Busca baseada em palavras-chave
A Busca da Tokopedia usa Elasticsearch para a busca e o ranqueamento de produtos. Para cada solicitação de busca, primeiro consultamos o Elasticsearch, que ranqueia os produtos de acordo com a consulta de busca. O ElasticSearch armazena cada palavra como uma sequência de números que representam códigos ASCII (ou UTF) para cada letra. Ele constrói um índice invertido para descobrir rapidamente quais documentos contêm palavras da consulta do usuário e, em seguida, encontra a melhor correspondência entre eles usando vários algoritmos de pontuação. Esses algoritmos de pontuação prestam pouca atenção ao que as palavras significam, mas sim à frequência com que ocorrem no documento, à proximidade entre elas etc. A representação ASCII obviamente contém informações suficientes para transmitir a semântica (afinal, nós, humanos, conseguimos entendê-la). Infelizmente, não há um bom algoritmo para o computador comparar palavras codificadas em ASCII pelo seu significado.
Representação vetorial
Uma solução para isso seria criar uma representação alternativa, que nos diga não apenas sobre as letras contidas na palavra, mas também algo sobre seu significado. Por exemplo, poderíamos codificar com quais outras palavras nossa palavra é frequentemente usada em conjunto (representada pelo contexto provável). Então presumiríamos que contextos semelhantes representam coisas semelhantes e tentaríamos compará-los usando métodos matemáticos. Poderíamos até encontrar uma maneira de codificar frases inteiras pelo seu significado.
A representação vetorial também revela o significado das palavras em comparação com a representação ASCII.
Selecionar um mecanismo de busca por similaridade de embeddings
Agora que temos vetores de características, a questão restante é como recuperar, do grande volume de vetores, aqueles que são semelhantes ao vetor-alvo. Quando se trata do mecanismo de busca de embeddings, tentamos POC em vários mecanismos disponíveis no Github, alguns deles são FAISS, Vearch, Milvus.
Preferimos o Milvus a outros mecanismos com base nos resultados dos testes de carga. Por um lado, já usamos FAISS antes em outras equipes e, portanto, gostaríamos de tentar algo novo. Comparado ao Milvus, o FAISS é mais uma biblioteca subjacente, portanto não é muito conveniente de usar. À medida que aprendemos mais sobre o Milvus, finalmente decidimos adotar o Milvus por seus dois principais recursos:
O Milvus é muito fácil de usar. Tudo o que você precisa fazer é obter sua imagem Docker e atualizar os parâmetros com base no seu próprio cenário.
Ele oferece suporte a mais índices e possui documentação de suporte detalhada.
Em resumo, o Milvus é muito amigável para os usuários e a documentação é bastante detalhada. Se você encontrar algum problema, geralmente pode encontrar soluções na documentação; caso contrário, pode sempre obter suporte da comunidade Milvus.
Serviço de cluster Milvus
Depois de decidir usar o Milvus como mecanismo de busca de vetores de características, decidimos usar o Milvus para um dos casos de uso do nosso serviço de Anúncios, em que queríamos corresponder palavras-chave com baixa taxa de atendimento a palavras-chave com alta taxa de atendimento. Configuramos um nó independente em um ambiente de desenvolvimento (DEV) e começamos a atender solicitações; ele estava funcionando bem havia alguns dias e nos proporcionando métricas de CTR/CVR melhores. Se um nó independente falhasse em produção, todo o serviço ficaria indisponível. Portanto, precisamos implantar um serviço de busca altamente disponível.
Milvus fornece tanto o Mishards, um middleware de sharding de cluster, quanto o Milvus-Helm para configuração. Na Tokopedia, usamos playbooks do Ansible para a configuração da infraestrutura, então criamos um playbook para orquestração da infra. O diagrama abaixo da documentação do Milvus mostra como o Mishards funciona:
Como o Mishards funciona.
O Mishards encaminha uma solicitação do upstream para seus submódulos, dividindo a solicitação upstream, e então coleta e retorna os resultados dos subserviços para o upstream. A arquitetura geral da solução de cluster baseada no Mishards é mostrada abaixo:
Arquitetura geral do Mishards.
A documentação oficial fornece uma introdução clara ao Mishards. Você pode consultar Mishards se tiver interesse.
Em nosso serviço keyword-to-keyword, implantamos um nó gravável, dois nós somente leitura e uma instância do middleware Mishards no GCP, usando o Milvus ansible. Ele tem se mantido estável até agora. Um enorme componente do que torna possível consultar com eficiência os conjuntos de dados de milhões, bilhões ou até trilhões de vetores dos quais os mecanismos de busca por similaridade dependem é a indexação, um processo de organização de dados que acelera drasticamente a busca em big data.
Como a indexação vetorial acelera a busca por similaridade?
Os mecanismos de busca por similaridade funcionam comparando a entrada com um banco de dados para encontrar objetos que sejam mais semelhantes à entrada. A indexação é o processo de organizar dados de forma eficiente, e desempenha um papel importante em tornar a busca por similaridade útil ao acelerar dramaticamente consultas demoradas em grandes conjuntos de dados. Depois que um enorme conjunto de dados vetoriais é indexado, as consultas podem ser roteadas para clusters, ou subconjuntos de dados, com maior probabilidade de conter vetores semelhantes a uma consulta de entrada. Na prática, isso significa que um certo grau de precisão é sacrificado para acelerar consultas em dados vetoriais realmente grandes.
Pode-se fazer uma analogia com um dicionário, onde as palavras são ordenadas alfabeticamente. Ao procurar uma palavra, é possível navegar rapidamente para uma seção que contém apenas palavras com a mesma inicial — acelerando drasticamente a busca pela definição da palavra de entrada.
O que vem a seguir, você pergunta?
Blog_How we used semantic search to make our search 10x smarter_5.jpeg
Como mostrado acima, não há uma solução que sirva para tudo; sempre queremos melhorar o desempenho do modelo usado para obter os embeddings.
Além disso, do ponto de vista técnico, queremos executar vários modelos de aprendizado ao mesmo tempo e comparar os resultados dos diversos experimentos. Fique atento para mais informações sobre nossos experimentos, como busca por imagens e busca por vídeos.
Referências:
- Documentação do 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 artigo de blog foi republicado de: https://medium.com/tokopedia-engineering/how-we-used-semantic-search-to-make-our-search-10x-smarter-bd9c7f601821
Leia outras histórias de usuários para saber mais sobre como criar coisas com Milvus.
Continue lendo

How to Build an Enterprise-Ready RAG Pipeline on AWS with Bedrock, Zilliz Cloud, and LangChain
Build production-ready enterprise RAG with AWS Bedrock, Nova models, Zilliz Cloud, and LangChain. Complete tutorial with deployable code.

Why Context Engineering Is Becoming the Full Stack of AI Agents
Discover how context engineering unifies prompts, RAG, and tools to build smarter, production-ready AI agents powered by Milvus.

Democratizing AI: Making Vector Search Powerful and Affordable
Zilliz democratizes AI vector search with Milvus 2.6 and Zilliz Cloud for powerful, affordable scalability, cutting costs in infrastructure, operations, and development.



