Pesquisa baseada em palavras-chave
Na Tokopedia, compreendemos que o valor do nosso corpus de produtos só é desbloqueado quando os nossos compradores conseguem encontrar produtos que lhes são relevantes, pelo que nos esforçamos por melhorar a relevância dos resultados da pesquisa.
Para promover esse esforço, estamos a introduzir a pesquisa por semelhança na Tokopedia. Se aceder à página de resultados de pesquisa em dispositivos móveis, encontrará um botão "..." que expõe um menu que lhe dá a opção de procurar produtos semelhantes ao produto.
Pesquisa baseada em palavras-chave
A Tokopedia Search utiliza o Elasticsearch para a pesquisa e classificação de produtos. Para cada pedido de pesquisa, consultamos primeiro o Elasticsearch, que classifica os produtos de acordo com a consulta de pesquisa. O ElasticSearch armazena cada palavra como uma sequência de números que representam códigos ASCII (ou UTF) para cada letra. Constrói um índice invertido para descobrir rapidamente quais os documentos que contêm palavras da consulta do utilizador e, em seguida, encontra a melhor correspondência entre eles utilizando vários algoritmos de pontuação. Estes algoritmos de pontuação prestam pouca atenção ao significado das palavras, mas sim à frequência com que ocorrem no documento, à proximidade entre elas, etc. A representação ASCII contém obviamente informação suficiente para transmitir a semântica (afinal, nós, humanos, conseguimos compreendê-la). Infelizmente, não existe um bom algoritmo para o computador comparar palavras codificadas em ASCII pelo seu significado.
Representação vetorial
Uma solução para este problema seria criar uma representação alternativa, que nos informasse não só sobre as letras contidas na palavra, mas também sobre o seu significado. Por exemplo, poderíamos codificar as outras palavras com as quais a nossa palavra é frequentemente utilizada (representadas pelo contexto provável). Assumiríamos então que contextos semelhantes representam coisas semelhantes e tentaríamos compará-los usando métodos matemáticos. Poderíamos até encontrar uma forma de codificar frases inteiras pelo seu significado.
Blogue_Como utilizámos a pesquisa semântica para tornar a nossa pesquisa 10x mais inteligente_2.png
Selecionar um motor de pesquisa de similaridade de incorporação
Agora que temos vectores de caraterísticas, a questão que resta é como recuperar do grande volume de vectores aqueles que são semelhantes ao vetor alvo. No que diz respeito ao motor de pesquisa de embeddings, experimentámos o POC em vários motores disponíveis no Github, alguns deles são o FAISS, o Vearch e o Milvus.
Preferimos o Milvus a outros motores com base nos resultados dos testes de carga. Por um lado, já utilizámos o FAISS noutras equipas e, por isso, gostaríamos de experimentar algo novo. Em comparação com o Milvus, o FAISS é mais uma biblioteca subjacente, pelo que não é muito conveniente de utilizar. À medida que fomos aprendendo mais sobre o Milvus, acabámos por decidir adotar o Milvus pelas suas duas caraterísticas principais:
O Milvus é muito fácil de utilizar. Tudo o que precisa de fazer é puxar a sua imagem Docker e atualizar os parâmetros com base no seu próprio cenário.
Suporta mais índices e tem documentação de apoio detalhada.
Em suma, Milvus é muito amigável para os utilizadores e a documentação é bastante detalhada. Se se deparar com algum problema, pode normalmente encontrar soluções na documentação; caso contrário, pode sempre obter apoio da comunidade Milvus.
Serviço de cluster Milvus
Depois de decidirmos utilizar o Milvus como motor de pesquisa de vectores de caraterísticas, decidimos utilizar o Milvus para um dos nossos casos de utilização do serviço Ads, em que queríamos fazer corresponder palavras-chave de baixa taxa de preenchimento com palavras-chave de alta taxa de preenchimento. Configurámos um nó autónomo num ambiente de desenvolvimento (DEV) e começámos a servir, estava a funcionar bem há alguns dias e a dar-nos melhores métricas de CTR/CVR. Se um nó autônomo falhasse na produção, todo o serviço ficaria indisponível. Assim, precisamos de implementar um serviço de pesquisa altamente disponível.
O Milvus fornece o Mishards, um middleware de fragmentação de clusters, e o Milvus-Helm para configuração. Na Tokopedia, usamos playbooks Ansible para a configuração da infraestrutura, então criamos um playbook para a orquestração da infraestrutura. O diagrama abaixo, retirado da documentação do Milvus, mostra como o Mishards funciona:
Blog_Como usámos a pesquisa semântica para tornar a nossa pesquisa 10x mais inteligente_3.png
O Mishards faz um pedido em cascata do upstream para os seus sub-módulos, dividindo o pedido do upstream, e depois recolhe e devolve os resultados dos sub-serviços ao upstream. A arquitetura geral da solução de cluster baseada em Mishards é mostrada abaixo: Blog_How we used semantic search to make our search 10x smarter_4.jpeg
A documentação oficial fornece uma introdução clara do Mishards. Se estiver interessado, pode consultar a Mishards.
Em nosso serviço de palavra-chave para palavra-chave, implantamos um nó gravável, dois nós somente leitura e uma instância de middleware Mishards no GCP, usando o ansible Milvus. Até agora tem-se mantido estável. Um grande 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 pesquisa de similaridade dependem é a indexação, um processo de organização de dados que acelera drasticamente a pesquisa de big data.
Como é que a indexação de vectores acelera a pesquisa por semelhança?
Os mecanismos de pesquisa de similaridade funcionam comparando a entrada com um banco de dados para encontrar objetos que sejam mais semelhantes à entrada. A indexação é o processo de organização eficiente dos dados e desempenha um papel importante na utilidade da pesquisa por similaridade, acelerando drasticamente as consultas demoradas em grandes conjuntos de dados. Depois de um enorme conjunto de dados vectoriais ser indexado, as consultas podem ser encaminhadas para clusters, ou subconjuntos de dados, que têm maior probabilidade de conter vectores semelhantes a uma consulta de entrada. Na prática, isto significa que um certo grau de precisão é sacrificado para acelerar as consultas em dados vectoriais realmente grandes.
Pode ser feita uma analogia com um dicionário, onde as palavras são ordenadas alfabeticamente. Ao procurar uma palavra, é possível navegar rapidamente para uma secção que apenas contém palavras com a mesma inicial - acelerando drasticamente a procura da definição da palavra introduzida.
O que é que se segue, pergunta?
Blogue_Como utilizámos a pesquisa semântica para tornar a nossa pesquisa 10x mais inteligente_5.jpeg
Como demonstrado acima, não existe uma solução que sirva para todos, queremos sempre melhorar o desempenho do modelo utilizado para obter os embeddings.
Além disso, de um ponto de vista técnico, queremos executar vários modelos de aprendizagem ao mesmo tempo e comparar os resultados das várias experiências. Esteja atento a este espaço para obter mais informações sobre as nossas experiências, como a pesquisa de imagens e a pesquisa de vídeos.
Referências:
- Mishards Docs: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 do blogue 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 utilizadores para saber mais sobre como fazer coisas com Milvus.
- Representação vetorial
- Selecionar um motor de pesquisa de similaridade de incorporação
- Serviço de cluster Milvus
- Como é que a indexação de vectores acelera a pesquisa por semelhança?
- O que é que se segue, pergunta?
- Referências:
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word