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 .

Saiba por que o MongoDB foi selecionado como um líder no 2024 Gartner_Magic Quadrupnt()
Desenvolvedor do MongoDB
Centro de desenvolvedores do MongoDB
chevron-right
Produtos
chevron-right
Atlas
chevron-right

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
IAGoogle cloudAtlasPython
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
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.

Linguagem natural para queries do MongoDB

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.

Plano de solução

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.

Componentes envolvidos

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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

Descrição da solução

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.
diagrama de arquitetura das extensões de AI da Vertex

Pré-requisitos

Antes de começar, certifique-se de ter o seguinte:
  1. Proteja seu acesso ao projeto do Google Cloud ou crie um novo projeto.
  2. 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 .
  3. As extensões Vertex AI não estão disponíveis publicamente. Inscreva-se no Programa Extensions Trusted Tester.
  4. O conhecimento básico das especificações do OpenAPI e como criá-los para APIs será útil.
  5. Você precisará de um bucket do Google Cloud Storage para armazenar as especificações do OpenAPI.
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.
1import functions_framework
2import os
3import json
4from pymongo import MongoClient
5from bson import ObjectId
6import traceback
7from datetime import datetime
8
9
10def connect_to_mongodb():
11 client = MongoClient("<MongoDB Connection String>")
12 return client
13
14
15def 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
25def 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
37class 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@functions_framework.http
45def 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.
1functions-framework==3.*
2pymongo
3pymongo[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.

Criar extensões de Vertex AI

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.
  1. 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.
1from google.colab import auth
2auth.authenticate_user("GCP project id")
3!gcloud config set project {"GCP project id"}
  1. 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
  1. Após a instalação das dependências, reinicie o kernel.
1import IPython
2app = IPython.Application.instance()
3app.kernel.do_shutdown(True) # Re-run the Env variable cell again after Kernel restart
  1. Inicialize as variáveis de ambiente.
1import os
2## This is just a sample values please replace accordingly to your project
3# Setting up the GCP project
4os.environ['PROJECT_ID'] = 'gcp project id' # GCP Project ID
5os.environ['REGION'] = "us-central1" # Project Region
6## GCS Bucket location
7os.environ['STAGING_BUCKET'] = "gs://vertexai_extensions"
8## Extension Config
9os.environ['EXTENSION_DISPLAY_HOME'] = "MongoDb Vertex API Interpreter"
10os.environ['EXTENSION_DESCRIPTION'] = "This extension makes api call to mongodb to do all crud operations"
11
12
13## OPEN API SPec config
14os.environ['MANIFEST_NAME'] = "mdb_crud_interpreter"
15os.environ['MANIFEST_DESCRIPTION'] = "This extension makes api call to mongodb to do all crud operations"
16os.environ['OPENAPI_GCS_URI'] = "gs://vertexai_extensions/mongodbopenapispec.yaml"
17
18
19## API KEY secret location
20os.environ['API_SECRET_LOCATION'] = "projects/787220387490/secrets/mdbapikey/versions/1"
21
22
23##LLM config
24os.environ['LLM_MODEL'] = "gemini-1.5-pro"
  1. Baixe a especificação Open API do GitHub e envie o arquivo YAML para o bucket do Google Cloud Storage.
1from google.cloud import aiplatformfrom google.cloud.aiplatform.private_preview import llm_extension
2
3PROJECT_ID = os.environ['PROJECT_ID']
4REGION = os.environ['REGION']
5STAGING_BUCKET = os.environ['STAGING_BUCKET']
6
7aiplatform.init(
8 project=PROJECT_ID,
9 location=REGION,
10 staging_bucket=STAGING_BUCKET,
11)
  1. 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:
1from google.cloud import aiplatform
2from vertexai.preview import extensions
3
4mdb_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 )
22mdb_crud
  1. Valide a extensão criada e imprima o esquema de operação e os parâmetros.
1print("Name:", mdb_crud.gca_resource.name)print("Display Name:", mdb_crud.gca_resource.display_name)print("Description:", mdb_crud.gca_resource.description)
2import pprint
3pprint.pprint(mdb_crud.operation_schemas())

Extensão em ação

Depois que a extensão for criada, navegue até Vertex AI UI e, em seguida, Vertex UI Extension no painel esquerdo.
Navegando até as extensões da Vertex AI
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.

Jornada do usuário 1

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 .
Testando as extensões da Vertex AI para localizar query
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
3os.environ['FIND_ONE_OP_ID'] = "findone_mdb"
4
5
6
7
8## NL Queries
9os.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
13os.environ['DATA_SOURCE'] = "VertexAI-POC"
14os.environ['DB_NAME'] = "sample_mflix"
15os.environ['COLLECTION_NAME'] = "movies"
16
17
18### Test data setup
19os.environ['TITLE_FILTER_CLAUSE'] = "A Corner in Wheat"
20
21from vertexai.preview.generative_models import GenerativeModel, Tool
22
23fc_chat = GenerativeModel(os.environ['LLM_MODEL']).start_chat()
24findOneResponse = fc_chat.send_message(os.environ['FIND_ONE_NL_QUERY'],
25 tools=[Tool.from_dict({ "function_declarations": mdb_crud.operation_schemas()
26 })],
27)
28
29findOneResponse
No esquema convertido, consulte a extensão.
1response = 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
6response

Jornada do usuário 2

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.
testando extensões da Vertex AI para encontrar query 2
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
3os.environ['FIND_MANY_OP_ID'] = "findmany_mdb"
4
5
6## NL Queries
7os.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
13os.environ['DATA_SOURCE'] = "VertexAI-POC"
14os.environ['DB_NAME'] = "sample_mflix"
15os.environ['COLLECTION_NAME'] = "movies"
16os.environ['YEAR'] = 1924
17fc_chat = GenerativeModel(os.environ['LLM_MODEL']).start_chat()
18findmanyResponse = fc_chat.send_message(os.environ['FIND_MANY_NL_QUERY'],
19 tools=[Tool.from_dict({ "function_declarations": mdb_crud.operation_schemas()
20 })],
21)
22
23findmanyResponse
Execute a extensão para obter a resposta.
1response = 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
6response

Execução da extensão passo a passo

Consultas do utilizador com linguagem natural
O LLM converte a linguagem natural de acordo com o esquema da extensão e executa a extensão
A extensão busca o documento do MongoDB e retorna a resposta
O LLM converte a resposta da extensão em linguagem natural e responde de volta ao usuário

Conclusão

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.

Leitura adicional

  1. Comece a usar o MongoDB Atlas no Google Cloud.
  2. Conecte modelos a APIs usando extensões de Vertex 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 Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Estendendo o MongoDB Atlas CLI com plug-ins personalizados


Jan 16, 2025 | 4 min read
Início rápido

Introdução ao desenvolvimento do Atlas Stream Processing


Aug 28, 2024 | 7 min read
Tutorial

Criando um localizador de restaurantes usando Atlas, Neurelo e AWS Lambda


Apr 02, 2024 | 8 min read
Artigo

Sistemas multiagentes com AutoGen e MongoDB


Sep 18, 2024 | 10 min read
Sumário