Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Learn why MongoDB was selected as a leader in the 2024 Gartner® Magic Quadrant™
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
Atlaschevron-right

Como usar os módulos de incorporações e reclassificação do Cohere com o MongoDB Atlas

Ashwin Gangadhar9 min read • Published Aug 14, 2024 • Updated Aug 14, 2024
PythonAtlas
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
A tarefa difícil que os desenvolvedores enfrentam atualmente ao desenvolver soluções alimentadas pela estrutura de geração aumentada de recuperação (RAG) é a escolha do mecanismo de recuperação. Aumentar o prompt do modelo de linguagem grande (LLM) com informações relevantes e exaustivas cria melhores respostas desses sistemas. Um deles tem a tarefa de escolher o modelo de incorporação mais apropriado no caso de Atlas Search de similaridade semântica. Como alternativa, no caso da implementação do Atlas Search de texto completo, você precisa ser minucioso com a implementação para obter uma recuperação precisa e alta precisão nos resultados. Às vezes, as soluções exigem uma implementação combinada que se beneficia de ambos os mecanismos de recuperação.
Se o seu fluxo de trabalho atual de pontuação de pesquisa de texto completo está deixando a desejar ou se você está gastando muito tempo escrevendo várias linhas de código para fazer com que a funcionalidade de pesquisa semântica funcione em seus aplicativos, o Cohere e o MongoDB podem ajudar. Para evitar que esses problemas o impeçam de aproveitar a poderosa funcionalidade de pesquisa de AI ou o aprendizado de máquina em seu aplicativo, a Cohere e o MongoDB oferecem soluções fáceis de usar e totalmente gerenciadas.
A Cohere é uma empresa de AI especializada em grandes modelos de linguagem.
  1. Com uma ferramenta poderosa para incorporar linguagem natural em seus projetos, ela pode ajudá-lo a representar um conteúdo mais preciso, relevante e envolvente como incorporações. O modelo de linguagem Cohere também oferece uma API simples e intuitiva que permite integrá-lo facilmente aos seus fluxos de trabalho e plataformas existentes.
  2. O móduloCohere Rerank é um componente do sistema de processamento de linguagem natural Cohere que ajuda a selecionar a melhor saída de um conjunto de candidatos. O módulo usa uma rede causal para pontuar cada candidato com base em sua relevância, similaridade semântica, tema e estilo. O módulo então classifica os candidatos de acordo com suas pontuações e retorna o top N como o resultado final.
O MongoDB Atlas é um serviço de plataforma de dados para desenvolvedores totalmente gerenciado que fornece armazenamento de dados e acesso escaláveis, seguros e confiáveis para seus aplicativos. Um dos principais recursos do MongoDB Atlas é a capacidade de realizar pesquisa vetorial e pesquisa de texto completo em seus dados, o que pode aprimorar os recursos de seus aplicativos baseados em AI/ML. O MongoDB Atlas pode ajudá-lo a criar aplicativos avançados e flexíveis baseados em AI/ML que podem aproveitar dados estruturados e não estruturados. Você pode criar e gerenciar facilmente índices de pesquisa, realizar consultas e analisar resultados usando a interface intuitiva, as APIs e os drivers do MongoDB Atlas. O MongoDB Atlas Vector Search fornece um recurso exclusivo — pré-filtragem e pós-filtragem em consultas de pesquisa vetorial — que ajuda os usuários a controlar o comportamento de seus resultados de pesquisa vetorial, melhorando assim a precisão e o desempenho de recuperação e economizando dinheiro ao mesmo tempo.
Portanto, com o Cohere e o MongoDB Atlas, podemos demonstrar técnicas nas quais podemos facilmente potencializar um recurso de pesquisa semântica em seu conjunto de dados privado com poucas linhas de código. Além disso, você pode aprimorar a classificação existente de seus sistemas de recuperação de pesquisa de texto completo usando o módulo Cohere Rerank. Ambas as técnicas são altamente benéficas para a criação de aplicativos GenAI mais complexos, como resumo ou aumento de dados movido a RAG ou LLM.

O que faremos neste tutorial?

Armazenar incorporações e preparar o índice

  1. Use os Cohere Embed Jobs para gerar incorporações vetoriais pela primeira vez em grandes conjuntos de dados de forma assíncrona e programada.
  2. Adicione incorporações vetoriais ao MongoDB Atlas, que pode armazenar e indexar essas incorporações vetoriais junto com seus outros operacionais/metadados.
  3. Por fim, prepare os índices para incorporação vetorial e pesquisa de texto completo em nosso conjunto de dados privado.

Pesquisar com incorporações de vetor

  1. Escreva uma função Python simples para aceitar termos/frases de pesquisa e passe-a novamente pela API de incorporação Cohere para obter um vetor de consulta.
  2. Pegue essas incorporações de vetores de consulta resultantes e execute uma consulta vetorial do Atlas Search usando o operador$vectorsearch no MongoDB Aggregation Pipeline.
  3. Pré-filtre documentos usando meta-informações para restringir a pesquisa em seu conjunto de dados, acelerando assim o desempenho dos resultados da pesquisa vetorial e mantendo a precisão.
  4. Os documentos semanticamente semelhantes recuperados podem ser pós-filtrados (pontuação de relevância) para demonstrar um maior grau de controle sobre o comportamento da pesquisa semântica.

Pesquise com texto e reclassifique com Cohere

  1. Escreva uma função Python simples para aceitar termos/frases de pesquisa e prepare uma query usando o operador $search e o MongoDB Aggregation Pipeline.
  2. Pegue esses documentos resultantes e realize uma operação de reclassificação dos documentos recuperados para obter maior precisão com resultados de pesquisa de texto completo usando o módulo de reclassificação Cohere.
Diagrama de fluxo de Cohere e MongoDB
Este será um tutorial prático que apresentará como você pode configurar o MongoDB com sample_movies conjunto de dados (o link para o arquivo está nos trechos de código). Você aprenderá a usar a API de trabalhos de inserção do Cohere para agendar um trabalho para processar todos os documentos como um trabalho em lotes e atualizar o conjunto de dados para adicionar um novo campo com o nome de incorporação que é armazenado junto com os outros metadados/dados operacionais. Usaremos esse campo para criar um índice de pesquisa vetorial programaticamente usando os drivers Python do MongoDB. Depois de criar esse índice, podemos demonstrar como consultar usando a incorporação de vetores, bem como realizar a pesquisa de texto completo usando o pipeline de agregação do MongoDB expressivo e combinável (API de consulta).

Etapas para inicializar e executar o tutorial

Dependências do Python

  • pandas: Ajuda no pré-processamento e manuseio de dados
  • cohere: Para o modelo de incorporação e o módulo de rerank
  • pymongo: Para o armazenamento de vetores do MongoDB Atlas e a pesquisa de texto completo
  • s3fs : Para carregar arquivos diretamente do bucket s3

Instalar todas as dependências

A seguinte linha de código deve ser executada no Jupyter Notebook para instalar os pacotes necessários.
1!pip install cohere==4.57 pymongo pandas s3fs

Inicializar a chave API Cohere e a connection string do MongoDB

Se você não criou uma chave de API na plataforma Cohere, pode se inscrever em uma conta Cohere e criar uma chave de API, que pode ser gerada a partir de uma das seguintes interfaces:
  • Painel coerente
  • Ferramenta Cohere CLI
Além disso, se você não tiver criado uma instância do MongoDB Atlas para si mesmo, poderá seguir o tutorial para criar uma. Isso fornecerá seu MONGODB_CONNECTION_STR.
Execute as seguintes linhas de código no Jupyter Notebook para inicializar o segredo Cohere ou a API chave e a MongoDB Atlas conexão string.
1import os
2import getpass
3# cohere api key
4try:
5 cohere_api_key = os.environ["COHERE_API_KEY"]
6except KeyError:
7 cohere_api_key = getpass.getpass("Please enter your COHERE API KEY (hit enter): ")
8
9# MongoDB connection string
10try:
11 MONGO_CONN_STR = os.environ["MONGODB_CONNECTION_STR"]
12except KeyError:
13 MONGO_CONN = getpass.getpass("Please enter your MongoDB Atlas Connection String (hit enter): ")

Carregar conjunto de dados do bucket S3

Execute as seguintes linhas de código no Jupyter Notebook para ler dados de um bucket S3 da AWS diretamente para um dataframe pandas.
1import pandas as pd
2import s3fs
3df = pd.read_json("s3://ashwin-partner-bucket/cohere/movies_sample_dataset.jsonl", orient="records", lines=True)
4df.to_json("./movies_sample_dataset.jsonl", orient="records", lines=True)
5df[:3]
Conjunto de dados AWS S3 carregado

Inicialize e agende o trabalho de incorporações Cohere para incorporar o conjunto de dados "sample_movies"

Aqui, criaremos um conjunto de dados de filmes no Cohere carregando nosso conjunto de dados de filmes de amostra que buscamos no bucket do S3 e armazenamos localmente. Depois de criar um conjunto de dados, podemos usar a API de trabalhos de incorporação Cohere para agendar um trabalho em lote para incorporar todo o conjunto de dados.
Você pode executar as seguintes linhas de código em seu Jupyter Notebook para carregar seu conjunto de dados no Cohere e agendar um trabalho de inserção.
1import cohere
2co_client = cohere.Client(cohere_api_key, client_name='mongodb')
3# create a dataset in Cohere Platform
4dataset = co_client.create_dataset(name='movies',
5 data=open("./movies_sample_dataset.jsonl",'r'),
6 keep_fields=["overview","title","year"],
7 dataset_type="embed-input").wait()
8dataset.wait()
9dataset
10
11dataset.wait()
12# Schedule an Embedding job to run on the entire movies dataset
13embed_job = co_client.create_embed_job(dataset_id=dataset.id,
14 input_type='search_document',
15 model='embed-english-v3.0',
16 truncate='END')
17embed_job.wait()
18output_dataset = co_client.get_dataset(embed_job.output.id)
19results = list(map(lambda x:{"text":x["text"], "embedding": x["embeddings"]["float"]},output_dataset))
20len(results)

Como inicializar o MongoDB Atlas e inserir dados em uma collection MongoDB

Agora que criamos as incorporações vetoriais para nosso conjunto de dados de filmes de exemplo, podemos inicializar o cliente MongoDB e inserir os documentos em nossa collection de escolha executando as seguintes linhas de código no Jupyter Notebook.
1from pymongo import MongoClient
2mongo_client = MongoClient(MONGO_CONN_STR)
3# Upload documents along with vector embeddings to MongoDB Atlas Collection
4output_collection = mongo_client["sample_mflix"]["cohere_embed_movies"]
5if output_collection.count_documents({})>0:
6 output_collection.delete_many({})
7e = output_collection.insert_many(results)

Criar programaticamente um índice de pesquisa vetorial e um índice de pesquisa de texto completo

Com a atualização mais recente do pacotePymongo Python, agora você pode criar seu índice de pesquisa vetorial, bem como índices de pesquisa de texto completo a partir do próprio cliente Python. Você também pode criar índices vetoriais usando a UI do MongoDB Atlas ou mongosh.
Execute as seguintes linhas de código em seu Notebook Jupyter para criar índices de pesquisa e pesquisa vetorial em sua nova collection.
1output_collection.create_search_index({"definition":
2 {"mappings":
3 {"dynamic": true,
4 "fields": {
5 "embedding" : {
6 "dimensions": 1024,
7 "similarity": "cosine",
8 "type": "vector"
9 },
10 "fullplot":
11 }}},
12 "name": "default"
13 }
14)

Consulte o índice vetorial do MongoDB usando $vectorSearch

MongoDB Atlas traz a flexibilidade de usar a pesquisa vetorial junto com os filtros de pesquisa de texto completo. Além disso, você pode aplicar filtros de intervalo, string e numéricos usando o pipeline de agregação. Isso permite que o usuário final controle o comportamento da resposta de pesquisa semântica do mecanismo de pesquisa. As linhas de código abaixo demonstrarão como você pode realizar a pesquisa vetorial junto com a pré-filtragem no campo ano para obter filmes antes de 1990. Além disso, você tem melhor controle sobre a relevância dos resultados retornados, para que possa executar a pós-filtragem na resposta usando a API do MongoDB. Nesta demonstração, estamos filtrando o campode pontuação gerado como resultado da realização da similaridade vetorial entre a consulta e os respectivos documentos, usando uma heurística para reter apenas os resultados precisos.
Execute as linhas de código abaixo no Jupyter Notebook para inicializar uma função que pode ajudá-lo a obter pesquisa vetorial + pré-filtro + pós-filtro.
1def query_vector_search(q, prefilter = {}, postfilter = {},path="embedding",topK=2):
2 ele = co_client.embed(model="embed-english-v3.0",input_type="search_query",texts=[q])
3 query_embedding = ele.embeddings[0]
4 vs_query = {
5 "index": "default",
6 "path": path,
7 "queryVector": query_embedding,
8 "numCandidates": 10,
9 "limit": topK,
10 }
11 if len(prefilter)>0:
12 vs_query["filter"] = prefilter
13 new_search_query = {"$vectorSearch": vs_query}
14 project = {"$project": {"score": {"$meta": "vectorSearchScore"},"_id": 0,"title": 1, "release_date": 1, "overview": 1,"year": 1}}
15 if len(postfilter.keys())>0:
16 postFilter = {"$match":postfilter}
17 res = list(output_collection.aggregate([new_search_query, project, postFilter]))
18 else:
19 res = list(output_collection.aggregate([new_search_query, project]))
20 return res

Exemplo de query de pesquisa vetorial

Execute as linhas de código abaixo na célula do Jupyter Notebook e você poderá ver os seguintes resultados.
1query_vector_search("romantic comedy movies", topK=5)
Resultados de exemplos de query do Vector Atlas Search

Exemplo de query de pesquisa vetorial com pré-filtro

1query_vector_search("romantic comedy movies", prefilter={"year":{"$lt": 1990}}, topK=5)
Vector Search com resultados de exemplo de pré-filtro

Exemplo de query de pesquisa vetorial com pré-filtro e pós-filtro para controlar a relevância e o comportamento da pesquisa semântica

1query_vector_search("romantic comedy movies", prefilter={"year":{"$lt": 1990}}, postfilter={"score": {"$gt":0.76}},topK=5)
Vector Search com resultados de exemplo de pré-filtro e pós-filtro

Aproveite a pesquisa de texto completo do MongoDB Atlas com o módulo Cohere Rerank

Cohere Rerank é um módulo do conjunto de produtos Cohere que melhora a qualidade dos resultados da pesquisa por meio da pesquisa semântica. Isso ajuda a elevar o desempenho do mecanismo de pesquisa tradicional, que depende somente de palavras-chave. O Rerank vai um passo além, classificando os resultados recuperados do mecanismo de pesquisa com base em sua relevância semântica para a query de entrada. Essa passagem de reclassificação dos resultados da pesquisa ajuda a obter resultados de pesquisa mais apropriados e contextualmente semelhantes.
Para demonstrar como o módulo Rerank pode ser aproveitado com a pesquisa de texto completo do MongoDB Atlas, podemos acompanhar executando a seguinte linha de código em seu Notebook Jupyter.
1# sample search query using $search operator in aggregation pipeline
2def query_fulltext_search(q,topK=25):
3 v = {"$search": {
4 "text": {
5 "query": q,
6 "path":"overview"
7 }
8 }}
9 project = {"$project": {"score": {"$meta": "searchScore"},"_id": 0,"title": 1, "release-date": 1, "overview": 1}}
10 docs = list(output_collection.aggregate([v,project, {"$limit":topK}]))
11 return docs
12# results before re ranking
13docs = query_fulltext_search("romantic comedy movies", topK=10)
14docs
Resultados da amostra do modelo de reclassificação Coere
1# After passing the search results through the Cohere rerank module
2q = "romantic comedy movies"
3docs = query_fulltext_search(q)
4results = co_client.rerank(query=q, documents=list(map(lambda x:x["overview"], docs)), top_n=5, model='rerank-english-v2.0') # Change top_n to change the number of results returned. If top_n is not passed, all results will be returned.
5for idx, r in enumerate(results):
6 print(f"Document Rank: {idx + 1}, Document Index: {r.index}")
7 print(f"Document Title: {docs[r.index]['title']}")
8 print(f"Document: {r.document['text']}")
9 print(f"Relevance Score: {r.relevance_score:.2f}")
10 print("\n")
Saída após a reclassificação dos resultados de texto completo do Atlas Search:
1Document Rank: 1, Document Index: 22
2Document Title: Love Finds Andy Hardy
3Document: A 1938 romantic comedy film which tells the story of a teenage boy who becomes entangled with three different girls all at the same time.
4Relevance Score: 0.99
5
6
7Document Rank: 2, Document Index: 12
8Document Title: Seventh Heaven
9Document: Seventh Heaven or De zevende zemel is a 1993 Dutch romantic comedy film directed by Jean-Paul Lilienfeld.
10Relevance Score: 0.99
11
12
13Document Rank: 3, Document Index: 19
14Document Title: Shared Rooms
15Document: A new romantic comedy feature film that brings together three interrelated tales of gay men seeking family, love and sex during the holiday season.
16Relevance Score: 0.97
17
18
19Document Rank: 4, Document Index: 3
20Document Title: Too Many Husbands
21Document: Romantic comedy adapted from a Somerset Maugham play.
22Relevance Score: 0.97
23
24
25Document Rank: 5, Document Index: 20
26Document Title: Walking the Streets of Moscow
27Document: "I Am Walking Along Moscow" aka "Ya Shagayu Po Moskve" (1963) is a charming lyrical comedy directed by Georgi Daneliya in 1963 that was nominated for Golden Palm at Cannes Film Festival. Daneliya proved that it is possible to create a masterpiece in the most difficult genre of romantic comedy. Made by the team of young and incredibly talented artists that besides Daneliya included writer/poet Gennady Shpalikov, composer Andrei Petrov, and cinematographer Vadim Yusov (who had made four films with Andrei Tarkovski), and the dream cast of the talented actors even in the smaller cameos, "I Am Walking Along Moscow" keeps walking victoriously through the decades remaining deservingly one of the best and most beloved Russian comedies and simply one of the best Russian movies ever made. Funny and gentle, dreamy and humorous, romantic and realistic, the film is blessed with the eternal youth and will always take to the walk on the streets of Moscow new generations of the grateful viewers.
28Relevance Score: 0.96

Resumo

Neste tutorial, conseguimos demonstrar o seguinte:
  1. Usando a incorporação Cohere junto com o MongoDB Vector Search, foi possível mostrar como é fácil obter a funcionalidade de pesquisa semântica junto com suas funções de dados operacionais.
  2. Com o Cohere Rerank, conseguimos pesquisar resultados usando recursos de pesquisa de texto completo no MongoDB e, em seguida, classificá-los por relevância semântica, fornecendo assim resultados mais ricos e relevantes sem substituir sua configuração de arquitetura de pesquisa existente.
  3. As implementações foram realizadas com o mínimo de linhas de código e demonstrando facilidade de uso.
  4. O uso de incorporações e reclassificação do Cohere não precisa de uma equipe de especialistas em ML para ser desenvolvido e mantido. Assim, os custos mensais de manutenção foram reduzidos ao mínimo.
  5. Ambas as soluções são independentes da nuvem e, portanto, podem ser configuradas em qualquer plataforma de nuvem.
O mesmo pode ser encontrado em um caderno que ajudará a reduzir o tempo e o esforço seguindo as etapas deste blog.

O que vem a seguir?

Para saber mais sobre como o MongoDB Atlas está ajudar a criar uma integração de ML do lado do aplicativo em aplicativos do mundo real, você pode acessar a página MongoDB para AI.
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
Exemplo de código

myLeG


Jul 07, 2022 | 1 min read
Tutorial

É seguro sair? Investigação de dados com o MongoDB


Sep 23, 2022 | 11 min read
Tutorial

Seleção de sub-rede CIDR para MongoDB Atlas


Sep 23, 2022 | 2 min read
Tutorial

Aplicativo agente Sentiment Chef com Google Cloud e MongoDB Atlas


Jun 24, 2024 | 16 min read
Sumário