Usar modelos de código e o SDK da Vertex AI

Há três modelos de fundação de código de IA generativa na Vertex AI. Estes são: geração, preenchimento e chat de código.

  • O nome do modelo de geração de código é code-bison, e a classe dele no SDK da Vertex AI é CodeGenerationModel.

  • O nome do modelo de preenchimento de código é code-gecko, e a classe dele no SDK da Vertex AI é a mesma usada para o de geração de código, CodeGenerationModel.

  • O nome do modelo de chat de código é codechat-bison, e a classe dele no SDK da Vertex AI é CodeChatModel.

Os tópicos a seguir mostram como usar essas classes e o SDK da Vertex AI para realizar algumas tarefas comuns relacionadas a códigos de IA generativa.

Gerar uma função de código

Os casos de uso do modelo de fundação de geração de código incluem projetar testes de unidade e criar uma função e classe. Para gerar código, use a mesma classe usada para criar o preenchimento de código, CodeGenerationModel. Para criar uma solução que gere código, transmita o nome de uma versão do modelo de geração de código, como code-bison@002. Para saber mais sobre o modelo de fundação de geração de código, consulte Criar comandos para gerar código e Testar comandos de geração de código.

O exemplo de código a seguir cria uma função que detecta se um ano é bissexto.

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,
))

O resultado será mais ou menos assim:

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

Gerar código para preenchimento

O código de preenchimento é um código previsto para ser preenchido à medida que é criado. A previsão gerada aparece enquanto você digita. Se você quiser criar uma solução de preenchimento de código, use a classe CodeGenerationModel. Essa é a mesma classe utilizada para gerar um código, como uma função. Para gerar o código previsto para ser preenchido à medida que é criado, chame CodeGenerationModel.from_pretrained e transmita o nome de uma versão do modelo de preenchimento de código. Para saber mais sobre o modelo de fundação de preenchimento de código, consulte Criar comandos para o preenchimento de código e Testar comandos de preenchimento de código.

O exemplo de código a seguir usa a versão estável mais recente do code-gecko para retornar o código previsto para preencher o início de uma função que inverte uma string.

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,
))

O resultado será assim:

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

Criar um chat de código

Crie uma sessão de chat especificamente sobre código. Por exemplo, você pode usar o chat para aprender sobre uma linguagem ou sintaxe de programação. Para criar uma sessão de chat de código com o SDK da Vertex AI, use o método start_chat em uma instância de um CodeChatModel. Ao contrário de um chat de texto, um chat de código criado com o SDK da Vertex AI não usa a classe InputOutputTextPair. Para saber mais sobre o modelo de fundação do chat de código, consulte Criar comandos para chat de código e Testar comandos de chat de código.

A seguir, usamos o chat de código para solicitar informações sobre como criar uma função.

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

O resultado será mais ou menos assim:

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.

Fazer streaming de respostas do modelo de código

Talvez você queira receber respostas dos modelos de geração de código e chat de código à medida que eles gerados. O recebimento de respostas de um modelo de fundação à medida que elas são geradas é conhecido como streaming. Durante o streaming das respostas do modelo de geração de código e chat de código, os tokens de saída são enviados no momento em que são gerados. Para fazer streaming da geração de código, use o método CodeGenerationModel.predict_streaming. Para fazer streaming de um chat de código, use o método CodeChatModel.predict_streaming. Para saber mais sobre streaming de modelos de fundação, consulte Fazer streaming de respostas de modelos de IA generativa.

Fazer streaming de geração de código

O exemplo de código a seguir faz streaming de um código que verifica se um ano é bissexto. Ele também retorna o tempo anterior e posterior à chamada de from_pretrained, para demonstrar quanto tempo leva para fazer o streaming da saída.

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

O resultado será mais ou menos assim:

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

Fazer streaming de chat de código

O exemplo de código a seguir faz streaming de um chat de código que é resposta a uma solicitação do chatbot para criar uma função que imprima seu próprio código-fonte. O exemplo de código também exibe o tempo anterior e posterior à chamada de from_pretrained, para demonstrar quanto tempo leva para fazer o streaming da saída.

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

O resultado será mais ou menos assim:

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

A seguir