🐱

一般公開されたVertex AI Codey APIsを活用して、コード自動生成プログラムを書いてみた

2023/07/18に公開

クラウドエース宮崎です。

ますます暑くなってきましたが、皆さんいかがお過ごしでしょうか?この頃はGoogle CloudのGenerative AI関連のリリースが続いてますね。
ということで、今回は6月29日に一般公開となったVertex AI Codey APIsの機能紹介と、お試し利用でCodey APIsを活用したコード自動生成プログラムを書いてみようと思います。

はじめに

  • 本記事の趣旨は、「一般公開になったばかりのVertex AI Codey APIsの説明およびとりあえず活用してみた」といったものになります。

Vertex AI Codey APIsとは

  • Codey APIsを利用することで、Vertex AIの提供するcode-bison(コード生成)、code completion(コード補完)、code chat(コードチャット)という3種類のコードモデルを簡単に扱うことができます。
  • 上記のコードモデルはGoogle Cloudの大規模言語モデル(LLM)であるPaLMの提供する4つの基礎モデルGecko、Otter、Bison、Unicornのうちbisonモデルをコードモデル用に事前トレーニングしたものになります。
  • Codey APIsには、code generation API、code completion API、code chat APIの3つの機能が含まれます

Codey APIsの3つの機能

code generation API

  • 自然言語の説明からコードを生成する機能を提供します。ユーザーが何を達成しようとしているのかを説明するだけで、Codey APIはその説明から適切なコードスニペットを生成します。

code completion API

  • 部分的に書かれたコードからそのコードを完成させる機能を提供します。ユーザーがコードを書き始めると、Codey APIはそのコードを理解し、最も可能性の高い完成形を提案します。

code chat API

  • コードに関する質問に対する答えを提供する機能を提供します。ユーザーが特定のコードスニペットやプログラミング概念についての質問をすると、Codey APIはその質問に対する最適な答えを提供します。

Google Cloudプロジェクトでの使用方法と設定の手順

  • gcloud の認証をします。
gcloud auth login
gcloud auth application-default login
  • プロジェクトの設定をします。
gcloud config set project <YOUR-PROJECT>
  • Vertex AI の機能を有効化します。
gcloud services enable aiplatform.googleapis.com
  • Vertex AIをインストールします。
pip install google-cloud-aiplatform

これでVertex AI Codey APIsを使用するための準備が整いました!

Vertex AI Codey APIsの活用方法のデモンストレーション

デモの概要

  • Codey APIを使用し、ユーザーからの入力に基づいてコードを生成するPythonスクリプトの紹介

手順

  • Google Cloudコンソールから、Vertex AIのModel Gardenのページにアクセスします。
    alt

  • モデル検索から"code"で検索し、Codey for Code Generationを選択します。
    alt

  • Codey for Code Generationの詳細画面が開きます。
    alt

  • "プロンプト設計を開く"からGoogle Cloudコンソール上でcodey APIを利用することも可能ですが、今回は以下のcurlコマンドと同内容のAPIリクエストを、python で実現しようと思います。

  • curlコマンドのJSON部分は、APIリクエストのボディで、以下の情報を含みます:

instances: 予測を行うための入力データ。ここでは、'Write a function that checks if a year is a leap year.'を指定しているので、うるう年判定の関数の生成をリクエストします。

parameters: モデルが予測を行う際に使用するパラメータ。ここでは、2つのパラメータが設定されています。

temperature: これは、モデルが生成するテキストの"ランダム性"を制御します。値が大きいほど、出力はランダムになります。値が小さいほど、出力は決定論的になります。

maxOutputTokens: これは、モデルが生成するテキストの最大長を制御します。ここでは、最大256トークンのテキストを生成するように設定されています。


MODEL_ID="code-bison"
PROJECT_ID=sample-project

curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://us-central1-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/us-central1/publishers/google/models/${MODEL_ID}:predict -d \
$"{
  'instances': [
    { 'prefix': 'Write a function that checks if a year is a leap year.'
    }
  ],
  'parameters': {    
    'temperature': 0.5,
    'maxOutputTokens': 512
  }
}"

実装したコード

今回は、ユーザー入力を解釈して、それを実現するスクリプトを自動生成するプログラムを作成しました。

import os
import requests
import json

def generate_code(user_input):
    # Codey APIのモデルID
    MODEL_ID="code-bison"
    # Google CloudのプロジェクトID
    PROJECT_ID="sample-project"

    # APIエンドポイントのURL
    url = f"https://us-central1-aiplatform.googleapis.com/v1/projects/{PROJECT_ID}/locations/us-central1/publishers/google/models/{MODEL_ID}:predict"

    # APIリクエストのヘッダー(認証情報とコンテンツタイプを含む)
    headers = {
        "Authorization": f"Bearer {os.popen('gcloud auth print-access-token').read().strip()}",
        "Content-Type": "application/json"
    }

    # APIリクエストのデータ(ユーザーの入力とモデルのパラメータを含む)
    data = {
        "instances": [
            {"prefix": user_input}
        ],
        "parameters": {    
            "temperature": 0.5,
            "maxOutputTokens": 512
        }
    }

    # APIリクエストを送信し、レスポンスを取得
    response = requests.post(url, headers=headers, data=json.dumps(data))
    # レスポンスのJSONを解析
    response_json = response.json()

    # リクエストが成功した場合は生成されたコードを返す
    # それ以外の場合はエラーメッセージを返す
    if response.status_code == 200:
        return response_json['predictions'][0]['content'] 
    else:
        return response_json

# 生成するコードのためのユーザー入力を取得
user_input = input("Enter your code request: ")
# コードを生成して出力
generated_code = generate_code(user_input)
print(generated_code)

これで、ユーザーからの入力に基づいてコードを生成するPythonスクリプトが作成できました!

実行結果

・入力
作成したPythonスクリプトに、"入力した年がうるう年かどうかを判定する関数のコード生成"をリクエストしました。
※現段階(2023年7月時点)では、bisonモデルは全て英語のみに対応しているので、日本語は利用できません。

Enter your code request: Write a function that checks if a year is a leap year.

・出力

def is_leap_year(year):
  """
  Checks if a year is a leap year.

  Args:
    year: The year to check.

  Returns:
    True if the year is a leap year, False otherwise.
  """

  # A year is a leap year if it is divisible by 4, unless it is divisible by 100
  # unless it is also divisible by 400.

  if year % 4 == 0:
    if year % 100 == 0:
      return year % 400 == 0
    else:
      return True
  else:
    return False

このように、うるう年を判定する関数を自動で生成してくれます。
いろいろと試してみましたが、プログラミング言語を明示しない場合はPythonのスクリプトを生成するようです。

感想

今回は2023年6月29日に一般公開となったVertex AI Codey APIsのうちcode generate API(コード生成)をお試しで使ってみました。
複雑な準備をせずに、簡単に事前トレーニングされたコードモデルを扱えるので今後も使ってみようと思います。
今回使用したコード生成API以外にも、コード補完APIやコードチャットAPIがあるので興味のある方は是非触ってみてください!

Discussion