EventoObtenha 50% de desconto no seu ingresso para MongoDB.local Londres em outubro 2. Use o código WEB50Saiba mais >>
Desenvolvedor MongoDB
Central de desenvolvedor do MongoDBchevron-right
Idiomaschevron-right
C#chevron-right

Adicionando o MongoDB Atlas Vector Search a um aplicativo .NET Blazor C#

Luce Carter10 min read • Published Feb 29, 2024 • Updated Feb 29, 2024
.NETC#
APLICATIVO COMPLETO
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Quando foi a última vez que você conseguiu se lembrar dos detalhes aproximados de algo, mas não conseguiu se lembrar do nome? Isso acontece com muitas pessoas, portanto, é muito importante poder pesquisar semanticamente em vez de usar pesquisas de texto exato.
É aqui que o MongoDB Atlas Vector Search se torna útil. Ele permite que você realize pesquisas semânticas em incorporações vetoriais em seus documentos armazenados no MongoDB Atlas. Como as incorporações são armazenadas dentro do Atlas, você pode criar as incorporações em qualquer tipo de dados, estruturados e não estruturados.
Neste tutorial, você aprenderá como adicionar pesquisa vetorial com o Atlas Vector Search, usando o driver C# do MongoDB, a um aplicativo .NET Blaszor. O aplicativo Blozor usa o banco de dados sample_mflix, disponível no conjunto de dados de amostra que qualquer um pode carregar em seu Atlas cluster. Você adicionará suporte para pesquisar semanticamente no campo de trama, para encontrar quaisquer filmes que possam se encaixar na trama inserida na caixa de pesquisa.

Pré-requisitos

Para acompanhar este tutorial, você precisará de algumas coisas antes de começar:
  1. .NET 8 SDK instalado em seu computador
  2. Um IDE ou editor de texto que pode dar suporte a C# e Blazor para a experiência de desenvolvimento mais perfeita, como Visual Studio, Visual Studio Code com a Extensão C# DevKit instalada ou JetBrains Rider
  3. Um cluster Atlas M0 , nosso nível gratuito para sempre, ideal para desenvolvimento
  4. Uma bifurcação e clone do repositório See Sharp Movies do GitHub ao qual adicionaremos a pesquisa
  5. Uma conta OpenAI e uma chave de APIgratuita gerada — você usará a API OpenAI para criar uma incorporação de vetor para nosso termo de pesquisa
Depois de bifurcar e clonar o repositório e usá-lo localmente, você precisará adicionar sua connection string a appsettings.Development.json e appsettings.json na seção de espaço reservado para se conectar ao seu cluster ao executar o projeto.
Se você não quiser acompanhar, o repositório tem uma ramificação chamada “vector-search” que tem o resultado final implementado. No entanto, você precisará garantir que tenha os dados incorporados no Atlas cluster.

Colocando nossos dados incorporados no Atlas

A primeira coisa que você precisa é de alguns dados armazenados em seu cluster que tenham incorporações de vetores disponíveis como um campo em seus documentos. O MongoDB já forneceu uma versão da coleção de filmes do sample_mflix, chamada incorporado_movies, que possui 1500 documentos, usando um subconjunto da coleção principal de filmes que foi carregado como um conjunto de dados para o Hugging Face que será usado neste tutorial.
É aqui que entra o Hugging Face Dataset Uploader baixado como parte dos pré-requisitos. Ao executar essa ferramenta usando dotnet run na raiz do projeto e passando sua connection string para o console quando solicitado, ele Go e fará o download do conjunto de dados de Abraçando a face e, em seguida, carregue-o em uma coleçãoembedded_movies dentro do banco de dadossample_mflix. Se você não tiver o mesmo conjunto de dados carregado, esse banco de dados estará ausente, ele apenas o criará para você graças ao C#!
Você pode gerar incorporações vetoriais para seus próprios dados usando ferramentas como Hugging Face, OpenAI, LlamaIndex e outras. Você pode ler mais sobre como gerar embeddings usando modelos de código aberto lendo um tutorial de Prakul Agarwal sobre IA generativa, pesquisa vetorial e modelos de código aberto aqui no Developer Center.

Criando o índice de pesquisa vetorial

Agora que você tem uma coleção de documentos de filmes com um campoplot_embeddingde embeddings vetoriais para cada documento, é hora de criar o índice Atlas Vector Search. Isso serve para habilitar os recursos de pesquisa vetorial no cluster e para permitir que o MongoDB saiba onde encontrar os embeddings vetoriais.
  1. Dentro do Atlas, clique em “Browse Collections” para abrir o explorador de dados e visualizar seu banco de dados sample_mflix recém-carregado.
  2. Selecione a aba “Atlas Search” na parte superior.
  3. Clique no botão verde “Create Search Index” para carregar o assistente de criação de índice.
  4. Selecione Editor JSON no título Vector Search e clique em "Next. "
  5. Selecione a collection embedded_movies em sample_mflix à esquerda.
  6. O nome não importa muito aqui, desde que você se lembre dele para mais tarde, mas, por enquanto, deixe-o como o valor padrão de 'vector_index'.
  7. Copie e cole o seguinte JSON, substituindo o conteúdo atual da caixa no assistente:
Ele contém alguns campos que você talvez não tenha visto antes.
  • caminho é o nome do campo que contém as incorporações. No caso do conjunto de dados da Hugging Face, isso é plot_embedding.
  • numDimensions refere-se às dimensões do modelo utilizado.
  • similaridade refere-se ao tipo de função usada para encontrar resultados semelhantes.
Confira a documentação do Atlas Vector Search para saber mais sobre esses campos de configuração.
Clique em "Next " e, na próxima página, clique em "Create Search Index. "
Após alguns minutos, o índice de pesquisa vetorial será configurado, você será notificado por e-mail e o aplicativo estará pronto para adicionar a pesquisa vetorial.

Adicionando a funcionalidade de backend

Você tem os dados com plot embeddings e um índice de pesquisa vetorial criado nesse campo, portanto, é hora de começar a trabalhar no aplicativo para adicionar a pesquisa, começando pela funcionalidade de backend.

Adicionando chave API OpenAI a appsettings

A chave de API OpenAI será usada para solicitar incorporações da API para o termo de pesquisa inserido, pois a pesquisa vetorial entende números e não texto. Por esse motivo, o aplicativo precisa que sua chave API OpenAI seja armazenada para uso posterior.
  1. Adicione o seguinte na raiz do seu appsettings.Development.json e appsettings.json, após a seção MongoDB, substituindo o texto do espaço reservado por sua própria chave:
  1. Dentro program.cs, após a criação do construtor var, adicione a seguinte linha de código para extrair o valor da configuração do aplicativo:
  1. Altere o código que cria a instância do MongoDBService para também passar o openAPIKey variable. Você alterará o construtor da classe posteriormente para fazer uso disso.

Adicionando um novo método ao IMongoDBService.cs

Você precisará adicionar um novo método à interface que suporte pesquisa, incluindo o termo a ser pesquisado e retornando uma lista de filmes encontrados na pesquisa.
Abra IMongoDBService.cs e adicione o seguinte código:

Implementando o método no MongoDBService.cs

Agora, faça as alterações na classe de implementação para dar suporte à pesquisa.
  1. Abra MongoDBService.cs e adicione as seguintes instruções using na parte superior do arquivo:
  1. Adicione as seguintes novas variáveis locais abaixo das existentes no topo da classe:
  1. Atualize o construtor para usar o novo parâmetro de string openAPIKey, bem como o parâmetro MongoDBSettings. Deve ficar assim:
  1. Dentro do construtor, adicione uma nova linha para atribuir o valor de openAPIKey a _openAPIKey.
  2. Também dentro do construtor, atualize o nome da collection de "movies " para "embedded_movies ", onde chama .GetCollection.
A seguir está a aparência do construtor concluído:

Atualizando o modelo de filme

O driver C# atua como um mapeador de documentos de objetos (ODM), tratando do mapeamento entre um objeto C# antigo e simples (POCO) que é usado em C# e os documentos em sua coleção.
No entanto, os campos do modelo de filme existentes precisam ser atualizados para corresponder aos documentos dentro da sua collection embedded_movies.
Substitua o conteúdo de Models/Movie.cs pelo seguinte código:
Ele contém propriedades para todos os campos no documento, bem como classes e propriedades que representam subdocumentos encontrados dentro do documento do filme, como “critic.”. Você também observará o uso do atributo BSONElement, que informa ao motorista como mapear entre os nomes dos campos e os nomes das propriedades devido às suas diferentes convenções de nomenclatura.

Adicionando um modelo EmbeddingResponse

Está quase na hora de começar a implementar a pesquisa no back-end. Ao chamar o endpoint de incorporação da API OpenAI, você receberá muitos dados, incluindo as incorporações. A maneira mais fácil de lidar com isso é criar uma classe EmbeddingResponse.cs que modela essa resposta para uso posterior.
Adicione uma nova classe chamada EmbeddingResponse dentro da pasta Modelo e substitua o conteúdo do arquivo pelo seguinte:

Adicionar um método para solicitar incorporações para o termo de pesquisa

É hora de usar a chave da API do OpenAI e escrever a funcionalidade para criar embeddings de vetor para o termo pesquisado, chamando o endpointEmbeddings da API do OpenAI.
Dentro de MongoDBService.cs, adicione o seguinte código:
O dicionário corporal é necessário pela API para saber o modelo usado e qual é a entrada. O modelo text-embedding-ada-002 é o modelo padrão de incorporação de texto.

Implementando a função SearchMovie

O método GetEmbeddingsFromText retornou as incorporações para o termo de pesquisa, então agora ele está disponível para ser utilizado pelo Atlas Vector Search e pelo driver C#.
Cole o código a seguir para implementar a pesquisa:
Se você escolheu um nome diferente ao criar o índice de pesquisa vetorial anteriormente, certifique-se de atualizar esta linha dentro de vectorOptions.
A pesquisa de vetores está disponível dentro do driver C# como parte do pipeline de agregação. Ele recebe quatro argumentos: o nome do campo com as incorporações, as incorporações de vetor do termo pesquisado, o número de resultados a serem retornados e as opções de vetor.
Em seguida, métodos adicionais são encadeados para especificar quais campos devem ser retornados dos documentos resultantes.
Como o documento do filme mudou ligeiramente, o código atual dentro do métodoGetMovieById não está mais correto.
Substitua a linha atual que chama .Find pelo seguinte:
O back-end agora está completo e é hora de passar para o front-end, adicionando a capacidade de pesquisar na interface do usuário e enviando essa pesquisa de volta ao código que acabamos de escrever.

Adicionando a funcionalidade de frontend

A funcionalidade de front-end será dividida em duas partes: o código no front-end para falar com o back-end e a barra de pesquisa em HTML para digitar.
Como este é um aplicativo existente, já há código disponível para extrair os filmes e até mesmo a paginação. É aqui que você adicionará a funcionalidade de pesquisa e ela pode ser encontrada dentro Home.razor na pastaComponents/Pages .
  1. Dentro do bloco@code, adicione uma nova variável de string para searchTerm:
  1. Cole o novo método a seguir no bloco de código:
Isso é bastante simples. Se a string search Term estiver vazia, mostre tudo. Caso contrário, pesquise sobre isso.
Adicionar a barra de pesquisa é muito simples. Ele será adicionado ao componente de cabeçalho já presente na página inicial.
Substitua a marcação de cabeçalho existente pelo seguinte HTML:
Isso cria uma entrada de pesquisa com o valor vinculado à string searchterm e a um botão que, quando clicado, chama o método SearchMovies que você acabou de chamar.

Tornando a barra de pesquisa mais bonita

Neste ponto, a funcionalidade está implementada. Mas se você o executasse agora, a barra de pesquisa estaria em um lugar estranho no cabeçalho, então vamos consertar isso, apenas por beleza.
Dentro de wwwroot/app.css, adicione o seguinte código:
Isso apenas dá à barra de pesquisa e ao botão um pouco de preenchimento para posiciona-lo mais bem dentro do cabeçalho. Embora não seja perfeita, CSS definitivamente não é o meu ponto forte. C# é a minha linguagem favorita!
Eba! Implementamos a funcionalidade de backend e frontend, então agora é hora de executar o aplicativo e vê-lo em ação!
Execute o aplicativo, insira um termo de pesquisa na caixa, clique no botão “Search” e veja quais filmes têm gráficos semanticamente próximos ao seu termo de pesquisa.
Mostrando resultados de filmes com enredo semelhante a Três jovens e uma espada

Resumo

Incrível! Agora você tem um aplicativo Blazor funcional com a capacidade de pesquisar o enredo por significado em vez de texto exato. Esse também é um ótimo ponto de partida para implementar mais recursos de pesquisa vetorial em seu aplicativo.
Se você quiser saber mais sobre o Atlas Vector Search, leia nossa documentação. O MongoDB também tem um espaço no Abraçando o Face onde você pode ver mais alguns exemplos do que pode ser feito e até mesmo jogar com ele. Go!
Há também um artigo surpreendente sobre o uso do Vector Search para áudio, co-escrito por Cloud Developer Advocate no MongoDB Pavel Duchovny.
Se tiver dúvidas ou feedback, acesse os fóruns da comunidade.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.
Iniciar a conversa

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Salvando dados no Unity3D usando o Realm


Aug 13, 2024 | 10 min read
exemplo de código

Como usar a criptografia no nível do campo do lado do cliente (CSFLE) do MongoDB com C#


Sep 23, 2022 | 18 min read
Tutorial

Introdução ao Realm SDK para Unity


Feb 03, 2023 | 8 min read
Artigo

Realm .NET para Xamarin (melhores práticas e roteiro) no Meetup


Mar 21, 2023 | 38 min read
Sumário