Duet AI in Google Cloudを試してみる

エヌデーデーの関口です。

先日のGoogle Cloud Next ‘23で多くのAIに関する発表があった中、Duet AIがGoogle Workspaceだけでなく、Duet AI in Google Cloudとして、Google Cloudにも展開されるという事も発表され、Google CloudコンソールやVSCode上で動作するというデモを見ましたので、実際に自分の環境でもDuet AIを使ってみようと思います。

Duet AI in Google Cloudとは?

Duet AI in Google CloudはPaLM 2に代表されるGoogleのAI基盤上で、Google Cloudにおける開発を促進するために、コード生成、ソース引用、テスト カバレッジ、チャットアシスタントなどの機能を提供するものです。(2023年9月現在でプレビュー版)

Duet AI in Google Cloudを利用するために

プレビュー版に参加する

Duet AIは2023年9月時点でプレビュー提供です。プレビュー版に参加する為にはGoogle CloudのAI Trusted Tester Programに参加する必要があります。こちらに登録した後、翌日以降に承認されるとDuet AI in Google Cloudを利用するための準備のメールが来ますので、その案内に従って対象プロジェクトの番号を入力フォームに登録すると、さらに翌日にはそのプロジェクトでDuet AIが利用できるようになります。

プロジェクトでのAPI有効化とIAMの設定

Duet AI in Google Cloudが利用可能になったプロジェクトに対して、まずはAPIを有効化します。成功していればOperation〜〜〜finished successfullyという正常終了が出力されます。エラーメッセージなどが表示されている場合は、対象プロジェクトが異なっていないかなどを確認してみてください。

gcloud services enable cloudaicompanion.googleapis.com --project {プロジェクト名}

また、自分がプロジェクトのオーナー権限などを持っていない場合は、プロジェクト管理権限を持つユーザーに、IAMで次の権限を付与してもらえるようにお願いしておきましょう。

  • Cloud AI Companion User (roles/cloudaicompanion.user)
  • Service Usage Viewer (roles/serviceusage.serviceUsageViewer)

すると、管理コンソールの右上部に吹き出しのマークが出るようになりました。これがDuet AIが利用できるという印になります。

ちなみにDuet AIが利用できないプロジェクトに切り替えると次のように今まで通りの画面であることがわかります。

Duet AI in Google Cloudの主な機能を試してみる

Duet AI in Google Cloudは次のようなことが実現できると説明されています。

  • アプリケーション開発支援
    • VSCodeやInteliJなどにコードアシスタントとして組み込む
    • Cloud Nextでも発表されたばかりのColab Enterpriseのノートブックにもコードアシスタントととして組み込む
  • データ分析支援
    • BigQueryやSpannerでクエリやSQLの作成を支援する
  • 運用支援
    • Google Cloudのコンソールで質問に答えてくれる
    • ログの説明やトラブルシュートの方法を支援をしてくれる

Google Cloudを使った開発から運用まで、あらゆる方面をいろいろとサポートしてくれそうです。すべてという訳にはいかないのですが、いくつか試してみましょう。

コンソールからDuet AIを利用してみる

Google Cloudコンソールにログインし、Duet AIが有効なプロジェクトに移動すると、先ほど示したようにDuet AIマークが表示されているのでクリックします。

すると、画面右側に次のような画面が出てきます。

クリックで拡大

日本語には対応していないようですが、さっそくStart chattingを押して、何か聞いてみましょう。

「How Can I reduce GKE Cost?」(GKEのコストを削減するにはどうすればいい?)

「optimize-utilizationを有効にすることや、適切なサイズのvCPUやメモリを選んでください」などの回答

クリックで拡大

「How Can I create an application in Cloud Run with Eventarc?」(Eventarc連動のCloud Runアプリケーションはどうやって作る?)

全部は読めてませんけど、Cloud Storage基準のEventarcの作り方を説明しているようです。

クリックで拡大

「tell me commands to create External HTTPS Load Balancer」(外部HTTPSロードバランサーを作るコマンドを教えて)

作り方の手順を示した後で、具体的にコマンドを示してくれています。

クリックで拡大

「how to create gke autopilot?」(GKE Autopilotの作り方を教えて)

コンソールを使った作り方とコマンドを用いた作り方の二通りを示してくれています。ただし、コマンドの方はAutopilotモードではなく通常モードのコマンドを示しているようです。

クリックで拡大

このように、やりたいことをDuet AIに尋ねると手順を示してくれたり、関連するドキュメントのURLなどを示してくれるようになるのです。

ちなみに、日本語はまだ対応していないと言うことでしたが、あえて日本語で尋ねてみたところほぼ同じような返事が返ってきました。GAになれば精度はもっと上がっていくのでしょう。

クリックで拡大

データ分析の支援機能を試してみる

BigQueryやSpannerもDuet AIによる支援機能が利用できます。

ただし、BigQueryについては、現在プレビュー版のBigQuery Studio内でのSQL補完やSQL生成となっているようです。BigQuery Studioはプレビュー申込みが必要な状況で、今回の検証には間に合いませんでしたので、Spannerで試してみました。

Spannerでインスタンスを選択し、左のメニューからSpanner Studioを選択します。

クエリエディタの画面の右上にあるDuet AIをクリックすると「SQLの補完」「コメントからクエリを生成」というものが選べるようになっていますので、使いたい機能にチェックを入れます。

クリックで拡大

さて、再びサンプルをいくつか実行してみましょう。ここはあえて日本語でやってみます。

次のようなCustomerという3つの項目を持つテーブルがあったとして、ここに適当にデータを入れて欲しいというお願いをしてみます。

クリックで拡大

SQLエディタを開いて、コメントを記入してみましょう。

「Customerにレコードを3行追加してください」

クリックで拡大

このように適当なレコードを入れるSQLが発行されました。しかし、CustomerIdという列に入れる値が不正だというエラーが出ています。コメントを少し変えてみましょう。

「Customerにレコードを3行追加してください。ただし、CustomerIdにはUUIDを入れてください」

クリックで拡大

おお!UUID関数を使ってSQLを変えてきましたね!

さて、もう少し複雑なSQLを作らせてみましょう。先ほどは単一のテーブルにレコードを追加する例でしたが、今度は次のように4つのテーブル(Account, Customer, CustomerRole, TransactionHistory)が関係したテーブルを使います。

クリックで拡大

TransactionHistoryのAmountを合計してみましょう。

「TransactionHistoryのAmountを合計しなさい。条件はEventTimestampが2023年8月1日から2023年8月31日までの期間で、CustomerのNameが’NDD’であるデータです」

クリックで拡大

惜しい!結合するテーブルが一つ足りません。それでもなかなかの精度でSQLを書いてきました。

もう少し補足してあげましょう。

「Account, CustomerRole, Customerを結合してTransactionHistoryのAmountを合計しなさい。条件はEventTimestampが2023年8月1日から2023年8月31日までの期間で、CustomerのNameが’NDD’であるデータです」

クリックで拡大

今度は正しくSQLが生成されました!

このように、自然言語でコメントを記述することで複雑なSQLを生成してくれるというデータ分析の支援をDuet AIが行ってくれます。

今回紹介はできなかったのですが、BigQuery Studioでは記述されたSQLから何をやろうとしているのかを自然言語で説明してくれるという機能もあるそうで、あまりSQLに明るくない人にとってもうれしい機能ですね。

Duet AIによるコードアシスト機能を使ってみる

SQLと同様にプログラムでもDuet AIは支援をしてくれます。

今回はVisual Studio Code(VSCode)にGoogleから提供されている拡張機能をインストールしてコードアシスト機能を使ってみます。

Cloud Code拡張機能のインストール

まずCloud Code拡張機能をインストールします。なお、Cloud Codeのバージョンは2.0.0です。

インストールできていると画面左下にCloud Code – Sign inという表示があるので、クリックするとブラウザが起動してGoogle Cloudへのログインを行う事ができます。

ログイン後は現在アクティブなプロジェクトが表示されているはずです。

アクティブプロジェクトでDuet AIを有効にする必要があるので、もしも違うプロジェクトがアクティブであるのならば、クリックすると画面上部のSwith Projectからプロジェクトの変更ができます。

Cloud CodeのDuet AI有効化

Ctrl+Shift+Pを押して、コマンドにPreferences: Open User Settingsと入力して、設定画面を開きます。

設定画面の検索窓にDuet AIと入力して、関連する設定項目を表示します。項目のDuet AIを有効化し、Duet AI: Languagesで利用したいプログラム言語を複数追加することができます。今回はpythonだけを選択しました。すべて設定したらVSCodeを再起動してください。

クリックで拡大

再起動してDuet AIが有効なプロジェクトに接続されていれば、下図のように画面右下にDuet AIのアイコンが表示されます。

そして、左のメニューにはDuet AIのメニューが増えており、チャットでアシストしてくれるようです。

Duet AIとのチャットを試す

Cloud Codeで簡単に作成できるCloud Runのサンプルアプリを使って出力されるサンプルコードを使って、そのコードの説明をDuet AIに尋ねてみようと思います。対象のプログラムは次のような簡単なものです。

"""
A sample Hello World server.
"""
import os
from flask import Flask, render_template

# pylint: disable=C0103
app = Flask(__name__)

@app.route('/')
def hello():
    """Return a friendly HTTP greeting."""
    message = "It's running!"
    """Get Cloud Run environment variables."""
    service = os.environ.get('K_SERVICE', 'Unknown service')
    revision = os.environ.get('K_REVISION', 'Unknown revision')

    return render_template('index.html',
                           message=message,
                           Service=service,
                           Revision=revision)

if __name__ == '__main__':
    server_port = os.environ.get('PORT', '8080')
    app.run(debug=False, port=server_port, host='0.0.0.0')

左のメニューからDuet AIのメニューを選択して、チャットのプロンプトに次のように入力してみました。

「次のコードについて私に説明してください」

結果は次の通りになりました。

クリックで拡大

なるほど、プログラムの内容も簡単ですし、簡潔に説明してくれているようです。

Duet AIのコード生成を試す

コード生成はどうでしょうか。こちらは残念ながら日本語では全く動きませんでしたので、英語で試しています。

空のファイルを作って次のようにコメントを入れてから、Enterを押すとコードが生成されます。

「Create Cloud Functions to get 100 records from BigQuery using the json request as a condition and returns the response as json.」(jsonリクエストを条件としてBigQueryから100レコードを取得し、レスポンスをjsonで返すCloud Functionsを作成する。)

# Create Cloud Functions to get 100 records from BigQuery using the json request as a condition and returns the response as json.

import os
from google.cloud import bigquery

def get_records(request):
    """Responds to any HTTP request.
    Args:
        request (flask.Request): HTTP request object.
    Returns:
        The response text or any set of values that can be turned into a
        Response object using
        `make_response <http://flask.pocoo.org/docs/1.0/api/#flask.Flask.make_response>`.
    """
    # Set the project ID
    project_id = os.environ.get('PROJECT_ID')

    # Set the dataset ID
    dataset_id = os.environ.get('DATASET_ID')

    # Set the table ID  
    table_id = os.environ.get('TABLE_ID')

    # Set the query
    query = os.environ.get('QUERY')

    # Create a BigQuery client
    client = bigquery.Client(project=project_id)

    # Run the query
    query_job = client.query(query)

    # Get the results
    results = query_job.result()

    # Get the records
    records = results.to_dataframe()

    # Return the records as json
    return records.to_json(orient='records')

if __name__ == '__main__':
    # Run the function
    get_records()

まあまあいい感じのコードを出力してくれたようです。(リクエストを条件にはしてくれていませんけど・・・)

このように、BigQueryやCloud StorageなどGoogle Cloudのサービスを使ったプログラムについても、SDKを適切に利用するコードを書いてくれるようですね。

もう一つお願いしてみましょう。

「Create a Cloud Functions to send a message to Cloud Pub/Sub triggered by creation of an object in Cloud Storage.」(Cloud Storageにオブジェクトが生成されたら、Cloud Pub/Subにメッセージを送信するCloud Functions関数を作れ)

# create a Cloud Functions to send a message to Cloud pub/sub triggered by the creation of an object in Cloud Storage.

import base64
import json
import os

from google.cloud import pubsub_v1


def hello_gcs(event, context):
    """Triggered by a change to a Cloud Storage bucket.
    Args:
         event (dict): Event payload.
         context (google.cloud.functions.Context): Metadata for the event.
    """

    pubsub_topic = os.environ.get('PUBSUB_TOPIC')
    pubsub_client = pubsub_v1.PublisherClient()

    bucket = event['bucket']
    file = event['name']

    data = {
        'bucket': bucket,
        'file': file
    }

    data = json.dumps(data).encode('utf-8')

    # When you publish a message, the client returns a future.
    future = pubsub_client.publish(pubsub_topic, data=data)
    print(future.result())

    print('Published messages.')
    print(data)

Cloud Functionsが第1世代ですけど、こちらも悪くはなさそうです。

ただし、やはりコメントの記述の仕方には少々工夫がいるようで、私が試している最中では、意図していないようなコード生成が行われることがしばしばありました。このあたりは、プログラムを生成させるためのプロンプトエンジニアリングみたいなものが必要そうですね。

ユニットテストコードを書いてもらう

こうして作成したコードを全選択すると、先頭に電球のマークが表示されるので右クリックするとユニットテストコードをDuet AIが書いてくれるということもやってくれます。

生成されたテストコードは次のようなものです。元が単純なのでテストも簡単なものではありますが、コードを書く手間を考えれば楽といえるかも?

import unittest

from main import hello_gcs

class TestHelloGCS(unittest.TestCase):

    def test_hello_gcs(self):
        event = {
            'bucket': 'my-bucket',
            'name': 'my-file'
        }
        context = {}

        hello_gcs(event, context)

        self.assertTrue(True)


if __name__ == '__main__':
    unittest.main()

なお、Cloud Next ‘23のキーノートでは、C++でSQLを使ってデータベースに接続するコードをGoに変換するというデモをやっていましたので、そのあたりも充実してくるとマイグレーションなども容易になってくるかも知れません。

まとめ

今回はDuet AI in Google Cloudの機能を、ほんの一部に過ぎませんがあれこれと試してみました。まだプレビュー段階であったり、日本語対応も完璧ではないようですが、SQL生成などはそれなりに使えそうなイメージがあります。

他のAI開発支援サービスとDuet AIの違いを挙げるとするならば、Duet AIはGoogle Cloudというエコシステムの中で有機的に機能するAIとなるはずなので、Google Cloudの開発をおこなうのには最適なツールと言えるのではないでしょうか。

それにしても、こうやってAIが開発や運用の支援を行ってくれるようになるというのはすごい世界になってきたなという感想です。

最後に、BigQuery Studioが使えなかったので、いずれ使えるようになったらまた記事を書こうと思います。