코드 모델 및 Vertex AI SDK 사용

Vertex AI에는 3가지 생성형 AI 코드 기반 모델이 있습니다. 3가지 모델은 코드 생성 모델, 코드 완성 모델, 코드 채팅 모델입니다.

  • 코드 생성 모델 이름은 code-bison이고 Vertex AI SDK의 클래스는 CodeGenerationModel입니다.

  • 코드 완성 모델 이름은 code-gecko이고 Vertex AI SDK의 클래스는 코드 생성에 사용된 같은 클래스인 CodeGenerationModel입니다.

  • 코드 채팅 모델 이름은 codechat-bison이고 Vertex AI SDK의 클래스는 CodeChatModel입니다.

다음 주제에서는 이러한 클래스와 Vertex AI SDK를 사용하여 일반적인 코드 관련 생성형 AI 태스크를 수행하는 방법을 보여줍니다.

코드 함수 생성

코드 생성 기반 모델 사용 사례에는 단위 테스트 설계, 함수 작성, 클래스 생성이 포함됩니다. 코드를 생성하려면 코드 완성을 만드는 데 사용된 같은 클래스인 CodeGenerationModel을 사용합니다. 코드를 생성하는 솔루션을 만들려면 코드 생성 모델 버전의 이름(예: code-bison@002)을 전달합니다. 코드 생성 기반 모델에 대한 자세한 내용은 코드 생성 프롬프트 만들기코드 생성 프롬프트 테스트를 참조하세요.

다음 코드 샘플은 윤년 여부를 감지하는 함수를 작성합니다.

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

출력은 다음과 비슷합니다.

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

코드 완성용 코드 생성

코드 완성은 작성 시 코드가 완료될 것으로 예상되는 코드입니다. 생성된 예측은 입력과 동시에 표시됩니다. 코드 완성 솔루션을 만들려면 CodeGenerationModel 클래스를 사용합니다. 함수와 같이 코드를 생성하는 데 사용된 같은 클래스입니다. 작성된 코드가 완성될 것으로 예측되는 코드를 생성하려면 CodeGenerationModel.from_pretrained를 호출하고 코드 완성 모델의 버전 이름을 전달합니다. 코드 완성 기반 모델에 대한 자세한 내용은 코드 완성 프롬프트 만들기코드 완성 프롬프트 테스트를 참조하세요.

다음 샘플 코드는 code-gecko의 최신 안정적인 버전을 사용하여 문자열을 반전시키는 함수 시작이 완료될 것으로 예측되는 코드를 반환합니다.

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

출력은 다음과 비슷합니다.

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

코드 채팅 만들기

코드에 관련된 채팅 세션을 만들려고 할 수 있습니다. 예를 들어 채팅을 사용하여 코딩 언어나 구문을 학습시킬 수 있습니다. Vertex AI SDK로 코드 채팅 세션을 만들려면 CodeChatModel 인스턴스에서 start_chat 메서드를 사용합니다. 텍스트 채팅과 달리 Vertex AI SDK로 생성된 코드 채팅에서는 InputOutputTextPair 클래스를 사용하지 않습니다. 코드 채팅 기반 모델에 대한 자세한 내용은 코드 채팅 프롬프트 만들기코드 채팅 프롬프트 테스트를 참조하세요.

다음은 코드 채팅을 사용하여 함수 작성 방법에 대한 정보를 요청합니다.

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

출력은 다음과 비슷합니다.

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.

코드 모델 응답 스트리밍

코드 생성 및 코드 채팅 모델이 생성될 때 응답을 받을 수 있습니다. 응답이 생성될 때 기반 모델에서 응답을 받는 것을 스트리밍이라고 합니다. 코드 생성 및 코드 채팅 모델 응답이 스트리밍되면 출력 토큰이 생성될 때 전송됩니다. 코드 생성을 스트리밍하려면 CodeGenerationModel.predict_streaming 메서드를 사용합니다. 코드 채팅을 스트리밍하려면 CodeChatModel.predict_streaming 메서드를 사용합니다. 기반 모델의 스트리밍에 대한 자세한 내용은 생성형 AI 모델의 응답 스트리밍을 참조하세요.

코드 생성 스트리밍

다음 샘플 코드는 윤년인지 여부를 확인하는 코드를 스트리밍합니다. 또한 출력을 스트리밍하는 데 걸리는 시간을 보여주기 위해 from_pretrained 호출 전후의 시간을 출력합니다.

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

응답은 다음과 비슷합니다.

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

코드 채팅 스트리밍

다음 샘플 코드는 자체 소스 코드를 출력하는 함수를 작성하기 위한 챗봇 요청에 대한 응답인 코드 채팅을 스트리밍합니다. 또한 코드 샘플은 출력을 스트리밍하는 데 걸리는 시간을 보여주기 위해 from_pretrained 호출 전후의 시간을 출력합니다.

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

응답은 다음과 비슷합니다.

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

다음 단계