Primeiros passos com o Gemini na Vertex AI

Luciano Martins
google-cloud-brasil
12 min readDec 18, 2023

--

Introdução

Google Gemini — anunciado em 6 de dezembro de 2023

Faz algumas semanas, o Google lançou o Gemini — o maior e com mais capacidade modelo já desenvolvido pelo Google.

Uma das grandes inovações na criação do Gemini é sua multimodalidade desde o T0, ou seja, desde seu desenvolvimento o Gemini já foi treinado com diversas modalidades (ou formatos) de informação — O que isso significa? Normalmente, os grandes modelos de linguagem são criados e treinados em uma única modalidade de dados (por exemplo, utilizando datasets em formato de texto) e depois que esta primeira “encarnação” do modelo está com uma qualidade boa, usa-se outras técnicas para otimizar este modelo para outras modalidades (imagens, áudio, video, documentos, etc).

Assim, o Gemini é treinado desde o início com diferentes modalidades — Depois, com a ajuda de datasets multimodais adicionais e para tarefas específicas, o modelo é refinado mais ainda para melhora na sua eficiência. Isso ajuda o Gemini a ter melhor compreensão e “reasoning” (ou “raciocínio” em uma tradução livre) para cenários envolvendo imagens e vídeos junto com prompts de texto.

Visão abstrata da arquitetura do Gemini

Mas o que isso nos traz de melhoria, na prática?

Excelente pergunta, caro internauta! Com essa abordagem de treinamento multimodal, você tem disponível, diretamente do modelo pré-treinado, coisas como:

Entendimento multimodal de contextos: Sendo o modelo treinado de forma multimodal desde o início, você consegue usar, desde a primeira interação, prompts combinando texto, imagens e vídeos (e com mais por vir no futuro).

Reasoning mais sofisticado: Ou seja, o Gemini consegue levar informações visuais e escritas em imagens, assim como escritas em prompts de texto, tudo junto, antes de gerar a resposta para sua solicitação.

Capacidade de codificação avançada: O Gemini evolui a qualidade que já estava disponível nos modelos baseados no PaLM2, trazendo maior qualidade na geração, complementação e explicação de códigos. Para dar uma ideia, o time da Google DeepMind criou recentemente uma nova versão do AlphaCode (o AlphaCode 2), baseado em uma versão do Gemini, que consegue resultados bem interessantes em competições de código (aquelas em que há um desafio objetivo “escreva um código que faça travessia em um grafo sob determinadas condições”) e com scores bem altos. Vale a pena dar uma olhada no relatório técnico do AlphaCode 2.

No lançamento realizado pela Google DeepMind, foram anunciadas três variações do Gemini em sua primeira versão (1.0):

Gemini Ultra: O maior modelo da família, com capacidade para solucionar tarefas mais complexas
Gemini Pro: O melhor modelo para a maioria das tarefas
Gemini Nano: O modelo mais eficiente para uso em dispositivos

Maiores detalhes sobre arquitetura, treinamento, datasets utilizados e resultados de avaliações com benchmarks acadêmicos podem ser encontrados no relatório técnico do Gemini.

Gemini API na Vertex AI

Após o lançamento do modelo pela área de pesquisa de IA do Google, a Google DeepMind, foi a hora da segunda parte (e pessoalmente, mais legal): o lançamento do Gemini, em formato de APIs, para todo mundo 🎉

O Gemini está disponível para experimentação de desenvolvedores tanto no Google AI Studio (antes conhecido como MakerSuite) quanto na Vertex AI da Google Cloud. Aqui nesse blog vamos focar nessa segunda forma (na Google Cloud).

A Gemini API está disponível dentro da Vertex AI, a plataforma de desenvolvimento de soluções de machine learning dentro da Google Cloud, e a utilização é simples como a interação que já tínhamos com a PaLM API.

Na console, você consegue acessar diretamente pela Vertex AI, no menu de “Linguagem” (para interações somente de texto):

Console da Vertex AI em uma interação de texto com a Gemini API

Ou na opção “Multimodal”, para interações multimodais (incluindo alguns exemplos legais):

Console da Vertex AI em uma interação multimodal com a Gemini API

Mas a diversão é mexer com código, né? Deixa a interface gráfica para outras pessoas! #brinks 🤡

Primeiros passos

Como começar? Bom, para não alongar muito nessa postagem, vou dar alguns exemplos rápidos, que podem ajudar a começar a jornada, e também um repositório no github com mais exemplos.

Mas nas próximas postagens teremos mais coisas legais, feitas pelos colaboradores do blog!

Instalação da SDK da Vertex AI

Aqui vou mostrar alguns exemplos em Python (mas tem exemplos em outras linguagens [Java, Nodejs, Go, etc] aqui).

Para instalar a SDK, basta um pip install:

$ pip3 install - upgrade - user google-cloud-aiplatform

Aqui eu estou usando o Vertex AI Workbench — então eu já tenho a ajuda da Vertex AI para autenticação do usuário, acesso às API etc. Nos notebooks que compartilharei no final tem os passos caso você use o Google Colab ou a sua própria estação.

Modelos disponíveis

A API Vertex AI Gemini fornece uma interface unificada para interagir com modelos Gemini. Atualmente existem dois modelos disponíveis na API Gemini:

Modelo Gemini Pro(ou gemini-pro na SDK): Projetado para lidar com tarefas de linguagem natural, bate-papo multivoltas de texto e código e geração de código.
Modelo Gemini Pro Vision (ou gemini-pro-vision na SDK): Suporta prompts multimodais. Você pode incluir texto, imagens e vídeo em suas solicitações de prompt e obter respostas em texto ou código.

Iniciando com interações somente texto

Depois disso você precisa importar os módulos da SDK:

from vertexai.preview.generative_models import GenerativeModel

E depois instanciar um objeto importando o modelo. Aqui, começando com o Gemini-Pro (somente prompts de texto).

model = GenerativeModel("gemini-pro")

Depois disso? Depois disso é só mandar requisições. Simples assim:

responses = model.generate_content("Por que o céu é azul?", stream=True)

E ter os resultados no objeto “responses”:

for response in responses:
print(response.text, end="")

A cor azul do céu é causada pela dispersão de Rayleigh, um fenômeno óptico
que ocorre quando a luz solar interage com as moléculas de nitrogênio e
oxigênio na atmosfera terrestre.

Quando a luz solar atinge a atmosfera, ela é dispersa em todas as direções.
A quantidade de dispersão depende do comprimento de onda da luz, com
comprimentos de onda mais curtos (como o azul) sendo dispersos mais do que
comprimentos de onda mais longos (como o vermelho).

Isso significa que a luz azul é espalhada para todas as partes do céu,
dando-lhe sua cor azulada. A luz vermelha, por outro lado, é menos dispersa
e viaja em linha reta, o que é por isso que o sol parece vermelho quando
está perto do horizonte.

A quantidade de dispersão também depende do ângulo do sol em relação ao
observador. Quando o sol está baixo no céu, a luz solar tem que viajar mais
através da atmosfera para atingir o observador. Isso significa que há mais
moléculas de gás para espalhar a luz, o que resulta em um céu mais azul.

Quando o sol está alto no céu, a luz solar tem que viajar menos através da
atmosfera para atingir o observador. Isso significa que há menos moléculas
de gás para espalhar a luz, o que resulta em um céu mais claro.

A dispersão de Rayleigh também é responsável pelos belos tons vermelhos,
laranja e amarelos do pôr do sol e do nascer do sol. Quando o sol está perto
do horizonte, a luz solar tem que viajar mais através da atmosfera para
atingir o observador. Isso significa que há mais moléculas de gás para
espalhar a luz, e os comprimentos de onda mais curtos (como o azul) são
espalhados para todas as partes do céu. Isso deixa apenas os comprimentos
de onda mais longos (como o vermelho, o laranja e o amarelo) para atingir o
observador, o que resulta nas cores vibrantes do pôr do sol e do nascer do
sol.

Isto foi um exemplo de uma interação “unária” — Ou seja, uma requisição, uma resposta e acabou a experiência. Mas o Gemini também suporta interações de chat multiturno (ou seja, com histórico das interações anteriores). Saca só:

chat = model.start_chat()
prompt = """Meu nome é Luciano.
Você é meu assistente pessoal.
Meus filmes favoritos são Senhor dos Anéis e Hobbit.
Sugira outro filme que eu possa gostar.
"""
responses = chat.send_message(prompt, stream=True)

E a resposta segue a ideia da primeira interação, utilizando o aprendizado embutido do modelo (menção honrosa pra Eragon e Willow, hein?):

for response in responses:
print(response.text, end="")

1. O Silmarillion
2. As Crônicas de Nárnia
3. Harry Potter
4. Percy Jackson e os Olimpianos
5. Eragon
6. A Bússola de Ouro
7. Terramar
8. A Princesa Prometida
9. Willow
10. O Cristal Encantado

Onde entra a magia (trocadilho não intencional com o gênero dos filmes aí) dessa interação em chat? É a possibilidade de não reenviar perguntas e respostas anteriores. Por exemplo, pedir pro modelo explicar a resposta anterior (sem muitos detalhes sobre ela):

prompt = "O que estes filmes tem em comum com os filmes que eu gosto?"
responses = chat.send_message(prompt, stream=True)

E checando o resultado:

for response in responses:
print(response.text, end="")

Os filmes que você mencionou, Senhor dos Anéis e Hobbit, são todos filmes de
fantasia. Eles têm em comum com os filmes que sugeri os seguintes elementos:

* Ambientação medieval ou mitológica: Todos esses filmes se passam em mundos
fictícios que lembram a Idade Média ou outras épocas mitológicas.

* Magia e criaturas fantásticas: Todos esses filmes apresentam magia e
criaturas fantásticas, como elfos, dragões, orcs e trolls.

* Heróis e vilões: Todos esses filmes têm heróis que devem lutar contra
vilões poderosos para salvar o mundo.

* Aventura e ação: Todos esses filmes são cheios de aventura e ação, com
muitas cenas de batalha e perseguição.

* Temas universais: Todos esses filmes exploram temas universais, como o
bem contra o mal, a amizade, a coragem e o amor.

Além disso, muitos desses filmes foram inspirados nas mesmas fontes que
Senhor dos Anéis e Hobbit, como a mitologia nórdica e as obras de J.R.R.
Tolkien. Aqui estão alguns exemplos específicos de como esses elementos
aparecem em cada um dos filmes que sugeri:

* O Silmarillion: Este filme é uma adaptação da obra de J.R.R. Tolkien do
mesmo nome, que conta a história da criação do mundo de Arda e as guerras
entre os Valar e Morgoth.

* As Crônicas de Nárnia: Esta série de filmes é baseada nos livros de C.S.
Lewis, e conta a história de quatro crianças que são transportadas para o
mundo mágico de Nárnia, onde devem lutar contra a Feiticeira Branca.

* Harry Potter: Esta série de filmes é baseada nos livros de J.K. Rowling,
e conta a história de Harry Potter, um jovem bruxo que deve lutar contra
Lord Voldemort, um bruxo das trevas que quer dominar o mundo.

* Percy Jackson e os Olimpianos: Esta série de filmes é baseada nos livros
de Rick Riordan, e conta a história de Percy Jackson, um semideus que deve
lutar contra os titãs, que querem destruir o mundo.

* Eragon: Este filme é baseado no livro de Christopher Paolini, e conta a
história de Eragon, um jovem que descobre um ovo de dragão e se torna um
Cavaleiro de Dragão, que deve lutar contra o Rei Galbatorix, um tirano que
quer dominar o mundo.

* A Bússola de Ouro: Este filme é baseado no livro de Philip Pullman, e
conta a história de Lyra Belacqua, uma jovem que viaja para o Norte para
resgatar seu amigo, que foi sequestrado por uma organização misteriosa.

* Terramar: Este filme é baseado no livro de Ursula K. Le Guin, e conta a
história de Ged, um jovem mago que deve lutar contra o Arquimago, um mago
das trevas que quer dominar o mundo.

* A Princesa Prometida: Este filme é uma comédia romântica de fantasia que
conta a história de Buttercup, uma jovem que é prometida em casamento a um
príncipe malvado, mas é salva por Westley, um pirata que a ama.

* Willow: Este filme conta a história de Willow, um fazendeiro que é
escolhido para proteger uma criança especial de uma rainha malvada.

* O Cristal Encantado: Este filme conta a história de Jen, um jovem que
deve viajar para o Castelo de Cristal para salvar seu amigo Kira, que foi
sequestrada por um Skeksis, uma criatura malvada.

Iniciando com interações multimodais

Agora a parte mais legal: Enviando imagens e/ou vídeo junto com o seu prompt de texto.

O primeiro passo é importar a versão do Gemini Pro com suporte a visão computacional:

multimodal_model = GenerativeModel("gemini-pro-vision")

O cenário que vamos fazer é o seguite: Vamos pedir pro modelo raciocinar e calcular informações contextuais de duas imagem. A primeira imagem é uma cesta de frutas e a segunda imagem é uma tabela de preços:

Duas imagens de exemplos que utilizaremos: Uma cesta de frutas e uma tabela de preços

Vamos pedir ao modelo que interprete ambas imagens e que calcule o quanto ficaria esta “compra” (considerando que compremos todas as frutas disponíveis na primeira imagem, pagando o preço na tabela da segunda imagem):

image_grocery_url = "https://storage.googleapis.com/github-repo/img/gemini/multimodality_usecases_overview/banana-apple.jpg"
image_prices_url = "https://storage.googleapis.com/github-repo/img/gemini/multimodality_usecases_overview/pricelist.jpg"
image_grocery = load_image_from_url(image_grocery_url)
image_prices = load_image_from_url(image_prices_url)
instructions = "Instruções: Considere a imagem a seguir que contem frutas:"

prompt1 = "Quanto eu pagarei portas frutas considerando esta tabela de preços?"

prompt2 = """
Responda à pergunta através destas etapas:
Passo 1: Identifique que tipo de fruta existe na primeira imagem.
Passo 2: Conte a quantidade de cada fruta.
Passo 3: Para cada item da primeira imagem, verifique o preço do item na tabela de preços.
Passo 4: Calcule o preço subtotal de cada tipo de fruta.
Passo 5: Calcule o preço total das frutas usando os subtotais.
Responda e descreva as etapas realizadas:"""

contents = [
instructions,
image_grocery,
prompt1,
image_prices,
prompt2,
]

responses = multimodal_model.generate_content(contents, stream=True)

Com isso temos como resposta:

for response in responses:
print(response.text, end="")

Passo 1: Identifique que tipo de fruta existe na primeira imagem.
Existem 2 bananas e 3 maçãs.

Passo 2: Conte a quantidade de cada fruta.
Bananas: 2
Maçãs: 3

Passo 3: Para cada item da primeira imagem, verifique o preço do item na tabela de preços.
Banana: $ 0,80
Maçã: $ 1,50

Passo 4: Calcule o preço subtotal de cada tipo de fruta.
Banana: 2 x $ 0,80 = $ 1,60
Maçã: 3 x $ 1,50 = $ 4,50

Passo 5: Calcule o preço total das frutas usando os subtotais.
$ 1,60 + $ 4,50 = $ 6,10

Portanto, o preço total das frutas é de $ 6,10.

Ou seja, o modelo conseguiu:

  • Entender o que está presente na primeira imagem, incluindo realizar contagem de objetos
  • Entender a estrutura de informações da segunda imagem
  • Entender as informações textuais da segunda imagem

Poxa, Luciano… E vídeos? Tem vídeos também. E a interação é bem parecida. Para este exemplo, vou usar um vídeo da cidade de Antalya, na Turquia e vamos pedir informações sobre o vídeo para o modelo (sem dar nenhuma “cola” — documento de referência, pistas, etc). Aqui é um screenshot do vídeo:

prompt = """
O que é mostrado neste vídeo?
Onde devo ir para ver isso?
Quais são 5 outros lugares do mundo com esta aparência?
"""

video = Part.from_uri(
uri="gs://github-repo/img/gemini/multimodality_usecases_overview/mediterraneansea.mp4",
mime_type="video/mp4",
)
contents = [prompt, video]
responses = multimodal_model.generate_content(contents, stream=True)

E o resultado é como abaixo:

for response in responses:
print(response.text, end="")

O vídeo mostra a cidade de Antalya, na Turquia. Antalya é uma cidade costeira
localizada no sul da Turquia, banhada pelo Mar Mediterrâneo. A cidade é um
importante destino turístico, com praias, hotéis e resorts.

Você pode ir para Antalya de avião, carro ou ônibus. O aeroporto de Antalya
fica a cerca de 10 km do centro da cidade. De carro, você pode chegar a
Antalya pela rodovia D400. De ônibus, você pode pegar um ônibus de Istambul,
Ankara ou Izmir.

Aqui estão 5 outros lugares do mundo com aparência semelhante a Antalya:

1. Cinque Terre, Itália
2. Costa Amalfitana, Itália
3. Ilhas Phi Phi, Tailândia
4. Baía de Halong, Vietnã
5. Ilha de Santorini, Grécia

Esse tipo de interação abre oportunidade para interpretar vídeos, realizar recomendações, extrair tags de conteúdos, etc.

Conclusão

E aí? Curtiram a ideia e a interação? Tiveram ideias de cenários que este tipo de interação, interpretação e reasoning podem te ajudar?

Compartilha aí! Se quiser escrever um blog aqui também e compartilhar sua experiência (de preferência compartilhando aquele código maroto junto), me dá um alô nas redes sociais e bora fazer isso 🙂

Nos próximos posts teremos mais aprofundamento em outros cenários — Mas para ter um spoiler de outras coisas que dá pra fazer, deem olhada neste meu repositório no GitHub: https://github.com/lucianommartins/generative-ai-ptbr

Vale a pena dar uma olhada também na documentação oficial da Gemini API da Vertex AI: https://cloud.google.com/vertex-ai/docs/generative-ai/model-reference/gemini?hl=pt-br.

E também o repositório oficial do time de Cloud AI Advocacy constantemente sendo populado com novos códigos, aplicações de exemplo e use cases: https://www.github.com/GoogleCloudPlatform/generative-ai

Um abraço!

--

--