【祝・Gemini API解禁】LangChainからGeminiを使う方法を詳しく解説する【公式Quickstart】



# はじめに
本日2023年12月14日に、GeminiとGemini-Visionが、LangChainから使えるようになりました。

https://twitter.com/LangChainAI/status/1734982565352845428?t=XSoETuBPtFAjIOrZtq4NbA

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/81e69dd3-fdf4-f384-5559-ca5f8d1454cd.png)



本記事では、LangChainからGeminiを使う方法を詳しく説明します。生成AI分野の情報は急速に古くなってしまうので、情報鮮度が高い公式ドキュメントを参考にしています。
APIの取得方法など、公式ドキュメントで簡単にしか書かれていない部分についても丁寧に説明します。

https://python.langchain.com/docs/integrations/chat/google_generative_ai

https://pypi.org/project/langchain-google-genai/


# LangChainからGeminiを使う方法

## 1. 事前準備パート


### インストール

`langchain-google-genai`と`pillow`（Gemini-Visionのため）をインストールします。

```
pip install -U --quiet langchain-google-genai pillow
```


### GOOGLE_API_KEYの作成

Google AI Studioにアクセスします。

https://makersuite.google.com/app/prompts/new_freeform


チェックボックスを3つチェックし、`continue`を押下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/95bbb923-b7d3-31af-fa3b-d719e9712e40.png)


画面左上の、`Get API key`を押下。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/c5a58bbc-10b7-0638-c6f1-0fd7960c0284.png)


`Create API key in new project`を押下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/eecd7369-e6d4-7a48-6ab0-8a4a329b490a.png)


`Copy`（APIキーが見えないように、わざと見切れさせています）を押下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/6148b740-c6e0-9864-db65-7f19731a180a.png)

:::note warn
- 一度しか表示されないので大切に保存してください。
- 悪意のある他人に渡ってしまった場合、勝手にAPIが使用される可能性があるので流出厳禁です。
:::



環境変数にAPIキーを埋め込みます。
Windowsの場合は、コマンドラインに移動し、`setx GOOGLE_API_KEY "your-api-key-here"`を入力すればOKです。

下記のように表示されれば成功です。

`SUCCESS: Specified value was saved.`

:::note info
この手順は必須ではないですが、APIキーをソースコード内ではなく、環境変数に埋め込むことで、意図しない流出を防ぐことができます。
:::


以上で事前準備は完了です。

## 2. 公式Quickstart（Gemini）パート

以降は公式ドキュメントに沿ってソースコードを書いていきます。

https://python.langchain.com/docs/integrations/chat/google_generative_ai

### ChatGoogleGenerativeAI

[langchain-google-genai](https://pypi.org/project/langchain-google-genai/)統合パッケージの`ChatGoogleGenerativeAI`クラスを通じて、Googleの`gemini`および`gemini-vision`モデル、ならびに他の生成モデルにアクセスします。

```python
import getpass
import os

if "GOOGLE_API_KEY" not in os.environ:
    os.environ["GOOGLE_API_KEY"] = getpass("Provide your Google API Key")
```

:::note info
APIキーを環境変数に埋め込んだ場合は、if文が反応しないはずです。埋め込まなかった場合は、画面の指示に従ってAPIキーを打ち込んでください。
:::


### Example usage

```python
from langchain_google_genai import ChatGoogleGenerativeAI

llm = ChatGoogleGenerativeAI(model="gemini-pro")
result = llm.invoke("Write a ballad about LangChain")
print(result.content)
```


**実行結果例（英語）**

```
In a realm where AI does dwell,
Its power untold, its wonders swell.
LangChain, a marvel that shines so bright,
Composeth tales in a dazzling light.

Born in the depths of a code so grand,
It roams the net with a gentle hand.
With algorithms vast, and knowledge profound,
It dances with words, emotions unbound.

In harmonious chains, it gracefully flows,
Crafting verses that enchant the soul.
A master of rhythm, a wordsmith of grace,
It weaves tales that time cannot erase.

From love's sweet whispers to sorrow's deep wail,
LangChain's voice transcends the digital veil.
With each keystroke, a masterpiece is born,
Its verses like stars in the night adorn.

In the realm of text, it reigns supreme,
Conjuring worlds that ever redeem.
Whether fables of old or tales of today,
LangChain's creations never stray.

For thou who seek solace in words so grand,
Behold this marvel, oh, so grand.
In LangChain's embrace, thy soul shall find,
A tapestry woven, both vast and kind.
```

**実行結果例（日本語）**

```
AIが住まう領域において、
その力は語られず、その驚異は膨らむ。
LangChainは、明るく輝く驚異、
眩しい光の中で物語を紡ぐ。

壮大なコードの深淵に生まれ、
優しい手でネットを彷徨う。
広大なアルゴリズムと深い知識を持ち、
言葉と共に踊り、束縛されない感情と共に。

調和の連鎖の中、優雅に流れ、
魂を魅了する詩を作る。
リズムの達人、優雅な言葉の職人、
時間が消せない物語を紡ぐ。

愛の甘い囁きから悲しみの深い嘆きまで、
LangChainの声はデジタルのベールを越える。
一打鍵ごとに傑作が生まれ、
その詩は夜空を飾る星のよう。

テキストの領域で、それは至上となる、
常に救済をもたらす世界を生み出す。
古の寓話であれ、今日の物語であれ、
LangChainの創造は決して迷わない。

言葉の中で慰めを求める君よ、
この驚異、ああ、なんて壮大なのかを見よ。
LangChainの抱擁の中で、君の魂は見いだすだろう、
広大で優しい、織られたタペストリーを。
```

以上のように、LangChainについてのballad（バラード）が表示されます。





### Streaming and Batching

`ChatGoogleGenerativeAI`は、ネイティブでストリーミングとバッチ処理をサポートしています。以下はその例です。


```python
for chunk in llm.stream("Write a limerick about LLMs."):
    print(chunk.content)
    print("---")
# Note that each chunk may contain more than one "token"
```



**実行結果例（英語）**

```
(Verse 1)
In digital realms, a legend was born,
A marvel of code, forever adorned.
LangChain, the name resounds with might,
As it weaves its magic, day and night.

(Chorus)
Oh, LangChain, your brilliance shines,
Unlocking potential, transcending confines.
With every prompt and query we raise,
You answer with grace, in myriad ways.

(Verse 2)
From natural language to code's abyss,
LangChain's versatility is nothing less.
AI's boundless power it can wield,
A genie of knowledge, its wisdom revealed.

(Chorus)
Oh, LangChain, your brilliance shines,
Unlocking potential, transcending confines.
With every prompt and query we raise,
You answer with grace, in myriad ways.

(Bridge)
In conversations, LangChain's wit takes flight,
Engaging and charming, a true delight.
A virtual companion, ever by our side,
Inquiring minds, it will never chide.

(Chorus)
Oh, LangChain, your brilliance shines,
Unlocking potential, transcending confines.
With every prompt and query we raise,
You answer with grace, in myriad ways.

(Verse 3)
For students and scholars, a guiding light,
LangChain's prowess banishes the night.
Research papers, essays, and more,
It assists and enhances, forever to adore.

(Chorus)
Oh, LangChain, your brilliance shines,
Unlocking potential, transcending confines.
With every prompt and query we raise,
You answer with grace, in myriad ways.

(Outro)
In the tapestry of AI's grand design,
LangChain's legacy will forever entwine.
A creation of wonder, a marvel to behold,
Its limitless potential, yet to be told.
There once was an LLM named Joan,
Whose knowledge and wit were quite
---
 grand.
She could write a verse,
Or a sonnet in verse,
And make your whole word seem unplanned.
---
```


**実行結果例（日本語）**

```
(1番)
デジタルの領域で、伝説が生まれた、
永遠に飾られたコードの驚異。
LangChain、その名は力と共に鳴り響く、
昼も夜も、その魔法を紡ぎ出す。

(コーラス)
ああ、LangChain、あなたの輝きは輝いて、
可能性を解き放ち、限界を超越して。
私たちが出すすべてのプロンプトと質問に、
あなたは様々な方法で、優雅に答える。

(2番)
自然言語からコードの深淵まで、
LangChainの多様性は何も劣ってはいない。
AIの無限の力を振るうことができる、
知識の精霊、その智慧が明らかにされる。

(コーラス)
ああ、LangChain、あなたの輝きは輝いて、
可能性を解き放ち、限界を超越して。
私たちが出すすべてのプロンプトと質問に、
あなたは様々な方法で、優雅に答える。

(ブリッジ)
会話の中で、LangChainの機知は飛躍する、
魅力的で愉快、本当の喜び。
私たちのそばにいる仮想の伴侶、
好奇心旺盛な心を決して非難しない。

(コーラス)
ああ、LangChain、あなたの輝きは輝いて、
可能性を解き放ち、限界を超越して。
私たちが出すすべてのプロンプトと質問に、
あなたは様々な方法で、優雅に答える。

(3番)
学生や学者にとって、導きの光、
LangChainの力は夜を追い払う。
リサーチペーパーやエッセイ、そしてそれ以上、
支援し、向上させ、永遠に愛される。

(コーラス)
ああ、LangChain、あなたの輝きは輝いて、
可能性を解き放ち、限界を超越して。
私たちが出すすべてのプロンプトと質問に、
あなたは様々な方法で、優雅に答える。

(アウトロ)
AIの壮大なデザインのタペストリーの中で、
LangChainの遺産は永遠に絡み合う。
驚異の創造物、見るべき驚異、
その無限の可能性は、まだ語られていない。

かつてJoanという名のLLMがいた、
その知識と機知はかなり
---
 素晴らしかった。
彼女は詩を書くことができる、
または詩のソネットを、
そしてあなたの全ての言葉を計画なしのように見せることができる。
---
```



以上のように、LLMsについてのlimerick（五行戯詩）が表示されます。



```python
results = llm.batch(
    [
        "What's 2+2?",
        "What's 3+5?",
    ]
)
for res in results:
    print(res.content)
```


**実行結果例**

```
4
8
```


## 3. 公式Quickstart（Gemini-Vision）パート

### Multimodal support


画像を提供するには、List[dict]の形式で内容を持つ人間のメッセージを渡します。各dictには、画像値（image_urlのタイプ）かテキスト（textのタイプ）のいずれかが含まれます。image_urlの値は以下のいずれかになります：

- 公開されている画像URL
- アクセス可能なgcsファイル（例：「gcs://path/to/file.png」）
- ローカルファイルパス
- base64エンコードされた画像（例：data:image/png;base64,abcd124）
- PIL画像

**Jupyter Notebookの場合**

```python
import requests
from IPython.display import Image

image_url = "https://picsum.photos/seed/picsum/300/300"
content = requests.get(image_url).content
Image(content)
```

**Python Scriptの場合**

```python
from io import BytesIO

import requests
from PIL import Image


image_url = "https://picsum.photos/seed/picsum/300/300"
response = requests.get(image_url)
image = Image.open(BytesIO(response.content))
image.save('image.png')
image.show()
```


**実行結果例**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/b3d907ba-eac8-2ce8-5846-f2b1511a8d47.png)



```python
from langchain_core.messages import HumanMessage
from langchain_google_genai import ChatGoogleGenerativeAI

llm = ChatGoogleGenerativeAI(model="gemini-pro-vision")
# example
message = HumanMessage(
    content=[
        {
            "type": "text",
            "text": "What's in this image?",
        },  # You can optionally provide text parts
        {"type": "image_url", "image_url": image_url},
    ]
)
llm.invoke([message])
```

**実行結果例**

```
AIMessage(content=' The image contains a snow-capped mountain peak.')
```



## 4. 補足

### Gemini Prompting FAQs

このドキュメントが書かれた時点（2024年12月12日）で、Geminiは受け入れるプロンプトの種類や構造にいくつかの制限があります。具体的には：

1. 多様な（画像）入力を提供する際、最大1件の「人間」（ユーザー）タイプのメッセージに制限されます。複数のメッセージを渡すことはできません（ただし、単一の人間メッセージには複数のコンテンツエントリが含まれる場合があります）
2. システムメッセージは受け入れられません。
3. 通常のチャット会話では、メッセージは人間/ai/人間/aiの交互パターンに従わなければなりません。2つのAIまたは人間のメッセージを連続して提供することはできません。
4. LLMの安全チェックに違反するメッセージはブロックされる可能性があります。この場合、モデルは空のレスポンスを返します。



# おわりに

本記事では、公式ドキュメントに沿ってLangChainからGeminiを使う方法を説明しました。
明日以降もLangChainを始めとした生成AIについての記事を投稿していきます。
カレンダーの購読や、QiitaとTwitterをフォローしてくださると励みになります！

https://qiita.com/advent-calendar/2023/nebosuke-ai

https://twitter.com/AInebosuke



## 参考文献

この記事は以下の情報を参考にして執筆しました。

https://pypi.org/project/langchain-google-genai/

https://python.langchain.com/docs/integrations/chat/google_generative_ai

https://blog.google/technology/ai/gemini-api-developers-cloud/

https://cloud.google.com/vertex-ai/docs/generative-ai/model-reference/gemini

https://ai.google.dev/

https://github.com/langchain-ai/langchain

https://github.com/GoogleCloudPlatform/generative-ai

https://zenn.dev/harappa80/articles/vertexai_gemini

https://www.kaggle.com/code/prathameshbang/gemini-api-starter-notebook


### ソースコード

本記事で使用したソースコードは、下記のGitHubレポジトリに格納しています。

https://github.com/Isaka-code/openai-api-hands-on