Como usar os módulos de incorporações e reclassificação do Cohere com o MongoDB Atlas
Avalie esse Tutorial
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.
- 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.
- 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.
- Use os Cohere Embed Jobs para gerar incorporações vetoriais pela primeira vez em grandes conjuntos de dados de forma assíncrona e programada.
- Adicione incorporações vetoriais ao MongoDB Atlas, que pode armazenar e indexar essas incorporações vetoriais junto com seus outros operacionais/metadados.
- Por fim, prepare os índices para incorporação vetorial e pesquisa de texto completo em nosso conjunto de dados privado.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
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).
pandas
: Ajuda no pré-processamento e manuseio de dadoscohere
: Para o modelo de incorporação e o módulo de rerankpymongo
: Para o armazenamento de vetores do MongoDB Atlas e a pesquisa de texto completos3fs
: Para carregar arquivos diretamente do bucket s3
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
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:
- 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.
1 import os 2 import getpass 3 # cohere api key 4 try: 5 cohere_api_key = os.environ["COHERE_API_KEY"] 6 except KeyError: 7 cohere_api_key = getpass.getpass("Please enter your COHERE API KEY (hit enter): ") 8 9 # MongoDB connection string 10 try: 11 MONGO_CONN_STR = os.environ["MONGODB_CONNECTION_STR"] 12 except KeyError: 13 MONGO_CONN = getpass.getpass("Please enter your MongoDB Atlas Connection String (hit enter): ")
Execute as seguintes linhas de código no Jupyter Notebook para ler dados de um bucket S3 da AWS diretamente para um dataframe pandas.
1 import pandas as pd 2 import s3fs 3 df = pd.read_json("s3://ashwin-partner-bucket/cohere/movies_sample_dataset.jsonl", orient="records", lines=True) 4 df.to_json("./movies_sample_dataset.jsonl", orient="records", lines=True) 5 df[:3]
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.
1 import cohere 2 co_client = cohere.Client(cohere_api_key, client_name='mongodb') 3 # create a dataset in Cohere Platform 4 dataset = 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() 8 dataset.wait() 9 dataset 10 11 dataset.wait() 12 # Schedule an Embedding job to run on the entire movies dataset 13 embed_job = co_client.create_embed_job(dataset_id=dataset.id, 14 input_type='search_document', 15 model='embed-english-v3.0', 16 truncate='END') 17 embed_job.wait() 18 output_dataset = co_client.get_dataset(embed_job.output.id) 19 results = list(map(lambda x:{"text":x["text"], "embedding": x["embeddings"]["float"]},output_dataset)) 20 len(results)
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.
1 from pymongo import MongoClient 2 mongo_client = MongoClient(MONGO_CONN_STR) 3 # Upload documents along with vector embeddings to MongoDB Atlas Collection 4 output_collection = mongo_client["sample_mflix"]["cohere_embed_movies"] 5 if output_collection.count_documents({})>0: 6 output_collection.delete_many({}) 7 e = output_collection.insert_many(results)
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.
1 output_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 )
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.
1 def 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
Execute as linhas de código abaixo na célula do Jupyter Notebook e você poderá ver os seguintes resultados.
1 query_vector_search("romantic comedy movies", topK=5)
1 query_vector_search("romantic comedy movies", prefilter={"year":{"$lt": 1990}}, topK=5)
1 query_vector_search("romantic comedy movies", prefilter={"year":{"$lt": 1990}}, postfilter={"score": {"$gt":0.76}},topK=5)
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 2 def 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 13 docs = query_fulltext_search("romantic comedy movies", topK=10) 14 docs
1 # After passing the search results through the Cohere rerank module 2 q = "romantic comedy movies" 3 docs = query_fulltext_search(q) 4 results = 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. 5 for 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:
1 Document Rank: 1, Document Index: 22 2 Document Title: Love Finds Andy Hardy 3 Document: 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. 4 Relevance Score: 0.99 5 6 7 Document Rank: 2, Document Index: 12 8 Document Title: Seventh Heaven 9 Document: Seventh Heaven or De zevende zemel is a 1993 Dutch romantic comedy film directed by Jean-Paul Lilienfeld. 10 Relevance Score: 0.99 11 12 13 Document Rank: 3, Document Index: 19 14 Document Title: Shared Rooms 15 Document: A new romantic comedy feature film that brings together three interrelated tales of gay men seeking family, love and sex during the holiday season. 16 Relevance Score: 0.97 17 18 19 Document Rank: 4, Document Index: 3 20 Document Title: Too Many Husbands 21 Document: Romantic comedy adapted from a Somerset Maugham play. 22 Relevance Score: 0.97 23 24 25 Document Rank: 5, Document Index: 20 26 Document Title: Walking the Streets of Moscow 27 Document: "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. 28 Relevance Score: 0.96
Neste tutorial, conseguimos demonstrar o seguinte:
- 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.
- 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.
- As implementações foram realizadas com o mínimo de linhas de código e demonstrando facilidade de uso.
- 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.
- 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.
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.