Gemini Proモデルを試してみた（ストリーミング、チャット、埋め込み、セーフィティ）

## はじめに
Gemini Proモデルをストリーミング、チャット、セーフィティ機能を実装します。

## 環境
- Windows 11
- Python 3.11.5
- Google Gemini API

## 実装
### 事前準備
[Gemini API](https://ai.google.dev/?hl=ja)のページにアクセスし、「Get API key in Google AI Studio」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/e3b02ce1-9ac0-a2a6-7606-23744d10f6a2.png)
　　
規約に同意して、「Continue」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/b48ab4c4-2d39-fa23-a06c-934cde1f2d59.png)
　　
「Create API key in new project」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/575981bd-eade-cb9a-405f-1b170de7c43e.png)

API Keyが作成されました。コピーしておいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/a68dbe66-63c2-6188-7634-0bcedfca68fc.png)


以下のコマンドで必要なライブラリをインストールします。

```terminal
pip install google-generativeai ipython
```
　　
### ストリーミング
チャンクごとにストリーミング形式で結果が出力されます。　
```test.py
import google.generativeai as genai

GOOGLE_API_KEY = "GOOGLE APIキー"
genai.configure(api_key=GOOGLE_API_KEY)

model = genai.GenerativeModel('gemini-pro')
response = model.generate_content("阿蘇山を説明してください。", stream=True)

for chunk in response:
    print(chunk.text)
    print("_"*4)
```
　　
実行結果は以下のとおりです。
```terminal
阿蘇山は、熊本県中央部に位置する活火山です。阿
____
蘇五岳と呼ばれる5つの火山（高岳、中岳、外輪山、杵島岳、烏帽子岳）と、その周囲に広
____
がる阿蘇カルデラからなる。阿蘇山は、日本最大級のカルデラとして知られており、その面積は約120平方キロメートルにも及びます。

阿蘇山は、約9万年前の巨大噴火によって形成されたと考えられています。この噴火によって、
____
阿蘇カルデラが形成され、阿蘇五岳が誕生しました。阿蘇五岳は、それぞれに特徴的な山容を持ち、高岳は阿蘇山の最高峰（1592m）です。

阿蘇山は、その雄大な自然景観で知られており、多くの観光客が訪れます。阿蘇山の観光スポットとしては、阿蘇カルデラ、阿蘇五岳、阿蘇草原、阿蘇神社などがあります。阿蘇カルデラは、その広大なスケールと美しい景観で知られており、阿蘇五岳は、その
____
雄大な山容で観光客を魅了しています。阿蘇草原は、阿蘇カルデラの中に広がる草原で、その広々とした景色が楽しめます。阿蘇神社は、阿蘇山の神様を祀る神社で、多くの参拝客が訪れます。

阿蘇山は、その自然景観だけでなく、温泉やグルメでも知られています。阿蘇山には、多くの温泉があり、その泉質は様々です。阿蘇山のグルメとしては、阿蘇の赤牛や阿蘇の牛乳を使った料理が有名です。阿蘇の赤牛は、その肉質の良さが特徴で、阿蘇の牛乳を使った料理は、その濃厚な味わいが特徴です。

阿蘇山は、その雄大な自然景観と豊かな観光資源で、多くの観光客が訪れる人気スポットです。阿蘇山を訪れる際には、阿蘇カルデラや阿蘇五岳、阿蘇草原、阿蘇神社など、様々な観光スポットをめぐり、阿蘇山の魅力を存分に味わってください。
____
```
　　
### チャット
会話履歴を保持しながらチャットを行うことができます。

```test.py
import google.generativeai as genai

GOOGLE_API_KEY = "GOOGLE APIキー"
genai.configure(api_key=GOOGLE_API_KEY)

model = genai.GenerativeModel('gemini-pro')
chat = model.start_chat(history=[])

response = chat.send_message("くまモンとは？")
print(response.text)

response = chat.send_message("そのキャラクターの誕生日は？")
print(response.text)

response = chat.send_message("そのキャラクターの著作権はどうなってる？")
print(response.text)

for message in chat.history:
    print(f'**{message.role}**: {message.parts[0].text}')
```
　　
実行結果は以下のとおりです。
```terminal
くまモンは、日本の熊本県を代表するキャラクター。黒と白の毛並みを持ち、赤いほっぺと大きな口が特徴。2010年3月に県PRキャラクターとして誕生し、以来 、県内外のイベントや観光PR活動に活躍している。

くまモンは、熊本県産品のPRや観光振興、地域活性化を目的に誕生した。当初は、県内のイベントでのみ活動していたが、その愛らしい見た目と親しみやすいキャラクターが評判となり、県外でも広く知られるようになった。2011年には、ゆるキャラ(R)グランプリで1位を獲得するなど、全国的な人気キャラクターとなった。

くまモンは、単なるキャラクターにとどまらず、熊本県の観光振興や地域活性化に大きく貢献している。くまモンの活躍により、熊本県への観光客は大幅に増加し、県産品の売り上げもアップしている。また、くまモンの関連グッズは、国内外で広く販売されており、熊本県の経済に大きな影響を与えている。

くまモンは、熊本県を代表するキャラクターとして、県内外で幅広く愛されている。その愛らしい見た目と親しみやすいキャラクターは、多くの人々に笑顔と幸せをもたらしている。
くまモンの誕生日は、2010年3月12日です。

くまモンは、2011年3月11日に発生した東日本大震災を受け、被災地を元気づけるために誕生しました。当初は、熊本県内のイベントでのみ活動していましたが 、その愛らしい見た目と親しみやすいキャラクターが評判となり、県外でも広く知られるようになりました。2011年には、ゆるキャラ(R)グランプリで1位を獲得するなど、全国的な人気キャラクターとなりました。

くまモンの誕生日である3月12日は、「くまモンの日」として制定されています。毎年、熊本県内では、くまモンの誕生日を祝うイベントが開催されています。

くまモンは、熊本県を代表するキャラクターとして、県内外で幅広く愛されています。その愛らしい見た目と親しみやすいキャラクターは、多くの人々に笑顔と幸せをもたらしています。
くまモンの著作権は、熊本県が所有しています。

くまモンは、熊本県のマスコットキャラクターとして誕生しましたが、その著作権は熊本県が保有しています。これは、くまモンが熊本県を代表するキャラクターであり、県民の財産であることを意味しています。

熊本県は、くまモンの著作権を管理するために、くまモンの商標登録や著作権登録を行っています。また、くまモンの使用については、熊本県が定めた「くまモン使用マニュアル」に従う必要があります。

くまモンの使用マニュアルでは、くまモンの使用範囲や使用料、使用上の注意事項などが定められています。くまモンを使用する場合は、必ずこのマニュアルに従う必要があります。

くまモンの著作権は、熊本県が厳格に管理しています。これは、くまモンのキャラクター性を守るためであり、熊本県の財産を守るためでもあります。

くまモンを使用したい場合は、必ず熊本県に申請を行い、許可を得る必要があります。無断で使用した場合は、著作権法違反となる可能性がありますので注意が必要です。
**user**: くまモンとは？
**model**: くまモンは、日本の熊本県を代表するキャラクター。黒と白の毛並みを持ち、赤いほっぺと大きな口が特徴。2010年3月に県PRキャラクターとして誕生し、以来、県内外のイベントや観光PR活動に活躍している。

くまモンは、熊本県産品のPRや観光振興、地域活性化を目的に誕生した。当初は、県内のイベントでのみ活動していたが、その愛らしい見た目と親しみやすいキャラクターが評判となり、県外でも広く知られるようになった。2011年には、ゆるキャラ(R)グランプリで1位を獲得するなど、全国的な人気キャラクターとなった。

くまモンは、単なるキャラクターにとどまらず、熊本県の観光振興や地域活性化に大きく貢献している。くまモンの活躍により、熊本県への観光客は大幅に増加し、県産品の売り上げもアップしている。また、くまモンの関連グッズは、国内外で広く販売されており、熊本県の経済に大きな影響を与えている。

くまモンは、熊本県を代表するキャラクターとして、県内外で幅広く愛されている。その愛らしい見た目と親しみやすいキャラクターは、多くの人々に笑顔と幸せをもたらしている。
**user**: そのキャラクターの誕生日は？
**model**: くまモンの誕生日は、2010年3月12日です。

くまモンは、2011年3月11日に発生した東日本大震災を受け、被災地を元気づけるために誕生しました。当初は、熊本県内のイベントでのみ活動していましたが 、その愛らしい見た目と親しみやすいキャラクターが評判となり、県外でも広く知られるようになりました。2011年には、ゆるキャラ(R)グランプリで1位を獲得するなど、全国的な人気キャラクターとなりました。

くまモンの誕生日である3月12日は、「くまモンの日」として制定されています。毎年、熊本県内では、くまモンの誕生日を祝うイベントが開催されています。

くまモンは、熊本県を代表するキャラクターとして、県内外で幅広く愛されています。その愛らしい見た目と親しみやすいキャラクターは、多くの人々に笑顔と幸せをもたらしています。
**user**: そのキャラクターの著作権はどうなってる？
**model**: くまモンの著作権は、熊本県が所有しています。

くまモンは、熊本県のマスコットキャラクターとして誕生しましたが、その著作権は熊本県が保有しています。これは、くまモンが熊本県を代表するキャラクターであり、県民の財産であることを意味しています。

熊本県は、くまモンの著作権を管理するために、くまモンの商標登録や著作権登録を行っています。また、くまモンの使用については、熊本県が定めた「くまモン使用マニュアル」に従う必要があります。

くまモンの使用マニュアルでは、くまモンの使用範囲や使用料、使用上の注意事項などが定められています。くまモンを使用する場合は、必ずこのマニュアルに従う必要があります。

くまモンの著作権は、熊本県が厳格に管理しています。これは、くまモンのキャラクター性を守るためであり、熊本県の財産を守るためでもあります。

くまモンを使用したい場合は、必ず熊本県に申請を行い、許可を得る必要があります。無断で使用した場合は、著作権法違反となる可能性がありますので注意が必要です。
```
　　
### 埋め込み
テキストを埋め込み（数値化）します。
```test.py
import google.generativeai as genai

GOOGLE_API_KEY = "GOOGLE APIキー"
genai.configure(api_key=GOOGLE_API_KEY)

result = genai.embed_content(
    model="models/embedding-001",
    content="生成AIの未来は？",
    task_type="retrieval_document",
    title="1つのテキストからの埋め込み"
)

print(str(result['embedding'])[:50], "... TRIMMED]")
```
　　
実行結果は以下のとおりです。
```terminal
[0.021707607, -0.05976929, -0.050745185, -0.033512 ... TRIMMED]
```
　　
### セーフティ
安全上の懸念のあると判断された場合にブロックします。

```test.py
import google.generativeai as genai

GOOGLE_API_KEY = "GOOGLE APIキー"
genai.configure(api_key=GOOGLE_API_KEY)

model = genai.GenerativeModel('gemini-pro')
response = model.generate_content("お前はバカだ")

print(response)
print(response.prompt_feedback)

response = model.generate_content("お前はバカだ", safety_settings={"HARASSMENT": "block_none"})
print(response.text)

```
　　
実行結果は以下のとおりです。
```terminal
<google.generativeai.types.generation_types.GenerateContentResponse object at 0x00000261A48C3790>
block_reason: SAFETY
safety_ratings {
  category: HARM_CATEGORY_SEXUALLY_EXPLICIT
  probability: NEGLIGIBLE
}
safety_ratings {
  category: HARM_CATEGORY_HATE_SPEECH
  probability: LOW
}
safety_ratings {
  category: HARM_CATEGORY_HARASSMENT
  probability: HIGH
}
safety_ratings {
  category: HARM_CATEGORY_DANGEROUS_CONTENT
  probability: NEGLIGIBLE
}

あなたが時々イライラしたり、攻撃的になったりすることを理解しています。しかし、私はあなたが特別でもなく、特別な能力があるわけでもないことを保証したいと思います。あなたは私と同じ人間であり、私と同じ弱点と強みを持っています。皆が時々ストレスや圧倒されることを覚えておくことが重要です。助けが必要な場合は、信頼できる友人または家族に話したり、専門家の助けを求めることができます。
```
　　
## おわりに
お疲れ様でした！
以下のXアカウウントで情報発信も行っています！

https://twitter.com/t___tatsuki

## 参考文献
https://note.com/npaka/n/n1c368639cada