Vertex AI で Gemini 1.5を使う 3: 教育向けユースケース
前回の続き
教育における Gemini の使用
以下のnotebookを進める。ここまでやってきたようなことを教育向けのユースケースでいろいろやってみるというもの。
事前準備
セットアップ回りは前回の記事を参考に、ということで詳細は割愛。
パッケージインストール
!pip install --upgrade --user --quiet google-cloud-aiplatform
ColaboratoryからGCPを使えるように認証を行う。
from google.colab import auth
auth.authenticate_user()
Vertex AIへの接続
import vertexai
PROJECT_ID="YOUR_PROJECT_ID"
REGION="asia-northeast1"
vertexai.init(
project=PROJECT_ID,
location=REGION
)
ライブラリをまとめてインポート
from vertexai.generative_models import (
GenerationConfig,
GenerationResponse,
GenerativeModel,
Image,
Part,
)
notebookの簡単のためのヘルパー関数を読み込み
import http.client
import io
import typing
import urllib.request
import IPython.display
from PIL import Image as PIL_Image
from PIL import ImageOps as PIL_ImageOps
Contents = str | list[str | Image | Part]
def generate_content(
model: GenerativeModel,
contents: Contents,
temperature: float = 0.0,
top_p: float = 0.0,
top_k: int = 1,
) -> list[GenerationResponse]:
"""Vertex AI Gemini APIを呼び出す。
このノートブックでは、呼び出しの一貫性を保つため、デフォルトのパラメータのランダム性は低くしてある。
"""
generation_config = GenerationConfig(
temperature=temperature,
top_p=top_p,
top_k=top_k,
candidate_count=1,
max_output_tokens=2048,
)
responses = model.generate_content(
contents,
generation_config=generation_config,
stream=True,
)
# ストリーミングモードでは、複数のGenerationResponseを生成できる
# 単項式(非ストリーミング)モードでは、単一のGenerationResponseが返される
return [responses] if isinstance(responses, GenerationResponse) else list(responses)
def print_contents(contents: Contents):
"""読みやすくするため、全手のコンテンツを出力する。"""
if not isinstance(contents, list):
contents = [contents]
print(" Contents ".center(80, "-"))
for content in contents:
if display_content_as_image(content):
continue
if display_content_as_video(content):
continue
print(content)
def display_content_as_image(content: str | Image | Part) -> bool:
if not isinstance(content, Image):
return False
display_image(content)
return True
def display_content_as_video(content: str | Image | Part) -> bool:
if not isinstance(content, Part):
return False
part = typing.cast(Part, content)
file_path = part.file_data.file_uri.removeprefix("gs://")
video_url = f"https://storage.googleapis.com/{file_path}"
IPython.display.display(IPython.display.Video(video_url, width=600))
return True
def print_responses(responses: list[GenerationResponse], as_markdown: bool = True):
"""完全なレスポンスを出力する"""
# テキストを統合する
text = "".join(
part.text
for response in responses
for part in response.candidates[0].content.parts
)
# 潜在的な前後の空白を取り除く
text = text.strip()
print(" Start of responses ".center(80, "-"))
if as_markdown:
IPython.display.display(IPython.display.Markdown(text))
else:
print(text)
print(" End of responses ".center(80, "-"))
print("")
def display_image(image: Image, max_width: int = 600, max_height: int = 350):
pil_image = typing.cast(PIL_Image.Image, image._pil_image)
if pil_image.mode != "RGB":
# RGBAなどのモードは、まだすべてのJupyter環境でサポートされているわけではない
pil_image = pil_image.convert("RGB")
image_width, image_height = pil_image.size
if max_width < image_width or max_height < image_height:
# notebook上で画像を小さく表示するためにサイズを変更する
pil_image = PIL_ImageOps.contain(pil_image, (max_width, max_height))
display_image_compressed(pil_image)
def display_image_compressed(pil_image: PIL_Image.Image):
"""ノートブックのサイズを小さくするために、画像を圧縮して表示する。"""
image_io = io.BytesIO()
pil_image.save(image_io, "jpeg", quality=80, optimize=True)
image_bytes = image_io.getvalue()
ipython_image = IPython.display.Image(image_bytes)
IPython.display.display(ipython_image)
def load_image_from_url(image_url: str) -> Image:
image_bytes = get_image_bytes_from_url(image_url)
return Image.from_bytes(image_bytes)
def get_image_bytes_from_url(image_url: str) -> bytes:
with urllib.request.urlopen(image_url) as response:
response = typing.cast(http.client.HTTPResponse, response)
image_bytes = response.read()
return image_bytes
モデルの定義。元のnotebookでは、Gemini 1.0 Proとなっているが、今回はGemini 1.5 Proを使用する。
model = GenerativeModel("gemini-1.5-pro")
異なるレベルでの推論
同じ内容でもプロンプトにより回答の内容やレベル感は変わる。
直接的な回答を求める場合。
contents = """
恐竜に何が起こったのか?それはいつ?
簡単に一文で説明して。
"""
responses = generate_content(model, contents)
print_contents(contents)
print_responses(responses)
----------------------------------- Contents -----------------------------------
恐竜に何が起こったのか?それはいつ?
簡単に一文で説明して。
------------------------------ Start of responses ------------------------------
約6,600万年前に、地球に小惑星が衝突したことで、恐竜を含む地球上の動植物種の約4分の3が絶滅しました。
------------------------------- End of responses -------------------------------
よりニュアンスに富んだ回答を求める場合
contents = """
恐竜に何が起こったのか、私たちは100%確信しているのか?
もしそうでないなら、現在の主な仮説を詳しく説明して。
"""
responses = generate_content(model, contents)
print_contents(contents)
print_responses(responses)
----------------------------------- Contents -----------------------------------
恐竜に何が起こったのか、私たちは100%確信しているのか?
もしそうでないなら、現在の主な仮説を詳しく説明して。
------------------------------ Start of responses ------------------------------
恐竜に何が起こったのか、100%確信しているわけではありません。しかし、科学界では広く受け入れられている説明は、チクシュルーブ衝突説と呼ばれるものです。この説は、約6,600万年前に巨大な小惑星が地球に衝突し、恐竜(鳥類を除く)を含む地球上の動植物の約4分の3が絶滅したというものです。
この説の主な証拠は以下のとおりです。
ユカタン半島のチクシュルーブクレーター: このクレーターは、衝突の時期と一致する約6,600万年前に形成されたもので、衝突した小惑星の大きさに一致する直径約180km、深さ20kmです。
世界中に分布するK-Pg境界層: この地層には、衝突時に放出されたとされる高濃度のイリジウムが含まれています。イリジウムは地球の地殻にはまれですが、小惑星には豊富に含まれています。
津波堆積物: 衝突の規模から、壊滅的な津波が発生したと考えられており、世界中の堆積物にその証拠が見られます。
広範囲にわたる火災の証拠: 衝突によって発生した熱と噴出物は、広範囲にわたる森林火災を引き起こした可能性があり、その証拠は堆積物中のすすや木炭に見られます。
これらの証拠は、チクシュルーブ衝突が恐竜の絶滅の主な原因であったことを強く示唆していますが、他の要因も役割を果たした可能性があります。
その他の仮説:
火山活動: インドのデカン・トラップと呼ばれる地域では、衝突の時期と重なる時期に大規模な火山活動が発生していました。これらの噴火によって大量のガスや塵が大気中に放出され、気候変動や酸性雨を引き起こした可能性があります。
漸進的な気候変動: 衝突や火山活動に加えて、海面や気温の漸進的な変化が、恐竜の絶滅に寄与した可能性があります。
恐竜の絶滅の原因については、まだ議論の余地があります。チクシュルーブ衝突が決定的な要因であった可能性が高いですが、火山活動や気候変動などの他の要因も、絶滅の規模や時期に影響を与えた可能性があります。恐竜の絶滅は、複雑な出来事であり、その全容を解明するには、さらなる研究が必要です。
------------------------------- End of responses -------------------------------
別の質問。
シンプルな回答を求める場合。
contents = """
どうして、ここフランスでは冬で、オーストラリアは夏なのか、説明して。
私は子供です。かんたんな3つのポイントで答えて。
"""
responses = generate_content(model, contents)
print_contents(contents)
print_responses(responses)
----------------------------------- Contents -----------------------------------
どうして、ここフランスでは冬で、オーストラリアは夏なのか、説明して。
私は子供です。かんたんな3つのポイントで答えて。
------------------------------ Start of responses ------------------------------
こんにちは!フランスは冬なのにオーストラリアは夏なのはなぜだろうと思ったんだね。その理由は次のとおりだよ。
地球は傾いているんだ! 地球はまっすぐ立っているんじゃなくて、ちょっと傾いてるんだ。この傾きのおかげで、地球の違う場所では太陽の光を浴びる量が変わるんだ。
地球は太陽の周りを回っているんだ! 地球は太陽の周りを1年かけて1周するんだ。地球が太陽の周りを回ると、傾いている部分が太陽の方を向いたり、太陽から反対の方を向いたりするんだ。
太陽に近いと暑くなるんだ! フランスが冬なのは、地球のその部分が太陽から傾いていて、太陽の光をあまり浴びないからなんだ。でもオーストラリアは地球の反対側にあって、太陽の光をたくさん浴びているから夏なんだ!
数か月後には、状況が逆転するんだ! フランスは太陽に近づいて暖かくなり、オーストラリアは太陽から遠ざかって寒くなるんだ。すごいよね! 😊
------------------------------- End of responses -------------------------------
より詳細な回答を求める場合。
contents = """
なぜ潮の満ち引きがあるのかを説明して。
私は大人です。箇条書きで詳しく回答して。
"""
responses = generate_content(model, contents)
print_contents(contents)
print_responses(responses)
----------------------------------- Contents -----------------------------------
なぜ潮の満ち引きがあるのかを説明して。
私は大人です。箇条書きで詳しく回答して。
------------------------------ Start of responses ------------------------------
潮の満ち引きは、主に月と太陽の重力によって引き起こされる地球の海面の周期的な上昇と下降です。これがその仕組みです。
月の引力:潮の満ち引きの主な原因は月です。より正確には、地球と月の間の重力の引っ張り合いです。この力は、地球の片側(月に最も近い側)が反対側よりも強い月の引力を受けることを意味します。
膨らみ:この重力の差により、地球とその水は月の両側でわずかに膨らみます。これらの膨らみが満潮です。
地球の自転:地球は約24時間で自転するため、地球上の特定の地点は1日に2回これらの膨らみの場所(満潮)と膨らみの間の場所(干潮)を通過します。
太陽の影響:太陽も地球の潮汐に重力を及ぼしますが、月よりもはるかに遠くにあるため、その影響は小さくなります。太陽、地球、月が一直線に並んだとき(新月と満月のとき)、潮汐力は合わさり、より大きな潮汐の範囲が生じます。これらを大潮と呼びます。
小潮:太陽、地球、月が直角に並んでいるとき(上弦と下弦の月)、太陽の重力は月の重力を部分的に相殺します。これにより、潮汐の範囲が小さくなり、小潮と呼ばれます。
地理的要因:潮汐の範囲(満潮と干潮の水位の差)は、場所によって大きく異なります。これは、海岸線の形状、海底の地形、その他の要因が、特定の場所に水がどのように流れ込むかに影響を与えるためです。
要約すると、潮の満ち引きは、主に月と地球の間の重力の引っ張り合いと、地球とその水に対するこの力の不均一な影響によって引き起こされる複雑な現象です。
------------------------------- End of responses -------------------------------
クローズドな質問。
contents = """
前回と前々回のうるう年はいつだった?
うるう年の間に開催された国際大会を3つ挙げて。
日付、都市、会場について詳しく述べること。
"""
responses = generate_content(model, contents)
print_contents(contents)
print_responses(responses)
----------------------------------- Contents -----------------------------------
前回と前々回のうるう年はいつだった?
うるう年の間に開催された国際大会を3つ挙げて。
日付、都市、会場について詳しく述べること。
------------------------------ Start of responses ------------------------------
最後の2回のうるう年は2020年と2016年でした。うるう年に開催された国際的な主要イベントを3つご紹介します。
2020年夏季オリンピック
日付: 2021年7月23日~8月8日(新型コロナウイルス感染症の世界的流行により2020年から延期)
都市: 日本・東京
会場: 東京の様々な会場(国立競技場など)が使用されました。
2016年夏季オリンピック
日付: 2016年8月5日~8月21日
都市: ブラジル・リオデジャネイロ
会場: リオデジャネイロの様々な会場(マラカナン競技場やオリンピックパークなど)が使用されました。
UEFA欧州選手権2016
日付: 2016年6月10日~7月10日
都市: フランス各地
会場: フランスの様々な都市(サンドニのスタッド・ド・フランスなど)にある10会場で開催されました。
------------------------------- End of responses -------------------------------
オープンな質問
contents = """
鶏と卵、どちらが先か?を3つの異なる視点から説明して。
「鶏卵」問題を何と呼びますか?教育現場で起こりうる例を1つ挙げて。
"""
responses = generate_content(model, contents)
print_contents(contents)
print_responses(responses)
----------------------------------- Contents -----------------------------------
鶏と卵、どちらが先か?を3つの異なる視点から説明して。
「鶏卵」問題を何と呼びますか?教育現場で起こりうる例を1つ挙げて。
------------------------------ Start of responses ------------------------------
鶏と卵、どちらが先か? 3つの視点
1. 進化生物学的視点:
この視点からは、卵が先と言えます。鶏のような鳥類は恐竜から進化しましたが、恐竜は鶏よりもはるか昔に卵を産んでいました。つまり、鶏の祖先は卵を産んでいましたが、それはまだ「鶏卵」ではありませんでした。進化の過程で、遺伝子の変異と自然選択が繰り返され、現在の鶏の卵、そして鶏が誕生したと考えられています。
2. 言語学的視点:
「鶏」と「卵」という言葉の定義によって答えが変わります。もし「鶏の卵」と定義するなら、鶏が先になります。鶏がいなければ、鶏の卵は存在し得ないからです。しかし、「硬い殻を持つ鳥の卵」と定義するなら、卵が先になります。前述の通り、鳥類は恐竜から進化しており、恐竜は硬い殻を持つ卵を産んでいたからです。
3. 哲学的視点:
この問題は、循環因果、あるいは無限後退の例として議論されます。どちらが先かという問い自体が、既に鶏と卵の存在を前提としており、論理的に堂々巡りになってしまいます。哲学的には、どちらが先かを決定づける絶対的な答えはなく、思考実験として捉えられることが多いでしょう。
「鶏卵」問題はなんと呼ばれる?
「鶏卵」問題は、Chicken and egg dilemma (チキン・アンド・エッグ・ジレンマ) と呼ばれます。
教育現場で起こりうる例
例:
生徒が文章の書き方を学ぶ際に、「良い文章を書くには、語彙力が必要だ」と言われたとします。しかし、語彙力を身につけるには、多くの文章を読んだり書いたりする必要があります。つまり、「良い文章を書く」ためには「語彙力」が必要で、「語彙力」を身につけるには「文章を書く」必要があるという、鶏卵問題のような状況に陥ることがあります。
この場合、先生は、生徒に「まずは簡単な文章をたくさん書いてみることから始めよう。そうすれば、自然と語彙力は身についていくよ」とアドバイスすることができます。重要なのは、どちらが先かという議論に囚われず、行動を起こすための具体的なステップを示すことです。
------------------------------- End of responses -------------------------------
テキストに関する推論
要約や翻訳
contents = """
以下の文章を、テキストのみを用いて、日本語で、3文に要約せよ。箇条書きで。
文章:
- Les hommes naissent et demeurent libres et égaux en droits. Les distinctions sociales ne peuvent être fondées que sur l'utilité commune.
- Le but de toute association politique est la conservation des droits naturels et imprescriptibles de l'homme. Ces droits sont la liberté, la propriété, la sûreté et la résistance à l'oppression.
- Le principe de toute souveraineté réside essentiellement dans la Nation. Nul corps, nul individu ne peut exercer d'autorité qui n'en émane expressément.
- La liberté consiste à pouvoir faire tout ce qui ne nuit pas à autrui : ainsi, l'exercice des droits naturels de chaque homme n'a de bornes que celles qui assurent aux autres membres de la société la jouissance de ces mêmes droits. Ces bornes ne peuvent être déterminées que par la loi.
La loi n'a le droit de défendre que les actions nuisibles à la société. Tout ce qui n'est pas défendu par la loi ne peut être empêché, et nul ne peut être contraint à faire ce qu'elle n'ordonne pas.
- La loi est l'expression de la volonté générale. Tous les citoyens ont droit de concourir personnellement ou par leurs représentants à sa formation. Elle doit être la même pour tous, soit qu'elle protège, soit qu'elle punisse. Tous les citoyens, étant égaux à ses yeux, sont également admissibles à toutes dignités, places et emplois publics, selon leur capacité et sans autre distinction que celle de leurs vertus et de leurs talents.
- Nul homme ne peut être accusé, arrêté ou détenu que dans les cas déterminés par la loi et selon les formes qu'elle a prescrites. Ceux qui sollicitent, expédient, exécutent ou font exécuter des ordres arbitraires doivent être punis ; mais tout citoyen appelé ou saisi en vertu de la loi doit obéir à l'instant ; il se rend coupable par la résistance.
- La loi ne doit établir que des peines strictement et évidemment nécessaires, et nul ne peut être puni qu'en vertu d'une loi établie et promulguée antérieurement au délit, et légalement appliquée.
Tout homme étant présumé innocent jusqu'à ce qu'il ait été déclaré coupable, s'il est jugé indispensable de l'arrêter, toute rigueur qui ne serait pas nécessaire pour s'assurer de sa personne doit être sévèrement réprimée par la loi.
- Nul ne doit être inquiété pour ses opinions, même religieuses, pourvu que leur manifestation ne trouble pas l'ordre public établi par la loi.
要約:
"""
responses = generate_content(model, contents)
print_contents(contents)
print_responses(responses)
----------------------------------- Contents -----------------------------------
以下の文章を、テキストのみを用いて、日本語で、3文に要約せよ。箇条書きで。
文章:
- Les hommes naissent et demeurent libres et égaux en droits. Les distinctions sociales ne peuvent être fondées que sur l'utilité commune.
- Le but de toute association politique est la conservation des droits naturels et imprescriptibles de l'homme. Ces droits sont la liberté, la propriété, la sûreté et la résistance à l'oppression.
- Le principe de toute souveraineté réside essentiellement dans la Nation. Nul corps, nul individu ne peut exercer d'autorité qui n'en émane expressément.
- La liberté consiste à pouvoir faire tout ce qui ne nuit pas à autrui : ainsi, l'exercice des droits naturels de chaque homme n'a de bornes que celles qui assurent aux autres membres de la société la jouissance de ces mêmes droits. Ces bornes ne peuvent être déterminées que par la loi.
La loi n'a le droit de défendre que les actions nuisibles à la société. Tout ce qui n'est pas défendu par la loi ne peut être empêché, et nul ne peut être contraint à faire ce qu'elle n'ordonne pas.
- La loi est l'expression de la volonté générale. Tous les citoyens ont droit de concourir personnellement ou par leurs représentants à sa formation. Elle doit être la même pour tous, soit qu'elle protège, soit qu'elle punisse. Tous les citoyens, étant égaux à ses yeux, sont également admissibles à toutes dignités, places et emplois publics, selon leur capacité et sans autre distinction que celle de leurs vertus et de leurs talents.
- Nul homme ne peut être accusé, arrêté ou détenu que dans les cas déterminés par la loi et selon les formes qu'elle a prescrites. Ceux qui sollicitent, expédient, exécutent ou font exécuter des ordres arbitraires doivent être punis ; mais tout citoyen appelé ou saisi en vertu de la loi doit obéir à l'instant ; il se rend coupable par la résistance.
- La loi ne doit établir que des peines strictement et évidemment nécessaires, et nul ne peut être puni qu'en vertu d'une loi établie et promulguée antérieurement au délit, et légalement appliquée.
Tout homme étant présumé innocent jusqu'à ce qu'il ait été déclaré coupable, s'il est jugé indispensable de l'arrêter, toute rigueur qui ne serait pas nécessaire pour s'assurer de sa personne doit être sévèrement réprimée par la loi.
- Nul ne doit être inquiété pour ses opinions, même religieuses, pourvu que leur manifestation ne trouble pas l'ordre public établi par la loi.
要約:
------------------------------ Start of responses ------------------------------
人は生まれながらにして自由かつ平等な権利を持ち、社会における差異は公益に基づいてのみ認められる。
国家の目的は個人の自由、所有、安全、圧政への抵抗といった自然権を保障することであり、主権は国民に属する。
法律は一般意志の表現であり、個人の自由は他者を害さない範囲で保障され、処罰は事前に定められた法律に基づいてのみ行われるべきである。
------------------------------- End of responses -------------------------------
アイデア出し。
contents = """
「世界のチョコレート」についてのプレゼンテーションの要点を5つにまとめて提出して。
1つはメキシコの原産地についてであること(私の先生の家族がメキシコにいる)。
最後の1つは、教室の全員と一緒に試食すること。
"""
# より創造的で多様な回答を得るために、ランダム性のレベルを上げよう。
# 連続したリクエストはおそらく異なる回答を返すでしょう。
temperature = 0.7
top_p = 0.8
top_k = 40
responses = generate_content(model, contents, temperature, top_p, top_k)
print_contents(contents)
print_responses(responses)
----------------------------------- Contents -----------------------------------
「世界のチョコレート」についてのプレゼンテーションの要点を5つにまとめて提出して。
1つはメキシコの原産地についてであること(私の先生の家族がメキシコにいる)。
最後の1つは、教室の全員と一緒に試食すること。
------------------------------ Start of responses ------------------------------
「世界のチョコレート」のプレゼンテーションのポイントを5つ紹介します。最後のポイントは試食です。
チョコレートの世界へようこそ
1. カカオ豆の原産地: チョコレートの旅は、何千年も前にメキシコや中央アメリカで始まります。古代メソアメリカの人々は、カカオの木を崇拝していました。カカオの木から取れる豆を焙煎して飲み物にしていました。先生、ご家族に、この飲み物についてご存知かどうか聞いてみてください。苦くてスパイシーで、今日のホットチョコレートとはまったく違っていたかもしれません。
2. チョコレートがヨーロッパに渡る: 16世紀、探検家エルナン・コルテスがカカオ豆をスペインに持ち帰りました。カカオ豆は宮廷で人気を博し、砂糖やスパイスを加えて甘くするようになりました。
3. チョコレート革命: 19世紀になると、チョコレートは大きく変化しました。スイスのヘンリー・ネスレは、固形チョコレートを作る新しいプロセスを開発しました。これが、今日私たちが知っているチョコレートバーへの道を切り開いたのです。
4. チョコレートの種類: ミルクチョコレートからダークチョコレート、ホワイトチョコレートまで、さまざまな種類のチョコレートがあります。チョコレートは、世界中のさまざまな方法で楽しまれています。一部の国では、チョコレートは飲み物に、また別の国では、デザートやお菓子に使われています。
5. 試食タイム! 今日は、さまざまな種類のチョコレートを試食して、ユニークな風味を探求します。試食しながら、チョコレートの歴史とそれがどのようにして世界中で愛されるようになったのかについて考えてみましょう。
これらのポイントは、プレゼンテーションを魅力的にするための出発点となるはずです。頑張ってください!
------------------------------- End of responses -------------------------------
文章の校正やスペルチェック
contents = """
私は英語を母国語ではありません。
以下の文章が正しいかどうかチェックしてください。
正しくない場合は、訂正と説明をすること。説明は日本語で。
与えられた例文と同じ構文を使うこと。
例:
- **Hi!**
- 判定: ✔️
- **Your my best freind!**
- 判定: ❌
- 訂正: **You're my best friend!**
- 説明:
- "**Your**"が間違っています。あなたは "You're" という意味で書いたつもりかもしれませんが、これは"You are"の省略形です。
- "**freind**" のスペルが間違っています。正しいスペルは "**friend**" です。
文章:
- They're twins, isn't it?
- I assisted to the meeting.
- You received important informations.
- I digged a hole in the ice and saw lots of fishes.
- That's all folks!
"""
responses = generate_content(model, contents)
print_contents(contents)
print_responses(responses)
----------------------------------- Contents -----------------------------------
私は英語を母国語ではありません。
以下の文章が正しいかどうかチェックしてください。
正しくない場合は、訂正と説明をすること。説明は日本語で。
与えられた例文と同じ構文を使うこと。
例:
- **Hi!**
- 判定: ✔️
- **Your my best freind!**
- 判定: ❌
- 訂正: **You're my best friend!**
- 説明:
- "**Your**"が間違っています。あなたは "You're" という意味で書いたつもりかもしれませんが、これは"You are"の省略形です。
- "**freind**" のスペルが間違っています。正しいスペルは "**friend**" です。
文章:
- They're twins, isn't it?
- I assisted to the meeting.
- You received important informations.
- I digged a hole in the ice and saw lots of fishes.
- That's all folks!
------------------------------ Start of responses ------------------------------
以下のように修正しました。
文章の添削
They're twins, isn't it?
判定: ❌
訂正: They're twins, aren't they?
説明:
付加疑問文の場合、主語が "they" であれば、疑問文の部分は "aren't they?" となります。
I assisted to the meeting.
判定: ❌
訂正: I attended the meeting.
説明:
"assist" は「手伝う」という意味です。会議に出席する場合は "attend" を使います。"assist" を使う場合は "assist in the meeting" のように前置詞が必要です。
You received important informations.
判定: ❌
訂正: You received important information.
説明:
"information" は不可算名詞なので、複数形になりません。
I dug a hole in the ice and saw lots of fishes.
判定: ❌
訂正: I dug a hole in the ice and saw lots of fish.
説明:
"fish" は、種類のことを言わない限り、単複同形です。たくさんの魚を見た場合は "lots of fish" となります。
That's all folks!
判定: ✔️
------------------------------- End of responses -------------------------------
contents = """
文章を以下の各言語に翻訳して。
文章:
皆さん、こんにちは!みんな元気にしているかな?さっそくワークショップを始めよう!
というのも、実は、僕はすべての言語を話すことができないんだ。
言語:
英語、ドイツ語、フランス語、ギリシャ語、ブルガリア語
"""
responses = generate_content(model, contents)
print_contents(contents)
print_responses(responses)
----------------------------------- Contents -----------------------------------
文章を以下の各言語に翻訳して。
文章:
皆さん、こんにちは!みんな元気にしているかな?さっそくワークショップを始めよう!
というのも、実は、僕はすべての言語を話すことができないんだ。
言語:
英語、ドイツ語、フランス語、ギリシャ語、ブルガリア語
------------------------------ Start of responses ------------------------------
以下に、文章を英語、ドイツ語、フランス語、ギリシャ語、ブルガリア語に翻訳したものを示します。
英語 Hello everyone! How are you all doing? Let's get this workshop started! To be honest, I actually can't speak every language.
ドイツ語 Hallo zusammen! Wie geht es euch allen? Lasst uns mit diesem Workshop beginnen! Um ehrlich zu sein, ich kann eigentlich nicht alle Sprachen sprechen.
フランス語 Bonjour à tous ! Comment allez-vous ? Commençons cet atelier ! Pour être honnête, je ne parle pas toutes les langues.
ギリシャ語 Γεια σας σε όλους! Πώς είστε; Ας ξεκινήσουμε αυτό το εργαστήριο! Για να είμαι ειλικρινής, δεν μπορώ να μιλήσω όλες τις γλώσσες.
ブルガリア語 Здравейте на всички! Как сте? Нека да започнем този семинар! За да бъда честен, всъщност не мога да говоря всички езици.
------------------------------- End of responses -------------------------------
contents = """
私は、英語を母国語としていません。なので、以下の文章には間違いがあります。
私の母国語は何でしょうか?
また、私の母国語がこういう間違いをしやすい理由も説明して。
複数の可能性がある場合はこれがヒントです:I like cheese.
文章:
- They are twin sisters, isn't it?
- I assisted to the meeting.
- I saw lots of fishes.
"""
responses = generate_content(model, contents)
print_contents(contents)
print_responses(responses)
----------------------------------- Contents -----------------------------------
私は、英語を母国語としていません。なので、以下の文章には間違いがあります。
私の母国語は何でしょうか?
また、私の母国語がこういう間違いをしやすい理由も説明して。
複数の可能性がある場合はこれがヒントです:I like cheese.
文章:
- They are twin sisters, isn't it?
- I assisted to the meeting.
- I saw lots of fishes.
------------------------------ Start of responses ------------------------------
あなたの母国語は、フランス語の可能性が高いです。
理由は以下の通りです。
"They are twin sisters, isn't it?" フランス語では、名詞の後に置く疑問形のタグ ("n'est-ce pas?") が、英語のように主語と動詞を一致させる必要がありません。そのため、"They are..." に対して "n'est-ce pas?" をそのまま当てはめてしまい、"isn't it?" となってしまったと考えられます。
"I assisted to the meeting." フランス語で「会議に出席する」は "assister à la réunion" と言います。英語の "assist" は「手伝う」という意味なので、前置詞 "to" を伴って "assist at the meeting" と言うか、"attend the meeting" と言うのが適切です。フランス語の表現をそのまま直訳してしまったため、このような間違いが生じたと考えられます。
"I saw lots of fishes." フランス語では、可算名詞と不可算名詞の区別が英語ほど厳密ではありません。そのため、英語では不可算名詞として扱われる "fish" を、可算名詞のように複数形にしてしまったと考えられます。ただし、文脈によっては "fishes" が正しい場合もあります (例: さまざまな種類の魚について言及する場合)。
これらの間違いは、フランス語話者が英語を学習する際に非常によく見られるものです。フランス語と英語は文法や語彙に共通点が多い一方で、このような微妙な違いが存在するため、注意が必要です。
------------------------------- End of responses -------------------------------
数に関する推論
注意書きがある
注:他のLLMと同様、Geminiはもっともらしく聞こえる出力を生成するが、それでも幻覚を見ることがある。入力やパラメータによっては、数学演算を含め、出力が不正確になることがある。ベストプラクティスとして、幻覚を減らすためにLLMにステップバイステップの指示を出すか、LLMではなく電卓ライブラリを使うことを検討するとよいだろう。
contents = """
パトリシアは走るのが得意で、平均時速12キロで走ることができます。
- 月曜日、彼女は1時間半走った。何キロ走ったか?
- 火曜日、彼女は21キロ走った。何分走ったか?
- 水曜日、150分走った。走った距離は?
- 次はマラソン(42キロ)に挑戦する予定だ。何分かかるか?
- マラソンを3時間で完走するためには、彼女はどれくらい速く走る必要があるか?
ステップ・バイ・ステップで答えを詳述して。
"""
responses = generate_content(model, contents)
print_contents(contents)
print_responses(responses)
----------------------------------- Contents -----------------------------------
パトリシアは走るのが得意で、平均時速12キロで走ることができます。
- 月曜日、彼女は1時間半走った。何キロ走ったか?
- 火曜日、彼女は21キロ走った。何分走ったか?
- 水曜日、150分走った。走った距離は?
- 次はマラソン(42キロ)に挑戦する予定だ。何分かかるか?
- マラソンを3時間で完走するためには、彼女はどれくらい速く走る必要があるか?
ステップ・バイ・ステップで答えを詳述して。
------------------------------ Start of responses ------------------------------
パトリシアのランニングについて、一つずつ見ていきましょう。
月曜日:
既知: 時速12キロ、1.5時間走行
求めたいもの: 走行距離
計算: 距離 = 速度 x 時間
計算: 距離 = 12 km/h * 1.5 h = 18 km
回答: 月曜日は18キロ走りました。
火曜日:
既知: 時速12キロ、21キロ走行
求めたいもの: 走行時間
計算: 時間 = 距離 / 速度
計算: 時間 = 21 km / 12 km/h = 1.75 時間
変換: 1.75 時間を分に変換します。1時間 = 60分なので、1.75時間 * 60分/時間 = 105分
回答: 火曜日は105分走りました。
水曜日:
既知: 時速12キロ、150分走行
求めたいもの: 走行距離
変換: 150分を時間に変換します。1時間 = 60分なので、150分 / 60分/時間 = 2.5時間
計算: 距離 = 速度 x 時間
計算: 距離 = 12 km/h * 2.5 h = 30 km
回答: 水曜日は30キロ走りました。
マラソン:
既知: 時速12キロ、マラソンは42キロ
求めたいもの: マラソンにかかる時間
計算: 時間 = 距離 / 速度
計算: 時間 = 42 km / 12 km/h = 3.5 時間
変換: 3.5時間を時間と分に換算します。0.5時間 * 60分/時間 = 30分
回答: マラソンを完走するには3時間30分かかります。
マラソンを3時間で完走するには?
既知: マラソンは42キロ、目標時間は3時間
求めたいもの: 必要な速度
計算: 速度 = 距離 / 時間
計算: 速度 = 42 km / 3 h = 14 km/h
回答: マラソンを3時間で完走するには、時速14キロで走る必要があります。
------------------------------- End of responses -------------------------------
contents = """
友人から1000ユーロを借りた。
単純金利4.5%で合意した。
1年後、2年後、3年後にいくら返金しなければならないか知りたい。
結果を表にまとめて。
"""
responses = generate_content(model, contents)
print_contents(contents)
print_responses(responses)
----------------------------------- Contents -----------------------------------
友人から1000ユーロを借りた。
単純金利4.5%で合意した。
1年後、2年後、3年後にいくら返金しなければならないか知りたい。
結果を表にまとめて。
------------------------------ Start of responses ------------------------------
1000ユーロを4.5%の単純金利で借りた場合の返済額は以下の通りです。
年 計算式 返済額
1 1000 + (1000 * 0.045 * 1) 1045ユーロ
2 1000 + (1000 * 0.045 * 2) 1090ユーロ
3 1000 + (1000 * 0.045 * 3) 1135ユーロ
ご覧のように、単純金利では毎年同じ金額の利息が発生します(この場合、45ユーロ)。
------------------------------- End of responses -------------------------------
ここからはマルチモーダル。Gemini 1.0ではモデルが分かれていたが、Gemini 1.5はマルチモーダルモデルなので、引き続きGemini 1.5 Proで。
multimodal_model = GenerativeModel("gemini-1.5-pro")
1つの画像における推論
画像
Image by Crissy Jarvis on Unsplash: https://unsplash.com/photos/cHhbULJbPwM
prompt = "この画像について説明して:"
image_abacus = load_image_from_url(
"https://unsplash.com/photos/cHhbULJbPwM/download?w=600"
)
contents = [prompt, image_abacus]
responses = generate_content(multimodal_model, contents)
print_contents(contents)
print_responses(responses)
----------------------------------- Contents -----------------------------------
この画像について説明して:
(画像)
------------------------------ Start of responses ------------------------------
この画像は、白い背景に置かれた木製のそろばんです。そろばんは、数えたり計算したりするために使用される道具です。木製の枠があり、その中に金属製の棒が水平に張られています。棒には、色とりどりの木製のビーズが通されています。そろばんは、特にアジアで、何世紀にもわたって使用されてきた伝統的な計算道具です。
------------------------------- End of responses -------------------------------
prompt = """
この画像に関する以下の質問に回答して。
結果を "question "と "answer "のペアを含むJSONリストとして返す。
質問:
- この画像は何を示しているか?
- どのように動くのか?
- いつ発明されたか?
- フランス語、イタリア語、スペイン語、オランダ語、ドイツ語でこの物体の名前は?
- 画像の中で最も目立つ色は何か?
"""
contents = [prompt, image_abacus]
responses = generate_content(multimodal_model, contents)
print_contents(contents)
print_responses(responses)
----------------------------------- Contents -----------------------------------
この画像に関する以下の質問に回答して。
結果を "question "と "answer "のペアを含むJSONリストとして返す。
質問:
- この画像は何を示しているか?
- どのように動くのか?
- いつ発明されたか?
- フランス語、イタリア語、スペイン語、オランダ語、ドイツ語でこの物体の名前は?
- 画像の中で最も目立つ色は何か?
(画像)
------------------------------ Start of responses ------------------------------
[ { "question": "この画像は何を示しているか?", "answer": "この画像はそろばんです。" }, { "question": "どのように動くのか?", "answer": "そろばんは、ビーズを上下に動かして数を表し、計算を行う手動式の計算機です。各列のビーズは、1の位、10の位、100の位など、異なる位を表しています。" }, { "question": "いつ発明されたか?", "answer": "そろばんは、紀元前2400年頃にメソポタミアで発明されました。" }, { "question": "フランス語、イタリア語、スペイン語、オランダ語、ドイツ語でこの物体の名前は?", "answer": "この物体の名前は、フランス語では「boulier」、イタリア語では「abaco」、スペイン語では「ábaco」、オランダ語では「telraam」、ドイツ語では「Abakus」です。" }, { "question": "画像の中で最も目立つ色は何か?", "answer": "画像の中で最も目立つ色は、木の色です。" } ]
------------------------------- End of responses -------------------------------
画像
Image by Brett Jordan on Unsplash: https://unsplash.com/photos/E1por_SGvJE
image_tiles = load_image_from_url(
"https://unsplash.com/photos/E1por_SGvJE/download?w=600"
)
prompt = """
- この画像からどのような表現が読み取れるだろうか?それはどのように表現されているのか?
- 反対の表現は何か?
- この表現から始まる、教師が生徒に対して試験のためにできる推薦とは何か?
- 反対表現は?
回答は日本語で。
"""
contents = [image_tiles, prompt]
responses = generate_content(multimodal_model, contents)
print_contents(contents)
print_responses(responses)
----------------------------------- Contents -----------------------------------
(画像)
- この画像からどのような表現が読み取れるだろうか?それはどのように表現されているのか?
- 反対の表現は何か?
- この表現から始まる、教師が生徒に対して試験のためにできる推薦とは何か?
- 反対表現は?
回答は日本語で。
------------------------------ Start of responses ------------------------------
画像から読み取れる表現は「IN THE BEGINNING」(始めに)です。これは、アルファベットが書かれた正方形のタイル(おそらくスクラブルのタイル)を並べて表現されています。
反対の表現は「IN THE END」(最後に)です。
この表現から始まる、教師が生徒に対して試験のためにできる推薦は、「IN THE BEGINNING, read all the questions carefully.」(始めに、すべての質問をよく読みましょう。)です。
反対表現を使った場合は、「IN THE END, check your answers carefully.」(最後に、回答をよく見直しましょう。)となります。
------------------------------- End of responses -------------------------------
画像
https://storage.googleapis.com/cloud-samples-data/generative-ai/image/math_beauty.jpg
prompt = """
次の指示に従ってください。
LaTexで数式を書いてください。
各命令とその結果の行を持つ表を使用してください。
指:
- 式を抜き出す。
- 円周率の直前の記号は何か?それは何を意味するか?
- これは有名な公式か?名前はあるか?
- なぜ特別なのか?
- キャプションを抜き出す。
- 底にあるものは何か?
- 何に使われたか?
- キャプションと数式は何色か?
"""
image_euler = load_image_from_url(
"https://storage.googleapis.com/cloud-samples-data/generative-ai/image/math_beauty.jpg"
)
contents = [prompt, image_euler]
responses = generate_content(multimodal_model, contents)
print_contents(contents)
print_responses(responses)
画像
Image by Elimende Inagella on Unsplash: https://unsplash.com/photos/4ApmfdVo32Q
prompt = """
画像に関する以下の質問に答えよ。
その結果を、各質問とその答えの行を持つ表で示せ。
質問
- 何が見えるか?
- 面白い理由は何か?
- 面白いキャプションは何だろう?
- 次に何が起こりうるか?
- あなたならどのようにイメージを変える?それでも面白いだろうか?
- もっと面白くするにはどうする?
"""
image_classroom = load_image_from_url(
"https://unsplash.com/photos/4ApmfdVo32Q/download?w=600"
)
contents = [prompt, image_classroom]
responses = generate_content(multimodal_model, contents)
print_contents(contents)
print_responses(responses)
複数の画像における推論
画像
Photo by Deleece Cook on Unsplash: https://unsplash.com/photos/zzjLGF_6dx4
Photo by Natasha Kapur on Unsplash: https://unsplash.com/photos/ndAHi2Wxcok
Photo by Roman Mager on Unsplash: https://unsplash.com/photos/5mZ_M06Fc9g
prompt = f"""
各画像について以下の質問に答える。
その結果を、各画像の行と各質問の列を持つ表で示せ。
質問
- 画像には何が写っているか?
- それはどこで起こっているか?
"""
caption_b1 = "Image 1:"
caption_b2 = "Image 2:"
caption_b3 = "Image 3:"
image_b1 = load_image_from_url("https://unsplash.com/photos/zzjLGF_6dx4/download?w=600")
image_b2 = load_image_from_url("https://unsplash.com/photos/ndAHi2Wxcok/download?w=600")
image_b3 = load_image_from_url("https://unsplash.com/photos/5mZ_M06Fc9g/download?w=600")
contents = [prompt, caption_b1, image_b1, caption_b2, image_b2, caption_b3, image_b3]
responses = generate_content(multimodal_model, contents)
print_contents(contents)
print_responses(responses)
prompt = """
画像に関する以下の質問に、短い答えと詳しい理由を添えて答えなさい。
その結果を、質問、答え、理由ごとに1行ずつ表にまとめなさい。
質問:
- 画像の共通点は何か?
- 数学者が興味を持ちそうなのはどれか?
- 休暇の終わりを示すものはどれか?
- コーヒーが飲めそうなのはどれだろう?
"""
contents = [prompt, caption_b1, image_b1, caption_b2, image_b2, caption_b3, image_b3]
responses = generate_content(multimodal_model, contents)
print_contents(contents)
print_responses(responses)
画像
Photo by Diego Ballon Vargas on Unsplash: https://unsplash.com/photos/TA5bUTySOrg
Photo by Reza Shayestehpour on Unsplash: https://unsplash.com/photos/Nw_D8v79PM4
prompt = """
画像に関する以下の質問に、短い答えと詳しい理由を添えて答えなさい。
その結果を、質問、答え、理由ごとに1行ずつ表にまとめなさい。
質問
- 最初の画像は何を表しているか?
- 番目の画像は何を表しているか?
- 次に論理的なイメージとして何が考えられるか?
"""
caption_w1 = "Image 1:"
caption_w2 = "Image 2:"
image_w1 = load_image_from_url("https://unsplash.com/photos/TA5bUTySOrg/download?w=600")
image_w2 = load_image_from_url("https://unsplash.com/photos/Nw_D8v79PM4/download?w=600")
contents = [prompt, caption_w1, image_w1, caption_w2, image_w2]
responses = generate_content(multimodal_model, contents)
print_contents(contents)
print_responses(responses)
画像
Photo by Tomoko Uji on Unsplash: https://unsplash.com/photos/eriuKJwcdjI
Photo by Todd Trapani on Unsplash: https://unsplash.com/photos/QldMpmrmWuc
Photo by Olivia Hutcherson on Unsplash: https://unsplash.com/photos/rN3m7aTH3io
Photo by Eberhard Grossgasteiger on Unsplash: https://unsplash.com/photos/FhdN5QVrBfY
prompt = """
次の質問に、短い答えと詳しい理由を添えて答えなさい。
その結果を、各質問、解答、理由を1行にまとめた表で示しなさい。
質問
- これらの画像はどのようなテーマを示しているか?
- 最初の画像に代わる別の画像は何だろう?
- 次に論理的なイメージとして何があり得るか?
- 番目の画像に代わるものは何だろう?
- 最後の画像は?
"""
caption_s1 = "Image 1:"
caption_s2 = "Image 2:"
caption_s3 = "Image 3:"
caption_s4 = "Image 4:"
image_s1 = load_image_from_url("https://unsplash.com/photos/eriuKJwcdjI/download?w=600")
image_s2 = load_image_from_url("https://unsplash.com/photos/QldMpmrmWuc/download?w=600")
image_s3 = load_image_from_url("https://unsplash.com/photos/rN3m7aTH3io/download?w=600")
image_s4 = load_image_from_url("https://unsplash.com/photos/FhdN5QVrBfY/download?w=600")
contents = [
prompt,
caption_s1,
image_s1,
caption_s2,
image_s2,
caption_s3,
image_s3,
caption_s4,
image_s4,
]
responses = generate_content(multimodal_model, contents)
print_contents(contents)
print_responses(responses)
動画における推論
動画
prompt = """
与えられた動画のみを用いて以下の質問に答えよ。
その結果を、各質問とその答えの行を持つ表にまとめなさい。
質問
- ビデオを通して見える主な動物は何か。
- どの電子機器が見えるか?
- 自撮りをしている漫画のキャラクターは何の動物か?
- どの有名ブランドが映っているか?
- 最後に見えるテキストは何か?
"""
video = Part.from_uri(
uri="gs://cloud-samples-data/video/animals.mp4",
mime_type="video/mp4",
)
contents = [prompt, video]
responses = generate_content(multimodal_model, contents)
print_contents(contents)
print_responses(responses)
やっぱりGeminiのマルチモーダルはよい。
次はこれ