Introdução à API Gemini: Python

Ver no Google AI Executar no Google Colab Consulte 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 permite 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. Gerar respostas de texto com base em entradas multimodais (texto e imagens).
  4. Use o Gemini para conversas com várias interações (chat).
  5. Use embeddings para modelos de linguagem grandes.

Pré-requisitos

Você pode 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 o 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á incluído 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, é necessário ter 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 secrets abaixo do "", no painel à esquerda. Dê o nome GOOGLE_API_KEY a ela.

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ê pode chamar a API Gemini. Use list_models para ver os modelos Gemini disponíveis:

  • gemini-pro: otimizado para comandos somente de texto.
  • gemini-pro-vision: otimizado para comandos de texto e imagens.
for m in genai.list_models():
  if 'generateContent' in m.supported_generation_methods:
    print(m.name)

O pacote genai também oferece suporte à família de modelos PaLM, mas apenas os modelos do Gemini oferecem suporte aos recursos genéricos e multimodais do método generateContent.

Gerar texto com base em entradas de texto

Para comandos somente de texto, use o modelo gemini-pro:

model = genai.GenerativeModel('gemini-pro')

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

No caso mais simples, é possível transmitir uma string de solicitação 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, você só precisa do acessador response.text. Para exibir o texto Markdown formatado, use a função to_markdown:

to_markdown(response.text)

A consulta do propósito da vida perturbou as pessoas ao longo de séculos, culturas e continentes. Embora não haja uma resposta universalmente reconhecida, muitas ideias surgiram, e a resposta costuma depender de ideias, crenças e experiências de vida individuais.

  1. Felicidade e bem-estar:muitas pessoas acreditam que o objetivo da vida é ter felicidade e bem-estar pessoal. Isso pode envolver localizar atividades que proporcionem alegria, estabelecer conexões significativas, cuidar da saúde física e mental da pessoa 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 incluir o exercício de uma profissão que beneficie outras pessoas, o envolvimento em atividades voluntárias ou beneficentes, geração de arte ou literatura ou invenções.

  3. Autorealização e crescimento pessoal:a busca pela autorealização e pelo desenvolvimento pessoal é outro objetivo comum da vida. Isso pode envolver aprender novas habilidades, ampliar 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 forma ética e moral. Isso pode envolver aderir aos princípios morais de alguém, fazer a coisa certa mesmo quando é difícil, e tentar tornar o mundo um lugar melhor.

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

  6. Vida ao máximo:algumas pessoas acreditam que o objetivo da vida é viver ao máximo. Isso pode envolver viajar, tentar 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 duradouros no mundo. Isso pode envolver a realização de algo notável, ser lembrado por suas contribuições ou inspirar e motivar outras pessoas.

  8. Em busca de equilíbrio e harmonia:para algumas pessoas, o propósito da vida é encontrar equilíbrio e harmonia em todos os aspectos. Isso pode envolver conciliar obrigações pessoais, profissionais e sociais, buscar paz e contentamento interno e levar uma vida de acordo com os valores e as crenças da pessoa.

Em última análise, 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 ela foi bloqueada por questões de segurança relacionadas à solicitação.

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
}

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.

Visualize os candidatos para as respostas 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, e o modelo vai retornar blocos da resposta assim que 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 estarão disponíveis até que você tenha iterado 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 fornece um modelo multimodal (gemini-pro-vision) que aceita texto, imagens e entradas. A API GenerativeModel.generate_content foi projetada para processar solicitações multimodais e retornar uma 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

Use o modelo gemini-pro-vision e transmita a imagem para o modelo com generate_content.

model = genai.GenerativeModel('gemini-pro-vision')
response = model.generate_content(img)

to_markdown(response.text)

Tigelas de preparação de refeições para Teriyaki com arroz integral, brócolis assado e pimentão.

Para fornecer texto e imagens em um comando, transmita uma lista contendo as strings e 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 refeições é uma ótima maneira de economizar tempo e dinheiro, além de ajudar você a comer de modo saudável. Esta refeição é um ótimo exemplo de uma refeição saudável e deliciosa que pode ser facilmente preparada com antecedência.

Essa refeição inclui arroz integral, legumes assados e teriyaki de frango. O arroz integral é um grão integral com alto teor de fibras e nutrientes. Os vegetais assados são uma ótima maneira de receber sua dose diária de vitaminas e minerais. O frango teriyaki é uma fonte magra de proteína, que também é muito saborosa.

Esta refeição é fácil de preparar com antecedência. Basta cozinhar o arroz integral, assar os vegetais e cozinhar o teriyaki de frango. Em seguida, divida a refeição em embalagens individuais e armazene na geladeira. Quando quiser comer, é só pegar um recipiente e aquecê-lo.

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

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

Conversas por chat

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

Inicialize o chat:

model = genai.GenerativeModel('gemini-pro')
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. A mensagem e a resposta também são anexadas ao histórico de chat:

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 consegue entender e seguir nossas instruções, nos ajudar com nosso trabalho e até mesmo jogar com a gente!

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"]

Continue enviando mensagens para continuar a conversa. Use o argumento stream=True para transmitir o 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 glm.Content contêm uma lista de objetos glm.Part, cada um contendo um texto (string) ou inline_data (glm.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 glm.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: um computador é como uma máquina muito inteligente que consegue entender e seguir nossas instruções, nos ajudar com nosso trabalho e até mesmo jogar com a gente.

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

model: um computador funciona seguindo instruções, chamadas de programa, que dizem o que fazer. Essas instruções são escritas em uma linguagem especial que o computador entende e são armazenadas na memória do computador. O processador do computador, ou CPU, 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 então exibidos na tela do computador ou armazenados na memória para uso posterior.

Para fazer uma analogia simples, imagine um computador como um 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), misturá-los (realizar cálculos) e prepará-los (processamento de dados). O prato final (a saída) é apresentado em um prato (a tela do computador).

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

Tokens de contagem

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 glm.Content. No caso mais simples, é possível transmitir uma string de consulta ao método GenerativeModel.count_tokens desta forma:

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

Da mesma forma, você pode 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 texto (palavras, frases e blocos de texto) de forma vetorial, facilitando a comparação e o contraste de embeddings. Por exemplo, dois textos que compartilham um assunto ou sentimento semelhante devem ter embeddings semelhantes, que podem ser identificados por meio de técnicas matemáticas de comparação, 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 código abaixo gera um embedding para 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 glm.Content (como GenerativeModel.generate_content). Os objetos glm.Content são as principais unidades de conversa na API.

Embora o objeto glm.Content seja multimodal, o método embed_content oferece suporte apenas a embeddings de texto. Com esse design, a API tem possibilidade de ser expandida 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 glm.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 nos comandos e nas 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. Ele não vai retornar nenhum candidato:

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 a solicitação:

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 forneça o mesmo comando ao modelo com as configurações de segurança recém-definidas. É possível que você receba uma resposta.

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

Observe também que cada candidato tem o próprio 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 solicitações à API. Esta seção oferece um equivalente completo do exemplo anterior, para que você possa entender melhor os detalhes de nível inferior sobre como o SDK codifica as mensagens.

Abaixo do SDK para Python está a biblioteca de cliente google.ai.generativelanguage:

import google.ai.generativelanguage as glm

O SDK tenta converter sua mensagem em um objeto glm.Content, que contém uma lista de objetos glm.Part, cada um contendo:

  1. um text (string)
  2. inline_data (glm.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.

Assim, o equivalente totalmente digitado ao exemplo anterior é:

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

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

Preparar refeições é uma ótima maneira de economizar tempo e dinheiro, além de ajudar você a comer de modo 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 lidar com conversas de vários turnos.

As mensagens individuais são objetos glm.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 as solicitações, ou o model, que fornece as respostas.

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

model = genai.GenerativeModel('gemini-pro')

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

to_markdown(response.text)

Imagine um computador como um amigo muito inteligente que pode ajudar com muitas coisas. Assim como você tem um cérebro para pensar e aprender, um computador também tem um, 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. Ela lembra de tudo o que você pede, como abrir jogos ou abrir vídeos.

Quando você pressiona os botões do teclado ou clica em itens na tela com o mouse, está enviando mensagens para o computador. Essas mensagens passam por fios especiais, chamados de 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úsica para você.

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

Para salvar seus jogos, vídeos ou fotos favoritos, o computador usa um espaço de armazenamento especial chamado disco rígido. É como uma gigantesca biblioteca onde o computador pode manter todas as suas coisas preciosas em segurança.

E quando você quer se conectar à Internet para jogar com amigos ou assistir vídeos engraçados, o computador usa algo chamado placa de rede para enviar e receber mensagens pelos cabos de Internet ou sinais de 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 tornar o 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. Ela consiste em vários componentes essenciais que funcionam juntos para processar, armazenar e exibir informações:

1. Processador (CPU): - O cérebro do computador. - Executa instruções e cálculos. - Velocidade medida em gigahertz (GHz). - Mais GHz geralmente significa um processamento mais rápido.

2. Memória (RAM): - armazenamento temporário para dados que estão sendo processados. - Mantém instruções e dados enquanto o programa está sendo executado. - Medido em gigabytes (GB). - Mais GB de RAM permite que mais programas sejam executados simultaneamente.

3. Armazenamento (HDD/SSD): armazenamento permanente para dados. - Armazena o sistema operacional, programas e 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 novas, 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 que consomem muitos recursos gráficos. - Medida em RAM de vídeo (VRAM) e velocidade do clock.

5. Placa-mãe: - conecta todos os componentes. - Fornece energia e caminhos de 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 do usuário e uma funcionalidade básica. - Exemplos: Windows, macOS e Linux.

Quando você executa um programa no seu 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 na 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 sua tarefa ou o usuário o encerre.

Configuração de geração

O argumento generation_config permite modificar os parâmetros de geração. Todos os comandos enviados ao modelo incluem valores de parâmetros que controlam como o modelo gera respostas.

model = genai.GenerativeModel('gemini-pro')
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 em meio a colinas verdes exuberantes, vivia uma menina chamada...

A seguir

  • O design de comandos é o processo de criação de comandos que geram 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 escrever 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 Genmini disponíveis.
  • Gemini oferece opções para solicitar aumentos no limite de taxa. O limite de taxa para modelos Gemini-Pro é de 60 solicitações por minuto (RPM).