Google Gemini LangChain Cheatsheet より
目次
はじめに
Google GeminiモデルとLangChainの統合は、高度なAIアプリケーションを構築するための強力な組み合わせです。このガイドでは、これらのテクノロジーを活用して、洗練されたコンテキスト対応のマルチモーダルAIシステムを作成する方法を探ります。
Google Geminiモデルは、テキスト、画像、音声、動画を処理・生成できる強力なマルチモーダルモデルファミリーです。一方、LangChainは大規模言語モデル(LLM)によるアプリケーション開発を簡素化するために設計されたフレームワークです。これらを組み合わせることで、開発者は比較的少ないコードで複雑なAIアプリケーションを構築できます。
このガイドでは、基本的なセットアップから高度な機能まで、各ステップで実践的なコード例を提供します。
Google GeminiとLangChainを始める
基本概念の理解
コードに入る前に、主要コンポーネントを明確にしておきましょう:
- Google Gemini:Googleが開発したマルチモーダルAIモデルファミリーで、テキスト、画像、音声、動画を理解・生成できます。
- LangChain:言語モデルを活用したアプリケーション開発のためのフレームワークで、さまざまなコンポーネントを連携させるツールを提供します。
- LangGraph:LLMを使用した状態を持つマルチアクターアプリケーションを構築するためのライブラリです。
- langchain-google-genai:LangChainとGoogleのGeminiモデルを接続するパッケージです。
このガイドの例では、デフォルトでgemini-2.0-flash
モデルを使用していますが、gemini-2.5-pro-preview-03-25
やgemini-2.5-flash-preview-04-17
などの新しいモデルも使用できます。すべてのモデルIDはGemini APIドキュメントで確認できます。
環境のセットアップ
始めるには以下が必要です:
- APIキーの取得:Google AI Studioから無料で登録してAPIキーを取得します。
-
パッケージのインストール:
langchain-google-genai
パッケージをインストールします。 - 環境の設定:APIキーを設定します。
パッケージのインストール方法:
%pip install langchain-google-genai
APIキーの設定方法:
import getpass
import os
if "GOOGLE_API_KEY" not in os.environ:
os.environ["GOOGLE_API_KEY"] = getpass.getpass("Google AI APIキーを入力してください: ")
これにより、APIキーを環境変数として安全に保存し、コード内に直接記述することを避けています。
LangChainの基本操作
チャットモデルによるテキスト生成
最も基本的な操作は、チャットモデルを使用したテキスト生成です。以下はGeminiモデルを初期化し、簡単な翻訳タスクに使用する方法です:
from langchain_google_genai import ChatGoogleGenerativeAI
# モデルの初期化
llm = ChatGoogleGenerativeAI(
model="gemini-2.0-flash",
temperature=0,
max_tokens=None,
timeout=None,
max_retries=2,
)
# 基本的な呼び出し
messages = [
("system", "あなたは英語からフランス語に翻訳する便利なアシスタントです。"),
("human", "I love programming."),
]
response = llm.invoke(messages)
print(response.content) # 出力: J'adore la programmation.
この例では:
-
gemini-2.0-flash
モデルでChatGoogleGenerativeAI
インスタンスを作成します - 決定論的な出力のために
temperature=0
を設定します - 動作を設定するシステムメッセージを定義します(翻訳)
- 翻訳するテキストを含む人間のメッセージを提供します
- モデルを呼び出して応答を出力します
プロンプトテンプレートとチェーニング
より柔軟なインタラクションのために、プロンプトテンプレートを使用し、LLM呼び出しとチェーンできます:
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.prompts import ChatPromptTemplate
# モデルの初期化
llm = ChatGoogleGenerativeAI(
model="gemini-2.0-flash",
temperature=0,
)
prompt = ChatPromptTemplate.from_messages([
("system", "あなたは{input_language}から{output_language}に翻訳する便利なアシスタントです。"),
("human", "{input}"),
])
chain = prompt | llm
result = chain.invoke({
"input_language": "English",
"output_language": "German",
"input": "I love programming.",
})
print(result.content) # 出力: Ich liebe Programmieren.
このアプローチでは:
- 変数を含む再利用可能なプロンプトテンプレートを作成します
- パイプ演算子(
|
)を使用してプロンプトテンプレートとLLMをチェーンします -
invoke()
に辞書を渡すことで動的な入力を可能にします
マルチモーダル機能
Geminiの特筆すべき機能の一つは、画像、音声、動画など、複数の種類のメディアを処理できることです。
画像の処理
Geminiモデルに分析用の画像を提供できます:
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.messages import HumanMessage
import base64
# モデルの初期化
llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash")
# 画像URLの使用
message_url = HumanMessage(
content=[
{"type": "text", "text": "この画像を説明してください。"},
{"type": "image_url", "image_url": "https://picsum.photos/seed/picsum/200/300"},
]
)
result_url = llm.invoke([message_url])
print(result_url.content)
# ローカル画像の使用
local_image_path = "../assets/react.png"
with open(local_image_path, "rb") as image_file:
encoded_image = base64.b64encode(image_file.read()).decode('utf-8')
message_local = HumanMessage(
content=[
{"type": "text", "text": "この画像を説明してください。"},
{"type": "image_url", "image_url": f"data:image/png;base64,{encoded_image}"}
]
)
result_local = llm.invoke([message_local])
print(result_local.content)
この例では:
- URLからの画像処理
- base64文字列としてエンコードしたローカル画像の処理
- テキストと画像の両方を含むマルチパートメッセージの送信
を示しています。
音声と動画の処理
Geminiは音声や動画入力も処理できます:
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.messages import HumanMessage
import base64
# モデルの初期化
llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash")
audio_file_path = "../path/to/your/audio/file.mp3"
audio_mime_type = "audio/mpeg"
with open(audio_file_path, "rb") as audio_file:
encoded_audio = base64.b64encode(audio_file.read()).decode('utf-8')
message = HumanMessage(
content=[
{"type": "text", "text": "この音声を文字起こししてください。"},
{"type": "media", "data": encoded_audio, "mime_type": audio_mime_type}
]
)
response = llm.invoke([message])
print(response.content)
動画処理:
video_file_path = "../path/to/your/video/file.mp4"
video_mime_type = "video/mp4"
with open(video_file_path, "rb") as video_file:
encoded_video = base64.b64encode(video_file.read()).decode('utf-8')
message = HumanMessage(
content=[
{"type": "text", "text": "この動画で起きていることを説明してください。"},
{"type": "media", "data": encoded_video, "mime_type": video_mime_type}
]
)
response = llm.invoke([message])
print(response.content)
これらの例は以下を示しています:
- 文字起こしのための音声ファイル処理
- 説明のための動画コンテンツ分析
- 適切なMIMEタイプを使用した異なるメディアタイプの操作
画像生成
Geminiはテキスト説明に基づいて画像も生成できます:
from langchain_google_genai import ChatGoogleGenerativeAI
import base64
from IPython.display import Image, display
# 画像生成用モデルの初期化
llm = ChatGoogleGenerativeAI(model="models/gemini-2.0-flash-exp-image-generation")
message = {
"role": "user",
"content": "帽子をかぶった猫の画像を生成してください。",
}
response = llm.invoke(
[message],
generation_config=dict(response_modalities=["TEXT", "IMAGE"]),
)
# 生成された画像の表示
image_base64 = response.content[0].get("image_url").get("url").split(",")[-1]
image_data = base64.b64decode(image_base64)
display(Image(data=image_data, width=300))
この例では:
- 特殊な画像生成モデルの使用
- 応答にテキストと画像の両方を含めるように指定
- 生成された画像の抽出と表示
を示しています。
高度な機能
ツール呼び出しと関数実行
Geminiに外部ツールや関数を呼び出す機能を持たせることができます:
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.tools import tool
from langchain_core.messages import ToolMessage
# ツールの定義
@tool(description="指定された場所の現在の天気を取得する")
def get_weather(location: str) -> str:
return "晴れています。"
# モデルの初期化とツールのバインド
llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash")
llm_with_tools = llm.bind_tools([get_weather])
# ツールをトリガーするクエリで呼び出し
query = "サンフランシスコの天気はどうですか?"
ai_msg = llm_with_tools.invoke(query)
# 応答内のツール呼び出しにアクセス
print(ai_msg.tool_calls)
# ツール結果をモデルに戻す
tool_message = ToolMessage(
content=get_weather(*ai_msg.tool_calls[0]['args']),
tool_call_id=ai_msg.tool_calls[0]['id']
)
final_response = llm_with_tools.invoke([ai_msg, tool_message])
print(final_response.content)
この例では:
-
@tool
デコレータを使用したカスタムツールの定義 - ツールをLLMにバインド
- ツール呼び出しとその引数の処理
- ツールの結果をモデルに戻す
を示しています。
組み込みツール
Geminiは一般的なタスク用の組み込みツールも提供しています:
from langchain_google_genai import ChatGoogleGenerativeAI
from google.ai.generativelanguage_v1beta.types import Tool as GenAITool
# モデルの初期化
llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash")
# Google検索
search_resp = llm.invoke(
"アメリカで次に起こる皆既日食はいつですか?",
tools=[GenAITool(google_search={})],
)
print(search_resp.content)
# コード実行
code_resp = llm.invoke(
"2*2は何ですか、Pythonを使ってください",
tools=[GenAITool(code_execution={})],
)
for c in code_resp.content:
if isinstance(c, dict):
if c["type"] == 'code_execution_result':
print(f"コード実行結果: {c['code_execution_result']}")
elif c["type"] == 'executable_code':
print(f"実行可能コード: {c['executable_code']}")
else:
print(c)
この例では:
- 組み込みのGoogle検索ツールの使用
- 組み込みのコード実行ツールの使用
- 異なるタイプの応答の処理
を示しています。
構造化出力
Geminiの出力を特定の構造に従うように制約できます:
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_google_genai import ChatGoogleGenerativeAI
# 希望する構造の定義
class Person(BaseModel):
'''人物に関する情報'''
name: str = Field(..., description="人物の名前")
height_m: float = Field(..., description="人物の身長(メートル)")
# モデルの初期化
llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash", temperature=0)
structured_llm = llm.with_structured_output(Person)
# 構造化情報を求めるクエリでモデルを呼び出し
result = structured_llm.invoke("アメリカ合衆国の第16代大統領は誰で、身長は何メートルでしたか?")
print(result) # 出力: name='Abraham Lincoln' height_m=1.93
この例では:
- 希望する出力構造のPydanticモデルの定義
-
with_structured_output
を使用したモデル応答の制約 - 生のテキストではなく、適切に構造化されたデータオブジェクトの受け取り
を示しています。
トークン使用量の追跡
監視と最適化のために、トークン使用量を追跡できます:
from langchain_google_genai import ChatGoogleGenerativeAI
# モデルの初期化
llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash")
result = llm.invoke("プロンプトエンジニアリングの概念を一文で説明してください。")
print(result.content)
print("\n使用状況メタデータ:")
print(result.usage_metadata)
この例では:
- モデル呼び出し後の使用状況メタデータへのアクセス
- コストとパフォーマンス追跡のためのトークン消費の監視
を示しています。
埋め込みとベクトル操作
埋め込みの作成と使用
埋め込みはテキストの意味を捉えるベクトル表現です:
from langchain_google_genai import GoogleGenerativeAIEmbeddings
embeddings = GoogleGenerativeAIEmbeddings(model="models/gemini-embedding-exp-03-07")
# 単一クエリの埋め込み
vector = embeddings.embed_query("hello, world!")
# 複数ドキュメントの埋め込み
vectors = embeddings.embed_documents([
"今日は月曜日です",
"今日は火曜日です",
"今日はエイプリルフールです",
])
この例では:
- 埋め込みモデルの作成
- 個々のクエリの埋め込み生成
- 複数ドキュメントの埋め込み生成
を示しています。
ベクトルストアと検索
埋め込みは意味的検索と情報取得を可能にします:
from langchain_google_genai import GoogleGenerativeAIEmbeddings
from langchain_core.vectorstores import InMemoryVectorStore
# 埋め込みの初期化
embeddings = GoogleGenerativeAIEmbeddings(model="models/gemini-embedding-exp-03-07")
text = "LangChainはコンテキスト対応の推論アプリケーションを構築するためのフレームワークです"
# ベクトルストアとリトリーバーの作成
vectorstore = InMemoryVectorStore.from_texts([text], embedding=embeddings)
retriever = vectorstore.as_retriever()
# 類似ドキュメントの検索
retrieved_documents = retriever.invoke("LangChainとは何ですか?")
print(retrieved_documents[0].page_content)
この例では:
- テキストドキュメントからのベクトルストア作成
- 意味的検索のためのリトリーバー作成
- 意味的類似性に基づくドキュメント検索
を示しています。
埋め込み性能の最適化
特定のタスクのために埋め込みを最適化できます:
from langchain_google_genai import GoogleGenerativeAIEmbeddings
from sklearn.metrics.pairwise import cosine_similarity
# 異なるユースケース向けのタスクタイプ
query_embeddings = GoogleGenerativeAIEmbeddings(
model="models/gemini-embedding-exp-03-07",
task_type="RETRIEVAL_QUERY" # クエリ用
)
doc_embeddings = GoogleGenerativeAIEmbeddings(
model="models/gemini-embedding-exp-03-07",
task_type="RETRIEVAL_DOCUMENT" # ドキュメント用
)
# 類似性の比較
q_embed = query_embeddings.embed_query("フランスの首都は何ですか?")
d_embed = doc_embeddings.embed_documents(["フランスの首都はパリです。", "フィリップはピザを食べるのが好きです。"])
for i, d in enumerate(d_embed):
similarity = cosine_similarity([q_embed], [d])[0][0]
print(f"ドキュメント {i+1} 類似度: {similarity}")
この例では:
- クエリとドキュメントに異なるタスクタイプの使用
- クエリとドキュメント埋め込み間の類似度計算
- 検索パフォーマンスの評価
を示しています。
まとめと次のステップ
このガイドでは、LangChainを通じてGoogle Geminiモデルを使用する基本的な側面をカバーしました。基本的なテキスト生成から高度なマルチモーダル機能、埋め込み操作まで、洗練されたAIアプリケーションを構築するための知識を得ました。
次のステップとして:
- さまざまなGeminiモデルを試して、ユースケースに最適なものを見つける
- エージェントやメモリなど、より複雑なLangChain構成要素を探る
- 複数の機能を包括的なアプリケーションに組み合わせる
- 新しいGeminiモデルのリリースと機能に関する最新情報を入手する
GeminiモデルのパワーとLangChainの柔軟性を活用することで、以前は不可能だったか、大規模なエンジニアリング作業が必要だったAIアプリケーションを作成できます。
補足: 本記事で紹介したコード例はGemini APIとLangChainパッケージの最新バージョンに基づいています。API仕様は変更される可能性があるため、公式ドキュメントで最新情報を確認することをお勧めします。