0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Google Gemini: LangChain チートシート

Last updated at Posted at 2025-05-03

image.png

Google Gemini LangChain Cheatsheet より

目次

  1. はじめに
  2. Google GeminiとLangChainを始める
  3. LangChainの基本操作
  4. マルチモーダル機能
  5. 高度な機能
  6. 埋め込みとベクトル操作
  7. まとめと次のステップ

はじめに

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-25gemini-2.5-flash-preview-04-17などの新しいモデルも使用できます。すべてのモデルIDはGemini APIドキュメントで確認できます。

環境のセットアップ

始めるには以下が必要です:

  1. APIキーの取得:Google AI Studioから無料で登録してAPIキーを取得します。
  2. パッケージのインストールlangchain-google-genaiパッケージをインストールします。
  3. 環境の設定: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アプリケーションを構築するための知識を得ました。

次のステップとして:

  1. さまざまなGeminiモデルを試して、ユースケースに最適なものを見つける
  2. エージェントやメモリなど、より複雑なLangChain構成要素を探る
  3. 複数の機能を包括的なアプリケーションに組み合わせる
  4. 新しいGeminiモデルのリリースと機能に関する最新情報を入手する

GeminiモデルのパワーとLangChainの柔軟性を活用することで、以前は不可能だったか、大規模なエンジニアリング作業が必要だったAIアプリケーションを作成できます。

補足: 本記事で紹介したコード例はGemini APIとLangChainパッケージの最新バージョンに基づいています。API仕様は変更される可能性があるため、公式ドキュメントで最新情報を確認することをお勧めします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?