No capítulo anterior, você viu como expandir um índice do Elasticsearch com um campo dense_vector que é preenchido com embeddings gerados por um modelo de Machine Learning. O modelo foi instalado localmente em seu computador, e os embeddings foram gerados a partir do código Python e adicionados aos documentos antes de serem inseridos no índice.
Neste capítulo, você aprenderá sobre outro tipo de vetor, o sparse_vector, que foi projetado para armazenar inferências do modelo Elastic Learned Sparse EncodeR (ELSER). Os embeddings retornados por este modelo são uma coleção de tags (mais apropriadamente chamadas de features), cada uma com um peso atribuído.
Neste capítulo, você também usará um método diferente para trabalhar com modelos de Machine Learning, no qual o próprio serviço Elasticsearch executa o modelo e adiciona os embeddings resultantes ao índice por meio de um pipeline.
O campo
Assim como o tipo de campo dense_vector que você usou no capítulo anterior, o tipo sparse_vector pode armazenar inferências retornadas por modelos de aprendizado de máquina. Enquanto vetores densos armazenam uma matriz de números de comprimento fixo que descreve o texto de origem, um vetor esparso armazena um mapeamento de características para pesos.
Vamos adicionar um campo sparse_vector ao índice. Este é um tipo que precisa ser definido explicitamente no mapeamento de índice. Abaixo você pode ver uma versão atualizada do método create_index() com um novo campo chamado elser_embedding com este tipo.
Implementando o Modelo ELSER
Conforme mencionado acima, neste exemplo, o Elasticsearch assumirá a responsabilidade pelo modelo e o executará automaticamente para gerar embeddings, tanto na inserção de documentos quanto na busca.
O cliente Elasticsearch expõe um conjunto de endpoints de API para gerenciar modelos de Machine Learning e seus pipelines. O seguinte método deploy_elser() em search.py segue alguns passos para baixar e instalar o modelo ELSER v2 e para criar um pipeline que o usa para preencher o campo elser_embedding definido acima.
A configuração do ELSER para nós requer várias etapas. Primeiro, o método ml.put_trained_model() do Elasticsearch é usado para baixar o ELSER. O argumento model_id identifica o modelo e a versão a serem baixados (ELSER v2 está disponível para Elasticsearch 8.11 e versões superiores). O campo input é a configuração exigida por este modelo.
Após o download do modelo, ele precisa ser implantado. Para isso, utiliza-se o método ml.start_trained_model_deployment() , apenas com o identificador do modelo a ser implantado. Note que esta é uma operação assíncrona, portanto o modelo estará disponível para uso após um curto período de tempo.
A etapa final para configurar o uso do ELSER é definir um pipeline para ele. Um pipeline é usado para informar ao Elasticsearch como o modelo deve ser utilizado. Um pipeline recebe um identificador e uma ou mais tarefas de processamento para executar. O pipeline criado acima é chamado elser-ingest-pipeline e tem uma única tarefa de inferência, o que significa que cada vez que um documento é adicionado, o modelo será executado no input_field e a saída será adicionada ao documento no output_field. Neste exemplo, o campo summary é usado para gerar os embeddings, assim como nos embeddings de vetores densos do capítulo anterior. Os embeddings resultantes serão escritos no campo vetorial esparso elser_embedding criado na seção anterior.
Para facilitar a invocação deste método, adicione um comando deploy-elser ao aplicativo Flask em app.py:
Agora você pode implantar o ELSER em seu serviço Elasticsearch com o seguinte comando:
A última tarefa de configuração envolve vincular o índice ao pipeline, para que o modelo seja executado automaticamente quando documentos forem inseridos nesse índice. Isso é feito na configuração do índice com a opção settings . Aqui está mais uma atualização para o método create_index() para criar este link:
Com essa alteração, agora você pode regenerar o índice com suporte completo para inferências ELSER:
Anteriormente
Busca semânticaPróximo
Consultas semânticas