Google Cloud VertexAIでGenerative AI Studio(PaLM)を試してみる

## 目的
Google Cloudの生成AIであるVertexAIの機能をコンソールから試してみる
今回は、ChatGPTの様な会話形式の機能とし、複数あるパラメタを変化させながら挙動を確認していく。

## Vertex AIとは？

Google Cloudが提供する統合型の機械学習（ML）プラットフォーム
MLのプロジェクト全体であるデータの前処理からモデルのトレーニング、評価、そしてデプロイまでの一連の作業を効率的に行うためのツールやサービスを提供している

## Generative AI Studioとは？

Vertex AIの一部としてGoogle Cloudが提供する生成型AIモデルのツール。
カスタマイズとデプロイをサポートし、ユーザは自分ニーズや要件に合わせてAIモデルを調整し、結果をアプリケーションやサービスに組み込むことが可能

## Generative AI Studioでチャット形式の会話を試してみる


### APIの有効化
Google Cloudコンソールのメニューから、**APIとサービス** -> **ライブラリ**をクリック
![貼り付けた画像_2023_08_15_18_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/84e965c0-8d9e-e4f1-f279-5986ed654b07.png)

検索エリアに有効化したいAPIの名前、今回は**vertex**を入力する
その後、出てきたサービス名をクリックする
![貼り付けた画像_2023_08_15_18_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/9dfa81e6-88e8-7e35-7fee-3fdd62f7ab21.png)

**有効化する**をクリックし、APIを有効化する
![貼り付けた画像_2023_08_15_18_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/14be2ce8-8a9b-bf0e-5df0-532efe8d7cb2.png)

### Generative AI Studioを使用してみる 
実際にGenerative AI Studioを使いつつ、各パラメータ

:::note info
インフォメーション
PaLM には、Google の考え方を反映していない、不正確または不適切な情報が表示されることがあります。
:::
[Language Support](https://cloud.google.com/vertex-ai/docs/generative-ai/learn/models#language_support)を見ると、まだ日本語に対応していないようだが使えるみたい
VertexAIのページに移動するため、検索メニューから検索しページに移動する
![貼り付けた画像_2023_08_15_18_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/b8667143-e708-e219-c272-0cd255a67fb3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/4d2cdf7d-d209-49ba-bc2c-79a03e341369.png)

ChatGPTの様なチャットタイプのプロンプト形式であるページ「**TEXT CHAT**」に移動する
![貼り付けた画像_2023_08_15_18_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/c9d84d41-3a69-aa1f-bb41-94a318575e37.png)

こちらがチャット形式で利用できるコンソールの画面
各パラメタについては、随時説明とサンプル結果を記載していく。

**コンテキスト(Context)**:モデルに入力情報や背景情報を指定することで、AIモデルの応答方法を定義
**例(Examples)**:モデルに期待する応答やタスクの実行方法を明確に伝えて挙動や応答を制御
**レスポンス(Responses/Messages)**:AIモデルとの会話内容の履歴を表示
**温度(temperature)**:モデルの出力の多様性や確実性を調整するためのパラメータ
**トークンの制限(token limit)**:基本的なテキストの単位であり、モデルの性能や処理能力
**トップK(Top-k)**:kの値によって、生成されるテキストの品質や多様性が変わる
**トップP(Top-p)**:pの値によって、次に来る単語を選ぶときの選び方を決める方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/a22a9af9-2ff8-9cbb-c4c1-27c3ae8f6a70.png)


### モデル

VertexAIで利用できるモデルについては、下記ページに詳細が載っている
https://cloud.google.com/vertex-ai/docs/generative-ai/learn/models#foundation_models

### コンテキスト(context)とは？
コンテキストとは、モデルに与えられる入力情報や背景情報のことを指す。

Google Cloudにおけるコンテキスト(Context)の説明
```
Context shapes how the model responds throughout the conversation. 
For example, you can use context to specify words the model can or cannot use, 
topics to focus on or avoid, or the response format or style.

コンテキストは、モデルがどのように応答すべきかを指定するものです。
たとえば、「このコードを説明して」のように、モデルが使用できる言葉や使用できない言葉、
沿うべきトピックや避けるべきトピック、応答の形式を指定します。
コンテキストは、モデルにリクエストを送信するたびに適用されます。
```

#### サンプルテスト
「コンテキスト」を利用して、AIモデルへの応答を制御する
基本的に無知なAIモデルとして、ユーザからの質問には答えないとするが
なぜか計算問題は答えてくれる「コンテキスト」を試し、意図した動作を確認できた。
![貼り付けた画像_2023_08_15_19_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/7e68dfc2-2006-7484-e53b-329c7f78cf92.png)


### 例(examples)とは？
モデルに特定のタスクや応答のスタイルを理解させるための参考情報を提供する。
モデルに期待する応答やタスクの実行方法を明確に伝えるための重要なツールとなっており、「例」を使用して、モデルの挙動や応答をより制御し、期待する結果を得ることができる。

Google Cloudにおける例(Examples)の説明
```
List of structured messages to the model to learn how to respond to the conversation.

例は、適切なモデルの応答がどのようなものかをモデルが理解するうえで役立ちます。
入力と出力の例を独自に記述することも、[テスト] セクションを使用して実際の応答を例として保存することもできます。
また、すべての例に付加する接頭辞を追加することもできます（「質問」と「回答」など）。
```

#### サンプルテスト
「例」を使っていない時、ユーザの「こんばんは」に対して、AIは「こんにちは」と返してくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/b59f5ec8-dae6-312f-5a27-2fedbbc2f246.png)

「例」に以下の様な単純なあいさつへの、単純な返しを記載すると「例」に従って出力してくれる。
おはよう -> おはようございます。
こん -> こんちゃ
こんばんは -> ねむい

![貼り付けた画像_2023_08_15_19_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/8fcae51f-4e71-c725-440c-74185aa1ea89.png)

### 温度(temperature)とは？
モデルの出力の多様性や確実性を調整するためのパラメータ

temperatureの値が高い場合(1に近いほど）、モデルの出力はよりランダムになる。
temperatureの値が低い場合(0に近いほど）、モデルの出力はより確実性が高くなる。

いろんなアイデアを出して欲しい時はランダム性を高めるなど

Google Cloudにおける例(Examples)の説明
```
The temperature is used for sampling during the response generation, which occurs when topP and topK are applied. 
Temperature controls the degree of randomness in token selection. 
Lower temperatures are good for prompts that require a more deterministic and less open-ended or creative response, 
while higher temperatures can lead to more diverse or creative results. 
A temperature of 0 is deterministic: the highest probability response is always selected. 
For most use cases, try starting with a temperature of 0.2.

温度は、トークン選択のランダム性の度合いを制御します。
低い温度は、正しいレスポンスや適切なレスポンスが求められるプロンプトに適しています。
一方、温度が高いと、多様な結果や想定外の結果が生じる可能性があります。
温度 0 は決定論的で、確率が最高のトークンが常に選択されます。
ほとんどのユースケースでは、温度 0.2 から始めることをおすすめします。
```

#### サンプルテスト

temperatureを**1**にしてランダム性の高い回答にしてみると、回数は少ないが３回とも異なる応答となった
![貼り付けた画像_2023_08_16_10_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/a40c3be7-d000-0f13-412f-ade9dcc45959.png)

逆に*0*にすると、同じ回答となる
![貼り付けた画像_2023_08_16_10_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/596f4eb8-da45-5168-91cc-6d4c533bdbb8.png)

### トークンの制限(token limit)
トークンは大規模言語モデルにおける基本的なテキストの単位であり、モデルの性能や処理能力、そしてコストに関連する
指定する

**トークン数が少ない場合**
トークンの数が少ない場合、モデルが受け付けるテキストの長さや、モデルが生成するテキストの長さも短くなる。
モデルの処理速度やコストの面での利点がある一方、テキストの情報や文脈の欠落というデメリットも考慮する必要がある。

**トークン数が多い場合**
トークンの制限が大きい場合、モデルはより長いテキストを受け付けることができ、また、より長いテキストを生成することも可能
トークンの数が多い場合、モデルはより詳細な情報や文脈を持つテキストを処理する能力が向上しますが、処理速度の低下やコストの増加といったデメリットも考慮する必要があり

Google Cloudにおけるトークンの制限(token limit)の説明
```
Maximum number of tokens that can be generated in the response. 
Specify a lower value for shorter responses and a higher value for longer responses.

A token may be smaller than a word. A token is approximately four characters. 
100 tokens correspond to roughly 60-80 words.

トークンの上限により、1 つのプロンプトから出力されるテキストの最大量が決まります。
トークンは約 4 文字です。デフォルト値は 256 です。
```

#### サンプルテスト

トークンの数値を小さくすると、出力される内容も短くなる
![貼り付けた画像_2023_08_16_14_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/0ac5659d-52e9-5d9c-1a55-7d722baf48fc.png)

トークンの数値を大きくすると、出力される内容も長くなる
![貼り付けた画像_2023_08_16_14_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/d3300b4b-ab55-f42a-7353-533c91e7ca28.png)

### トップK(Top-k)とは？

kの値によって、生成されるテキストの品質や多様性が変わる。
小さなkの値は出力の多様性を制限し、大きなkの値は不適切な出力を増やすリスクがある。

**kの値が低い場合**
モデルはトークンとして選択可能な候補の数が少なくなる。
その結果、生成されるテキストの多様性が低下し、似たような文やフレーズが繰り返し生成される。
一方で、出力の一貫性や品質が向上する可能性もある。

**kの値が高い場合**
モデルはトークンとして選択可能な候補の数が増える。
その結果、生成されるテキストの多様性が増加し、さまざまな文やフレーズが生成される。
一方で、出力の一貫性や品質が低下するリスクが増加する。

Google CloudにおけるトップK(Top-k)の説明
```
Top-k changes how the model selects tokens for output. 
A top-k of 1 means the selected token is the most probable among all tokens in the model's vocabulary (also called greedy decoding), 
while a top-k of 3 means that the next token is selected from among the 3 most probable tokens (using temperature).

For each token selection step, the top K tokens with the highest probabilities are sampled. 
Then tokens are further filtered based on topP with the final token selected using temperature sampling.

Specify a lower value for less random responses and a higher value for more random responses.

トップ K は、モデルが出力用にトークンを選択する方法を変更します。
トップ K が 1 の場合、選択されるトークンは、モデルの語彙内のすべてのトークンで最も確率の高いものであることになります（グリーディ デコードとも呼ばれます）。
トップ K が 3 の場合は、最も確率が高い上位 3 つのトークンから次のトークン選択されることになります（温度を使用します）。トップ K のデフォルト値は 40 です。
```

#### サンプルテスト
クリエイティブな質問でどう言った返答が来るか確認してみた。
```
宇宙でのピクニックに必要な重要なものを、様ざなシチュエーションを考慮して、3つ持っていくとしたら何が最適か考えてください。
何が必要かだけ、端的に答えてください。
```

K値を**40**にした時
**同じ回答もあるが、異なる回答もいくつかあった**
![貼り付けた画像_2023_08_16_15_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/20a3bed0-aa33-d1e3-0cb6-4c6f8800663d.png)


<details><summary>10回分のサンプル</summary>

1
宇宙食
水
酸素マスク

2
宇宙服
酸素マスク
宇宙食

3
宇宙食
水
酸素マスク

4
宇宙食
水
酸素マスク

5
宇宙服
酸素マスク
宇宙食

6
宇宙服
酸素ボンベ
宇宙食

7
宇宙服
酸素マスク
宇宙食

8
宇宙食
水
酸素マスク

9
宇宙服
酸素マスク
宇宙食

10
宇宙食
水
酸素マスク
</details>

K値を**1**にした時
**全部同じ回答となった**
![貼り付けた画像_2023_08_16_15_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/81e44211-d9ad-8608-510e-3d42b3633254.png)


<details><summary>10回分のサンプル</summary>

1
酸素マスク
宇宙服
宇宙食

2
酸素マスク
宇宙服
宇宙食

3
酸素マスク
宇宙服
宇宙食

4
酸素マスク
宇宙服
宇宙食

5
酸素マスク
宇宙服
宇宙食

6
酸素マスク
宇宙服
宇宙食

7
酸素マスク
宇宙服
宇宙食

8
酸素マスク
宇宙服
宇宙食

9
酸素マスク
宇宙服
宇宙食

10
酸素マスク
宇宙服
宇宙食
</details>

### トップP(Top-p)とは？
言語モデルが文章を生成する際の方法の一つで、次に来る単語を選ぶときの選び方を決める方法

モデルは、次に来る単語が何かを予測し、それぞれの単語が来る確率を計算する。
例えば、「こんにちは、私は」の後に「猫が好き」と続く確率が60%、または「犬が好き」と続く確率が40%といった具体的な確率を出す。この確率を高いものから順に足していき、その合計が指定した閾値p（例: 0.9や0.95など）を超えるまでの単語を候補として選ぶ。そして、その候補の中からランダムに1つの単語を選んで文章を続ける。

**pの値が低い場合**
pの値が低いとのトークンとして選択される候補の範囲が狭まるため、
生成されるテキストの多様性が低下し、似たような文やフレーズが繰り返し生成される可能性が高まる。
一方で、出力の一貫性や品質が向上する可能性が高くなる。

**pの値が高い場合**
pの値が高いと、トークンとして選択される候補の範囲が広がるため、
生成されるテキストの多様性が増加し、さまざまな文やフレーズが生成される可能性が高まる。
一方で、出力の一貫性や品質が低下するリスクが増加する。


Google CloudにおけるトップP(Top-p)の説明
```
Top-p changes how the model selects tokens for output. 
Tokens are selected from most K (see topK parameter) probable to least until the sum of their probabilities equals the top-p value. 
For example, if tokens A, B, and C have a probability of 0.3, 0.2, and 0.1 and the top-p value is 0.5, 
then the model will select either A or B as the next token (using temperature) and
doesn't consider C. The default top-p value is 0.8.

Specify a lower value for less random responses and a higher value for more random responses.

トップ P は、モデルが出力用にトークンを選択する方法を変更します。
確率の合計が トップ P の値と等しくなるまで、最も確率が高いものから最も確率が低いものの順に、トークンが選択されます。
たとえば、トークン A、B、C の確率が 0.3、0.2、0.1 で、トップ P の値が 0.5 の場合、
モデルは次のトークンとして A と B のいずれかを選択します（温度を使用します）。
トップ P のデフォルト値は 0.8 です。
```

#### サンプルテスト
クリエイティブな質問でどう言った返答が来るか確認してみたが、あまり違いがわからなかった・・・。
```
森の中で迷子になった子猫の話を50文字程度で考えてみてください。
```

P値を**1**にした時
![貼り付けた画像_2023_08_16_15_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/3d9f66cd-9e11-ee38-3165-1c15204da972.png)

<details><summary>10回分のサンプル</summary>

1
森の中で迷子になった子猫は、怖くて泣き出しました。すると、森の動物たちが集まって、子猫を探してくれました。子猫は動物たちに助けられて、無事に家まで帰ることができました。

2
森の中で迷子になった子猫は、怖くて泣き出しました。すると、森の動物たちが集まって、子猫を探してくれました。子猫は、動物たちのおかげで無事に家に帰ることができました。

3
小さな子猫が森の中で迷子になりました。子猫は怖くて泣き出しました。すると、森の動物たちが子猫を助けてくれました。動物たちは子猫を森の出口まで連れて行き、子猫は家に帰ることができました。

4
森の中で迷子になった子猫は、怖くて泣き出しました。すると、森の動物たちが集まって、子猫を探してくれました。子猫は動物たちに助けられ、無事に家まで帰ることができました。

5
小さな子猫が森の中で迷子になりました。子猫は怖くて泣き出しました。森の動物たちは子猫を助けようとしました。子猫は動物たちに導かれて森から出ることができ、家に帰ることができました。

6
小さな子猫は森の中で迷子になりました。彼は怖くて泣き始めました。すると、森の動物たちが彼を見つけて助けてくれました。彼らは彼を森の外に連れて行き、彼が家に帰れるようにしました。

7
小さな子猫は森の中で迷子になりました。彼は怖くて泣き始めました。森の動物たちは彼の泣き声を聞いて、彼を助けに行きました。彼らは彼を森の出口まで連れて行き、彼は家に帰ることができました。

8
森の中で迷子になった子猫は、怖くて泣き出しました。すると、森の動物たちが集まって、子猫を探してくれました。子猫は動物たちに助けられ、無事に家に帰ることができました。

9
森の中で迷子になった子猫は、怖くて泣き出しました。すると、森の動物たちが集まって、子猫を探してくれました。子猫は動物たちに助けられ、無事に家まで帰ることができました。

10
小さな子猫は森の中で迷子になりました。彼は怖くて泣きました。森の動物たちは彼を助けてくれました。彼らは彼を森の出口に連れて行き、彼は家に帰ることができました。
</details>

P値を**0**にした時
![貼り付けた画像_2023_08_16_15_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/73685570-e4f6-ab69-a06e-b11f53d2c9d7.png)

<details><summary>10回分のサンプル</summary>

1
森の中で迷子になった子猫は、怖くて泣き出しました。すると、森の動物たちが集まって、子猫を探してくれました。子猫は動物たちに助けられて、無事に家まで帰ることができました。

2
小さな子猫は、森の中で迷子になりました。彼は怖くて泣き始めました。森の動物たちは、子猫を助けるために集まりました。彼らは子猫を森の出口まで連れて行き、彼が家に帰れるようにしました。

3
小さな子猫は、森の中で迷子になりました。彼は怖くて泣き始めました。森の動物たちは、子猫を助けるために集まりました。彼らは子猫を森の外に連れて行き、彼が家に帰れるようにしました。

4
小さな子猫が森の中で迷子になりました。子猫は怖くて泣き出しました。すると、森の動物たちが子猫を助けてくれました。動物たちは子猫を森の出口まで連れて行ってくれました。子猫は動物たちに感謝して、元気に家まで帰りました。

5
小さな子猫は、森の中で迷子になりました。彼は怖くて泣き、助けを求めました。幸運にも、彼は森の賢い鳥に出会いました。鳥は子猫を森の出口まで導き、彼は家に帰ることができました。

6
小さな子猫が森の中で迷子になりました。子猫は怖くて泣き出しました。すると、森の動物たちが子猫を助けてくれました。動物たちは子猫を森の出口まで連れて行ってくれました。子猫は森から出ることができて、とても嬉しかったです。

7
小さな子猫は森の中で迷子になりました。彼は怖くて泣きました。森の動物たちは彼を助けてくれました。彼らは彼を森の出口に連れて行き、彼は家に帰ることができました。

8
小さな子猫は森の中で迷子になりました。彼は怖くて泣き始めました。森の動物たちは彼の泣き声を聞いて、彼を助けに行きました。彼らは彼を森の出口まで連れて行き、彼は家に帰ることができました。

9
森の中で迷子になった子猫は、怖くて泣き出しました。すると、森の動物たちが集まって、子猫を探してくれました。子猫は、動物たちのおかげで無事に家まで帰ることができました。

10
森の中で迷子になった子猫は、怖くて泣き出しました。すると、森の動物たちが集まって、子猫を探してくれました。子猫は、動物たちのおかげで無事に家に帰ることができました。
</details>