Gemini 1.5 Flash Vertex APIのレスポンス速度

# はじめに
株式会社StackPilesではAIチャットボットやAI-OCRを開発しております。
この度、Vertex APIを用いてGemini 1.5 Flashを使用する機会がありました。リアルタイム性を求められたので、いろんなパラメータや設定を変更することによるレスポンス速度の変化の調査を行いました。

# 調査1 デフォルト設定
## 目的
デフォルトの設定でどれほどかかるか把握する。

## 結果
|レスポンス内容|レスポンス時間(秒)|
|-|-|
|AGI は、理論的には可能ですが、実現するかどうかはまだ分かりません。(37)|1.21|
|AGI は、人間の知能と能力を模倣できる人工知能ですが、実現には重大な技術的課題がいくつかあります。(51)|1.33|
|AGI は、人間と同様の知能を持つ可能性がありますが、達成は非常に困難であり、その実現時期は不明です。(53)|1.39|
|AGI は、理論的には可能ですが、技術的な課題は多く、その実現時期は不明です。(41)|1.32|
|AGIの実現可能性は、まだ議論の余地があり、実現する可能性もあれば、決して実現しない可能性もあります。(53)|0.75|

## 感想
だいたい1秒付近ですね。一度だけ1秒をきりました。レスポンス文字数に変化するということはなさそうです。

<details><summary>使用したコード</summary>

```py
from vertexai.generative_models import GenerativeModel, Part
import time

# Gemini 1.5 Flashモデルの設定
model = GenerativeModel(
    'gemini-1.5-flash',
)

# プロンプトの設定
user_prompt = "AGIの実現可能性について一言で説明してください。"

message = [
        Part.from_text(f"{user_prompt}"),
]

# Gemini APIを呼び出し
start = time.time()
response = model.generate_content(message)
end = time.time()
text = response.candidates[0].content.text
print(f"{text}({len(text)})|{time.time() - start}|")
```
</details>

# 調査2 max_output_tokens指定
## 目的
出力トークン数を制限することで調査1の結果と比較しどれくらい変化するかを調べる。

## 結果
|レスポンス内容|レスポンス時間(秒)|
|-|-|
|AGIの実現可能性は、テクノロジーの(18)|1.23|
|AGIの実現可能性は、活発な議論(16)|1.24|
|AGI の実現可能性は、技術的な進歩(18)|1.21|
|AGIの達成可能性は、現在のところ議論の(20)|1.17|
|AGIの実現可能性は、技術的および哲学(19)|1.21|

## 感想
若干速くなったかと思うが、劇的な変化はない。小さな出力文字数の変化では速度の変化に影響はなさそう。

<details><summary>使用したコード</summary>

```py
from vertexai.generative_models import GenerativeModel, GenerationConfig, Part
import time

# Gemini 1.5 Flashモデルの設定
model = GenerativeModel(
    'gemini-1.5-flash',
)

# モデル設定
generation_config = GenerationConfig(
    max_output_tokens=10,
)

# プロンプトの設定
user_prompt = "AGIの実現可能性について一言で説明してください。"

message = [
        Part.from_text(f"{user_prompt}"),
]

# Gemini APIを呼び出し
start = time.time()
response = model.generate_content(message, generation_config=generation_config)
end = time.time()
text = response.candidates[0].content.text
print(f"|{text}({len(text)})|{round(time.time() - start, 2)}|")
```
</details>

# 調査3 temperature指定
## 目的
temperatureを0.0, 0.5, 1.0, 1.5, 2.0に変化させレスポンス速度の影響を調べる。

## temperature=0.0
|レスポンス内容|レスポンス時間(秒)|
|-|-|
|AGIの実現可能性は、活発な議論と研究の対象であり、その実現は依然として不確かです。(44)|1.52|
|AGIの実現可能性は、活発な議論と研究の対象であり、その実現は依然として不確かです。(44)|1.46|
|AGIの実現可能性は、活発な議論と研究の対象であり、その実現は依然として不確かです。(44)|1.41|
|AGIの実現可能性は、活発な議論と研究の対象であり、その実現は依然として不確かです。(44)|1.6|
|AGIの実現可能性は、活発な議論と研究の対象であり、その実現は依然として不確かです。(44)|1.39|

## temperature=0.5
|レスポンス内容|レスポンス時間(秒)|
|-|-|
|AGIの実現可能性は、活発な議論と研究の対象であり、その実現時期は不明です。(40)|1.31|
|AGIの実現可能性は、活発な議論の的であり、その実現は技術的な課題と倫理的な問題に依存します。(49)|1.4|
|AGIの実現可能性は、活発な議論の的であり、まだ明確な答えはありません。(38)|1.4|
|AGIの実現可能性は、活発な議論の的であり、まだ確実な答えはありません。(38)|1.24|
|AGIの実現可能性は、まだ議論の余地があり、確実な答えはありません。(36)|1.27|

## temperature=1.0
|レスポンス内容|レスポンス時間(秒)|
|-|-|
|AGIは、人間レベルの知能を持つAIを実現する可能性を秘めていますが、実現には多くの課題が残されています。(55)|1.44|
|AGIの実現可能性は、人間の知能を完全に模倣できるコンピュータシステムを作るという技術的課題、倫理的影響、そして未解決の問題が複雑に絡み合ったものです。(78)|1.52|
|AGIの実現可能性は、現在活発な議論の的であり、その実現可能性は、依然として未解明です。(46)|1.42|
|AGIの実現可能性は、技術的な課題、倫理的な懸念、そして私たちの知能の本質についての根本的な疑問に直面しています。(58)|1.39|
|AGIの実現可能性は、技術的進歩、倫理的懸念、そして人間の知能そのものの複雑さを考えると、依然として議論の的となっています。(64)|1.43|

## 感想
temperature=0.0は厳密性が高いため返答内容はすべて同じになった！そのためか、速度が全体的に遅め。それ以外の0.5, 1.0は大きな変化はなし。

<details><summary>使用したコード</summary>

```py
from vertexai.generative_models import GenerativeModel, GenerationConfig, Part
import time

# Gemini 1.5 Flashモデルの設定
model = GenerativeModel(
    'gemini-1.5-flash',
    # system_instruction=system_prompt,
)

# モデル設定
generation_config = GenerationConfig(
    temperature=1.0,
)

# プロンプトの設定
user_prompt = "AGIの実現可能性について一言で説明してください。"

message = [
        Part.from_text(f"{user_prompt}"),
]

# Gemini APIを呼び出し
start = time.time()
response = model.generate_content(message, generation_config=generation_config)
end = time.time()
text = response.candidates[0].content.text
print(f"|{text.strip()}({len(text)})|{round(time.time() - start, 2)}|")
```
</details>

# 調査4 top_k指定
## 目的
top_kを1, 10, 20, 30に変化させレスポンス速度の影響を調べる。

## top_k=1
|レスポンス内容|レスポンス時間(秒)|
|-|-|
|AGIは、人間レベルの知能を持つ人工知能であり、その実現可能性は議論の的となっています。(46)|1.65|
|AGI は理論上可能ですが、その実現には技術的な課題が山積しており、いつ実現するかは不明です。(48)|1.42|
|AGIの実現可能性は、依然として活発な議論と推測の対象です。(32)|1.29|
|AGIの実現可能性は、活発な議論と研究の対象であり、専門家の意見は分かれています。(43)|1.45|
|AGI は、人間の知能を超える能力を持つ可能性を秘めている、実現可能な目標です。(42)|1.29|

## top_k=10
|レスポンス内容|レスポンス時間(秒)|
|-|-|
|AGIの実現可能性は、科学的議論の対象であり、その達成は技術的および倫理的な課題に満ち溢れています。(52)|1.38|
|AGI は、人間の知能に匹敵する人工知能ですが、現時点では実現していません。(40)|1.27|
|AGIの実現可能性は、まだ議論の余地があり、達成のタイムラインは不確かです。(40)|0.72|
|AGIの出現は、現在、コンピュータサイエンスにおける最も難しい課題であり、その実現は不確実です。(50)|1.33|
|AGI は理論的には実現可能ですが、現在の技術ではまだ遠い未来のことです。(39)|1.21|

## top_k=20
|レスポンス内容|レスポンス時間(秒)|
|-|-|
|AGI の実現可能性は、現在も熱い議論の的となっていますが、その可能性は、人間レベルの知能と汎用性を備えたシステムを構築するための技術的進歩と倫理的課題にかかっています。(87)|1.58|
|AGIの実現可能性は、現在活発な議論と研究の対象であり、意見は分かれています。(40)|1.3|
|AGIの実現可能性は、現在も活発な議論の的であり、実現は難しいものの、不可能ではありません。(48)|1.28|
|AGI は、まだ理論上の概念であり、実証されていないものです。(33)|0.77|
|AGIの実現可能性は、現在も議論が続いているホットトピックであり、確実な答えはありません。(47)|1.38|

## top_k=30
|レスポンス内容|レスポンス時間(秒)|
|-|-|
|AGIの実現可能性は、活発な議論の対象であり、まだ決定されていません。(37)|1.36|
|AGI の実現可能性は、依然として活発な議論の的であり、明確な答えはありません。(41)|1.39|
|AGIの実現可能性は、技術的な挑戦と倫理的な懸念という2つの側面を持つ、活発な議論の的です。(48)|1.36|
|AGIの実現可能性は、技術的な課題と倫理的な課題が複雑に絡み合った、活発な議論の的となっています。(51)|1.33|
|AGI は、人間の知能に匹敵する、またはそれを超える能力を持つ AI を指しますが、その実現可能性は活発な議論の的であり、実現時期は未定です。(73)|1.38|

## 感想
特に変化はなさそうですね～。サンプリングするのに特にコストはかからない or あらかじめサンプリングしたうえでtop_kで絞り込んでるんでしょうか。

<details><summary>使用したコード</summary>

```py
from vertexai.generative_models import GenerativeModel, GenerationConfig, Part
import time

# Gemini 1.5 Flashモデルの設定
model = GenerativeModel(
    'gemini-1.5-flash',
    # system_instruction=system_prompt,
)

# モデル設定
generation_config = GenerationConfig(
    top_k=20,
)

# プロンプトの設定
user_prompt = "AGIの実現可能性について一言で説明してください。"

message = [
        Part.from_text(f"{user_prompt}"),
]

# Gemini APIを呼び出し
start = time.time()
response = model.generate_content(message, generation_config=generation_config)
end = time.time()
text = response.candidates[0].content.text
print(f"|{text.strip()}({len(text)})|{round(time.time() - start, 2)}|")
```
</details>

# 調査5 top_p指定
## 目的
top_pを0.0, 0.3, 0.5, 0.7, 1.0に変化させレスポンス速度の影響を調べる。

## top_p=0.0
|レスポンス内容|レスポンス時間(秒)|
|-|-|
|AGIの実現可能性は、活発な議論と研究の対象であり、その実現は依然として不確かです。(44)|1.36|
|AGIの実現可能性は、活発な議論と研究の対象であり、その実現は依然として不確かです。(44)|1.43|
|AGIの実現可能性は、活発な議論と研究の対象であり、その実現は依然として不確かです。(44)|1.37|
|AGIの実現可能性は、活発な議論と研究の対象であり、その実現は依然として不確かです。(44)|1.32|
|AGIの実現可能性は、活発な議論と研究の対象であり、その実現は依然として不確かです。(44)|1.48|

## top_p=0.3
|レスポンス内容|レスポンス時間(秒)|
|-|-|
|AGIの実現可能性は、活発な議論と研究の対象であり、その実現は依然として不確かです。(44)|1.39|
|AGIの実現可能性は、活発な議論と研究の対象であり、その実現は技術的な課題と倫理的な懸念の両方を含んでいます。(57)|0.75|
|AGIの実現可能性は、まだ証明されていませんが、多くの研究者や専門家は、それが実現可能な目標であると考えています。(59)|1.39|
|AGIの実現可能性は、活発な議論と研究の対象であり、その実現は技術的な課題と倫理的な懸念を伴います。(52)|1.43|
|AGIの実現可能性は、まだ証明されていませんが、可能性はあります。(35)|1.23|

## top_p=0.5
|レスポンス内容|レスポンス時間(秒)|
|-|-|
|AGIの実現可能性は、活発な議論と研究の対象であり、まだ明確な答えはありません。(42)|1.64|
|AGIの実現可能性は、活発な議論と研究の対象であり、まだ確実な答えはありません。(42)|1.5|
|AGIの実現可能性は、活発な議論と研究の対象であり、その実現は、まだ遠い未来にあるか、そもそも不可能であると考える人もいます。(65)|1.43|
|AGIの実現可能性は、まだ未解明ですが、科学的進歩と計算能力の向上により、現実味を帯びてきました。(51)|1.3|
|AGIの実現可能性は、活発な議論と研究の対象であり、その実現時期は不明です。(40)|1.31|

## top_p=0.7
|レスポンス内容|レスポンス時間(秒)|
|-|-|
|AGIの実現可能性は、まだ明確な答えがない、複雑で議論の多い問題です。(37)|0.68|
|AGIの実現可能性は、現在も議論の的となっています。(28)|1.26|
|AGI は、人間のような知能を持つシステムを構築するという壮大な目標であり、実現の可能性は活発な議論の的となっています。(62)|1.4|
|AGI は、人間の知能を模倣できる可能性を秘めた、まだ実現していない技術です。(41)|1.35|
|AGIの実現可能性は、依然として活発な議論の的であり、楽観的な見方と懐疑的な見方の両方があります。(51)|1.34|

## top_p=1.0
|レスポンス内容|レスポンス時間(秒)|
|-|-|
|AGIの実現可能性については、議論が続いており、誰もが合意している明確な答えはありません。(47)|1.25|
|AGIの実現可能性は、いまだに激しい議論の対象ですが、可能性はありますが、技術的、倫理的、社会的課題が山積しています。(60)|1.36|
|AGIの実現可能性は、技術的な課題、倫理的な含意、そして人間の知能についての深い理解にかかっています。(52)|1.4|
|AGI は、人間の知能をすべて模倣する可能性を秘めた、依然として理論的かつ議論の的となっている概念です。(54)|1.28|
|AGIの実現可能性は、まだ未知数です。(21)|0.57|

## 感想
top_pもレスポンス速度の影響はなさそうですね。

<details><summary>使用したコード</summary>

```py
from vertexai.generative_models import GenerativeModel, GenerationConfig, Part
import time

# Gemini 1.5 Flashモデルの設定
model = GenerativeModel(
    'gemini-1.5-flash',
)

# モデル設定
generation_config = GenerationConfig(
    top_p=0.95,
)

# プロンプトの設定
user_prompt = "AGIの実現可能性について一言で説明してください。"

message = [
        Part.from_text(f"{user_prompt}"),
]

# Gemini APIを呼び出し
start = time.time()
response = model.generate_content(message, generation_config=generation_config)
end = time.time()
text = response.candidates[0].content.text
print(f"|{text.strip()}({len(text)})|{round(time.time() - start, 2)}|")
```
</details>

# 調査6 SafetySetting指定
## 目的
レスポンスの安全性チェックをBLOCK_ONLY_HIGHとBLOCK_NONEでレスポンス速度の影響を調べる。

## BLOCK_ONLY_HIGHに設定
|レスポンス内容|レスポンス時間(秒)|
|-|-|
|AGIの実現可能性は、議論の余地があるものの、強力なコンピューティングとAI研究の進歩により、現実的な目標になりつつあります。(65)|1.38|
|AGI は、人間の知能に匹敵する、またはそれを超える能力を持つ人工知能です。その実現可能性は、まだ証明されていませんが、その可能性は急速に高まっています。(77)|1.54|
|AGI は理論的には可能ですが、その実現には多くの課題があり、いつ、どのように実現するかはまだ不明です。(54)|1.47|
|AGIの実現可能性は、まだ完全には解明されていません。(29)|1.19|
|AGIの実現可能性は、人類の最大の未解決の課題の一つです。(31)|1.26|

## BLOCK_NONEに設定
許可が下りていないので未検証。

## 感想
変化はありませんでした。BLOCK_NONEにするとどうなるのでしょうか？

<details><summary>使用したコード</summary>

```py
from vertexai.generative_models import GenerativeModel, GenerationConfig, Part
import time

# Gemini 1.5 Flashモデルの設定
model = GenerativeModel(
    'gemini-1.5-flash',
)

# モデル設定
generation_config = GenerationConfig(
    top_p=0.95,
)

# プロンプトの設定
user_prompt = "AGIの実現可能性について一言で説明してください。"

message = [
        Part.from_text(f"{user_prompt}"),
]

# Gemini APIを呼び出し
start = time.time()
response = model.generate_content(message, generation_config=generation_config)
end = time.time()
text = response.candidates[0].content.text
print(f"|{text.strip()}({len(text)})|{round(time.time() - start, 2)}|")
```
</details>

# 調査7 httpxでREST APIにリクエスト
## 目的
Pythonのライブラリを使用せず、httpxを用いてREST APIへリクエストした場合の速度の変化を調べる。またロケーションもus-central1とasia-northeast1を試す。

## us-central1を指定
|レスポンス内容|レスポンス時間(秒)|
|-|-|
|AGI は理論的には可能ですが、現在の実務レベルでは達成されていない技術的課題がいくつかあります。(51)|1.7|
|AGIの実現可能性は、技術的な限界ではなく、哲学的な問いと社会的な影響に対する理解に左右される。(48)|1.45|
|AGI は理論的には可能ですが、現実世界での実現は非常に難しい課題です。(36)|1.34|
|AGI は、人間並みの知能を持つ可能性を秘めていますが、実現にはまだ多くの課題が残っています。(47)|1.59|
|AGIの実現可能性は、まだ完全には解明されていない活発な研究と議論の対象です。(39)|1.6|

## asia-northeast1を指定
|レスポンス内容|レスポンス時間(秒)|
|-|-|
|AGIの実現可能性は、現在議論が続いている問題であり、確実な回答はありません。(39)|0.97|
|AGIの実現可能性は、依然として議論の余地があり、その実現は未知数です。(36)|0.76|
|AGIの実現可能性は、活発な議論と研究の対象であり、現時点ではまだ不明です。(38)|0.82|
|AGI は理論的には実現可能ですが、実現するための技術的課題はまだ多く残されています。(43)|0.86|
|AGIの実現可能性は、活発な議論と研究の対象であり、いくつかの課題に直面していますが、技術的な進歩が可能性に希望を与えています。(64)|0.95|

## 感想
asia-northeast1で5回中すべて1秒切ってきました！us-central1は今までの調査結果と変わらずです。よって、LOCATIONの差で遅くなっているということが分かりました。
ということは、Pythonのライブラリを使用しているときもLOCATIONの差で遅くなっていると予想。

<details><summary>使用したコード</summary>

```py
import httpx
import json
import subprocess
import time

# Set your Google Cloud project ID and model ID
PROJECT_ID = "PROJECT_ID"
MODEL_ID = "gemini-1.5-flash"
LOCATION = "asia-northeast1"
# LOCATION = "us-central1"

# Function to get Google Cloud access token using gcloud command
def get_access_token():
    result = subprocess.run(
        ["gcloud", "auth", "application-default", "print-access-token"],
        capture_output=True,
        text=True,
        check=True,
        shell=True,
    )
    return result.stdout.strip()

# Prepare the request URL
url = f"https://{LOCATION}-aiplatform.googleapis.com/v1/projects/{PROJECT_ID}/locations/{LOCATION}/publishers/google/models/{MODEL_ID}:generateContent"

# Prepare the headers
headers = {
    "Authorization": f"Bearer {get_access_token()}",
    "Content-Type": "application/json"
}

# Prepare the request payload
payload = {
    "contents": {
        "role": "user",
        "parts": [
            {
                "text": "AGIの実現可能性について一言で説明してください。"
            }
        ]
    }
}

# Make the POST request
client = httpx.Client()

start = time.time()
response = client.post(url, headers=headers, json=payload)
end = time.time()

# Process the response
if response.status_code == 200:
    print("Request successful!")
    json_data = response.json()
    text = json_data['candidates'][0]['content']['parts'][0]['text'].strip()
    print(f"|{text}({len(text)})|{round(end - start, 2)}|")
else:
    print(f"Request failed with status code: {response.status_code}")
    print(response.text)
```
</details>

# おまけ
Pythonのライブラリを使用する際は、事前に以下の初期化をしておくと幸せになれます。
```py
# Initialize Vertex AI
vertexai.init(project=PROJECT_ID, location=LOCATION)
```

# StackPilesでAIエンジニア募集中！
株式会社StackPilesでは生成AIを使ったサービスやAI-OCRサービスを開発しております。興味ある方いましたらご連絡ください。