Usa modelos de código y el SDK de Vertex AI

Hay tres modelos base de código generativo de IA en Vertex AI. Los tres modelos son un modelo de generación de código, un modelo de finalización de código y un modelo de chat de código.

  • El nombre del modelo de generación de código es code-bison y su clase en el SDK de Vertex AI es CodeGenerationModel.

  • El nombre del modelo de finalización de código es code-gecko, y su clase en el SDK de Vertex AI es la misma clase que se usa para la generación de código, CodeGenerationModel.

  • El nombre del modelo del chat de código es codechat-bison y su clase en el SDK de Vertex AI es CodeChatModel.

En los siguientes temas, se muestra cómo usar estas clases y el SDK de Vertex AI para realizar algunas tareas comunes de IA generativa relacionada con código.

Genera una función de código

Los casos prácticos para el modelo base de generación de código incluyen diseñar pruebas de unidades, escribir una función y crear una clase. Para generar código, usa la misma clase que se usa para completar el código, CodeGenerationModel. Para crear una solución que genere código, pasa el nombre de una versión del modelo de generación de código, como code-bison@002. Para obtener más información sobre el modelo de base de generación de código, consulta Crea instrucciones para generar código y Prueba instrucciones de generación de código.

En la siguiente muestra de código, se escribe una función que detecta si un año es bisiesto.

from vertexai.language_models import CodeGenerationModel

code_generation_model = CodeGenerationModel.from_pretrained("code-bison@001")
print(code_generation_model.predict(
    prefix="Write a function that checks if a year is a leap year.",
    # The following parameters are optional:
    # max_output_tokens=1024,
    # temperature=0.0,
))

El resultado será similar al siguiente ejemplo:

I will write a function to check if a year is a leap year.

**The function will take a year as input and return a boolean value**.

**The function will first check if the year is divisible by 4.**

**If the year is divisible by 4, the function will then check if the year is divisible by 100.**

**If the year is divisible by 100, the function will then check if the year is divisible by 400.**

**If the year is divisible by 400, the function will ...

Genera código para completar el código

La finalización de código es código que se espera que complete código a medida que se escribe. La predicción generada aparecerá a medida que escribas. Si deseas crear una solución de finalización de código, usa la clase CodeGenerationModel. Esta es la misma clase que se usa para generar código, como una función. Para generar un código que se espera que complete el código a medida que se escribe, llama a CodeGenerationModel.from_pretrained y pasa el nombre de una versión del modelo de finalización de código. Para obtener más información sobre el modelo de base de finalización de código, consulta Crea instrucciones para completar el código y Prueba instrucciones de finalización de código.

En el siguiente código de muestra, se usa la versión estable más reciente de code-gecko para mostrar el código que completa el inicio de una función que revierte una cadena.

from vertexai.language_models import CodeGenerationModel

code_completion_model = CodeGenerationModel.from_pretrained("code-gecko@001")
print(code_completion_model.predict(
    prefix="def reverse_string(s):",
    # Optional:
    suffix="    return reversed_str",
    max_output_tokens=64,
    # temperature=0.0,
))

El resultado es similar a este:

"""
:type s: str
:rtype: str
"""
reversed_str = ""
for i in range(len(s) - 1, -1, -1):
    reversed_str += s[i]

Crea un chat de código

Te recomendamos crear una sesión de chat específicamente sobre el código. Por ejemplo, es posible que desees usar el chat para obtener información sobre un lenguaje de programación o sintaxis. Para crear una sesión de chat de código con el SDK de Vertex AI, usa el método start_chat en una instancia de un CodeChatModel. A diferencia de un chat de texto, un chat de código creado con el SDK de Vertex AI no usa la clase InputOutputTextPair. Para obtener más información sobre el modelo de base de chat de código, consulta Crea instrucciones para el chat de código y Prueba instrucciones de chat de código.

A continuación, se usa el chat de código para solicitar información sobre cómo escribir una función.

from vertexai.language_models import CodeChatModel

code_chat_model = CodeChatModel.from_pretrained("codechat-bison@002")
code_chat = code_chat_model.start_chat()
print(code_chat.send_message("Please help write a function that prints its own source code"))

El resultado será similar al siguiente ejemplo:

Sure, here is a function that prints its own source code:

```
def print_source_code():
  """Prints the source code of this function."""

  # Get the source code of this function.
  source_code = inspect.getsource(print_source_code)

  # Print the source code.
  print(source_code)

```

This function works by first getting the source code of the function using the
`inspect.getsource()` function. Then, it prints the source code to the console.

Transmitir respuestas del modelo de código

Es posible que quieras recibir respuestas de los modelos de generación de código y de chat de código a medida que se generan. Recibir respuestas de un modelo de base a medida que se generan respuestas se conoce como transmisión. Cuando se transmiten las respuestas del modelo de chat y la generación de código, los tokens de salida se envían cuando se generan. Para transmitir una generación de código, usa el método CodeGenerationModel.predict_streaming. Para transmitir un chat de código, usa el método CodeChatModel.predict_streaming. Para obtener más información sobre la transmisión de modelos base, consulta Transmitir respuestas desde modelos generativos de IA.

Transmitir generación de código

El siguiente código de muestra transmite un código que verifica si un año es bisiesto. También muestra el tiempo anterior y el tiempo posterior a la llamada a from_pretrained para demostrar cuánto tiempo lleva transmitir el resultado.

import datetime
from vertexai.language_models import CodeGenerationModel

code_generation_model = CodeGenerationModel.from_pretrained("code-bison@001")

print("Start: ", datetime.datetime.now())
for response in code_generation_model.predict_streaming(
    prefix="Write a function that checks if a year is a leap year.",
    # Optional:
    # max_output_tokens=1024,
    # temperature=0.0,
):
    print(datetime.datetime.now(), "|", response)
print("End: ", datetime.datetime.now())

La respuesta podría ser similar a la siguiente:

Start:  YYYY-MM-DD 06:31:45.759810
YYYY-MM-DD 06:31:46.536173 | To check if a year is a leap year, we can use the following step
YYYY-MM-DD 06:31:46.611856 | s:

1. **Check if the year is divisible by 4.** If it is not, th
YYYY-MM-DD 06:31:46.667330 | en it is not a leap year.
2. **Check if the year is divisible by
YYYY-MM-DD 06:31:46.805714 |  100.** If it is, then it is not a leap year unless it is also d
YYYY-MM-DD 06:31:46.940925 | ivisible by 400.
3. **If the year is divisible by 4 but not by 1
YYYY-MM-DD 06:31:47.033529 | 00, then it is a leap year.**

For example, the year 2020 is div
YYYY-MM-DD 06:31:47.110856 | isible by
End:  YYYY-MM-DD 06:31:47.112951

Transmitir chat de código

El siguiente código de muestra transmite el chat de código que responde a una solicitud de chatbot para escribir una función que imprima su propio código fuente. La muestra de código también genera el tiempo anterior y el tiempo posterior a la llamada a from_pretrained para demostrar cuánto tiempo lleva transmitir el resultado.

import datetime
from vertexai.language_models import CodeChatModel

code_chat_model = CodeChatModel.from_pretrained("codechat-bison@001")
code_chat = chat_model.start_chat()

print("Start: ", datetime.datetime.now())
for response in code_chat.send_message_streaming(
    message="Please help write a function that prints its own source code",
    # Optional:
    max_output_tokens=1024,
):
    #print(datetime.datetime.now(), "|", response)
    print(">>>")
    print(response)
print("End: ", datetime.datetime.now())

La respuesta podría ser similar a la siguiente:

```
Start:  YYYY-MM-DD 06:32:10.733415
>>>
```python
def print_source(func):
    with open(func.__file__, '
>>>
r') as f:
        source = f.read()
    print(source)
```
End:  YYYY-MM-DD 06:32:11.764794
```

¿Qué sigue?