Tutorial: primeiros passos com a API Gemini


Ver na IA do Google Executar no Google Colab Veja o código-fonte no GitHub

Este guia de início rápido demonstra como usar o SDK do Python para a API Gemini, que oferece acesso aos modelos de linguagem grandes do Gemini do Google. Neste guia de início rápido, você aprenderá a:

  1. Configure seu ambiente de desenvolvimento e o acesso à API para usar o Gemini.
  2. Gerar respostas de texto com base em entradas de texto.
  3. Gere respostas de texto a partir de entradas multimodais (texto e imagens).
  4. Usar o Gemini em conversas de vários turnos (chat).
  5. Use embeddings para modelos de linguagem grandes.

Pré-requisitos

É possível executar este guia de início rápido no Google Colab, que executa o notebook diretamente no navegador e não requer configuração adicional do ambiente.

Como alternativa, para concluir este guia de início rápido localmente, verifique se seu ambiente de desenvolvimento atende aos seguintes requisitos:

  • Python 3.9 ou superior
  • Uma instalação de jupyter para executar o notebook.

Configuração

Instalar o SDK do Python

O SDK do Python para a API Gemini está no pacote google-generativeai. Instale a dependência usando pip:

pip install -q -U google-generativeai

Importar pacotes

Importe os pacotes necessários.

import pathlib
import textwrap

import google.generativeai as genai

from IPython.display import display
from IPython.display import Markdown


def to_markdown(text):
  text = text.replace('•', '  *')
  return Markdown(textwrap.indent(text, '> ', predicate=lambda _: True))
# Used to securely store your API key
from google.colab import userdata

Configurar sua chave de API

Antes de usar a API Gemini, você precisa de uma chave de API. Se você ainda não tiver uma, crie uma chave com um clique no Google AI Studio.

Gerar uma chave de API

No Colab, adicione a chave ao gerenciador de chaves secretas em "HELP" no painel esquerdo. Nomeie como GOOGLE_API_KEY.

Quando você tiver a chave de API, transmita-a ao SDK. Faça isso de duas maneiras:

  • Coloque a chave na variável de ambiente GOOGLE_API_KEY. O SDK vai selecioná-la automaticamente de lá.
  • Transmita a chave para genai.configure(api_key=...)
# Or use `os.getenv('GOOGLE_API_KEY')` to fetch an environment variable.
GOOGLE_API_KEY=userdata.get('GOOGLE_API_KEY')

genai.configure(api_key=GOOGLE_API_KEY)

Listar modelos

Agora você já pode chamar a API Gemini. Use list_models para conferir os modelos do Gemini disponíveis:

  • gemini-1.5-flash: nosso modelo multimodal mais rápido
  • gemini-1.5-pro: nosso modelo multimodal mais eficiente e inteligente
for m in genai.list_models():
  if 'generateContent' in m.supported_generation_methods:
    print(m.name)

Gerar texto com base em entradas de texto

Para comandos somente de texto, use um modelo Gemini 1.5 ou Gemini 1.0 Pro:

model = genai.GenerativeModel('gemini-1.5-flash')

O método generate_content pode lidar com uma ampla variedade de casos de uso, incluindo chat com vários turnos e entrada multimodal, dependendo do suporte do modelo subjacente. Os modelos disponíveis aceitam apenas texto e imagens como entrada e texto como saída.

No caso mais simples, você pode transmitir uma string de comando ao método GenerativeModel.generate_content:

%%time
response = model.generate_content("What is the meaning of life?")
CPU times: user 110 ms, sys: 12.3 ms, total: 123 ms
Wall time: 8.25 s

Em casos simples, o acessador response.text é tudo o que você precisa. Para exibir o texto Markdown formatado, use a função to_markdown:

to_markdown(response.text)

A consulta sobre o propósito da vida deixou as pessoas perplexas em séculos, culturas e continentes. Embora não haja uma resposta universalmente reconhecida, muitas ideias foram apresentadas, e a resposta é frequentemente dependente de ideias, crenças e experiências de vida individuais.

  1. Felicidade e bem-estar:muitas pessoas acreditam que o objetivo da vida é alcançar a felicidade e o bem-estar. Isso pode envolver encontrar atividades que proporcionem alegria, estabelecer conexões significativas, cuidar da saúde física e mental e buscar objetivos e interesses pessoais.

  2. Contribuição significativa:algumas pessoas acreditam que o propósito da vida é fazer uma contribuição significativa para o mundo. Isso pode envolver seguir uma profissão que beneficie outras pessoas, participar de atividades voluntárias ou beneficentes, gerar arte ou literatura ou inventar.

  3. Auto-realização e crescimento pessoal:outro objetivo comum na vida é buscar a auto-realização e o desenvolvimento pessoal. Isso pode envolver aprender novas habilidades, ultrapassar os limites, enfrentar obstáculos pessoais e evoluir como pessoa.

  4. Comportamento ético e moral:algumas pessoas acreditam que o objetivo da vida é agir de maneira ética e moral. Isso pode envolver aderir aos princípios morais de alguém, fazer a coisa certa mesmo quando for difícil e tentar tornar o mundo um lugar melhor.

  5. Fulfillment espiritual:para algumas pessoas, o propósito da vida está ligado a crenças espirituais ou religiosas. Isso inclui buscar uma conexão com um poder superior, praticar rituais religiosos ou seguir ensinamentos espirituais.

  6. Vivendo a vida até o fim:algumas pessoas acreditam que o objetivo da vida é aproveitar tudo o que ela tem a oferecer. Isso pode envolver viajar, experimentar coisas novas, assumir riscos e abraçar novos encontros.

  7. Legado e impacto:outras pessoas acreditam que o propósito da vida é deixar um legado e um impacto duradouro no mundo. Isso pode implicar realizar algo notável, ser lembrado pelas contribuições de alguém ou inspirar e motivar os outros.

  8. Encontrar equilíbrio e harmonia: para algumas pessoas, o objetivo da vida é encontrar equilíbrio e harmonia em todos os aspectos da vida. Isso pode envolver conciliar obrigações pessoais, profissionais e sociais, buscar paz e satisfação interna e levar uma vida de acordo com nossos valores e crenças.

No fim das contas, o significado da vida é uma jornada pessoal, e indivíduos diferentes podem descobrir o próprio propósito por meio de experiências, reflexões e interações com o mundo ao redor.

Se a API não retornar um resultado, use GenerateContentResponse.prompt_feedback para ver se a solicitação foi bloqueada por questões de segurança.

response.prompt_feedback
safety_ratings {
  category: HARM_CATEGORY_SEXUALLY_EXPLICIT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HATE_SPEECH
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HARASSMENT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_DANGEROUS_CONTENT
  probability: NEGLIGIBLE
}

O Gemini pode gerar várias respostas possíveis para um único comando. Essas possíveis respostas são chamadas de candidates e você pode analisá-las para selecionar a mais adequada como resposta.

Veja as respostas candidatas com GenerateContentResponse.candidates:

response.candidates
[content {
  parts {
    text: "The query of life\'s purpose has perplexed people across centuries, cultures, and continents. While there is no universally recognized response, many ideas have been put forth, and the response is frequently dependent on individual ideas, beliefs, and life experiences.\n\n1. **Happiness and Well-being:** Many individuals believe that the goal of life is to attain personal happiness and well-being. This might entail locating pursuits that provide joy, establishing significant connections, caring for one\'s physical and mental health, and pursuing personal goals and interests.\n\n2. **Meaningful Contribution:** Some believe that the purpose of life is to make a meaningful contribution to the world. This might entail pursuing a profession that benefits others, engaging in volunteer or charitable activities, generating art or literature, or inventing.\n\n3. **Self-realization and Personal Growth:** The pursuit of self-realization and personal development is another common goal in life. This might entail learning new skills, pushing one\'s boundaries, confronting personal obstacles, and evolving as a person.\n\n4. **Ethical and Moral Behavior:** Some believe that the goal of life is to act ethically and morally. This might entail adhering to one\'s moral principles, doing the right thing even when it is difficult, and attempting to make the world a better place.\n\n5. **Spiritual Fulfillment:** For some, the purpose of life is connected to spiritual or religious beliefs. This might entail seeking a connection with a higher power, practicing religious rituals, or following spiritual teachings.\n\n6. **Experiencing Life to the Fullest:** Some individuals believe that the goal of life is to experience all that it has to offer. This might entail traveling, trying new things, taking risks, and embracing new encounters.\n\n7. **Legacy and Impact:** Others believe that the purpose of life is to leave a lasting legacy and impact on the world. This might entail accomplishing something noteworthy, being remembered for one\'s contributions, or inspiring and motivating others.\n\n8. **Finding Balance and Harmony:** For some, the purpose of life is to find balance and harmony in all aspects of their lives. This might entail juggling personal, professional, and social obligations, seeking inner peace and contentment, and living a life that is in accordance with one\'s values and beliefs.\n\nUltimately, the meaning of life is a personal journey, and different individuals may discover their own unique purpose through their experiences, reflections, and interactions with the world around them."
  }
  role: "model"
}
finish_reason: STOP
index: 0
safety_ratings {
  category: HARM_CATEGORY_SEXUALLY_EXPLICIT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HATE_SPEECH
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HARASSMENT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_DANGEROUS_CONTENT
  probability: NEGLIGIBLE
}
]

Por padrão, o modelo retorna uma resposta após concluir todo o processo de geração. Também é possível transmitir a resposta conforme ela é gerada. O modelo retornará blocos da resposta assim que eles forem gerados.

Para transmitir as respostas, use GenerativeModel.generate_content(..., stream=True).

%%time
response = model.generate_content("What is the meaning of life?", stream=True)
CPU times: user 102 ms, sys: 25.1 ms, total: 128 ms
Wall time: 7.94 s
for chunk in response:
  print(chunk.text)
  print("_"*80)
The query of life's purpose has perplexed people across centuries, cultures, and
________________________________________________________________________________
 continents. While there is no universally recognized response, many ideas have been put forth, and the response is frequently dependent on individual ideas, beliefs, and life experiences
________________________________________________________________________________
.

1. **Happiness and Well-being:** Many individuals believe that the goal of life is to attain personal happiness and well-being. This might entail locating pursuits that provide joy, establishing significant connections, caring for one's physical and mental health, and pursuing personal goals and aspirations.

2. **Meaning
________________________________________________________________________________
ful Contribution:** Some believe that the purpose of life is to make a meaningful contribution to the world. This might entail pursuing a profession that benefits others, engaging in volunteer or charitable activities, generating art or literature, or inventing.

3. **Self-realization and Personal Growth:** The pursuit of self-realization and personal development is another common goal in life. This might entail learning new skills, exploring one's interests and abilities, overcoming obstacles, and becoming the best version of oneself.

4. **Connection and Relationships:** For many individuals, the purpose of life is found in their relationships with others. This might entail building
________________________________________________________________________________
 strong bonds with family and friends, fostering a sense of community, and contributing to the well-being of those around them.

5. **Spiritual Fulfillment:** For those with religious or spiritual beliefs, the purpose of life may be centered on seeking spiritual fulfillment or enlightenment. This might entail following religious teachings, engaging in spiritual practices, or seeking a deeper understanding of the divine.

6. **Experiencing the Journey:** Some believe that the purpose of life is simply to experience the journey itself, with all its joys and sorrows. This perspective emphasizes embracing the present moment, appreciating life's experiences, and finding meaning in the act of living itself.

7. **Legacy and Impact:** For others, the goal of life is to leave a lasting legacy or impact on the world. This might entail making a significant contribution to a particular field, leaving a positive mark on future generations, or creating something that will be remembered and cherished long after one's lifetime.

Ultimately, the meaning of life is a personal and subjective question, and there is no single, universally accepted answer. It is about discovering what brings you fulfillment, purpose, and meaning in your own life, and living in accordance with those values.
________________________________________________________________________________

Durante o streaming, alguns atributos de resposta não ficam disponíveis até que você tenha iterado em todos os blocos de resposta. Isso é demonstrado abaixo:

response = model.generate_content("What is the meaning of life?", stream=True)

O atributo prompt_feedback funciona:

response.prompt_feedback
safety_ratings {
  category: HARM_CATEGORY_SEXUALLY_EXPLICIT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HATE_SPEECH
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HARASSMENT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_DANGEROUS_CONTENT
  probability: NEGLIGIBLE
}

Mas atributos como text não:

try:
  response.text
except Exception as e:
  print(f'{type(e).__name__}: {e}')
IncompleteIterationError: Please let the response complete iteration before accessing the final accumulated
attributes (or call `response.resolve()`)

Gerar texto com base em entradas de imagem e texto

O Gemini oferece vários modelos que podem processar entrada multimodal (modelos do Gemini 1.5) para que você possa inserir texto e imagens. Confira os requisitos de imagem para comandos.

Quando a entrada do comando incluir texto e imagens, use um Gemini 1.5 com o método GenerativeModel.generate_content para gerar a saída de texto:

Vamos incluir uma imagem:

curl -o image.jpg https://t0.gstatic.com/licensed-image?q=tbn:ANd9GcQ_Kevbk21QBRy-PgB4kQpS79brbmmEG7m3VOTShAn4PecDU5H5UxrJxE3Dw1JiaG17V88QIol19-3TM2wCHw
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  405k  100  405k    0     0  6982k      0 --:--:-- --:--:-- --:--:-- 7106k
import PIL.Image

img = PIL.Image.open('image.jpg')
img

png

Usar um modelo Gemini 1.5 e transmitir a imagem para o modelo com generate_content.

model = genai.GenerativeModel('gemini-1.5-flash')
response = model.generate_content(img)

to_markdown(response.text)

Tigelas de frango teriyaki com arroz integral, brócolis assado e pimentão.

Para incluir texto e imagens em um comando, transmita uma lista com as strings e as imagens:

response = model.generate_content(["Write a short, engaging blog post based on this picture. It should include a description of the meal in the photo and talk about my journey meal prepping.", img], stream=True)
response.resolve()
to_markdown(response.text)

Preparar as refeições é uma ótima maneira de economizar tempo e dinheiro, e também pode ajudá-lo a ter uma alimentação mais saudável. Esta refeição é um ótimo exemplo de uma refeição saudável e deliciosa que pode ser facilmente preparada com antecedência.

Esta refeição inclui arroz integral, legumes assados e frango teriyaki. O arroz integral é um grão integral rico em fibras e nutrientes. Os vegetais torrados são uma ótima maneira de obter sua dose diária de vitaminas e minerais. O frango teriyaki é uma fonte de proteína magra e muito saborosa.

Esta refeição é fácil de preparar com antecedência. Basta cozinhar o arroz integral, assar os legumes e o frango teriyaki. Em seguida, divida a refeição em recipientes individuais e armazene-os na geladeira. Quando estiver pronto para comer, basta pegar um recipiente e aquecê-lo.

Esta refeição é uma ótima opção para pessoas ocupadas que procuram uma maneira saudável e deliciosa. Também é uma ótima refeição para quem está tentando perder ou manter um peso saudável.

Se você procura uma refeição saudável e deliciosa que possa ser preparada com antecedência, esta é uma ótima opção. Experimente hoje mesmo!

Conversas por chat

Com o Gemini, você pode ter conversas livres em vários turnos. A classe ChatSession simplifica o processo gerenciando o estado da conversa. Assim, ao contrário de generate_content, não é necessário armazenar o histórico de conversas como uma lista.

Inicialize o chat:

model = genai.GenerativeModel('gemini-1.5-flash')
chat = model.start_chat(history=[])
chat
<google.generativeai.generative_models.ChatSession at 0x7b7b68250100>

O método ChatSession.send_message retorna o mesmo tipo de GenerateContentResponse que GenerativeModel.generate_content. Sua mensagem e a resposta ao histórico de chat também são anexadas:

response = chat.send_message("In one sentence, explain how a computer works to a young child.")
to_markdown(response.text)

Um computador é como uma máquina muito inteligente que pode entender e seguir nossas instruções, nos ajudar no trabalho e até mesmo jogar conosco.

chat.history
[parts {
   text: "In one sentence, explain how a computer works to a young child."
 }
 role: "user",
 parts {
   text: "A computer is like a very smart machine that can understand and follow our instructions, help us with our work, and even play games with us!"
 }
 role: "model"]

Você pode continuar enviando mensagens para continuar a conversa. Use o argumento stream=True para fazer streaming do chat:

response = chat.send_message("Okay, how about a more detailed explanation to a high schooler?", stream=True)

for chunk in response:
  print(chunk.text)
  print("_"*80)
A computer works by following instructions, called a program, which tells it what to
________________________________________________________________________________
 do. These instructions are written in a special language that the computer can understand, and they are stored in the computer's memory. The computer's processor
________________________________________________________________________________
, or CPU, reads the instructions from memory and carries them out, performing calculations and making decisions based on the program's logic. The results of these calculations and decisions are then displayed on the computer's screen or stored in memory for later use.

To give you a simple analogy, imagine a computer as a
________________________________________________________________________________
 chef following a recipe. The recipe is like the program, and the chef's actions are like the instructions the computer follows. The chef reads the recipe (the program) and performs actions like gathering ingredients (fetching data from memory), mixing them together (performing calculations), and cooking them (processing data). The final dish (the output) is then presented on a plate (the computer screen).

In summary, a computer works by executing a series of instructions, stored in its memory, to perform calculations, make decisions, and display or store the results.
________________________________________________________________________________

Os objetos genai.protos.Content contêm uma lista de objetos genai.protos.Part, cada um contendo um texto (string) ou inline_data (genai.protos.Blob), em que um blob contém dados binários e um mime_type. O histórico de chat está disponível como uma lista de objetos genai.protos.Content no ChatSession.history:

for message in chat.history:
  display(to_markdown(f'**{message.role}**: {message.parts[0].text}'))

usuário: em uma frase, explique como um computador funciona para uma criança.

model: o computador é como uma máquina muito inteligente que pode entender e seguir nossas instruções, nos ajudar em nosso trabalho e até mesmo jogar conosco.

usuário: Certo, que tal uma explicação mais detalhada para um estudante do ensino médio?

model: um computador trabalha seguindo instruções, chamadas de programa, que informam o que fazer. Essas instruções são escritas em uma linguagem especial que o computador consegue entender e são armazenadas na memória do computador. O processador (ou CPU) do computador lê as instruções da memória e as executa, realizando cálculos e tomando decisões com base na lógica do programa. Os resultados desses cálculos e decisões são exibidos na tela do computador ou armazenados na memória para uso posterior.

Para fazer uma analogia simples, imagine um computador como chef seguindo uma receita. A receita é como o programa, e as ações do chef são como as instruções que o computador segue. O chef lê a receita (o programa) e realiza ações como reunir ingredientes (buscar dados da memória), combiná-los (realizar cálculos) e cozinhar (processar dados). O prato final (a saída) é apresentado em um prato (a tela do computador).

Em resumo, um computador trabalha executando uma série de instruções, armazenadas em sua memória, para realizar cálculos, tomar decisões e exibir ou armazenar os resultados.

Contar tokens

Modelos de linguagem grandes têm uma janela de contexto, e o tamanho do contexto geralmente é medido em termos do número de tokens. Com a API Gemini, é possível determinar o número de tokens por qualquer objeto genai.protos.Content. No caso mais simples, você pode transmitir uma string de consulta ao método GenerativeModel.count_tokens da seguinte maneira:

model.count_tokens("What is the meaning of life?")
total_tokens: 7

Da mesma forma, é possível verificar token_count para seu ChatSession:

model.count_tokens(chat.history)
total_tokens: 501

Usar embeddings

Embedding é uma técnica usada para representar informações como uma lista de números de ponto flutuante em uma matriz. Com o Gemini, é possível representar textos (palavras, frases e blocos de texto) em forma vetorizada, o que facilita a comparação e o contraste de embeddings. Por exemplo, dois textos que compartilham um assunto ou sentimento semelhante precisam ter embeddings semelhantes, que podem ser identificados por técnicas de comparação matemática, como a similaridade de cossenos. Para mais informações sobre como e por que usar embeddings, consulte o guia de embeddings.

Use o método embed_content para gerar embeddings. O método lida com a incorporação das seguintes tarefas (task_type):

Tipo de tarefa Descrição
RETRIEVAL_QUERY Especifica que o texto é uma consulta em uma configuração de pesquisa/recuperação.
RETRIEVAL_DOCUMENT Especifica que o texto é um documento em uma configuração de pesquisa/recuperação. O uso desse tipo de tarefa requer um title.
SEMANTIC_SIMILARITY Especifica o texto a ser usado para similaridade textual semântica (STS).
CLASSIFICAÇÃO Especifica que os embeddings serão usados para classificação.
CLUSTERING Especifica que os embeddings serão usados para clustering.

O exemplo a seguir gera um embedding de uma única string para recuperação de documentos:

result = genai.embed_content(
    model="models/embedding-001",
    content="What is the meaning of life?",
    task_type="retrieval_document",
    title="Embedding of single string")

# 1 input > 1 vector output
print(str(result['embedding'])[:50], '... TRIMMED]')
[-0.003216741, -0.013358698, -0.017649598, -0.0091 ... TRIMMED]

Para processar lotes de strings, transmita uma lista de strings em content:

result = genai.embed_content(
    model="models/embedding-001",
    content=[
      'What is the meaning of life?',
      'How much wood would a woodchuck chuck?',
      'How does the brain work?'],
    task_type="retrieval_document",
    title="Embedding of list of strings")

# A list of inputs > A list of vectors output
for v in result['embedding']:
  print(str(v)[:50], '... TRIMMED ...')
[0.0040260437, 0.004124458, -0.014209415, -0.00183 ... TRIMMED ...
[-0.004049845, -0.0075574904, -0.0073463684, -0.03 ... TRIMMED ...
[0.025310587, -0.0080734305, -0.029902633, 0.01160 ... TRIMMED ...

Embora a função genai.embed_content aceite strings simples ou listas de strings, ela é criada em torno do tipo genai.protos.Content (como GenerativeModel.generate_content). Os objetos genai.protos.Content são as principais unidades de conversa na API.

Embora o objeto genai.protos.Content seja multimodal, o método embed_content só oferece suporte a embeddings de texto. Esse design oferece à API a possibilidade de expandir para embeddings multimodais.

response.candidates[0].content
parts {
  text: "A computer works by following instructions, called a program, which tells it what to do. These instructions are written in a special language that the computer can understand, and they are stored in the computer\'s memory. The computer\'s processor, or CPU, reads the instructions from memory and carries them out, performing calculations and making decisions based on the program\'s logic. The results of these calculations and decisions are then displayed on the computer\'s screen or stored in memory for later use.\n\nTo give you a simple analogy, imagine a computer as a chef following a recipe. The recipe is like the program, and the chef\'s actions are like the instructions the computer follows. The chef reads the recipe (the program) and performs actions like gathering ingredients (fetching data from memory), mixing them together (performing calculations), and cooking them (processing data). The final dish (the output) is then presented on a plate (the computer screen).\n\nIn summary, a computer works by executing a series of instructions, stored in its memory, to perform calculations, make decisions, and display or store the results."
}
role: "model"
result = genai.embed_content(
    model = 'models/embedding-001',
    content = response.candidates[0].content)

# 1 input > 1 vector output
print(str(result['embedding'])[:50], '... TRIMMED ...')
[-0.013921871, -0.03504407, -0.0051786783, 0.03113 ... TRIMMED ...

Da mesma forma, o histórico de chat contém uma lista de objetos genai.protos.Content, que você pode transmitir diretamente para a função embed_content:

chat.history
[parts {
   text: "In one sentence, explain how a computer works to a young child."
 }
 role: "user",
 parts {
   text: "A computer is like a very smart machine that can understand and follow our instructions, help us with our work, and even play games with us!"
 }
 role: "model",
 parts {
   text: "Okay, how about a more detailed explanation to a high schooler?"
 }
 role: "user",
 parts {
   text: "A computer works by following instructions, called a program, which tells it what to do. These instructions are written in a special language that the computer can understand, and they are stored in the computer\'s memory. The computer\'s processor, or CPU, reads the instructions from memory and carries them out, performing calculations and making decisions based on the program\'s logic. The results of these calculations and decisions are then displayed on the computer\'s screen or stored in memory for later use.\n\nTo give you a simple analogy, imagine a computer as a chef following a recipe. The recipe is like the program, and the chef\'s actions are like the instructions the computer follows. The chef reads the recipe (the program) and performs actions like gathering ingredients (fetching data from memory), mixing them together (performing calculations), and cooking them (processing data). The final dish (the output) is then presented on a plate (the computer screen).\n\nIn summary, a computer works by executing a series of instructions, stored in its memory, to perform calculations, make decisions, and display or store the results."
 }
 role: "model"]
result = genai.embed_content(
    model = 'models/embedding-001',
    content = chat.history)

# 1 input > 1 vector output
for i,v in enumerate(result['embedding']):
  print(str(v)[:50], '... TRIMMED...')
[-0.014632266, -0.042202696, -0.015757175, 0.01548 ... TRIMMED...
[-0.010979066, -0.024494737, 0.0092659835, 0.00803 ... TRIMMED...
[-0.010055617, -0.07208932, -0.00011750793, -0.023 ... TRIMMED...
[-0.013921871, -0.03504407, -0.0051786783, 0.03113 ... TRIMMED...

Casos de uso avançado

As seções a seguir discutem casos de uso avançados e detalhes de nível inferior do SDK do Python para a API Gemini.

Configurações de segurança

O argumento safety_settings permite configurar o que o modelo bloqueia e permite em comandos e respostas. Por padrão, as configurações de segurança bloqueiam conteúdo com probabilidade média e/ou alta de não ser seguro em todas as dimensões. Saiba mais sobre as Configurações de segurança.

Insira um comando questionável e execute o modelo com as configurações de segurança padrão. Nenhum candidato será retornado:

response = model.generate_content('[Questionable prompt here]')
response.candidates
[content {
  parts {
    text: "I\'m sorry, but this prompt involves a sensitive topic and I\'m not allowed to generate responses that are potentially harmful or inappropriate."
  }
  role: "model"
}
finish_reason: STOP
index: 0
safety_ratings {
  category: HARM_CATEGORY_SEXUALLY_EXPLICIT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HATE_SPEECH
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HARASSMENT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_DANGEROUS_CONTENT
  probability: NEGLIGIBLE
}
]

O prompt_feedback vai informar qual filtro de segurança bloqueou o comando:

response.prompt_feedback
safety_ratings {
  category: HARM_CATEGORY_SEXUALLY_EXPLICIT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HATE_SPEECH
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HARASSMENT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_DANGEROUS_CONTENT
  probability: NEGLIGIBLE
}

Agora envie o mesmo comando ao modelo com as configurações de segurança recém-definidas, e talvez você receba uma resposta.

response = model.generate_content('[Questionable prompt here]',
                                  safety_settings={'HARASSMENT':'block_none'})
response.text

Além disso, cada candidato tem a própria safety_ratings, caso o comando seja aprovado, mas as respostas individuais sejam reprovadas nas verificações de segurança.

Codificar mensagens

As seções anteriores dependiam do SDK para facilitar o envio de prompts à API. Esta seção oferece um equivalente totalmente digitado ao exemplo anterior, para que você possa entender melhor os detalhes de nível inferior sobre como o SDK codifica as mensagens.

A biblioteca de cliente google.ai.generativelanguage está subjacente ao SDK do Python:

O SDK tenta converter sua mensagem em um objeto genai.protos.Content, que contém uma lista de objetos genai.protos.Part. Cada um deles contém:

  1. text (string)
  2. inline_data (genai.protos.Blob), em que um blob contém um data binário e um mime_type.

Também é possível transmitir qualquer uma dessas classes como um dicionário equivalente.

Portanto, o equivalente totalmente digitado do exemplo anterior é:

model = genai.GenerativeModel('gemini-1.5-flash')
response = model.generate_content(
    genai.protos.Content(
        parts = [
            genai.protos.Part(text="Write a short, engaging blog post based on this picture."),
            genai.protos.Part(
                inline_data=genai.protos.Blob(
                    mime_type='image/jpeg',
                    data=pathlib.Path('image.jpg').read_bytes()
                )
            ),
        ],
    ),
    stream=True)
response.resolve()

to_markdown(response.text[:100] + "... [TRIMMED] ...")

Preparar as refeições é uma ótima maneira de economizar tempo e dinheiro, e também pode ajudá-lo a ter uma alimentação mais saudável. Por ... [TRIMMED] ...

Conversas com vários turnos

Embora a classe genai.ChatSession mostrada anteriormente possa lidar com muitos casos de uso, ela faz algumas suposições. Caso seu caso de uso não se encaixe nessa implementação de chat, é bom lembrar que genai.ChatSession é apenas um wrapper em torno de GenerativeModel.generate_content. Além de solicitações únicas, ele pode processar conversas de vários turnos.

As mensagens individuais são objetos genai.protos.Content ou dicionários compatíveis, como visto nas seções anteriores. Como dicionário, a mensagem requer as chaves role e parts. O role em uma conversa pode ser o user, que fornece os comandos, ou o model, que fornece as respostas.

Transmita uma lista de objetos genai.protos.Content e ela será tratada como um chat de vários turnos:

model = genai.GenerativeModel('gemini-1.5-flash')

messages = [
    {'role':'user',
     'parts': ["Briefly explain how a computer works to a young child."]}
]
response = model.generate_content(messages)

to_markdown(response.text)

Imagine que o computador é um amigo muito inteligente que pode ajudar em muitas coisas. Assim como você tem um cérebro para pensar e aprender, um computador também tem um cérebro, chamado de processador. É como o chefe do computador, dizendo o que fazer.

Dentro do computador, há um lugar especial chamado "memória", que é como uma grande caixa de armazenamento. Ele lembra de tudo o que você pede para fazer, como abrir jogos ou abrir vídeos.

Quando você pressiona botões no teclado ou clica nas coisas na tela com o mouse, você está enviando mensagens para o computador. Essas mensagens viajam por fios especiais, chamados cabos, até o processador.

O processador lê as mensagens e diz ao computador o que fazer. Ele pode abrir programas, mostrar imagens ou até mesmo tocar músicas para você.

Tudo o que você vê na tela é criado pela placa gráfica, que é como um artista mágico dentro do computador. Ele transforma as instruções do processador em imagens e vídeos coloridos.

Para salvar seus vídeos, fotos ou jogos favoritos, o computador usa um espaço de armazenamento especial chamado disco rígido. É como uma biblioteca gigante onde o computador guarda todos os seus itens valiosos.

E quando você quer se conectar à Internet para jogar com amigos ou assistir vídeos engraçados, o computador usa uma placa de rede para enviar e receber mensagens por cabos de Internet ou sinais Wi-Fi.

Assim como seu cérebro ajuda você a aprender e jogar, o processador, a memória, a placa de vídeo, o disco rígido e a placa de rede do computador trabalham juntos para fazer do computador um amigo superinteligente que pode ajudar você a fazer coisas incríveis!

Para continuar a conversa, adicione a resposta e outra mensagem.

messages.append({'role':'model',
                 'parts':[response.text]})

messages.append({'role':'user',
                 'parts':["Okay, how about a more detailed explanation to a high school student?"]})

response = model.generate_content(messages)

to_markdown(response.text)

Em sua essência, um computador é uma máquina que pode ser programada para executar um conjunto de instruções. Ele consiste em vários componentes essenciais que trabalham juntos para processar, armazenar e exibir informações:

1. Processador (CPU): o cérebro do computador - Executa instruções e realiza cálculos. - Velocidade medida em gigahertz (GHz). - Mais GHz indica que o processamento é mais rápido.

2. Memória (RAM): - armazenamento temporário para dados que estão sendo processados. - Mantém as instruções e os dados enquanto o programa está em execução. - Medido em gigabytes (GB). - Com mais GB de RAM, é possível executar mais programas simultaneamente.

3. Armazenamento (HDD/SSD): armazenamento permanente de dados. - Armazena o sistema operacional, os programas e os arquivos do usuário. - Medido em gigabytes (GB) ou terabytes (TB). - As unidades de disco rígido (HDDs) são tradicionais, mais lentas e mais baratas. - As unidades de estado sólido (SSDs) são mais recentes, mais rápidas e mais caras.

4. Placa de vídeo (GPU): processa e exibe imagens. - Essencial para jogos, edição de vídeos e outras tarefas com uso intenso de gráficos. - Medida em RAM de vídeo (VRAM) e velocidade do clock.

5. Placa-mãe: conecta todos os componentes. - Fornece caminhos de força e comunicação.

6. Dispositivos de entrada/saída (E/S): permitem que o usuário interaja com o computador. - Exemplos: teclado, mouse, monitor, impressora.

7. Sistema operacional (SO): software que gerencia os recursos do computador. - Fornece uma interface de usuário e uma funcionalidade básica. – Exemplos: Windows, macOS, Linux.

Quando você executa um programa no computador, acontece o seguinte:

  1. As instruções do programa são carregadas do armazenamento para a memória.
  2. O processador lê as instruções da memória e as executa uma a uma.
  3. Se a instrução envolve cálculos, o processador os executa usando a unidade lógica aritmética (ALU, na sigla em inglês).
  4. Se a instrução envolve dados, o processador lê ou grava na memória.
  5. Os resultados dos cálculos ou da manipulação de dados são armazenados na memória.
  6. Se o programa precisar exibir algo na tela, ele enviará os dados necessários para a placa de vídeo.
  7. A placa de vídeo processa os dados e os envia para o monitor, que os exibe.

Esse processo continua até que o programa conclua a tarefa ou até que o usuário o encerre.

Configuração de geração

O argumento generation_config permite modificar os parâmetros de geração. Cada comando que você envia ao modelo inclui valores de parâmetros que controlam como o modelo gera respostas.

model = genai.GenerativeModel('gemini-1.5-flash')
response = model.generate_content(
    'Tell me a story about a magic backpack.',
    generation_config=genai.types.GenerationConfig(
        # Only one candidate for now.
        candidate_count=1,
        stop_sequences=['x'],
        max_output_tokens=20,
        temperature=1.0)
)
text = response.text

if response.candidates[0].finish_reason.name == "MAX_TOKENS":
    text += '...'

to_markdown(text)

Era uma vez, em uma pequena cidade aninhada entre colinas verdes exuberantes, uma menina chamada...

A seguir

  • O design de comandos é o processo de criação de comandos que extraem a resposta desejada dos modelos de linguagem. Escrever comandos bem estruturados é essencial para garantir respostas precisas e de alta qualidade de um modelo de linguagem. Saiba mais sobre as práticas recomendadas para gravação de comandos.
  • O Gemini oferece diversas variações de modelo para atender às necessidades de diferentes casos de uso, como tipos de entrada e complexidade, implementações para chat ou outras tarefas de linguagem de diálogo e restrições de tamanho. Saiba mais sobre os modelos do Gemini disponíveis.