Geminiを使い始める際、最も悩ましい問題の一つが「回答の質が期待と異なる」ことです。事実と異なる回答(ハルシネーション)が出たり、JSON形式が壊れたり、コード生成が古いAPIを参照していたり... このようなトラブルは、実は適切な設定やプロンプトの工夫で大部分が解決できます。このFAQでは、出力品質に関連する7つの一般的なトラブルと具体的な解決方法を解説します。
:::info このガイドはGeminiの出力品質を向上させるための7つのFAQです。各質問には実装例やプロンプト例を含めて丁寧に説明しています。 :::
Q1: ハルシネーション(事実と異なる回答)が出るのはなぜ?
ハルシネーションは、大規模言語モデル特有の課題で、事実ではない情報を自信を持って述べてしまう現象です。Geminiもこの問題に完全には免れていません。
ハルシネーションの例:
- 実在しない論文や著者を引用する
- 正確でない統計情報を述べる
- 存在しない関数やAPIメソッドを記述する
- 日付や固有名詞を間違える
原因:
-
学習データのカットオフ日以降の情報
- モデルの学習は特定の時点で終了しており、その後の最新情報は知りません
- 特に日付、著名人の現在の役職、最新技術などで顕著
-
曖昧なプロンプト
- 指示が漠然としていると、モデルは推測で埋める傾向があります
- 例:「良い説明をして」では、モデルが自信を持って述べやすい
-
学習データに含まれていない情報への質問
- 非常にニッチなトピックや専門的な内容では、正確な情報がない場合があります
ハルシネーション対策:
- 具体的で詳細な指示を与える
悪い例:
"Python について説明して"
良い例:
"Python 3.12 の特定のコンテキストマネージャーの使い方を、実装例とともに説明してください。"
- 情報源の明記を要求する
プロンプト例:
"以下の質問に答えてください。回答の際は、参考にした情報源を必ず記載してください。
質問:COVID-19のワクチン開発の歴史"
- ドキュメントやテキストを提供する(RAG)
プロンプト例:
"""
以下のドキュメントに基づいて質問に答えてください。
ドキュメントに記載されていない情報は、「記載されていません」と明記してください。
[ドキュメント内容をここに貼り付け]
質問:[あなたの質問]
"""
- ファクトチェック指示を与える
プロンプト例:
"以下の情報について回答してください。ただし、確実でない情報は『これは推測です』と明記してください。
質問:[あなたの質問]"
Python実装例:
import google.generativeai as genai
def generate_with_source_check(prompt):
model = genai.GenerativeModel('gemini-pro')
enhanced_prompt = f"""
{prompt}
重要:この回答では、次のことを守ってください:
1. 確実な情報のみを述べる
2. 確信が持てない場合は「不確実です」と明記する
3. 可能なら情報源を記載する
4. 学習データのカットオフ日(2024年4月)以降の情報については注意を促す
"""
response = model.generate_content(enhanced_prompt)
return response.text
result = generate_with_source_check("最新のAI技術トレンドは?")
print(result):::tip ハルシネーション完全排除は不可能ですが、具体的指示と情報源要求により、大幅に軽減できます。 :::
Q2: 同じ質問で毎回違う回答が返る(temperature設定)
Geminiに同じ質問をしても、毎回異なる回答が返ってくることがあります。これはtemperature(創造性パラメータ)による影響です。
temperature の役割:
- 低い値(0.0-0.3):確定的で一貫性のある回答
- 中程度(0.5-0.7):バランスの取れた回答(デフォルト)
- 高い値(0.8-1.0):創造的で多様な回答
異なる回答が出る理由:
デフォルトのtemperatureが0.7(中程度)に設定されているため、同じプロンプトでも多少異なる回答が生成されます。これは言語モデルの仕様で、バリエーション豊かな回答を生成するための設計です。
一貫した回答を得る方法(Python):
import google.generativeai as genai
model = genai.GenerativeModel(
'gemini-pro',
generation_config=genai.types.GenerationConfig(
temperature=0.1, # 低温度で一貫性を高める
top_p=0.95,
top_k=40,
)
)
# 同じプロンプトで複数回実行しても、ほぼ同じ回答が返される
for i in range(3):
response = model.generate_content("日本の首都は?")
print(f"回答{i+1}: {response.text}")用途別のtemperature設定:
| 用途 | 推奨temperature |
|---|---|
| 事実確認・情報検索 | 0.0-0.3 |
| 技術的な説明 | 0.3-0.5 |
| 創造的なコンテンツ作成 | 0.7-0.9 |
| 質疑応答・会話 | 0.5-0.7 |
REST APIを使用する場合:
curl -X POST "https://generativelanguage.googleapis.com/v1/models/gemini-pro:generateContent?key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [{
"parts": [{"text": "日本の首都は?"}]
}],
"generationConfig": {
"temperature": 0.1,
"maxOutputTokens": 256
}
}':::info 事実ベースの質問には低いtemperature、クリエイティブなタスクには高いtemperatureが適しています。 :::
Q3: JSON で出力してもフォーマットが壊れる
Geminiに「JSON形式で出力してください」と指示しても、時に不正なJSON形式で返されることがあります。
よくある問題:
- JSON末尾に余計なテキストが追加される
- クォートが正しくエスケープされていない
- 括弧や波括弧が閉じられていない
例(問題のあるJSON出力):
{
"name": "Taro",
"age": 30,
"bio": "私は開発者です。「プログラミング」が好き。"
}
他の情報:...
解決方法:
- 明確なフォーマット指定
プロンプト例:
"""
以下の情報をJSON形式で出力してください。
- 出力は有効なJSONのみとする
- JSONの前後に余計なテキストを付けない
- 文字列内のダブルクォートは必ずエスケープする
情報:[あなたの情報]
"""
- JSONスキーマを明示する
プロンプト例:
"""
以下のスキーマに従ってJSONで出力してください:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "number"},
"skills": {"type": "array", "items": {"type": "string"}}
},
"required": ["name", "age"]
}
出力値:[あなたのデータ]
"""
- Python実装での検証
import google.generativeai as genai
import json
import re
def generate_json_safe(prompt, schema=None):
model = genai.GenerativeModel('gemini-pro')
enhanced_prompt = f"""
{prompt}
重要な指示:
1. 出力は有効なJSONのみとする
2. JSONの前後に説明文を付けない
3. 必ず完全な形式のJSONを返す
"""
if schema:
enhanced_prompt += f"\n\nJSONスキーマ:\n{json.dumps(schema, ensure_ascii=False, indent=2)}"
response = model.generate_content(enhanced_prompt)
try:
# JSONを抽出(前後のテキストを削除)
json_str = response.text
# 最初の'{' から最後の'}' までを抽出
start = json_str.find('{')
end = json_str.rfind('}') + 1
if start != -1 and end > start:
json_str = json_str[start:end]
return json.loads(json_str)
except json.JSONDecodeError as e:
print(f"JSONパースエラー: {e}")
print(f"取得した文字列: {response.text}")
return None
# 使用例
schema = {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "number"}
}
}
result = generate_json_safe("太郎の情報:名前は太郎、年齢は30です。", schema=schema)
if result:
print(json.dumps(result, ensure_ascii=False, indent=2)):::warning Geminiの出力形式は完全に保証されないため、本番コードではJSONパース時の例外処理が必須です。 :::
Q4: コード生成が古いAPIバージョンを使う
Geminiが生成するコードが、古いライブラリバージョンやレガシーAPIを参照してしまうことがあります。
例(TensorFlow 1.x が生成される場合):
# Geminiが生成する古いコード(不正確)
import tensorflow as tf
sess = tf.Session()
result = sess.run(...)
# 正しいTensorFlow 2.x のコード
import tensorflow as tf
result = model(input_data)原因:
- 学習データに古いバージョンのドキュメントが多く含まれている
- 新しいバージョンのドキュメントが学習に含まれていない時期がある
対策:
- バージョン指定をプロンプトに含める
プロンプト例:
"""
Python 3.12 と Flask 3.0.0 を使用したウェブアプリケーションを作成してください。
必ず最新のベストプラクティスに従ってください。
[具体的な要件]
"""
- ドキュメントを直接提供する(RAG)
def generate_code_with_docs(task, documentation):
model = genai.GenerativeModel('gemini-pro')
prompt = f"""
以下のドキュメントに基づいてコードを生成してください。
このドキュメントの方法を優先し、それ以外の古い方法は使用しないでください。
【参考ドキュメント】
{documentation}
【タスク】
{task}
"""
response = model.generate_content(prompt)
return response.text
# Flask 3.0の最新ドキュメントを提供
docs = """
Flask 3.0 では以下の方法でルートを定義します:
@app.route('/hello')
def hello():
return jsonify({'message': 'Hello'})
"""
code = generate_code_with_docs("Flaskでダイスを表示するAPI", docs)- 生成後に検証する
# 生成されたコードをチェック
import re
code = model.generate_content("...").text
# 古いAPIパターンを検出
deprecated_patterns = [
r'tf\.Session\(',
r'sess\.run\(',
r'tf\.placeholder',
]
for pattern in deprecated_patterns:
if re.search(pattern, code):
print(f"警告:古いAPIが検出されました:{pattern}")
# ユーザーに知らせる、または再生成を要求:::tip 生成されたコードは常に公式ドキュメントで検証し、最新バージョンに対応しているか確認してください。 :::
Q5: 長文の回答がmax_output_tokensで途切れる
Geminiが長めの出力を生成しようとするとき、max_output_tokensの制限に達して途中で終わることがあります。
例:
質問:Pythonについて10,000字の詳細な説明を書いて
→ 生成途中で打ち切られる(デフォルト制限は数千tokens)
token の概念:
- 1 token ≈ 4文字(英語)
- 1 token ≈ 2-3文字(日本語)
- max_output_tokens:モデルが生成できる最大token数
解決方法:
- max_output_tokensを増やす(Python)
import google.generativeai as genai
model = genai.GenerativeModel(
'gemini-pro',
generation_config=genai.types.GenerationConfig(
max_output_tokens=4096, # デフォルトより大きく設定
)
)
response = model.generate_content("Pythonについて詳しく説明してください")
print(response.text)- REST APIで指定
curl -X POST "https://generativelanguage.googleapis.com/v1/models/gemini-pro:generateContent?key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [{
"parts": [{"text": "詳しく説明してください"}]
}],
"generationConfig": {
"maxOutputTokens": 4096
}
}'- 回答を分割する
プロンプト例:
"""
Pythonについて説明してください。以下の順序で、各セクションを別々に生成してください:
1. 基本概念(1000字程度)
2. 言語仕様(1000字程度)
3. ライブラリエコシステム(1000字程度)
各セクションを完成させた後、『次のセクションへ』と入力して続けてください。
"""
token数の確認方法:
import google.generativeai as genai
model = genai.GenerativeModel('gemini-pro')
# プロンプトのtoken数をカウント
prompt = "あなたの質問をここに入力"
response = model.count_tokens(prompt)
print(f"プロンプトtoken数: {response.total_tokens}"):::info max_output_tokensは最大値を指定するだけで、実際の出力がその長さになるとは限りません。質問内容によります。 :::
Q6: System Instruction が反映されない
System Instructionを設定してもGeminiの動作が変わらないことがあります。
System Instructionとは:
モデルの振る舞いを指定するシステムレベルの指示。例えば「常に敬語で答える」「回答は箇条書きで」など。
反映されない原因:
-
プロンプトがSystem Instructionを上書きしている
- ユーザーの直接的な指示が強力になることがある
-
実装時の設定ミス
- SDKのバージョンが古い場合、System Instruction機能に対応していない
-
矛盾する指示
- System Instructionと通常のプロンプトが矛盾している
正しい実装方法(Python):
import google.generativeai as genai
# System Instructionを含めてモデルを初期化
model = genai.GenerativeModel(
'gemini-pro',
system_instruction="""
あなたは経験豊富なPython開発者です。
以下のルールに従ってください:
1. 回答は常に敬語で
2. コード例は必ず実装
3. 説明後は『何か質問はありますか?』と聞く
4. エラーメッセージが出た場合は、その原因と対策を説明する
"""
)
response = model.generate_content("Pythonでリスト操作について教えてください")
print(response.text)REST APIでの設定:
curl -X POST "https://generativelanguage.googleapis.com/v1/models/gemini-pro:generateContent?key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"system_instruction": {
"parts": [{
"text": "あなたはPythonの専門家です。常に敬語で答えてください。"
}]
},
"contents": [{
"parts": [{"text": "Pythonについて教えてください"}]
}]
}'System Instructionの最適な書き方:
良い例:
"あなたはテクニカルサポート担当者です。
顧客の質問には丁寧に答え、必ず解決策を提示し、
最後に『問題は解決されましたか?』と確認してください。"
悪い例:
"いい応答をして"
:::tip System Instructionは一度設定すればそのモデルインスタンスすべての会話に適用されるため、複数の異なる役割が必要な場合は、複数のモデルインスタンスを作成してください。 :::
Q7: マルチモーダル入力で画像が無視される
テキストと画像を一緒に送信(マルチモーダル入力)したのに、画像の内容が分析されないことがあります。
例(画像が無視される場合):
ユーザー:「この画像のテキストを読み取ってください」[画像を添付]
Gemini:「申し訳ありませんが、テキストだけでは判断できません...」
原因:
-
画像フォーマットの問題
- 対応形式:JPEG, PNG, GIF, WebP
- 非対応:BMP, TIFF などの一部形式
-
画像のサイズが小さすぎる
- テキスト抽出の場合、一定の解像度が必要
- 推奨:最小幅100ピクセル以上
-
プロンプトが画像を参照していない
- テキストのみの指示になっていないか確認
正しい実装(Python):
import google.generativeai as genai
from PIL import Image
import base64
model = genai.GenerativeModel('gemini-pro-vision')
# 方法1:ファイルパスから直接読み込む
response = model.generate_content([
"この画像に何が映っていますか?",
Image.open('/path/to/image.jpg')
])
# 方法2:Base64エンコーディング
with open('/path/to/image.jpg', 'rb') as f:
image_data = base64.standard_b64encode(f.read()).decode('utf-8')
response = model.generate_content([
{
"text": "この画像のテキストをすべて抽出してください"
},
{
"inline_data": {
"mime_type": "image/jpeg",
"data": image_data
}
}
])
print(response.text)複数の画像を処理:
import google.generativeai as genai
from PIL import Image
model = genai.GenerativeModel('gemini-pro-vision')
# 複数の画像を送信
response = model.generate_content([
"以下の3つの画像の違いを説明してください",
Image.open('image1.jpg'),
Image.open('image2.jpg'),
Image.open('image3.jpg')
])
print(response.text)画像品質の最適化:
- 画像サイズ:100px × 100px以上推奨
- ファイルサイズ:20MB以下
- 解像度:テキスト抽出の場合は200ppi以上推奨
- フォーマット:JPEG(効率)またはPNG(品質)
:::warning プライベート情報が含まれた画像をアップロードしないよう注意してください。 :::
全体を振り返って
Geminiの出力品質トラブルのほとんどは、適切なプロンプト設計と設定調整で改善できます。重要なポイント:
- ハルシネーション対策:具体的指示、情報源要求、RAGの活用
- 回答のバリエーション:temperature値を調整(事実系は低い、創造系は高い)
- JSON形式エラー:スキーマ明示とパース時の例外処理
- 古いコード生成:バージョン指定とドキュメント提供
- 出力途切れ:max_output_tokensを増やすか、回答を分割
- System Instruction未反映:正しい実装と矛盾指示の排除
- 画像が無視される:gemini-pro-visionモデル使用確認と画像形式確認
プロンプトエンジニアリングとパラメータ調整により、Geminiから高品質な出力を得ることができます。