Instructivo: Comienza a usar la API de Gemini


Ver en la IA de Google Ejecutar en Google Colab Ver código fuente en GitHub

En esta guía de inicio rápido, se muestra cómo usar el SDK de Python para la API de Gemini, que te brinda acceso a los modelos grandes de lenguaje de Gemini de Google. En esta guía de inicio rápido, aprenderás a realizar las siguientes tareas:

  1. Configura tu entorno de desarrollo y el acceso a la API para usar Gemini.
  2. Generar respuestas de texto a partir de entradas de texto
  3. Generar respuestas de texto a partir de entradas multimodales (imágenes y texto)
  4. Usa Gemini para conversaciones de varios turnos (chat).
  5. Usa incorporaciones para modelos grandes de lenguaje.

Requisitos previos

Puedes ejecutar esta guía de inicio rápido en Google Colab, que ejecuta este notebook directamente en el navegador y no requiere configuración de entorno adicional.

Como alternativa, para completar esta guía de inicio rápido de manera local, asegúrate de que tu entorno de desarrollo cumpla con los siguientes requisitos:

  • Python 3.9 y versiones posteriores
  • Una instalación de jupyter para ejecutar el notebook

Configuración

Instala el SDK de Python

El SDK de Python para la API de Gemini se encuentra en el paquete google-generativeai. Instala la dependencia con pip:

pip install -q -U google-generativeai

Importa paquetes

Importa los paquetes necesarios.

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

Configura tu clave de API

Para poder usar la API de Gemini, primero debes obtener una clave de API. Si aún no tienes una, crea una con un clic en Google AI Studio.

Obtén una clave de API.

En Colab, agrega la clave al administrador de Secrets en la "automated" del panel izquierdo. Asígnale el nombre GOOGLE_API_KEY.

Una vez que tengas la clave de API, pásala al SDK. Puedes hacerlo de dos maneras:

  • Coloca la clave en la variable de entorno GOOGLE_API_KEY (el SDK la recogerá automáticamente desde allí).
  • Pasa la llave a 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)

Enumera modelos

Ya tienes todo listo para llamar a la API de Gemini. Usa list_models para ver los modelos de Gemini disponibles:

  • gemini-1.5-flash: nuestro modelo multimodal más rápido
  • gemini-1.5-pro: nuestro modelo multimodal más inteligente y capaz
for m in genai.list_models():
  if 'generateContent' in m.supported_generation_methods:
    print(m.name)

Cómo generar texto a partir de entradas de texto

Para instrucciones de solo texto, usa un modelo Gemini 1.5 o Gemini 1.0 Pro:

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

El método generate_content puede controlar una gran variedad de casos de uso, incluido el chat de varios turnos y la entrada multimodal, según lo que admita el modelo subyacente. Los modelos disponibles solo admiten imágenes y texto como entrada y texto como salida.

En el caso más simple, puedes pasar una cadena de mensaje al 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

En casos simples, solo necesitas el descriptor de acceso de response.text. Para mostrar texto de Markdown con formato, usa la función to_markdown:

to_markdown(response.text)

La búsqueda del propósito de la vida ha perplejo a las personas por siglos, culturas y continentes. Si bien no existe una respuesta universalmente reconocida, se presentaron muchas ideas y, con frecuencia, la respuesta depende de ideas, creencias y experiencias de vida individuales.

  1. Felicidad y bienestar: Muchas personas creen que el objetivo de la vida es alcanzar la felicidad y el bienestar personales. Esto podría implicar buscar actividades que brinden alegría, establecer conexiones significativas, cuidar la salud física y mental, y perseguir intereses y objetivos personales.

  2. Contribución significativa: Algunas personas creen que el propósito de la vida es hacer una contribución significativa al mundo. Esto podría implicar ejercer una profesión que beneficie a los demás, participar en actividades voluntarias o de caridad, generar arte o literatura, o inventar.

  3. Autorealización y crecimiento personal: Otro objetivo común de la vida es perseguir la autorrealización y el desarrollo personal. Esto podría implicar aprender nuevas habilidades, superar los límites propios, enfrentar obstáculos personales y evolucionar como persona.

  4. Comportamiento ético y moral: Algunas personas creen que el objetivo de la vida es actuar de manera ética y moral. Esto podría implicar apegarse a los principios morales de uno, hacer lo correcto incluso cuando es difícil e intentar hacer del mundo un lugar mejor.

  5. Satisfacción espiritual: Para algunos, el propósito de la vida está conectado con creencias espirituales o religiosas. Esto podría implicar buscar una conexión con un poder superior, practicar rituales religiosos o seguir enseñanzas espirituales.

  6. Experimentar la vida al máximo: Algunas personas creen que el objetivo de la vida es experimentar todo lo que tiene para ofrecer. Esto podría implicar viajar, probar cosas nuevas, tomar riesgos y adoptar nuevos encuentros.

  7. El legado y el impacto: Otras personas creen que el propósito de la vida es dejar un legado duradero y un impacto en el mundo. Esto puede implicar lograr algo digno de mención, ser recordado por las contribuciones de uno o inspirar y motivar a los demás.

  8. Encontrar equilibrio y armonía: Para algunas personas, el propósito de su vida es encontrar equilibrio y armonía en todos los aspectos de sus vidas. Esto podría implicar hacer malabares con las obligaciones personales, profesionales y sociales, buscar la paz interior y la satisfacción, y vivir una vida que esté de acuerdo con los valores y las creencias de uno.

En última instancia, el significado de la vida es un viaje personal, y diferentes individuos pueden descubrir su propio propósito a través de sus experiencias, reflexiones e interacciones con el mundo que los rodea.

Si la API no pudo mostrar un resultado, usa GenerateContentResponse.prompt_feedback para ver si se bloqueó debido a problemas de seguridad relacionados con el mensaje.

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 puede generar varias respuestas posibles para una sola instrucción. Estas respuestas posibles se denominan candidates, y puedes revisarlas para seleccionar la más adecuada.

Visualiza los candidatos de respuesta con 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
}
]

De forma predeterminada, el modelo muestra una respuesta después de completar todo el proceso de generación. También puedes transmitir la respuesta a medida que se genera, y el modelo mostrará fragmentos de la respuesta tan pronto como se generen.

Para transmitir las respuestas, usa 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 la transmisión, algunos atributos de respuesta no estarán disponibles hasta que iteres todos los fragmentos de respuesta. Esto se demuestra a continuación:

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

El 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
}

Sin embargo, los atributos como text no hacen lo siguiente:

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()`)

Genera texto a partir de imágenes y entradas de texto

Gemini proporciona varios modelos que pueden controlar entradas multimodales (modelos Gemini 1.5 y Gemini 1.0 Pro Vision) para que puedas ingresar texto e imágenes. Asegúrate de revisar los requisitos de las imágenes para los mensajes.

Cuando la entrada de la instrucción incluya imágenes y texto, usa un modelo de Gemini 1.5 o un modelo de Gemini 1.0 Pro Vision con el método GenerativeModel.generate_content para generar una salida de texto:

Incluyamos una imagen:

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

Usa un modelo Gemini 1.5 y pasa la imagen al modelo con generate_content.

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

to_markdown(response.text)

Cuencos para preparar comida de pollo Teriyaki con arroz integral, brócoli asado y pimientos.

Para proporcionar tanto texto como imágenes en una instrucción, pasa una lista que contenga las cadenas y las imágenes:

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 comidas es una excelente manera de ahorrar tiempo y dinero, y también puede ayudar a comer de forma más saludable. Esta comida es un excelente ejemplo de un plato saludable y deliciosa que se puede preparar fácilmente con anticipación.

Esta comida incluye arroz integral, verduras asadas y pollo teriyaki. El arroz integral es un cereal integral alto en fibra y nutrientes. Los vegetales asados son una excelente manera de obtener su dosis diaria de vitaminas y minerales. El pollo teriyaki es una fuente magra de proteína que también está llena de sabor.

Es fácil preparar esta comida con anticipación. Solo debes cocinar el arroz integral, asar los vegetales y cocinar el teriyaki de pollo. Luego, divida la comida en contenedores individuales y guárdelos en el refrigerador. Cuando tenga todo listo para comer, simplemente tome un recipiente y caléntelo.

Este plato es una excelente opción para las personas ocupadas que buscan una forma de comer saludable y deliciosa. También es una excelente comida para quienes buscan perder peso o mantener un peso saludable.

Si buscas una comida saludable y deliciosa que se pueda preparar fácilmente con anticipación, esta es una gran opción. ¡Pruébalo hoy mismo!

Conversaciones de chat

Gemini te permite mantener conversaciones de formato libre en varios turnos. La clase ChatSession simplifica el proceso, ya que administra el estado de la conversación, por lo que, a diferencia de generate_content, no necesitas almacenar el historial de conversaciones como una lista.

Inicializa el chat:

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

El método ChatSession.send_message muestra el mismo tipo de GenerateContentResponse que GenerativeModel.generate_content. También agrega tu mensaje y la respuesta al historial de chat:

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

Una computadora es como una máquina muy inteligente que puede entender y seguir nuestras instrucciones, ayudarnos con nuestro trabajo e incluso jugar con nosotros.

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

Puedes seguir enviando mensajes para continuar la conversación. Usa el argumento stream=True para transmitir el 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.
________________________________________________________________________________

Los objetos genai.protos.Content contienen una lista de objetos genai.protos.Part, cada uno de los cuales contiene un texto (string) o datos_intercalados (genai.protos.Blob), donde un BLOB contiene datos binarios y un mime_type. El historial de chat está disponible como una lista de objetos genai.protos.Content en ChatSession.history:

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

usuario: En una oración, explica cómo funciona una computadora a un niño pequeño.

model: Una computadora es como una máquina muy inteligente que puede entender y seguir nuestras instrucciones, ayudarnos con nuestro trabajo e incluso jugar con nosotros.

usuario: Bien, ¿qué te parece una explicación más detallada para un estudiante de secundaria?

model: Una computadora sigue instrucciones, llamadas programa, que le indican qué hacer. Estas instrucciones están escritas en un lenguaje especial que la computadora puede comprender y se almacenan en su memoria. El procesador de la computadora, o CPU, lee las instrucciones de la memoria y las lleva a cabo, realizando cálculos y tomando decisiones basadas en la lógica del programa. Los resultados de estos cálculos y decisiones luego se muestran en la pantalla de la computadora o se almacenan en la memoria para su uso posterior.

Para darte una analogía simple, imagina a una computadora como un chef que sigue una receta. La receta es como el programa, y las acciones del chef son como las instrucciones que sigue la computadora. El chef lee la receta (el programa) y realiza acciones como recopilar ingredientes (recuperar datos de la memoria), mezclarlos (realizar cálculos) y cocinarlos (procesar datos). El plato final (la salida) se presenta en un plato (la pantalla de la computadora).

En resumen, una computadora ejecuta una serie de instrucciones, almacenadas en su memoria, para realizar cálculos, tomar decisiones y mostrar o almacenar los resultados.

Contar tokens

Los modelos grandes de lenguaje tienen una ventana de contexto, y la longitud del contexto a menudo se mide en términos de la cantidad de tokens. Con la API de Gemini, puedes determinar la cantidad de tokens por cualquier objeto genai.protos.Content. En el caso más simple, puedes pasar una cadena de consulta al método GenerativeModel.count_tokens de la siguiente manera:

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

De manera similar, puedes verificar token_count para tu ChatSession:

model.count_tokens(chat.history)
total_tokens: 501

Usa incorporaciones

La incorporación es una técnica que se usa para representar información como una lista de números de punto flotante en un array. Con Gemini, puedes representar texto (palabras, oraciones y bloques de texto) en un formato vectorizado, lo que facilita la comparación y el contraste de las incorporaciones. Por ejemplo, dos textos que comparten un tema o una opinión similar deben tener incorporaciones similares, que pueden identificarse a través de técnicas de comparación matemática, como la similitud coseno. Para obtener más información sobre cómo y por qué deberías usar las incorporaciones, consulta la Guía de incorporaciones.

Usa el método embed_content para generar incorporaciones. El método controla la incorporación de las siguientes tareas (task_type):

Tipo de tarea Descripción
RETRIEVAL_QUERY Especifica que el texto dado es una consulta en un parámetro de configuración de búsqueda/recuperación.
RETRIEVAL_DOCUMENT Especifica que el texto dado de un documento en un parámetro de configuración de búsqueda y recuperación. Para usar este tipo de tarea, se requiere un title.
SEMANTIC_SIMILARITY Especifica que el texto dado se usará para la similitud textual semántica (STS).
CLASIFICACIÓN Especifica que las incorporaciones se usarán para la clasificación.
CLÚSTERES Especifica que las incorporaciones se usarán para el agrupamiento en clústeres.

Lo siguiente genera una incorporación para una sola string para la recuperación 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 controlar lotes de strings, pasa una lista de strings en 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 ...

Si bien la función genai.embed_content acepta cadenas simples o listas de cadenas, en realidad se compila en torno al tipo genai.protos.Content (como GenerativeModel.generate_content). Los objetos genai.protos.Content son las unidades principales de conversación en la API.

Si bien el objeto genai.protos.Content es multimodal, el método embed_content solo admite incorporaciones de texto. Este diseño le otorga a la API la posibilidad de expandirse a incorporaciones multimodales.

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 ...

Del mismo modo, el historial de chat contiene una lista de objetos genai.protos.Content, que puedes pasar directamente a la función 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 avanzados

En las siguientes secciones, se analizan casos de uso avanzados y detalles de nivel inferior del SDK de Python para la API de Gemini.

Configuración de seguridad

El argumento safety_settings te permite configurar lo que bloquea el modelo y permite tanto en los mensajes como en las respuestas. La configuración de seguridad bloquea el contenido con probabilidad media o alta de ser contenido inseguro en todas las dimensiones. Obtén más información sobre la configuración de seguridad.

Ingresa un mensaje cuestionable y ejecuta el modelo con la configuración de seguridad predeterminada. No mostrará ningún 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
}
]

prompt_feedback te indicará qué filtro de seguridad bloqueó el mensaje:

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
}

Ahora envía la misma instrucción al modelo con los nuevos ajustes de seguridad establecidos, y podrías recibir una respuesta.

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

Además, ten en cuenta que cada candidato tiene su propio safety_ratings, en caso de que se apruebe la solicitud y las respuestas individuales no pasen las verificaciones de seguridad.

Codificar mensajes

Las secciones anteriores se basaban en el SDK para facilitar el envío de instrucciones a la API. Esta sección ofrece un equivalente completo al del ejemplo anterior, para que puedas comprender mejor los detalles de nivel inferior relacionados con la forma en que el SDK codifica mensajes.

Detrás del SDK de Python, se encuentra la biblioteca cliente de google.ai.generativelanguage:

El SDK intenta convertir tu mensaje en un objeto genai.protos.Content, que contiene una lista de objetos genai.protos.Part con alguno de los siguientes elementos:

  1. un text (cadena)
  2. inline_data (genai.protos.Blob), donde un BLOB contiene objetos binarios data y mime_type.

También puedes pasar cualquiera de estas clases como un diccionario equivalente.

Por lo tanto, el equivalente completo del ejemplo anterior es el siguiente:

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 comidas es una excelente manera de ahorrar tiempo y dinero, y también puede ayudar a comer de forma más saludable. Por ... [TRIMMED] ...

Conversaciones de varios turnos

Si bien la clase genai.ChatSession que se mostró antes puede manejar muchos casos de uso, sí hace algunas suposiciones. Si tu caso de uso no encaja en esta implementación de chat, recuerda que genai.ChatSession es solo un wrapper alrededor de GenerativeModel.generate_content. Además de solicitudes individuales, puede controlar conversaciones de varios turnos.

Los mensajes individuales son objetos genai.protos.Content o diccionarios compatibles, como se vio en las secciones anteriores. Como diccionario, el mensaje requiere las claves role y parts. El role de una conversación puede ser el user, que proporciona los mensajes, o el model, que proporciona las respuestas.

Pasa una lista de objetos genai.protos.Content y se tratará como un chat de varios 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)

Imagina una computadora como un amigo realmente inteligente que puede ayudarte con muchas cosas. Así como tienes un cerebro para pensar y aprender, una computadora también tiene un cerebro, denominado procesador. Es como el jefe de la computadora y le dice qué hacer.

Dentro de la computadora, hay un lugar especial llamado memoria, que es como una gran caja de almacenamiento. Recuerda todo lo que le pidas que haga, como abrir juegos o mirar videos.

Cuando presionas botones en el teclado o haces clic en cosas en la pantalla con el mouse, estás enviando mensajes a la computadora. Estos mensajes viajan a través de cables especiales, llamados cables, hasta el procesador.

El procesador lee los mensajes y le dice a la computadora qué hacer. Puede abrir programas, mostrarte imágenes o incluso reproducir música.

Todo lo que ves en la pantalla se crea con la tarjeta gráfica, que es como un artista mágico dentro de la computadora. Toma las instrucciones del procesador y las convierte en imágenes y videos coloridos.

Para guardar tus juegos, imágenes o videos favoritos, la computadora usa un espacio de almacenamiento especial llamado disco duro. Es como una biblioteca gigante donde la computadora puede guardar todas tus cosas valiosas a salvo.

Y cuando quieres conectarte a Internet para jugar con amigos o mirar videos divertidos, la computadora usa algo llamado tarjeta de red para enviar y recibir mensajes a través de cables de Internet o señales de Wi-Fi.

Así que, al igual que tu cerebro te ayuda a aprender y a jugar, el procesador, la memoria, la tarjeta gráfica, el disco duro y la tarjeta de red de la computadora funcionan en conjunto para hacer de tu computadora una amiga superinteligente que puede ayudarte a hacer cosas increíbles.

Para continuar la conversación, agrega la respuesta y otro mensaje.

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)

En esencia, una computadora es una máquina que se puede programar para llevar a cabo una serie de instrucciones. Consiste en varios componentes esenciales que funcionan juntos para procesar, almacenar y mostrar información:

1. Procesador (CPU): Es el cerebro de la computadora. - Ejecuta instrucciones y realiza cálculos. - La velocidad medida en gigahercios (GHz). - Por lo general, más GHz significa un procesamiento más rápido.

2. Memoria (RAM): Almacenamiento temporal para los datos que se procesan. - Contiene instrucciones y datos mientras se ejecuta el programa. - Se mide en gigabytes (GB). - Una mayor cantidad de GB de RAM permite que más programas se ejecuten simultáneamente.

3. Almacenamiento (HDD/SSD): Almacenamiento permanente para datos. - Almacena el sistema operativo, los programas y los archivos del usuario. - Se mide en gigabytes (GB) o terabytes (TB). - Las unidades de disco duro (HDD) son tradicionales, más lentas y más económicas. - Las unidades de estado sólido (SSD) son más nuevas, más rápidas y más costosas.

4. Tarjeta gráfica (GPU): Procesa y muestra imágenes. - Es esencial para los videojuegos, la edición de video y otras tareas con alto contenido gráfico. - Se mide en RAM de video (VRAM) y velocidad del reloj.

5. Motherboard: Conecta todos los componentes. - Aporta poder y vías de comunicación.

6. Dispositivos de entrada y salida (E/S): Permite que el usuario interactúe con la computadora. - Ejemplos: teclado, mouse, monitor, impresora.

7. Sistema operativo (SO): Es el software que administra los recursos de la computadora. - Proporciona una interfaz de usuario y funcionalidad básica. - Ejemplos: Windows, macOS y Linux.

Cuando ejecutas un programa en la computadora, ocurre lo siguiente:

  1. Las instrucciones del programa se cargan del almacenamiento a la memoria.
  2. El procesador lee las instrucciones de la memoria y las ejecuta una por una.
  3. Si la instrucción incluye cálculos, el procesador los realiza con su unidad lógica aritmética (ALU).
  4. Si la instrucción involucra datos, el procesador lee o escribe en la memoria.
  5. Los resultados de los cálculos o la manipulación de datos se almacenan en la memoria.
  6. Si el programa necesita mostrar algo en la pantalla, envía los datos necesarios a la tarjeta gráfica.
  7. La tarjeta gráfica procesa los datos y los envía al monitor, que los muestra.

Este proceso continúa hasta que el programa completa su tarea o el usuario la finaliza.

Configuración de generación

El argumento generation_config te permite modificar los parámetros de generación. Cada instrucción que envías al modelo incluye valores de parámetros que controlan cómo el modelo genera respuestas.

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)

Érase una vez, en un pequeño pueblo enclavado entre exuberantes colinas verdes, vivía una joven llamada...

¿Qué sigue?

  • El diseño de instrucciones es el proceso de crear instrucciones que provoquen la respuesta deseada de los modelos de lenguaje. Escribir instrucciones bien estructuradas es una parte esencial para garantizar respuestas precisas y de alta calidad de un modelo de lenguaje. Obtén más información sobre las prácticas recomendadas para escribir instrucciones.
  • Gemini ofrece diversas variaciones de modelos para satisfacer las necesidades de distintos casos de uso, como los tipos de entrada y la complejidad, las implementaciones para chat y otras tareas de lenguaje de diálogo, y las restricciones de tamaño. Obtén más información sobre los modelos de Gemini disponibles.
  • Gemini ofrece opciones para solicitar aumentos del límite de frecuencia. El límite de frecuencia para los modelos Gemini-Pro es de 60 solicitudes por minuto (RPM).