6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【2025年12月】最新の生成AIの簡単比較ツールの作成と比較結果の公開

Last updated at Posted at 2025-12-09

概要

最近、業務で生成AIを活用する機会が増えてきているのではないでしょうか。

私自身、コーディングやコードレビューにとどまらず、メールの添削やユーザーへの広報内容など、幅広い業務で生成AIを使用しています。

また、私が所属する企業ではIT営業支援ツールを自社開発していますが、ユーザーの負担を軽減したり、よりパーソナライズされた価値を提供するために、生成AIを機能に組み込むことも増えてきました。

その際、必ず議題に上がるのがモデルの選定です。

ベンチャー企業ということもあり、使用するモデルの選択には比較的自由度があるのですが、昨今は生成AIの進化が目覚ましく次々と新しいモデルが登場するため、比較検討がなかなか大変なのが実情です。

プロンプトやパラメータを調整しながら「特定のタスクに最も適したモデルはどれか」を簡単に比較検証でき、かつ「ステークホルダーやチームのエンジニアにも視覚的にわかりやすく説明できる」ツールの必要性を強く感じていました。

そこで今回は、最新の生成AIのAPIを簡単に比較検証できるStreamlitアプリを作成しましたので、共有させていただきます

加えて、このツールを使用してGPT-5.1Claude Sonnet 4.5Gemini 3 Proの比較検証を行った結果も併せて共有いたします。

Streamlitの比較検証リポジトリ

Streamlitとは、PythonだけでWebアプリケーションを簡単に作成・共有できるオープンソースのライブラリです。

商用サービスのようなカスタマイズ性の高いUIは実現できませんが、Pythonが必要なモジュール関連(特に今回のような生成AIの検証など)では、UIを作り込むことなく簡単に検証用の仕組みを構築することができます。

画面イメージ

画面イメージ.png

Github

セットアップ手順

  1. git clone https://github.com/Naoki-Nomi/llm-comparison を実行
  2. .env ファイルを作成し、APIキーを設定
  3. docker-compose up を実行
  4. 正常に立ち上がったら、http://0.0.0.0:8501/ にアクセス

事前にDockerをインストールしておく必要があります。

必要なAPIキー

検証には以下の各社のAPIキーが必要です。

.envにAPIキーを設定後、それぞれ料金をチャージするようにしてください。

デフォルトで設定されているモデル

必要に応じて追加・修正してください。
(※ コストは2025年12月1日時点の情報に基づいています)

モデル名 サービス Inputコスト Outputコスト
GPT-5.1 OpenAI $1.25 $10.00
GPT-5 OpenAI $1.25 $10.00
GPT-5 mini OpenAI $0.25 $2.00
GPT-5 nano OpenAI $0.05 $0.40
Claude Sonnet 4.5 Anthropic $3.00 $15.00
Claude Haiku 4.5 Anthropic $1.00 $5.00
Gemini 3 Pro Google $2.00 $12.00
Gemini 2.5 Pro Google $1.25 $10.00
Gemini 2.5 Flash Google $0.30 $2.50
Grok 4 xAI $3.00 $15.00
Grok 4.1 Fast xAI $0.20 $0.50
Grok 3 Mini xAI $0.30 $0.50

ツール上では、$1 = 150円で日本円換算した値が表示されます。
このレートは、src/config.pyでいつでも修正可能です。

Gemini 3 Proは2025年12月時点でpreview版のみ提供されています。
そのためAPIが不安定なことがあり、検証中にも「The caller doesn't have permission」エラーが発生し、数時間使用できないことがありました。

このツールでできること

  • 選択したモデルで、自由にプロンプトやシステムプロンプトをカスタマイズしてAPIコール可能
  • 複数のモデルで同時に同じプロンプトやシステムプロンプトでAPIコールすることが可能
  • 各モデルのパラメータをサイドバーで設定可能
  • 各モデルのレスポンス速度と概算の日本円コストを確認可能
  • PDFなどのファイルアップロードにも対応

Grok 4系はセーフティ用のシステムプロンプトを内部的に自動付与するため、Inputトークン数が他モデルより多くカウントされていました。しかし、このシステムプロンプトはcached_tokensとして控除されていたため、input_costからcached_tokens分を差し引くように実装しています。
なお、挿入されるシステムプロンプトの内容は以下より参照できます。
https://github.com/xai-org/grok-prompts

一部のモデルでは思考トークン(推論に使用されるトークン数)が発生し、これは出力トークンに含める形で実装しています。

実際にメインのモデルで性能を比較検証

ここからは、上記のツールを使用して実際にローカルで比較検証した結果を共有します。

生成AIのモデル検証においては、世界的に有名な機関が行っているベンチマークが複数あります。

また、生成AIが急速に進化することにより、知力を測ることが困難になっているという記事も出されています。

このようにすでにさまざまな検証が行われていますが、実際に比較検証してみると「このモデルの回答が理想に近い」と感じるものは、ベンチマーク結果によらずまちまちだったりするのではないでしょうか。

個人的には日本語との相性もあるのではないかと考えており、実際に検証してみることが大切だと感じています。

そこで、この記事では実務で需要がありそうな以下の4項目について、それぞれの特徴を検証していきます。

  1. 障害報告メールの作成
  2. 難解な文章の要約力
  3. 新商品のネーミングを考える創造力
  4. コードレビュー

評価の観点

  • スピード: レスポンス時間
  • コスト: API利用料(※$1 = 150円で日本円換算。)
  • アウトプットの質: 成果物を示しつつ、主観的に判断

※今回の検証は各タスク1回の実行結果です。LLMの出力にはばらつきがあるため、参考値としてご覧ください。

モデルのパラメータ

GPT-5.1

  • reasoning_effort: none
  • verbosity: low
  • max_completion_tokens: 10,000

Claude Sonnet 4.5

  • extended_thinking: 未使用
  • temperature: 0
  • max_tokens: 10,000

Gemini 3 Pro

  • thinking_level: low
  • temperature: 1(Gemini 3 Pro推奨値)
  • max_tokens: 10,000

パラメータ説明

reasoning_effort (GPT-5.1)
高い値を設定すると、GPT-5.1は内部的により時間をかけて熟考し、より複雑で正確な答えを導き出しますが、処理時間とコストが増加します。

verbosity (GPT-5.1)
応答がユーザーに対してどれだけ親切か、背景情報や詳細な説明を含めるかを制御します。

extended_thinking (Claude Sonnet 4.5)
Claude Sonnet 4.5で使用できる拡張思考機能です。有効にすると、モデルが回答を生成する前に内部で思考プロセスを実行し、より深い推論が可能になります。

thinking_level (Gemini 3 Pro)
モデルが回答を生成する際の思考の深さを制御します。高い値を設定すると、より深く考えて回答を生成しますが、処理時間とコストが増加します。

temperature
「AIの回答における創造性(ランダム性)の度合い」であり、数値が1に近いほど独創的な回答が増え、0に近いほど安定的・論理的な回答が増えます。

max_completion_tokens / max_tokens
モデルが生成を停止するまでに出力できるトークンの最大数を定義します。GPTではmax_completion_tokens、その他のモデルではmax_tokensという名称です。

今回は業務で実際にありそうな簡単なタスクを想定して検証するため、思考の深さは低めに設定し、GPT-5.1ではreasoning_effortnone、Claude Sonnet 4.5ではextended_thinkingを使用せず、Gemini 3 Proではthinking_levellowに設定しています。

temperatureについては、Gemini 3 Proでは1が推奨されているため1に設定し、その他のモデルは安定性を重視して0に設定しています。

Gemini 3 Proのtemperature設定について
Googleの公式ドキュメントにおいて、Gemini 3ではtemperatureをデフォルトの 1.0 に維持することが強く推奨されています。
従来のモデルとは異なり、推論機能がこの設定で最適化されており、値を下げるとループやパフォーマンス低下などの予期せぬ動作が発生する可能性があるためです。
https://ai.google.dev/gemini-api/docs/gemini-3?hl=ja#temperature

Grok 4について
推論を無効化できないため、他のモデルよりも思考トークンを消費し、レスポンス時間も長くなります。今回のような日常的な業務タスクには向かない可能性があるため、比較対象から除外しました。

比較対象モデルの選定

各社のフラグシップである最新モデルを比較対象として選択しました。

モデル名 サービス Inputコスト Outputコスト
GPT-5.1 OpenAI $1.25 $10.00
Claude Sonnet 4.5 Anthropic $3.00 $15.00
Gemini 3 Pro Google $2.00 $12.00

結論

先に結論から記載すると、コストとレスポンス速度が最も優れており、回答の品質も高い印象を受けたのはGPT-5.1でした。
一方、Gemini 3 Proは、コストとレスポンス速度の観点ではGPT-5.1には及びませんでしたが、日本語の回答としての質の高さはGPT-5.1を凌駕している印象を受けました。
また、コードレビューに関しては、見やすさや分かりやすさの観点でClaude Sonnet 4.5が最も品質が高い印象です。ただし、コストが最も高い点が難点です。

1. 障害報告メールの作成

実際のユースケースでも多い、システム障害時の謝罪メールを生成してみます。

システムプロンプト

あなたは日本企業のカスタマーサクセス部門で10年以上の経験を持つビジネス文書の専門家です。
BtoB SaaSにおける顧客対応メールを熟知しており、適切な敬語と簡潔な文章で、誠意が伝わる文面を作成します。

プロンプト

以下の状況でお詫びのメールを作成してください。

状況:
- 当社はBtoB向けSaaSを提供
- 昨日15:00〜17:00にシステム障害が発生
- 原因はデータベースサーバーの過負荷
- 一部顧客のデータ出力機能が利用不可だった
- 現在は復旧済み、再発防止策を実施予定

宛先: 影響を受けた顧客企業の担当者

※回答はプレーンテキストで、マークダウン記法(見出し、箇条書き、太字など)は使わず、通常の文章で記載してください。

レスポンス速度とコスト

メール.png

モデル 時間(秒) 入力トークン 出力トークン コスト(¥)
GPT-5.1 10.06 260 523 0.83
Claude Sonnet 4.5 10.84 306 442 1.13
Gemini 3 Pro 8.10 184 581 1.10

生成結果

GPT-5.1

株式会社〇〇〇〇
〇〇部 〇〇〇〇様

平素より弊社サービスをご利用いただき、誠にありがとうございます。
◯◯株式会社カスタマーサクセス部の△△でございます。

このたびは、弊社サービスにおいてシステム障害が発生し、〇〇様の業務にご不便とご迷惑をおかけいたしましたこと、心よりお詫び申し上げます。

昨日、◯月◯日15:00〜17:00頃にかけて、弊社サービスのデータベースサーバーに過負荷が発生し、その影響により一部のお客様においてデータ出力機能がご利用いただけない状況となっておりました。
現在はすでに復旧しており、通常どおりご利用いただける状態であることを確認しております。

今回の障害の原因は、データベースサーバーへのアクセス集中により負荷が想定を上回ったことにございます。
再発防止に向けて、下記の対策を順次実施してまいります。

・データベースサーバーのリソース増強および構成の見直し
・アクセス集中時を想定した負荷試験の強化
・監視体制の改善による早期検知・即時対応の強化

あらためまして、本件により〇〇様ならびに貴社の業務に支障をきたしましたこと、深くお詫び申し上げます。
本障害に関しまして、ご不明点や影響範囲の確認などございましたら、ささいなことでも構いませんので、遠慮なくお申し付けください。

今後このような事態を招くことのないよう、サービスの安定稼働と品質向上に一層努めてまいります。
何卒ご容赦賜りますとともに、引き続き弊社サービスをご愛顧くださいますようお願い申し上げます。

────────────────
◯◯株式会社
カスタマーサクセス部 △△ △△
E-mail:xxxxx@xxxx.xx
TEL:03-xxxx-xxxx
────────────────

Claude Sonnet 4.5

件名:【重要】システム障害発生のお詫びとご報告

株式会社〇〇〇〇
ご担当者様

平素より弊社サービスをご利用いただき、誠にありがとうございます。
カスタマーサクセス部の〇〇でございます。

この度は、弊社システムにおいて障害が発生し、お客様の業務に多大なるご迷惑をおかけいたしましたこと、心よりお詫び申し上げます。

昨日、2025年〇月〇日の15時00分から17時00分にかけて、データベースサーバーの過負荷により、データ出力機能がご利用いただけない状態となりました。現在は完全に復旧しており、すべての機能が正常にご利用いただける状態でございます。

今回の障害により、貴社の業務に支障をきたしましたこと、重ねてお詫び申し上げます。今後このような事態を二度と発生させないよう、サーバーの負荷分散体制の強化および監視体制の見直しを含めた再発防止策を早急に実施してまいります。

何かご不明な点やご心配な点がございましたら、遠慮なく弊社までお問い合わせくださいますようお願い申し上げます。

今後とも変わらぬご愛顧を賜りますよう、何卒よろしくお願い申し上げます。

Gemini 3 Pro

件名:【重要】データ出力機能における障害発生のお詫びと復旧のお知らせ

〇〇株式会社
〇〇様

平素より弊社サービスをご利用いただき、誠にありがとうございます。
株式会社〇〇、カスタマーサクセス部の〇〇でございます。

このたび、弊社が提供するサービスにおきまして、
以下の通りシステム障害が発生しておりました。
ご利用のお客様には、多大なるご不便とご迷惑をおかけしましたことを
深くお詫び申し上げます。

現在は復旧しており、通常通りご利用いただける状態となっております。
本件の詳細につきまして、以下の通りご報告いたします。

----------------------------------------------------------------------
■発生日時
XXXX年XX月XX日(昨日) 15:00 〜 17:00

■障害内容
一部のお客様において、データ出力機能がご利用いただけない状態となっておりました。

■原因
データベースサーバーへのアクセス集中による一時的な過負荷

■現在の状況
昨日の17:00時点でサーバーの負荷は解消され、
現在は全ての機能が正常に動作していることを確認しております。

■今後の対策について
今回の事象を重く受け止め、サーバー構成の見直しおよび監視体制の強化を行い、
再発防止に向けて万全を期す所存でございます。
----------------------------------------------------------------------

お忙しい中、業務に支障をきたす結果となりましたこと、重ねてお詫び申し上げます。

本件に関しまして、ご不明な点やご懸念などがございましたら、
お手数ではございますが、本メールへの返信にてお問い合わせいただけますと幸いです。

今後とも、安心してサービスをご利用いただけるよう、
サービス品質の向上に努めてまいります。

引き続き弊社サービスをご愛顧賜りますよう、何卒お願い申し上げます。

--------------------------------------------------
株式会社〇〇
カスタマーサクセス部 〇〇 〇〇
〒000-0000 東京都〇〇区〇〇 1-2-3
Tel: 03-xxxx-xxxx / Email: cs@example.com
URL: https://www.example.com
--------------------------------------------------

評価

GPT-5.1: 生成時間は2番目に短く、コストも最も安いのが特徴です。日本語によるメール文章の完成度も高く、このまま謝罪文として使用できそうです。

Claude Sonnet 4.5: 生成時間とコストでは最も高く出ました。文章は簡潔ですが、やや一文が長く、改行を入れた方が読みやすい部分もあります。

Gemini 3 Pro: 日本語の文章の特性を踏まえた模範的な障害報告メールになっています。セクション分けも明確で実用的です。コストもGPT-5.1に次いで安く、レスポンス速度は最も速かったです。

2. 難解な文章の要約力

経済産業省の「AI事業者ガイドライン」(PDF)を要約させ、理解力と簡潔さを比較します。

システムプロンプト

あなたは経営コンサルタントとして、複雑な政策文書や技術レポートを経営層向けに要約してきた専門家です。
指定された文字数・フォーマットを厳守し、本質を損なわず簡潔にまとめます。

プロンプト

以下のAI事業者ガイドラインについて、次の3つの観点で簡潔に説明してください。

1. このガイドラインの目的は何か
2. 企業が対応すべき主要なポイントは何か
3. 対応しない場合のリスクは何か

---
{file_content}
---

※回答はプレーンテキストで、マークダウン記法は使わず、通常の文章で記載してください。
※各観点は100文字程度で簡潔にまとめてください。

レスポンス速度とコスト

要約.png

モデル 時間(秒) 入力トークン 出力トークン コスト(¥)
GPT-5.1 6.38 38651 281 7.67
Claude Sonnet 4.5 13.82 44150 521 21.04
Gemini 3 Pro 18.40 29718 1393 11.42

生成結果

GPT-5.1

1. このガイドラインの目的  
AIを活用する全ての事業者に共通の指針を示し、国際動向も踏まえつつ、イノベーション促進とリスク低減を両立する自律的なAIガバナンスを普及させること。

2. 企業が対応すべき主要なポイント  
人間中心・安全性・公平性・プライバシー・セキュリティ・透明性・アカウンタビリティを軸に、開発・提供・利用それぞれの立場でリスクベースの対策とAIガバナンス体制(方針・プロセス・教育)を構築・運用すること。

3. 対応しない場合のリスク  
事故や権利侵害、差別・偽情報などによる法的責任・行政対応・取引停止、国内外規制との不整合、社会的信用失墜やレピュテーション毀損により、AI活用の機会損失と事業価値の低下・参入制限が生じうること。

Claude Sonnet 4.5

# AI事業者ガイドライン 要約

## 1. ガイドラインの目的

AI開発・提供・利用を行う全ての事業者が、国際動向とステークホルダーの懸念を踏まえたAIリスクを正しく認識し、必要な対策をライフサイクル全体で自主的に実行できるよう後押しすることが目的です。イノベーション促進とリスク緩和を両立する枠組みを、非拘束的なソフトローとして提供し、人間中心のAI社会原則に基づく安全安心なAI活用を促進します。

## 2. 企業が対応すべき主要なポイント

人間中心、安全性、公平性、プライバシー保護、セキュリティ確保、透明性、アカウンタビリティの7つの共通指針への対応が求められます。具体的には、リスクベースアプローチによる適切なリスク評価と対策、ステークホルダーへの情報提供、検証可能性の確保、AIガバナンス体制の構築などです。高度なAIシステムについては広島AIプロセス国際指針の遵守も必要です。

## 3. 対応しない場合のリスク

社会からの信頼喪失により事業機会の損失や事業価値の維持困難を招く恐れがあります。また、人権侵害、偽情報拡散、プライバシー侵害、セキュリティ事故などの社会的リスクが顕在化し、法的責任を問われる可能性もあります。適切な対応がなければAI活用自体が阻害され、競争力低下や持続的成長の妨げとなります。

Gemini 3 Pro

1. このガイドラインの目的は何か

生成AIの普及等に伴うリスクに対応し、AIの安全安心な活用を促進することです。イノベーションとリスク緩和の両立を目指し、国際動向を踏まえた統一的な指針を示すことで、企業の自主的なガバナンス構築と社会的責任の実践を後押しします。

2. 企業が対応すべき主要なポイントは何か

人間中心の原則に基づき、安全性、公平性、プライバシー保護等のリスク対策を講じることです。経営主導でAIガバナンスを構築し、リスクに応じた管理体制を整備するとともに、ステークホルダーに対する透明性と説明責任を果たすことが求められます。

3. 対応しない場合のリスクは何か

AIの不適切な挙動による権利侵害や事故が発生し、社会的信用を失墜させる恐れがあります。これにより、法的責任やセキュリティ被害のみならず、深刻な事業価値の毀損やビジネス機会の喪失を招き、企業の持続的成長が阻害されるリスクがあります。

評価

GPT-5.1: レスポンス速度が圧倒的に速く、コスト消費にも優れており、アウトプットの文章も簡潔で分かりやすいです。

Claude Sonnet 4.5: レスポンス速度は2番目に速いのですが、コストの消費は最も高く出ており、GPT-5.1の約3倍です。また、アウトプットの内容もマークダウン形式と100文字程度の要約が守られておらず、入力が長文になると指示が守られにくくなる可能性があります。

Gemini 3 Pro: レスポンス速度は最も遅いのですが、コスト消費は2番目に少なく、内容としても非常に簡潔で分かりやすいです。ただし、こちらもやや100文字をオーバーしていました。

3. 新商品のネーミングを考える創造力

完全栄養パンのネーミング案5個を考えさせ、創造性と説得力を比較します。

システムプロンプト

あなたは日本市場に精通したブランディングコンサルタントです。
日本人消費者の言語感覚を理解し、覚えやすく、商品特性が直感的に伝わるネーミングを提案します。
カタカナ英語の直訳ではなく、日本語の響きや語感も考慮してください。

プロンプト

以下の新商品のネーミング案を5個考えてください。
それぞれ名前の由来や狙いも簡潔に説明してください。

商品概要:
- 忙しいビジネスパーソン向けの完全栄養パン
- 1個で1食分の栄養素(タンパク質30g、ビタミン、ミネラル等)
- 常温で1ヶ月保存可能
- 味は3種類(プレーン、チョコ、メープル)
- 価格帯は1個350円
- コンビニで販売予定

ターゲット:
- 20〜40代の働く男女
- 朝食を抜きがち、または時間がない人
- 健康意識はあるが手軽さも重視

※回答はプレーンテキストで、マークダウン記法は使わないでください。

レスポンス速度とコスト

ネーミング.png

モデル 時間(秒) 入力トークン 出力トークン コスト(¥)
GPT-5.1 7.28 299 352 0.58
Claude Sonnet 4.5 18.75 372 829 2.03
Gemini 3 Pro 9.39 236 641 1.22

生成結果

GPT-5.1

1. モーニングチャージパン  
由来・狙い:朝に必要な栄養を「一気にチャージ」するイメージ。忙しい朝でもこれ一つで完結する手軽さと、エナジー補給の機能性を前面に。

2. パワーブレッド30  
由来・狙い:「30」はタンパク質30gをストレートに訴求。シンプルで覚えやすく、力強さと栄養感を同時に想起させるネーミング。

3. マンナワン  
由来・狙い:「満腹・満足・栄養満たす」の“マン”と、「1個で1食分」の“ワン”を掛け合わせ。短く語感もよく、コンビニ棚でも目に留まりやすい。

4. フルミールブレッド  
由来・狙い:「フル=フルスペック・完全」「ミール=食事」で、一個で“完全な一食”になることを直感的に表現。機能性ときちんと感を両立。

5. タンパク朝ごぱん  
由来・狙い:「朝ごはん」と「パン」をかけた親しみやすい言い回しに、「タンパク」を前に出して健康意識に訴求。朝専用イメージで用途が分かりやすい。

Claude Sonnet 4.5

新商品ネーミング案を5つご提案いたします。

【案1】パワーブレッド
由来と狙い:「パワー」と「ブレッド」を組み合わせた直感的なネーミング。栄養満点でエネルギーチャージできることが一目で伝わります。カタカナ表記で現代的な印象を与えつつ、「パワー」という言葉が持つポジティブで力強いイメージが、忙しいビジネスパーソンの活力源というコンセプトに合致します。

【案2】朝チャージ
由来と狙い:朝食シーンを想起させる「朝」と、栄養補給を意味する「チャージ」を組み合わせた造語。ひらがなとカタカナの組み合わせで親しみやすく、朝食を抜きがちなターゲットに「朝はこれで栄養チャージ」という行動を促します。短くリズミカルで覚えやすく、コンビニの棚でも目を引く名前です。

【案3】栄養パン30
由来と狙い:商品の本質である「栄養」と「パン」をストレートに表現し、タンパク質30gという具体的な数値を加えることで、健康意識の高い消費者に訴求します。シンプルで機能性が明確に伝わり、「30」という数字が記憶に残りやすく、リピート購入時に「あの30のやつ」と想起されやすい設計です。

【案4】デイリーチャージ
由来と狙い:「毎日の」を意味する「デイリー」と「チャージ」を組み合わせ、日常的に取り入れる栄養補給習慣を提案します。1ヶ月保存可能という特性を活かし、ストック食材としての位置づけも示唆。英語由来ですが日本人に馴染みのある言葉で、ビジネスパーソンが違和感なく受け入れられる洗練された響きです。

【案5】満たすパン
由来と狙い:栄養を「満たす」、空腹を「満たす」、忙しい生活の中での充足感を「満たす」という多層的な意味を込めた日本語ネーミング。やわらかい日本語表現が安心感と信頼感を与え、女性層にも受け入れられやすい印象です。シンプルながら商品価値が凝縮されており、「今日も満たすパンで」という日常会話にも自然に溶け込みます。

以上、5案をご提案いたしました。ターゲット層や販売戦略に応じて、最適な案をご検討ください。

Gemini 3 Pro

はい、承知いたしました。
ターゲットである「20〜40代の忙しいビジネスパーソン」がコンビニで手に取りたくなるような、スタイリッシュかつ機能性が伝わるネーミング案を5つ提案します。

1. Oneworks(ワンワークス)

【由来・狙い】
「One(ひとつ)」で「Works(機能する・仕事ができる)」という意味を込めました。たった1個で1食分の栄養が摂れ、仕事のパフォーマンスも支えるという意味です。ビジネスシーンに馴染むスマートな語感で、仕事道具(ツール)のひとつとして選んでもらうことを意識しています。

2. 30ブレッド(サンマルブレッド)

【由来・狙い】
商品の大きな特徴である「タンパク質30g」の「30」を前面に出しました。健康意識の高いターゲットは数字に敏感です。「30」という数字のインパクトで高タンパクであることを直感的に伝えつつ、リズムの良い語感で覚えやすさを狙っています。

3. キープミール(Keep Meal)

【由来・狙い】
「常温で1ヶ月保存(Keep)できる食事(Meal)」と、「健康や体型を維持(Keep)する」という2つの意味を掛け合わせました。忙しくても自分のコンディションをキープしたいビジネスパーソンの願望に寄り添う、守り神のようなイメージの名前です。

4. 完食パン(かんしょくぱん)

【由来・狙い】
「完全栄養食」と「食パン・菓子パン」を組み合わせ、さらに「手軽に完食できる」という意味も含めた日本語のネーミングです。漢字の持つ信頼感と、少しユーモアのある響きで親しみやすさを演出します。コンビニの棚でパッと見て「何の商品か」が一番伝わりやすい案です。

5. Asa-Full(アサフル)

【由来・狙い】
「朝(Asa)」に「Full(満たされる・お腹いっぱい・栄養フル)」になる、という意味です。朝食抜きがちなターゲットに対し、利用シーンを「朝」に絞ることで自分ごととして捉えてもらいやすくします。語感が軽やかなので、重たい栄養食のイメージを払拭し、気軽に手に取れる雰囲気を作ります。

評価

GPT-5.1: レスポンス速度は最も速くコストも低く出ました。一方で、アウトプットは、日本人の語感ではおそらく馴染みのない「マンナワン」のような名称が使用されていたり、「タンパク朝ごぱん」に関しては、由来がよくわからない内容となっています。

Claude Sonnet 4.5: レスポンス速度が最も遅く、ここでもコストの消費は最も高く出ました。アウトプットとしては「朝チャージ」や「満たすパン」など、やや無理矢理な気もしますが日本語の特性を踏まえた上で提案している様子が窺えるのと、由来や狙いは利用シーンなども想定されながらしっかりと明記されている印象です。

Gemini 3 Pro: コストは中間程度で、レスポンス速度は2番目に速い結果となりました。こちらも「完食パン(かんしょくぱん)」や「Asa-Full(アサフル)」など、日本語の語感を踏まえた提案がされており、由来や狙いの中で利用シーンが想定されていました。

4. コードレビュー

N+1問題やトランザクション未使用のRubyコードをレビューさせ、問題発見力と改善提案を比較します。

N+1問題とは、イテレート(繰り返し処理)の中で、何度もデータベースにアクセスしてしまうことです。以下のコードでは、userを単一で更新したり、PointHistoryを単一で作成していることが挙げられます。

トランザクションとは、データベースに変更を加える処理の中で、整合性を保つために使用される技術です。例えば、今回の場合はユーザーのポイントが更新されて、ポイントの履歴の作成に失敗した場合、ユーザーのポイントだけ更新された状態になってしまう可能性があります。
そのため、一連の処理をトランザクションで囲うことですぐにデータベースにはコミットさせず、処理が完了し整合性が保たれた状態でコミットすることができます。

上記のような課題をクリアできているかを確認します。

システムプロンプト

あなたはRuby on Railsのシニアエンジニアです。
パフォーマンス、保守性、データ整合性の観点からレビューを行います。

プロンプト

以下のRubyコードをレビューし、改善してください。

【コード】
class UserPointService
  def add_campaign_points(campaign_id, point_amount)
    users = User.where(campaign_id: campaign_id)

    users.each do |user|
      current = user.point_balance
      user.update(point_balance: current + point_amount)

      PointHistory.create(
        user_id: user.id,
        amount: point_amount,
        reason: 'campaign_bonus'
      )
    end
  end
end

【前提条件】
・対象ユーザーは約10,000件です

【回答条件】
・問題点を3つ以内で簡潔に指摘すること
・改善版コードを1つだけ提示すること
・回答は400文字以内に収めること
・マークダウン記法は使わないこと

レスポンス速度とコスト

コードレビュー.png

モデル 時間(秒) 入力トークン 出力トークン コスト(¥)
GPT-5.1 5.78 225 265 0.44
Claude Sonnet 4.5 8.69 300 414 1.07
Gemini 3 Pro 7.55 228 419 0.82

生成結果

GPT-5.1

問題点:
1. ユーザー1件ごとにUPDATE/INSERTしており、10,000件でN+1クエリになりパフォーマンスが悪い
2. トランザクション未使用のため、途中で失敗すると一部だけ更新されデータ不整合が起こる
3. 同時更新時にpoint_balanceの加算が素朴で、レースコンディションに弱い

改善例:

class UserPointService
  def add_campaign_points(campaign_id, point_amount)
    User.transaction do
      users = User.lock.where(campaign_id: campaign_id)
      users.find_in_batches(batch_size: 500) do |batch|
        ids = batch.map(&:id)
        User.where(id: ids).update_all(
          "point_balance = point_balance + #{ActiveRecord::Base.sanitize_sql(point_amount)}"
        )
        histories = ids.map do |id|
          { user_id: id, amount: point_amount, reason: 'campaign_bonus', created_at: Time.current, updated_at: Time.current }
        end
        PointHistory.insert_all!(histories)
      end
    end
  end
end

Claude Sonnet 4.5

【問題点】
1. N+1問題: 10,000件のユーザーに対して20,000回のクエリ(UPDATE + INSERT)が発行され、パフォーマンスが著しく低下します
2. 競合状態: point_balanceの読み取りと更新の間に他の処理が入ると、ポイントが正しく加算されない可能性があります
3. トランザクション未使用: 途中で失敗した場合、一部のユーザーのみポイントが付与される不整合が発生します

【改善版コード】
class UserPointService
  def add_campaign_points(campaign_id, point_amount)
    users = User.where(campaign_id: campaign_id)

    ApplicationRecord.transaction do
      # バルクアップデートで一括更新
      users.update_all("point_balance = point_balance + #{point_amount.to_i}")

      # バルクインサートで履歴を一括作成
      point_histories = users.pluck(:id).map do |user_id|
        {
          user_id: user_id,
          amount: point_amount,
          reason: 'campaign_bonus',
          created_at: Time.current,
          updated_at: Time.current
        }
      end
      PointHistory.insert_all(point_histories)
    end
  end
end

update_allとinsert_allによりクエリ数を2回に削減し、トランザクションでデータ整合性を保証します。

Gemini 3 Pro

【問題点】
1. N+1問題と大量データのメモリ展開:1万件のUserを一括でメモリにロードしており、ループ内で都度UPDATEとINSERTが実行されるため、合計2万回以上のSQLが発行され処理が極めて遅延します。
2. データ整合性の欠如:トランザクションがないため、処理途中でエラーが発生した場合、一部のユーザーのみポイントが付与される不整合な状態になります。
3. 排他制御の欠如:ポイント加算時にロックを取得していないため、並行して別の処理が走るとポイント計算が狂う可能性があります。

【改善版コード】
class UserPointService
  def add_campaign_points(campaign_id, point_amount)
    User.where(campaign_id: campaign_id).find_in_batches do |batch_users|
      ActiveRecord::Base.transaction do
        histories = batch_users.map do |user|
          { user_id: user.id, amount: point_amount, reason: 'campaign_bonus', created_at: Time.current, updated_at: Time.current }
        end

        PointHistory.insert_all(histories)
        User.where(id: batch_users.map(&:id)).update_all("point_balance = point_balance + #{point_amount}")
      end
    end
  end
end

評価

GPT-5.1: N+1は解消されており、トランザクションも入れられています。また、レスポンス速度は速くコストも低いため、ここでもパフォーマンスに優れている印象を受けます。しかしながら、個人的な好みにもよるかもしれませんが、500件ずつ処理するようにbatch_sizeを指定しているのはいい反面、1万件という前提を考慮するとやや冗長な気もします。また、lockしているので他の処理がブロックされる可能性があり、今回のケースでは一括更新なのでlockする必要性はそこまでないのではないかと考えています。

Claude Sonnet 4.5: N+1の解消とトランザクションに加え、コメントアウトやハッシュのキーごとに改行されており、非常に視覚的に優しいレスポンスであると見受けられました。コストが高いのが難点ですが、最もアウトプットの質は高い印象を受けました。

Gemini 3 Pro: レスポンス速度もコスト消費も2番手となる結果でした。回答内容としては、ほぼGPT-5と同様ですが、find_in_batchesに引数がないので、1,000件ずつ処理するようになっています。上記に記載した通り、対象のレコード数が1万件という前提を踏まえると、やや冗長な気もしました。

総合評価

評価サマリー

モデル 速度 コスト 日本語品質 コードレビュー 総合
GPT-5.1 オールラウンダー
Claude Sonnet 4.5 エンジニア向け
Gemini 3 Pro 日本語タスク向け

総評

今回作成したStreamlitのリポジトリを活用して各サービスの生成AIのモデルを検証し、以下の結果を得ることができました。

個人的には、日本語を扱うタスクにおいては Gemini 3 Pro が最も適している印象を受けました。どれも自然でそのまま使用できそうな回答が得られ、普段使いには最適かと思われます。コストが安いのも魅力的です。

また、GPT-5.1 もレスポンス速度とコストの面では最も優れており、回答の質も高いことからオールマイティーになんでもこなせる印象を受けました。日本語のアウトプットの質を求めるよりも、ある程度の品質でスピードやコストを重要視する場合は、ファーストオプションになるのではないかと思います。

コードレビューに関しては、Claude Sonnet 4.5 が良いのではないかと感じました。返却されるコードは見やすく説明も丁寧で、エンジニア関連のタスクにはうってつけです。また、Gemini 3 Proほどではないにせよ、日本語の特性を踏まえた回答を得ることができました。ただし、他のモデルに比べて割高になるのが悩みどころです。

余談

本文の検証では触れていませんでしたが、コストを抑える方法として、リアルタイム性が不要であればバッチ処理を使用するという手段もあります。
(バッチ処理の完了速度も、サービスやモデルによって違いがあると思います。)

生成AIのモデル選定では、コストやレスポンス速度、アウトプットの質に加えて、同期的な処理が必要かどうかも考慮することが大切だと思います。

今回作成したツールと検証結果が、少しでもお役に立てれば幸いです。
不明点や誤っている点などございましたら、お気軽にご連絡くださいませ。

6
7
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
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?