Aplicar linguagem natural em consultas do MongoDB com o Google Gemini
Venkatesh Shanbhag, Yemi Falokun8 min read • Published Dec 13, 2024 • Updated Dec 13, 2024
Avalie esse Artigo
Na era digital, aproveitar a linguagem natural para queries de banco de dados representa um salto em direção a um gerenciamento de dados mais intuitivo. As extensões de IA do Vertex , atualmente em visualização pública, ajudam na interação com o MongoDB usando linguagem natural. Este tutorial apresenta uma abordagem que combina o processamento avançado de linguagem natural do GoogleGemini com o MongoDB, facilitado pelas extensões de IA da Vertex.
Essas extensões abordam as principais limitações dos modelos de linguagem grandes (LLMs), permitindo a consulta e modificação de dados em tempo real, o que os LLMs não podem fazer devido à sua base de conhecimento estática após o treinamento. Ao integrar o MongoDB Atlas com o Vertex AI Extensions, oferecemos uma solução que reduz a impactação e garante que as respostas sejam baseadas nas informações da empresa armazenadas no Atlas DB.
O esquema dinâmico, a escalabilidade e os recursos abrangentes de query do MongoDB o tornam um exemplo para aplicativos de IA generativa. Ele é hábil em lidar com a natureza versátil e imprevisível dos dados que esses aplicativos geram e usam. Da geração de conteúdo personalizada, em que os dados do usuário moldam o conteúdo em tempo real, aos sistemas de recomendações sofisticados e orientados por IA, aproveitando dados atualizados ao minuto para sugestões personalizadas, o MongoDB se destaca. Além disso, ele se destaca na análise complexa de dados, permitindo que as ferramentas de AI interajam com conjuntos de dados vastos e variados para extrair insights significativos, mostrando seu papel fundamental no aprimoramento da eficiência e eficácia dos aplicativos de AI generativa.
A consulta de linguagem natural representa uma mudança de paradigma na interação de dados, permitindo que os usuários recuperem informações sem a necessidade de linguagens de consulta personalizadas. Ao integrar o MongoDB com um sistema capaz de entender e processar linguagem natural, simplificamos as operações de banco de dados, tornando-as mais acessíveis a usuários não técnicos.
A solução envolve uma sinergia de vários componentes, incluindo MongoDB, Google Vertex AI SDK, Google Secrets Manager e OpenAPI 3 especificações. Juntos, esses elementos criam uma estrutura robusta que traduz consultas de linguagem natural em chamadas do MongoDB Atlas Data API. Nesta solução, exploramos as operações básicas de CRUD com extensões de Vertex AI. Estamos trabalhando em estreita colaboração com o Google para permitir agregações de pesquisa vetorial em um futuro próximo.
- MongoDB: Um banco de dados versátil e orientado a documentos que armazena dados em formatos semelhantes ao JSON, tornando-o altamente adaptável a vários tipos de dados e estruturas
- SDK de IA do Google Vertex: facilita a criação e o gerenciamento de modelos de IA e aprendizado de máquina, incluindo a extensão personalizada para a IA do Google Vertex
- Extensões de IA da Vertex: aprimore os LLMs permitindo que eles interajam com sistemas externos em tempo real, ampliando suas capacidades além do conhecimento estático
- Google Secrets Manager: Armazena com segurança informações confidenciais, como chaves de API do MongoDB , garantindo a segurança e a integridade da solução
- Especificação OpenAPI para Data API 3 do MongoDB : define uma interface padrão e independente de linguagem para o MongoDB que permite integração fácil e documentação clara dos recursos da API
A solução opera convertendo queries de linguagem natural em parâmetros que a API do MongoDB pode entender. Essa conversão é facilitada por uma extensão personalizada desenvolvida usando o SDK de extensão do Google Vertex AI, que é então integrada ao Gêmeos 1.5 Pro. A extensão aproveita as especificações OpenAPI 3 para interagir com o MongoDB, recuperando dados com base na entrada de linguagem natural do usuário. O Google Secrets Manager desempenhou um papel fundamental no gerenciamento seguro das chaves de API necessárias para o acesso ao MongoDB , garantindo a segurança da solução.

Antes de começar, certifique-se de ter o seguinte:
- Se você é novo no MongoDB Atlas, pode se inscrever no MongoDB por meio do GCP Marketplace ou com a Atlas página de registro do .
- As extensões Vertex AI não estão disponíveis publicamente. Inscreva-se no Programa Extensions Trusted Tester.
Antes de começarmos, certifique-se também de:
Crie uma função de execução do Google Cloud Platform para chamar o MongoDB Atlas usando drivers Python. Para criar uma função Abra a função Executar da Google Cloud Platform e clique em criar função.
- Forneça um nome de função e selecione uma região .
- Permitir acesso não autenticado, deixe as outras opções como padrão e clique em Avançar .
- Selecione Python como tempo de execução (selecione a versão mais recente disponível).
- Copie o código abaixo e cole em principal.py.
1 import functions_framework 2 import os 3 import json 4 from pymongo import MongoClient 5 from bson import ObjectId 6 import traceback 7 from datetime import datetime 8 9 10 def connect_to_mongodb(): 11 client = MongoClient("<MongoDB Connection String>") 12 return client 13 14 15 def success_response(body): 16 return { 17 'statusCode': '200', 18 'body': json.dumps(body, cls=DateTimeEncoder), 19 'headers': { 20 'Content-Type': 'application/json', 21 }, 22 } 23 24 25 def error_response(err): 26 error_message = str(err) 27 return { 28 'statusCode': '400', 29 'body': error_message, 30 'headers': { 31 'Content-Type': 'application/json', 32 }, 33 } 34 35 36 # Used to convert datetime object(s) to string 37 class DateTimeEncoder(json.JSONEncoder): 38 def default(self, o): 39 if isinstance(o, datetime): 40 return o.isoformat() 41 return super().default(o) 42 43 44 45 def mongodb_crud(request): 46 client = connect_to_mongodb() 47 payload = request.get_json(silent=True) 48 db, coll = payload['database'], payload['collection'] 49 request_args = request.args 50 op = request.path 51 try: 52 if op == "/findOne": 53 filter_op = payload['filter'] if 'filter' in payload else {} 54 projection = payload['projection'] if 'projection' in payload else {} 55 result = {"document": client[db][coll].find_one(filter_op, projection)} 56 if result['document'] is not None: 57 if isinstance(result['document']['_id'], ObjectId): 58 result['document']['_id'] = str(result['document']['_id']) 59 60 elif op == "/find": 61 agg_query = [] 62 63 if 'filter' in payload and payload['filter'] != {}: 64 agg_query.append({"$match": payload['filter']}) 65 66 if "sort" in payload and payload['sort'] != {}: 67 agg_query.append({"$sort": payload['sort']}) 68 69 if "skip" in payload: 70 agg_query.append({"$skip": payload['skip']}) 71 72 if 'limit' in payload: 73 agg_query.append({"$limit": payload['limit']}) 74 75 if "projection" in payload and payload['projection'] != {}: 76 agg_query.append({"$project": payload['projection']}) 77 78 result = {"documents": list(client[db][coll].aggregate(agg_query))} 79 for obj in result['documents']: 80 if isinstance(obj['_id'], ObjectId): 81 obj['_id'] = str(obj['_id']) 82 83 elif op == "/insertOne": 84 if "document" not in payload or payload['document'] == {}: 85 return error_response("Send a document to insert") 86 insert_op = client[db][coll].insert_one(payload['document']) 87 result = {"insertedId": str(insert_op.inserted_id)} 88 89 elif op == "/insertMany": 90 if "documents" not in payload or payload['documents'] == {}: 91 return error_response("Send a document to insert") 92 insert_op = client[db][coll].insert_many(payload['documents']) 93 result = {"insertedIds": [str(_id) for _id in insert_op.inserted_ids]} 94 95 elif op in ["/updateOne", "/updateMany"]: 96 payload['upsert'] = payload['upsert'] if 'upsert' in payload else False 97 if "_id" in payload['filter']: 98 payload['filter']['_id'] = ObjectId(payload['filter']['_id']) 99 if op == "/updateOne": 100 update_op = client[db][coll].update_one(payload['filter'], payload['update'], upsert=payload['upsert']) 101 else: 102 update_op = client[db][coll].update_many(payload['filter'], payload['update'], upsert=payload['upsert']) 103 result = {"matchedCount": update_op.matched_count, "modifiedCount": update_op.modified_count} 104 105 elif op in ["/deleteOne", "/deleteMany"]: 106 payload['filter'] = payload['filter'] if 'filter' in payload else {} 107 if "_id" in payload['filter']: 108 payload['filter']['_id'] = ObjectId(payload['filter']['_id']) 109 if op == "/deleteOne": 110 result = {"deletedCount": client[db][coll].delete_one(payload['filter']).deleted_count} 111 else: 112 result = {"deletedCount": client[db][coll].delete_many(payload['filter']).deleted_count} 113 114 elif op == "/aggregate": 115 if "pipeline" not in payload or payload['pipeline'] == []: 116 return error_response("Send a pipeline") 117 docs = list(client[db][coll].aggregate(payload['pipeline'])) 118 for obj in docs: 119 if isinstance(obj['_id'], ObjectId): 120 obj['_id'] = str(obj['_id']) 121 result = {"documents": docs} 122 123 else: 124 return error_response("Not a valid operation") 125 126 return success_response(result) 127 128 except Exception as e: 129 print(traceback.format_exc()) 130 return error_response(e) 131 132 finally: 133 if client: 134 client.close()
- Copie os requisitos exigidos também para o arquivorequires.py.
1 functions-framework==3.* 2 pymongo 3 pymongo[srv]
- Renomeie o ponto de entrada como "mongodb_crod" e implemente a função.
- Copie e armazene localmente o ponto de conexão HTTPS(URL) para acionar a Função de Nuvem.
- Navegue até a página de detalhes da função de nuvem e copie e armazene o nome da conta de serviço usado pela função.
Observação: o código detalhado e as etapas para configuração estão disponíveis no repositório do Github.
Este tutorial usa o conjunto de dados padrão MongoDB do banco de dados sample_mflix, coleção de filmes. Executaremos todo o código abaixo no Notebook Enterprise Colib.
- O Vertex AI Extensions é uma plataforma para criar e gerenciar extensões que conectam grandes modelos de linguagem a sistemas externos por meio de APIs. Esses sistemas externos podem fornecer dados em tempo real aos LLMs e executar ações de processamento de dados em seu nome.
1 from google.colab import auth 2 auth.authenticate_user("GCP project id") 3 !gcloud config set project {"GCP project id"}
- Instale as dependências necessárias do Python.
1 !pip install --force-reinstall --quiet google_cloud_aiplatform 2 # This is for printing the Vertex AI service account. 3 !pip install --force-reinstall --quiet langchain==0.0.298 4 5 !pip install --upgrade google-auth 6 !pip install bigframes==0.26.0
- Após a instalação das dependências, reinicie o kernel.
1 import IPython 2 app = IPython.Application.instance() 3 app.kernel.do_shutdown(True) # Re-run the Env variable cell again after Kernel restart
- Inicialize as variáveis de ambiente.
1 import os 2 ## This is just a sample values please replace accordingly to your project 3 # Setting up the GCP project 4 os.environ['PROJECT_ID'] = 'gcp project id' # GCP Project ID 5 os.environ['REGION'] = "us-central1" # Project Region 6 ## GCS Bucket location 7 os.environ['STAGING_BUCKET'] = "gs://vertexai_extensions" 8 ## Extension Config 9 os.environ['EXTENSION_DISPLAY_HOME'] = "MongoDb Vertex API Interpreter" 10 os.environ['EXTENSION_DESCRIPTION'] = "This extension makes api call to mongodb to do all crud operations" 11 12 13 ## OPEN API SPec config 14 os.environ['MANIFEST_NAME'] = "mdb_crud_interpreter" 15 os.environ['MANIFEST_DESCRIPTION'] = "This extension makes api call to mongodb to do all crud operations" 16 os.environ['OPENAPI_GCS_URI'] = "gs://vertexai_extensions/mongodbopenapispec.yaml" 17 18 19 ## API KEY secret location 20 os.environ['API_SECRET_LOCATION'] = "projects/787220387490/secrets/mdbapikey/versions/1" 21 22 23 ##LLM config 24 os.environ['LLM_MODEL'] = "gemini-1.5-pro"
- Baixe a especificação Open API do GitHub e envie o arquivo YAML para o bucket do Google Cloud Storage.
1 from google.cloud import aiplatformfrom google.cloud.aiplatform.private_preview import llm_extension 2 3 PROJECT_ID = os.environ['PROJECT_ID'] 4 REGION = os.environ['REGION'] 5 STAGING_BUCKET = os.environ['STAGING_BUCKET'] 6 7 aiplatform.init( 8 project=PROJECT_ID, 9 location=REGION, 10 staging_bucket=STAGING_BUCKET, 11 )
- Para criar a extensão Vertex AI, execute o script abaixo. O manifesto aqui é um objeto JSON estruturado que contém vários componentes principais:
1 from google.cloud import aiplatform 2 from vertexai.preview import extensions 3 4 mdb_crud = extensions.Extension.create( 5 display_name = EXTENSION_DISPLAY_HOME, 6 # Optional. 7 description = EXTENSION_DESCRIPTION, 8 manifest = { 9 "name": MANIFEST_NAME, 10 "description": MANIFEST_DESCRIPTION, 11 "api_spec": { 12 "open_api_gcs_uri": ( 13 OPENAPI_GCS_URI 14 ), 15 }, 16 "authConfig": { 17 "authType": "OAUTH", 18 "oauthConfig": {"service_account": "<Service account name here>"} 19 }, 20 }, 21 ) 22 mdb_crud
- Valide a extensão criada e imprima o esquema de operação e os parâmetros.
1 print("Name:", mdb_crud.gca_resource.name)print("Display Name:", mdb_crud.gca_resource.display_name)print("Description:", mdb_crud.gca_resource.description) 2 import pprint 3 pprint.pprint(mdb_crud.operation_schemas())
Depois que a extensão for criada, navegue até Vertex AI UI e, em seguida, Vertex UI Extension no painel esquerdo.

Todas as extensões criadas estarão disponíveis para seleção. Selecione o intérprete da API do MongoDB Vertex. Para este tutorial, consideraremos duas viagens de usuário.
Recupere dados por meio de extensões da Vertex AI: Imagine precisar descobrir rapidamente quando um filme clássico foi lançado sem navegar pelo banco de dados manualmente. Ao solicitar à Vertex AI, "Encontre o ano de lançamento do filme 'A Canto no Trigo' no VertexAI-POC cluster, sample_mflix, filmes," você obtém o ano de lançamento específico, pois o sistema executa uma operação findOne() para recuperar esse detalhe .

Além de usar a UI, também podemos usar o Notebook para consultar o MongoDB usando o processamento de linguagem natural. Estamos usando o Gemini para converter a linguagem natural no esquema de operação real para chamar a extensão Vertex AI. Atualize a variável de ambiente e execute o script abaixo.
1 ## Please replace accordingly to your project 2 ## Operation Ids 3 os.environ['FIND_ONE_OP_ID'] = "findone_mdb" 4 5 6 7 8 ## NL Queries 9 os.environ['FIND_ONE_NL_QUERY'] = "Find the release year of the movie 'A Corner in Wheat' from VertexAI-POC cluster, sample_mflix, movies" 10 11 12 ## Mongodb Config 13 os.environ['DATA_SOURCE'] = "VertexAI-POC" 14 os.environ['DB_NAME'] = "sample_mflix" 15 os.environ['COLLECTION_NAME'] = "movies" 16 17 18 ### Test data setup 19 os.environ['TITLE_FILTER_CLAUSE'] = "A Corner in Wheat" 20 21 from vertexai.preview.generative_models import GenerativeModel, Tool 22 23 fc_chat = GenerativeModel(os.environ['LLM_MODEL']).start_chat() 24 findOneResponse = fc_chat.send_message(os.environ['FIND_ONE_NL_QUERY'], 25 tools=[Tool.from_dict({ "function_declarations": mdb_crud.operation_schemas() 26 })], 27 ) 28 29 findOneResponse
No esquema convertido, consulte a extensão.
1 response = mdb_crud.execute( 2 operation_id = findOneResponse.candidates[0].content.parts[0].function_call.name, 3 operation_params = findOneResponse.candidates[0].content.parts[0].function_call.args 4 ) 5 6 response
Recuperar dados por meio de extensões da Vertex AI: um analista do cinema deseja uma lista de todos os filmes lançados em um ano específico — por 1924 exemplo, — para aprender as tendências do cinema da época. Eles poderiam perguntar: "Mostre-me filmes lançados no ano 1924 do cluster VertexAI-POC, sample_mflix, filmes," e o sistema usaria o método find() para listar todos os filmes 1924 do, fornecendo um instantâneo abrangente de a produção cinematográfica daquele ano.

Além de usar a UI, também podemos usar o Notebook para consultar o MongoDB usando o processamento de linguagem natural.
Aqui está a integração do Gemini para conversão de linguagem natural em esquema de extensão:
1 ## This is just a sample values please replace accordingly to your project 2 ## Operation Ids 3 os.environ['FIND_MANY_OP_ID'] = "findmany_mdb" 4 5 6 ## NL Queries 7 os.environ['FIND_MANY_NL_QUERY'] = "give me movies released in year 1924 from VertexAI-POC cluster, sample_mflix, movies" 8 9 10 11 12 ## Mongodb Config 13 os.environ['DATA_SOURCE'] = "VertexAI-POC" 14 os.environ['DB_NAME'] = "sample_mflix" 15 os.environ['COLLECTION_NAME'] = "movies" 16 os.environ['YEAR'] = 1924 17 fc_chat = GenerativeModel(os.environ['LLM_MODEL']).start_chat() 18 findmanyResponse = fc_chat.send_message(os.environ['FIND_MANY_NL_QUERY'], 19 tools=[Tool.from_dict({ "function_declarations": mdb_crud.operation_schemas() 20 })], 21 ) 22 23 findmanyResponse
Execute a extensão para obter a resposta.
1 response = mdb_crud.execute( 2 operation_id = findmanyResponse.candidates[0].content.parts[0].function_call.name, 3 operation_params = findmanyResponse.candidates[0].content.parts[0].function_call.args 4 ) 5 6 response




Concluindo, a integração do MongoDB com recursos de query de linguagem natural revolve a interação de dados, melhorando a acessibilidade e a intuitividade das queries de banco de dados. Aproveitar o Google Gemini Foundation Model junto com uma extensão personalizada do Vertex AI não apenas enriquece a experiência de recuperação de dados, mas também mantém a segurança e a integridade dos dados. Estamos trabalhando de perto com a equipe do Google Cloud para adicionar ainda mais padrões de query às extensões da Vertex AI. Fique atento para mais neste espaço.
- Comece a usar o MongoDB Atlas no Google Cloud.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.