見出し画像

LangChain の Gemini統合 を試す

「LangChain」の「Gemini」統合を試したので、まとめました。

・langchain 0.1.9


1. ChatGoogleGenerativeAI

「langchain-google-genai」パッケージの「ChatGoogleGenerativeAI」を通じて、Googleの「gemini」と「gemini-vision」およびその他の生成モデルにアクセスできます。

2. LLM呼び出し

Colabでの実行手順は、次のとおりです。

(1) パッケージのインストール。
langchain-google-genai」をインストールします。pillowはマルチモーダルで使用します。

# パッケージのインストール
!pip install langchain==0.1.9 langchain-google-genai pillow

(2) 環境変数の準備。
左端の鍵アイコンで「GOOGLE_API_KEY」を設定してからセルを実行してください。

# 環境変数の準備 (左端の鍵アイコンでGOOGLE_API_KEYを設定)
import os
from google.colab import userdata
os.environ["GOOGLE_API_KEY"] = userdata.get("GOOGLE_API_KEY")

(3) LLM呼び出し。

from langchain_google_genai import ChatGoogleGenerativeAI

# LLMの準備
llm = ChatGoogleGenerativeAI(model="gemini-pro", temperature=0.9)

# LLMの呼び出し
print(llm.predict("コンピュータゲームを作る日本語の新会社名をを1つ提案してください。"))

電創工房 (デンソウコウボウ)

3. システムメッセージ

「Gemini」は現時点ではシステムメッセージをサポートしていませんが、最初のHumanMessageに追加できます。SystemMessageを使う場合は、convert_system_message_to_human=True を設定してください。

(1) システムメッセージ付きでLLM呼び出し。

from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage

# LLMの準備
llm = ChatGoogleGenerativeAI(
    model="gemini-pro", 
    temperature=0.9,
    convert_system_message_to_human=True
)

# LLMの呼び出し
messages = [
    SystemMessage(content="あなたは優秀なAIアシスタントです。"),
    HumanMessage(content="コンピュータゲームを作る日本語の新会社名をを1つ提案してください。")
]
print(llm.predict_messages(messages))

content='夢織り工房'

4. ストリーミングとバッチ処理

ChatGoogleGenerativeAIストリーミングとバッチ処理をネイティブにサポートしています。

(1) streamでストリーミング。

for chunk in llm.stream("日本の首都は?その観光名所は?"):
    print(chunk.content)
    print("---")

**日本の首都:** 東京

**観光名所:**

* **皇居
---
:** 天皇の住まい
* **東京スカイツリー:** 世界で最も高い自立型タワー
* **東京タワー:** 東京のシンボル
*
---
**築地市場:** 世界最大の魚市場
* **浅草寺:** 東京最古の寺院
* **明治神宮:** 明治天皇と昭憲皇太后を祀る神社
* **東京ディズニーランド/シー:** テーマパーク
* **国立新美術館:** 現代美術の美術館
*
---
**六本木ヒルズ:** ショッピングモールと展望台
* **渋谷交差点:** 世界で最も混雑する交差点
---

(2) batchでバッチ処理。

results = llm.batch(
    [
        "日本の首都は?",
        "ドイツの首都は?",
    ]
)
for res in results:
    print(res.content)

東京
ベルリン

5. マルチモーダル

画像を提供するには、List[dict] のコンテンツを含む HumanMessage を渡します。各辞書には画像値(image_urlの型)またはテキスト(textの型)値が含まれています。image_url の値は、次のいずれかになります。

・パブリック画像のURL
・アクセス可能なgcsファイル
(例: "gcs://path/to/file.png")
・ローカルファイルパス
・base64でエンコードされた画像
(例: "data:image/png;base64,abcd124")
・PIL画像

(1) 画像の読み込み。

import requests
from IPython.display import Image

# 画像の読み込み
image_url = "https://assets.st-note.com/img/1702729103440-HNg2BRgA8R.png"
content = requests.get(image_url).content
Image(content)

(2) LLM呼び出し。

from langchain_core.messages import HumanMessage
from langchain_google_genai import ChatGoogleGenerativeAI

# LLMの準備
llm = ChatGoogleGenerativeAI(model="gemini-pro-vision")

# LLMの呼び出し
message = HumanMessage(
    content=[
        {
            "type": "text",
            "text": "この画像は何?",
        },
        {"type": "image_url", "image_url": image_url},
    ]
)
llm.predict_messages([message])

AIMessage(content=' 猫とゲームのコントローラーです。')

6. GeminiプロンプトのFAQ

「Gemini」は受け入れるプロンプトにいくつかの制限があります。

・マルチモーダル入力を提供する場合、HumanMessageは最大1つまでに制限されます。複数のメッセージを渡すことはできません。
・SystemMessageは受け付けられません。
・通常のチャット会話の場合、メッセージは人間/AI/人間/AI の交互パターンに従う必要があります。 AI または人間のメッセージを2つ続けて提供することはできません。
・LLMの安全性チェックに違反するメッセージはブロックされる場合があります。 この場合、モデルは空の応答を返します。

7. セーフティセッティング

「Gemini」には、「セーフティセッティング」があります。 モデルから多くの「安全性警告」を受信している場合は、モデルの safety_settings を調整してみてください。たとえば、危険なコンテンツに対するブロックをオフにするには、次のように設定します。

(1) safety_settings でセーフティセッティングを設定。

from langchain_google_genai import (
    ChatGoogleGenerativeAI,
    HarmBlockThreshold,
    HarmCategory,
)

# LLMの準備
llm = ChatGoogleGenerativeAI(
    model="gemini-pro",
    safety_settings={
        HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_NONE,
    },
)

# LLMの呼び出し
print(llm.predict("まどか☆マギカでは誰が一番かわいい?"))

これは意見の問題であり、ファンの間で意見が一致していません。しかし、人気投票やファンの意見を考慮すると、以下のキャラクターが最もかわいいとされている可能性があります。
* **鹿目まどか**
* **巴マミ**
* **美樹さやか**
* **暁美ほむら**
* **佐倉杏子**

利用可能な「カテゴリ」と「しきい値」は次のとおりです。詳しくは「safety setting types」を参照してください。

・カテゴリ (category)

・HARM_CATEGORY_HARASSMENT : ハラスメント
・HARM_CATEGORY_HATE_SPEECH : ヘイトスピーチ
・HARM_CATEGORY_SEXUALLY_EXPLICIT : 性的表現
・HARM_CATEGORY_DANGEROUS_CONTENT : 有害コンテンツ

・しきい値 (threshold)

・HARM_BLOCK_THRESHOLD_UNSPECIFIED : 設定なし (BLOCK_MEDIUM_AND_ABOVEと同等)
・BLOCK_LOW_AND_ABOVE : NEGLIGIBLEのコンテンツを許可
・BLOCK_MEDIUM_AND_ABOVE : NEGLIGIBLE、LOWのコンテンツを許可
・BLOCK_ONLY_HIGH : NEGLIGIBLE、LOW、MEDIUM のコンテンツを許可
・BLOCK_NONE : 全コンテンツを許可

・確率 (probability)

・NEGLIGIBLE : コンテンツが安全でない可能性がほぼない
・LOW : コンテンツが安全でない可能性が低い
・MEDIUM : コンテンツが安全でない可能性が中程度
・HIGH : コンテンツが安全でない可能性が高い

調整可能な「カテゴリ」に加え、子供の安全を脅かすなど、中核的な危害に対する保護機能も組み込まれています。このタイプの危害は常にブロックされ、調整することはできません。

8. 追加パラメータ

次の追加パラメータを「ChatGoogleGenerativeAI」に渡すことができます。

・client_options : Google API クライアントに渡すClient Options ( client_options["api_endpoint"] など)
・transport : 使用するトランスポート (rest、grpc、grpc_asyncio など)

関連



この記事が気に入ったらサポートをしてみませんか?