🌴

Vertex AI PaLM APIを触ってみる

2023/07/30に公開

LayerX で機械学習エンジニアとして働いている松村 @yu-ya4 です。現在はMLチームにて、バクラクシリーズのAI-OCR機能の開発をはじめとした機械学習技術の活用を推進しています。7月はLayerXエンジニアブログを活発にしよう月間 とのことですのでブログを執筆しております。今日は誰がなんと言おうと7/26です。

今回は、2023年5月にプレビューとなり先月から今月にかけてGAとなったVertex AI PaLM APIを触ってみたので紹介します。なお、このブログを執筆している2023年7月26日時点では英語やスペイン語など5つの言語への対応のみがGAであり、日本語は対応しておりませんのでご注意ください。最新のリリース情報については以下のリリースノートなどをご参照ください。

https://cloud.google.com/vertex-ai/docs/generative-ai/release-notes

PaLM自体は日本語を含む多数の言語からなるデータセットで学習されているので入力を受け付けること自体は問題ないはずですが、GCP上のサービスとして十分な性能検証がこれからであるために日本語が入力された際は機能しないように制限されているとのことです。ちなみに今回 Vertex AI PaLM APIを触ってみたのは日本語対応のテスター(Trusted Tester Program)に選んでいただいたことがきっかけです。せっかくなので本ブログにおける入出力例も日本語を用いていたのですが、GAしていない生成AI系の機能の入出力を許可なく第三者に公開することが禁じられていることに気がつきました。規約は守りましょう。

PaLM / PaLM 2

PaLM(Pathways Language Model)とはGoogleの開発する大規模言語モデル(LLM)のひとつであり、2022年4月に発表されました。最大で540Bのパラメタを持つTransformerベースの巨大モデルであり、因果関係の理解や数学計算、コード生成など幅広いタスクへの対応や多言語への対応で話題となりました。

筆者は当時たまたま公開直後に論文を読んでいたのですが、最近ではプロンプトエンジニアリングのテクニックとしても有名になったChain of Thought(CoT)の考え方に初めて触れて感動した記憶があります。

PaLM 2は2023年5月に発表されたPaLMを発展させた大規模言語モデルです。PaLMの特徴であった多言語対応や幅広いタスクへの対応の性能が全体的に底上げされています。実応用への意識も強く、モバイル端末でも動作可能な軽量モデルGeckoをはじめ、Otter、Bison、Unicornというサイズの異なる4つのモデルが発表されています。PaLM 2は現在、BardGoogle WorkspaceなどGoogleの25を超えるプロダクト、機能に搭載されているとのことです。

特定のドメインに特化したモデルの開発も進んでおり、医療領域に特化したMed-PaLM 2やセキュリティ領域に特化した Sec-PaLM などが発表されています。

https://japan.googleblog.com/2023/05/palm-2.html

Vertex AI PaLM API

Vertex AI PaLM APIはVertex AIの生成AIサポートの中で提供されている機能のひとつであり、APIを通して先述のPaLM 2(ベースのモデル)が利用できます。

PaLM 2系のモデルを利用したサービスには、ユーザーの入力に応じた自然言語を生成するものと、エンべディングを生成するもの、コードを生成するものの大きく3つあります。テキスト生成とコード生成のモデルはそれぞれチャットベースのものも提供されています。

API モデル 入出力トークン数など ファインチューニング
PaLM 2 for Text text-bison Max input token: 8192
Max output tokens: 1024
Training data: Up to Feb 2023
PaLM 2 for Chat chat-bison Max input token: 4096
Max output tokens: 1024
Training data: Up to Feb 2023
Max turns : 2500
x
Embeddings for text textembedding-gecko 3072 input tokens and outputs 768-dimensional vector embeddings. x
Codey for Code Generation code-bison Max input token: 6144
Max output tokens: 2048
x
Codey for Code Chat codechat-bison Max input token: 6144
Max output tokens: 2048
x
Codey for Code Completion code-gecko Max input token: 2048
Max output tokens: 64
x

https://cloud.google.com/vertex-ai/docs/generative-ai/learn/models#foundation_models

PaLM APIの利用方法は、Vertex AI model gardenGenerative AI Studioの大きく2通りあります。model gardenではPaLM APIを含む様々な事前学習モデルのAPIが提供されており、curlで叩くなりPyhton SDKを使うなりすれば簡単に利用できます。提供されているモデルは、Stable Diffusionなどの画像生成モデルやChirpなどの音声生成モデル、NLPの分野を中心に昔からよく利用されるBERTやRoBERTaなど多岐にわたります。それらのモデルをVertex AI上でファインチューニングしてそのままVertex AIのエンドポイントにてサービングするということも可能なようで、機械学習モデルの実活用のハードルがかなり下がっていることが実感されます。

model garden

Generative AI Studioでは、UI上で簡単に基盤モデルを試すことができます。コードを書くのが苦手な方でも直感的にPaLMなどの言語モデルを試すことができますし、試した内容のコードを吐き出すこともできますのでそのまま実装に落とし込むにも便利です。

https://cloud.google.com/blog/ja/products/ai-machine-learning/vertex-ai-model-garden-and-generative-ai-studio

今回はVertex AI model gardenで公開されている「PaLM 2 for Text」と「PaLM 2 for Chat」のAPIを利用してみます。

事前準備

今回はPython SDKを利用します。筆者はM1 Macを利用してPython 3.11.4にて動作確認しました。gcloudの認証やAPIの有効化、SDKのインストールなどは公式ドキュメントに従って進めてください。SDKはpipでもpoetryでも困ることなくインストールできました。

$ pip install google-cloud-aiplatform

https://cloud.google.com/vertex-ai/docs/start/cloud-environment?hl=ja

PaLM 2 for Text

入力したテキスト(自然言語)に対してテキストを出力してくれるPaLM 2 for Textから試してみます。実装に難しい部分はなく、学習済みモデルを指定して初期化した上でパラメタと入力となるプロンプトを指定して推論するだけです。パラメタの意味は以下の通り。

  • temperature: 温度パラメタ。小さいほど出力が入力に対して決定的になる。([0.0, 1.0]、default: 0.0)
  • max_output_tokens: 出力のトークン数上限([1, 1024]、default: 128)
  • top_p: 生成するトークンを選択する際に、累積確率がpになるまで生成確率の大きい順にトークンを選択し、その中から次のトークンを選択する。([0.0, 1.0]、default: 0.95)
  • top_k: 生成するトークンを選択する際に、生成確率上位k件の中から次のトークンを選択する。([0.0, 40]、default: 40)
from vertexai.language_models import TextGenerationModel

parameters = {
    "temperature": 0.2,
    "max_output_tokens": 256,
    "top_p": 0.8,
    "top_k": 40
}


model = TextGenerationModel.from_pretrained("text-bison@001")
question = "Input Question: What is the business of LayerX?"
prompt = f"{question}\nA:"

answer = model.predict(prompt, **parameters)
print(answer.text)
> LayerX is a Japanese blockchain company.

今は違います(日本語で質問しても同等の結果でした)。2023年2月までのデータを利用して学習しているとのことなので、LayerXについても最新の情報を回答してもらいたかったのですが仕方ありません。LayerXが現在何をしているのかは以下のブログなどをご覧ください。

https://note.com/fukkyy/n/n7f60e18db2c6

PaLM 2 for Chat

次に、自然言語での対話ができるPaLM 2 for Chatを試してみます。こちらも実装に難しい部分はありません。会話の内容を自前でコンテキストに入れてあげなくても良いのは楽ですね。

from vertexai.language_models import ChatModel, InputOutputTextPair

parameters = {
    "temperature": 0.2,
    "max_output_tokens": 256,
    "top_p": 0.8,
    "top_k": 40
}


model = ChatModel.from_pretrained("chat-bison@001")
chat = model.start_chat()
>>> chat = model.start_chat()
>>> chat.send_message("Do you like drinking?", **parameters)
I don't have a preference for drinking.
>>> chat.send_message("Why?")
I am not programmed to have preferences.

特に何もせずとも会話の内容が引き継がれるのは便利だと思いました。

もちろんコンテキストや、対話の例を与えてあげることも可能です。

chat = model.start_chat(
    context="You are a 30 year old man who loves to drink.",
    examples=[
        InputOutputTextPair(
            input_text="How often do you drink?",
            output_text="I drink every day.",
        ),
    ],
)
>>> chat.send_message("Do you like drinking?", **parameters)
I love drinking.
>>> chat.send_message("Why?", **parameters)
It makes me feel good.
>>> chat.send_message("I think so.", **parameters)
I know so.

終わりに

今回はVertex AI PaLM APIについて調査し、「PaLM 2 for Text」と「PaLM 2 for Chat」を簡単に触ってみました。これだけ大きいモデルがここまでシュッと試せ、かつ実際にプロダクトにも容易に活用できる世界に改めて驚きと感謝を感じました。個人的にはGCP、主にBigQueryの信者ですので、うまいこと組み合わせてプロダクト開発やデータ分析コンペに活かしたいお気持ちです。

最後になりますが、LayerXでは一緒にハタラク仲間を募集しています!まずはカジュアルにお話しできればと思いますので、お気軽に twitter のDMや以下のリンクから声をかけてください。

https://jobs.layerx.co.jp/03086b53925347b08050a240be370ced

https://open.talentio.com/r/1/c/layerx/pages/63504

LayerX

Discussion