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?

生成AIの使用感比較

0
Posted at

概要

メジャーな生成AIをいくつか使用し、それぞれ同じ内容で命令を実行した場合にどのような違いが出るかを確認したい。

利用AI

  • Chat GPT
  • Gemini
  • Claude
  • Copilot
  • Grok/X

実施内容

  • 各AIごとに同じ質問をして、それぞれの回答を確認
  • 各AIごとにドキュメント生成を依頼し、それぞれで作成されたドキュメントを確認
  • 各AIごとにコード生成を依頼し、それぞれ作成されたコードを確認

各AIの質問に対する回答

命令文

  • 近年、日本で米の価格が高騰した原因が何かを調査してください。
  • これから5年後、AIを活用した仕事にはどのような変化が起きると予想しますか?

各AIの出力結果を見ての感想

  • 各AIごとに回答内容に大きな差は無かった
  • 各AIごとに出力された文章の文字数ではChat GPTの文字数が多く、他は平行線
    • 以下各AIごとの文章の文字数(2つの質問に対する回答となる文章の文字数合計)
      • Chat GPT
        • 4096
      • Gemini
        • 2642
      • Claude
        • 2129
      • Copilot
        • 2249
      • Grok
        • 2940
  • それぞれの回答までの時間は1分もかかってはいないが、Claudeのみ20-30秒ほどかかり、他は10秒以内くらいの速度感
  • 体感としては、Claudeが他と比べて読みやすかったという印象
    • 以下参考比較として、CopilotとClaudの「コメ価格の高騰原因」の回答内容を抜粋
Claude ## 日本の米価高騰の原因

2024年夏から「令和の米騒動」と呼ばれる歴史的な価格高騰が起き、2025年8月下旬時点で全国のスーパーの米5kgあたり平均価格は前年同時期比45.0%高い水準を記録しました。主な原因は複数の要因が重なったことにあります。

1. 猛暑による生産量・品質の低下

2023年から2024年にかけて記録的な猛暑と少雨が続き、2024年産米の作況指数自体は101と平年並みだったものの、高温の影響で品質が低下し、一等米の比率は8月末時点でわずか63.7%まで落ち込みました。これにより流通に回る良質米の実質量が減少しました。

2. 端境期の在庫不足と消費者の買い増し

高騰の始まりは2024年夏、新米が出回る前の端境期でした。前年2023年産米は高温障害の影響で例年以上に在庫が不足しており、そこに災害への備えをしたい消費者や米不足報道を受けた消費者の買い増しが重なり、店頭から米が消える場面も見られました。実際、2024年夏には主要スーパーの欠品率が8月時点で平均63%に達し、転売価格が通常の2.5倍で取引される事態も発生しました。

3. 流通の目詰まり(投機的な在庫滞留)

農水省の調査では、民間在庫の41%が「戦略的備蓄」として流通に回らず滞留していたことが明らかになっています。品薄を見込んだ業者や集荷業者が売り急がなかったことで、実際の生産量ほど市場に米が出回らない状態が生じました。

4. その他の需要増要因

インバウンド需要の回復による外食・観光需要の増加や、生産コスト(肥料・燃料など)の上昇も価格を押し上げる要因として挙げられています。

5. 政府対応の遅れ

2024年10月時点では当時の農林水産大臣が米価下落を懸念して備蓄米放出に消極的でしたが、価格高騰が続く事態を受けて政府は方針を転換し、2025年1月31日に政府備蓄米の運用ルールを見直しました。この対応の遅れについて農水相が需給予測の誤りを陳謝する事態にもなりました。


その後の動き(2026年8月時点)

興味深いことに、状況は大きく転換しています。2026年6月の日本経済新聞の報道では、2025年産米の売れ残り在庫の積み上がりと2026年産米の増産見込みが重なる「ダブル過剰」により、2026年産新米の店頭価格が5kgあたり3,000円を下回る可能性が指摘されました。実際、2026年8月1日時点では新米が前年比2〜3割安で店頭に並んでいる状況で、米価は下落局面に入っています。

つまり、高騰の原因は「天候不順による品質低下」「消費者心理による買い急ぎ」「流通での在庫滞留」「政府対応の遅れ」が複合的に絡んだ結果であり、2025年末以降は増産と在庫過剰への反動で逆に価格下落が課題になっています。

Copilot

近年の日本の米価格高騰は、単一の原因ではなく、供給不足・需要増加・在庫減少・流通不安が重なって発生した複合的な現象と考えられています。農林水産省の検証資料や農業白書では、主に次の要因が指摘されています。

  1. 2023年の猛暑による品質低下

2023年産米は記録的な高温の影響を受けました。収穫量だけでなく、品質低下によって精米時に砕ける米が増え、同じ量の白米を作るためにより多くの玄米が必要になりました。結果として、市場に供給できる実質的な量が減少しました。

  1. 需要が予想以上に増加

農林水産省は従来、人口減少に伴い米需要も減少すると見込んでいました。しかし実際には、

インバウンド(訪日外国人)の回復
家庭での米購入量の増加
パンや麺類の値上がりによる米の相対的な割安感

などにより、需要が想定を上回りました。

  1. 民間在庫の大幅な減少

供給が減る一方で需要が増えたため、JAや卸売業者が保有する民間在庫が大きく取り崩されました。在庫が減ると「将来足りなくなるかもしれない」という不安が強まり、業者間の仕入れ競争が激化しました。

  1. 品薄報道や災害への備えによる買い増し

2024年夏には、米不足の報道や南海トラフ地震関連情報、台風接近などが重なり、消費者の買い置き需要が増加しました。これが一時的な需給逼迫をさらに強めました。

  1. 流通市場での集荷競争と高値取引

在庫が少なくなると、卸売業者は確保のために高値で調達するようになります。スポット市場などでの高値取引が増え、その価格上昇が小売価格へ波及しました。

  1. 政府の需給見通しと対応の遅れ

農林水産省の検証では、需要増加や精米歩留まりの低下を十分に見込めておらず、市場との対話や備蓄米放出の対応が後手に回ったことが価格上昇を拡大させた一因とされています。

まとめ

近年の米価高騰を一言で表すと、

「2023年猛暑による実質供給減」+「需要増加」+「在庫不足」+「流通不安と買いだめ」

が連鎖的に起きた結果です。特に農林水産省の最新検証では、供給不足だけでなく、需要予測の誤差や在庫減少による市場心理の悪化が重要な要因として位置付けられています。

必要であれば、「減反政策は本当に原因だったのか」という論点についても賛否両論を整理して解説できます。

各AIごとのドキュメント作成結果

命令文

  • おいしいコーヒーを作るための手順をドキュメントとして作成してください。
    ファイル形式は.pptxとします。

各AIの出力結果を見ての感想

  • Grok/Xはファイル出力はそもそも不可
  • Copilotは画面上ではDLファイルを作ったことが表示されるが、実際のファイルは画面上に添付されていない
    • チャット環境によりファイル受け私ができない状態があるとのこと、ローカルアプリおよびブラウザアプリでも同じ結果であったため、今回はCopilotでのドキュメント作成は無し
  • Chat GPT、Geminiは画像を使った形式でパワポをまとめているが、Claudeはアイコン形式でまとめられている
  • スライド枚数はChat GPTは10枚、Geminitは12枚、Claudeは5枚で、Claudeが一番少ない
  • こちらもClaudeの作りが一番シンプルで見やすくなっているように感じる
    • 以下参考比較でClaudeとGeminiからそれぞれスライド1枚を抜粋
      • Claude
        • {69BA674A-9072-4793-824A-69E5F6DC4835}.png
      • Gemini
        • {EFF4A174-B97F-4742-9E1A-CA26AA3D152E}.png

各AIごとのコード作成結果

命令文

  • 自分の住んでいる場所を入力したら、住んでいる場所の明日の天気と気温を画面上に表示するプログラムコードを作成してください。
    使う言語:
    Python 3.12.3
    OS:
    Windows11

各AIの出力結果を見ての感想

  • 作られたコードはどれも同じような内容
  • Claudeから生成されたコードのエラー分岐量が他より多い
  • コード生成に一番時間がかかっていたのはClaudeで40秒ほどかかっていた、他は10秒以内
  • 以下参考としてClaude生成コードとGrok生成コード
Claude
tomorrow_weather.py
# -*- coding: utf-8 -*-
"""
入力した地名から「明日の天気と気温」を画面に表示するプログラム
使用API: Open-Meteo (https://open-meteo.com/) ※APIキー不要・無料
必要ライブラリ: requests  (pip install requests)
"""

import sys
import requests
from datetime import date, timedelta

# 天気コード(WMO Weather code)を日本語の天気に変換する対応表
WEATHER_CODE_MAP = {
    0: "快晴",
    1: "晴れ", 2: "晴れ時々曇り", 3: "曇り",
    45: "", 48: "霧(霧氷)",
    51: "霧雨(弱)", 53: "霧雨(中)", 55: "霧雨(強)",
    56: "着氷性の霧雨(弱)", 57: "着氷性の霧雨(強)",
    61: "雨(弱)", 63: "雨(中)", 65: "雨(強)",
    66: "着氷性の雨(弱)", 67: "着氷性の雨(強)",
    71: "雪(弱)", 73: "雪(中)", 75: "雪(強)",
    77: "雪あられ",
    80: "にわか雨(弱)", 81: "にわか雨(中)", 82: "にわか雨(強)",
    85: "にわか雪(弱)", 86: "にわか雪(強)",
    95: "雷雨",
    96: "雷雨(小さな雹を伴う)", 99: "雷雨(大きな雹を伴う)",
}


def get_location_coordinates(place_name: str):
    """
    地名を緯度・経度に変換する(ジオコーディング)
    Open-MeteoのGeocoding APIを利用
    """
    url = "https://geocoding-api.open-meteo.com/v1/search"
    params = {
        "name": place_name,
        "count": 1,
        "language": "ja",
        "format": "json",
    }
    response = requests.get(url, params=params, timeout=10)
    response.raise_for_status()
    data = response.json()

    if "results" not in data or len(data["results"]) == 0:
        return None

    result = data["results"][0]
    return {
        "name": result.get("name"),
        "country": result.get("country", ""),
        "admin1": result.get("admin1", ""),  # 都道府県など
        "latitude": result["latitude"],
        "longitude": result["longitude"],
    }


def get_tomorrow_weather(latitude: float, longitude: float):
    """
    緯度経度から明日の天気予報(最高/最低気温・天気コード)を取得
    """
    url = "https://api.open-meteo.com/v1/forecast"
    params = {
        "latitude": latitude,
        "longitude": longitude,
        "daily": "weathercode,temperature_2m_max,temperature_2m_min",
        "timezone": "Asia/Tokyo",
        "forecast_days": 2,  # 今日・明日の2日分を取得
    }
    response = requests.get(url, params=params, timeout=10)
    response.raise_for_status()
    data = response.json()

    daily = data.get("daily", {})
    dates = daily.get("time", [])
    weather_codes = daily.get("weathercode", [])
    temp_max = daily.get("temperature_2m_max", [])
    temp_min = daily.get("temperature_2m_min", [])

    tomorrow = (date.today() + timedelta(days=1)).isoformat()

    if tomorrow not in dates:
        # 念のため、取得できたリストの2番目(インデックス1)を明日として扱う
        if len(dates) >= 2:
            idx = 1
        else:
            return None
    else:
        idx = dates.index(tomorrow)

    return {
        "date": dates[idx],
        "weather_code": weather_codes[idx],
        "temp_max": temp_max[idx],
        "temp_min": temp_min[idx],
    }


def display_weather(place_name: str):
    """
    地名を受け取り、明日の天気情報を画面に表示するメイン処理
    """
    print(f"\n{place_name}」の場所を検索しています...")
    location = get_location_coordinates(place_name)

    if location is None:
        print(f"エラー: 「{place_name}」という場所が見つかりませんでした。")
        print("地名の表記(例: 東京, 大阪市, Tokyo など)を変えて再度お試しください。")
        return

    full_name = location["name"]
    if location["admin1"]:
        full_name += f"({location['admin1']})"
    if location["country"]:
        full_name += f", {location['country']}"

    print(f"場所が見つかりました: {full_name}")
    print("天気予報を取得しています...")

    weather = get_tomorrow_weather(location["latitude"], location["longitude"])

    if weather is None:
        print("エラー: 天気情報を取得できませんでした。")
        return

    weather_text = WEATHER_CODE_MAP.get(weather["weather_code"], "不明な天気")

    print("\n" + "=" * 40)
    print(f"  {full_name} の明日({weather['date']})の天気")
    print("=" * 40)
    print(f"  天気     : {weather_text}")
    print(f"  最高気温 : {weather['temp_max']}")
    print(f"  最低気温 : {weather['temp_min']}")
    print("=" * 40 + "\n")


def main():
    print("=" * 40)
    print("  明日の天気予報チェッカー")
    print("=" * 40)

    place_name = input("お住まいの場所(市区町村名など)を入力してください: ").strip()

    if not place_name:
        print("場所が入力されませんでした。プログラムを終了します。")
        sys.exit(1)

    try:
        display_weather(place_name)
    except requests.exceptions.RequestException as e:
        print(f"通信エラーが発生しました: {e}")
        print("インターネット接続を確認してください。")
        sys.exit(1)


if __name__ == "__main__":
    main()

    
Grok
tomorrow_weather.py

import requests
from datetime import datetime

# WMO天気コードを日本語に変換する辞書
WEATHER_CODES = {
    0: "晴れ",
    1: "ほぼ晴れ",
    2: "一部曇り",
    3: "曇り",
    45: "",
    48: "着氷性の霧",
    51: "弱い霧雨",
    53: "中程度の霧雨",
    55: "強い霧雨",
    56: "弱い着氷性の霧雨",
    57: "強い着氷性の霧雨",
    61: "弱い雨",
    63: "中程度の雨",
    65: "強い雨",
    66: "弱い着氷性の雨",
    67: "強い着氷性の雨",
    71: "弱い雪",
    73: "中程度の雪",
    75: "強い雪",
    77: "雪粒",
    80: "弱いにわか雨",
    81: "中程度のにわか雨",
    82: "激しいにわか雨",
    85: "弱いにわか雪",
    86: "強いにわか雪",
    95: "雷雨",
    96: "弱いひょうを伴う雷雨",
    99: "強いひょうを伴う雷雨",
}

def get_coordinates(city_name: str) -> dict | None:
    """都市名から緯度・経度を取得する"""
    url = "https://geocoding-api.open-meteo.com/v1/search"
    params = {
        "name": city_name,
        "count": 1,
        "language": "ja",  # 日本語で結果を取得
    }
    try:
        response = requests.get(url, params=params, timeout=10)
        response.raise_for_status()
        data = response.json()

        if "results" not in data or not data["results"]:
            return None

        result = data["results"][0]
        return {
            "name": result.get("name", city_name),
            "country": result.get("country", ""),
            "latitude": result["latitude"],
            "longitude": result["longitude"],
            "timezone": result.get("timezone", "auto"),
        }
    except requests.RequestException as e:
        print(f"位置情報の取得に失敗しました: {e}")
        return None

def get_tomorrow_weather(lat: float, lon: float, timezone: str = "auto") -> dict | None:
    """明日の天気情報を取得する"""
    url = "https://api.open-meteo.com/v1/forecast"
    params = {
        "latitude": lat,
        "longitude": lon,
        "daily": "weather_code,temperature_2m_max,temperature_2m_min",
        "timezone": timezone,
        "forecast_days": 2,  # 今日と明日
    }
    try:
        response = requests.get(url, params=params, timeout=10)
        response.raise_for_status()
        data = response.json()

        daily = data["daily"]
        # index 0 = 今日, index 1 = 明日
        return {
            "date": daily["time"][1],
            "weather_code": daily["weather_code"][1],
            "temp_max": daily["temperature_2m_max"][1],
            "temp_min": daily["temperature_2m_min"][1],
        }
    except (requests.RequestException, KeyError, IndexError) as e:
        print(f"天気情報の取得に失敗しました: {e}")
        return None

def main():
    print("=" * 40)
    print("  明日の天気予報プログラム")
    print("=" * 40)

    # ユーザーから場所を入力
    city = input("住んでいる場所(都市名)を入力してください: ").strip()

    if not city:
        print("場所が入力されていません。")
        return

    print(f"\n{city}」の位置情報を検索中...")

    # 緯度・経度を取得
    location = get_coordinates(city)
    if location is None:
        print(f"{city}」が見つかりませんでした。都市名を確認して再試行してください。")
        return

    print(f"見つかりました: {location['name']} ({location['country']})")
    print("明日の天気を取得中...")

    # 明日の天気を取得
    weather = get_tomorrow_weather(
        location["latitude"],
        location["longitude"],
        location["timezone"]
    )

    if weather is None:
        print("天気情報を取得できませんでした。")
        return

    # 結果を表示
    weather_desc = WEATHER_CODES.get(weather["weather_code"], f"不明 (コード: {weather['weather_code']})")

    print("\n" + "=" * 40)
    print(f"{location['name']}】の明日の天気")
    print("=" * 40)
    print(f"日付      : {weather['date']}")
    print(f"天気      : {weather_desc}")
    print(f"最高気温  : {weather['temp_max']:.1f}")
    print(f"最低気温  : {weather['temp_min']:.1f}")
    print("=" * 40)

if __name__ == "__main__":
    main()
    

おわりに

上記に挙げた生成AIでClaude以外は同じような結果・性能であるようい感じた。
Claudeのみ他と比べて文章・ドキュメントの構成や、コードの内容に違いを感じた。
特に感じたのは文章のまとまり具合で、他と比べシンプルにまとまっていた。
ただ、出力に一番時間を要していたのもClaude。
今回の命令文だけなら、出力までの時間はかかっても1分ほどだが、複雑なコードを出力する場合に掛かる時間がどれほどになるかも気になる。

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?