Instructivo: Comienza a usar la API de Gemini


Ver en la IA de Google Ejecutar en Google Colab Ver el 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 da 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. Configurar 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. Genera respuestas de texto a partir de entradas multimodales (imágenes y texto).
  4. Usar Gemini para conversaciones de varios turnos (chat)
  5. Usa incorporaciones para modelos de lenguaje grandes.

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 una configuración de entorno adicional.

Como alternativa, para completar esta guía de inicio rápido de forma 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

Cómo configurar 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 clave con un clic en Google AI Studio.

Obtén una clave de API.

En Colab, agrega la clave al administrador de Secrets en la " Compose" que se encuentra en el 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 clave 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 está todo listo para que llames 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)

Genera texto a partir de entradas de texto

Para instrucciones de solo texto, usa un modelo de Gemini 1.5 o el modelo de 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 instrucción 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 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 desconcertó a personas de siglos, culturas y continentes. Si bien no hay una respuesta universalmente reconocida, se han presentado muchas ideas y la respuesta con frecuencia depende de ideas, creencias y experiencias de vida individuales.

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

  2. Contribución significativa: Algunas personas creen que el propósito de la vida es hacer una contribución significativa al mundo. Esto puede implicar perseguir una profesión que beneficie a otros, participar en actividades benéficas o voluntarias, generar arte o literatura, o inventar.

  3. Autorrealización y crecimiento personal: La búsqueda de la autorrealización y el desarrollo personal es otro objetivo común en la vida. 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: Algunos creen que el objetivo de la vida es actuar de forma ética y moral. Esto podría implicar cumplir con los principios morales de cada persona, hacer lo correcto, incluso cuando sea difícil, e intentar hacer del mundo un lugar mejor.

  5. Satisfacción espiritual: Para algunas personas, el propósito de la vida está relacionado 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. Experimentamos 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, asumir riesgos y emprender nuevos encuentros.

  7. El legado y el impacto: Otros creen que el objetivo de la vida es dejar un legado duradero y tener un impacto en el mundo. Esto podría implicar lograr algo importante, que se lo recuerde por sus contribuciones o inspirar y motivar a los demás.

  8. Encontrar el equilibrio y la armonía: Para algunas personas, el objetivo de la vida es encontrar el equilibrio y la armonía en todos los aspectos de sus vidas. Esto puede implicar malabares con obligaciones personales, profesionales y sociales, búsqueda de paz interior y satisfacción, y de vivir una vida de acuerdo con nuestros valores y creencias.

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

Si la API no mostró un resultado, usa GenerateContentResponse.prompt_feedback para comprobar si se bloqueó debido a inquietudes de seguridad en relación 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 múltiples respuestas posibles para una sola instrucción. Estas posibles respuestas se denominan candidates, y puedes revisarlas para seleccionar la más adecuada como respuesta.

Consulta 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 devuelve 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 en cuanto se generen.

Para transmitir 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 una transmisión, algunos atributos de respuesta no estarán disponibles hasta que hayas iterado todos los fragmentos de la 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 entradas de imagen y texto

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

Cuando la entrada de una instrucción incluya tanto texto como imágenes, usa Gemini 1.5 con el método GenerativeModel.generate_content para generar 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 de 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)

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

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

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 servir para comer de forma más saludable. Esta comida es un excelente ejemplo de una comida saludable y deliciosa que se puede preparar fácilmente con anticipación.

Esta comida incluye arroz integral, vegetales asados y pollo teriyaki. El arroz integral es un grano entero que es alto en fibra y nutrientes. Los vegetales asados son una excelente forma de obtener su dosis diaria de vitaminas y minerales. Y el teriyaki de pollo es una fuente de proteína magra que también tiene mucho sabor.

Esta comida es fácil de preparar con anticipación. Simplemente cocina el arroz integral, asa los vegetales y cocina el pollo teriyaki. Luego, divide la comida en contenedores individuales y almacénalos en el refrigerador. Cuando quieras comer, solo toma un recipiente y caliéntalo.

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

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

Conversaciones de chat

Gemini te permite tener conversaciones de formato libre en múltiples turnos. La clase ChatSession simplifica el proceso, ya que administra el estado de la conversación, de modo que, a diferencia de generate_content, no tienes que almacenar el historial de la conversación 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 se adjunta 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 y hasta 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 inline_data (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 para un niño pequeño.

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

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

model: Una computadora funciona siguiendo instrucciones, denominadas programa, que le indican qué hacer. Estas instrucciones están escritas en un lenguaje especial que la computadora puede comprender y se almacenan en la memoria de la computadora. El procesador de la computadora, o CPU, lee las instrucciones de la memoria y las ejecuta, realiza cálculos y toma decisiones basadas en la lógica del programa. Los resultados de estos cálculos y decisiones 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 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 recolectar ingredientes (obtener datos de la memoria), mezclarlos (realizar cálculos) y cocinarlos (procesar datos). El plato final (el resultado) se presenta en un plato (la pantalla de computadora).

En resumen, una computadora funciona ejecutando 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 suele medirse 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 la 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) de forma vectorizada, lo que facilita la comparación y el contraste de las incorporaciones. Por ejemplo, dos textos que comparten un tema o una opinión similares deben tener incorporaciones similares, que se pueden identificar a través de técnicas matemáticas de comparación, 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 sobre incorporaciones.

Usa el método embed_content para generar incorporaciones. El método controla la incorporación para 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 una 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.
Agrupamiento en clústeres Especifica que las incorporaciones se usarán para el agrupamiento en clústeres.

A continuación, se genera una incorporación de una sola cadena 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 cadenas, pasa una lista de cadenas 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 basa en el 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 da 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 ...

De manera similar, 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 el modelo bloquea y permite en las instrucciones y en las respuestas. De forma predeterminada, la configuración de seguridad bloquea en todas las dimensiones el contenido con probabilidad media o alta de ser no seguro. Obtén más información sobre la configuración de seguridad.

Ingresa una instrucción cuestionable, ejecuta el modelo con la configuración de seguridad predeterminada y no mostrará candidatos:

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

El 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 proporciona la misma instrucción al modelo con los nuevos parámetros de configuración de seguridad, y es posible que obtengas 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 la solicitud se apruebe, pero las respuestas individuales no pasen las verificaciones de seguridad.

Codificar mensajes

Las secciones anteriores se basaban en el SDK para facilitarte el envío de instrucciones a la API. Esta sección ofrece un equivalente completamente escrito al ejemplo anterior, de modo que puedas comprender mejor los detalles de nivel inferior sobre cómo el SDK codifica los mensajes.

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

El SDK intenta convertir tu mensaje en un objeto genai.protos.Content, que contiene una lista de objetos genai.protos.Part, cada uno de los cuales contiene lo siguiente:

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

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

Por lo tanto, el equivalente completamente escrito 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 servir para 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, hace algunas suposiciones. Si tu caso de uso no se adapta a esta implementación de chat, recuerda que genai.ChatSession es solo un wrapper 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 ve en las secciones anteriores. Como diccionario, el mensaje requiere las claves role y parts. El role de una conversación puede ser user, que proporciona los mensajes, o model, que proporciona las respuestas.

Pasa una lista de objetos genai.protos.Content y se tratará como 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 que una computadora es un amigo realmente inteligente que puede ayudarte con muchas cosas. Al igual que tienes el cerebro para pensar y aprender, las computadoras también tienen un cerebro, llamado procesador. Es como el jefe de la computadora, que le dice qué hacer.

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

Cuando presionas botones del teclado o haces clic en elementos de la pantalla con el mouse, estás enviando mensajes a la computadora. Estos mensajes viajan al procesador mediante cables especiales, llamados cables.

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

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

Para guardar tus juegos, videos o imágenes favoritos, la computadora usa un espacio de almacenamiento especial llamado disco duro. Es como una biblioteca gigante donde la computadora puede mantener seguros todos tus objetos valiosos.

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

Así que, así como tu cerebro te ayuda a aprender y jugar, el procesador, la memoria, la tarjeta gráfica, el disco duro y la tarjeta de red de la computadora trabajan juntos para hacer de tu computadora una amistad 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 un conjunto de instrucciones. Consta de varios componentes esenciales que funcionan juntos para procesar, almacenar y mostrar información:

1. Procesador (CPU): El cerebro de la computadora. - Ejecuta instrucciones y hace cálculos. - Velocidad medida en gigahercios (GHz). - Una mayor cantidad de GHz generalmente 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 los 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 videojuegos, edición de video y otras tareas de alto contenido gráfico. - Se mide en RAM de video (VRAM) y velocidad de reloj.

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

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

7. Sistema operativo (SO): Es un 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 tu computadora, sucede 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 implica cálculos, el procesador los realiza mediante su unidad lógica aritmética (ALU).
  4. Si la instrucción incluye datos, el procesador lee o escribe en la memoria.
  5. Los resultados de los cálculos o de 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)

Había una vez una niña llamada...

¿Qué sigue?

  • El diseño de instrucciones es el proceso de crear instrucciones que provocan la respuesta deseada de los modelos de lenguaje. Escribir instrucciones bien estructuradas es esencial para garantizar respuestas precisas y de alta calidad a partir de un modelo de lenguaje. Obtén más información sobre las prácticas recomendadas para la escritura de instrucciones.
  • Gemini ofrece diversas variaciones de modelos para satisfacer las necesidades de distintos casos de uso, como tipos de entrada y complejidad, implementaciones para tareas de chat o de otros lenguajes de diálogo, y restricciones de tamaño. Obtén información sobre los modelos de Gemini disponibles.