【GPT-5.1】性能・親しみやすさがアップしたOpenAI最新モデル!使い方、GPT-5との比較検証まで徹底解説

GPT-5.1 性能 親しみやすさ アップ OpenAI 最新モデル 使い方 GPT-5 比較検証 徹底解説
押さえておきたいポイント
  • 従来のGPT-5を改良し「より賢く、より会話的(より親しみやすい)」になるよう設計されたアップグレード
  • 2つの新モデル「GPT-5.1 Instant」と「GPT-5.1 Thinking」から構成
  • ChatGPT全体のパーソナライズ(個性設定)機能も強化

2025年11月13日、OpenAIは「GPT-5.1」を公開しました!

これはChatGPTに搭載される最新モデルで、従来のGPT-5を改良し「より賢く、より会話的(より親しみやすい)」になるよう設計されたアップグレードです。

GPT-5.1開発の背景には、8月に登場したGPT-5が「知性は高いが会話が堅苦しい」という評判があったことが挙げられます。

OpenAIはこの課題に応え、GPT-5.1で応答の温かみやユーモアを取り戻しつつ知能も向上しており、「よりスマートで、話していて楽しいAI」というコンセプトが実現されています。

本記事では、このGPT-5.1の概要と性能、ライセンスや料金体系、使い方、そして実際に試してみた感想を詳しく解説していきます。

ぜひ最後までご覧ください!

\生成AIを活用して業務プロセスを自動化/

目次

GPT-5.1の概要

GPT-5.1の概要
参考:https://x.com/OpenAI/status/1988714373058351213?s=20

GPT-5.1は、GPT-5シリーズに属する2つの新モデル「GPT-5.1 Instant」と「GPT-5.1 Thinking」から構成されています。

GPT-5.1 Instant

GPT-5.1 Instantの概要
参考:https://openai.com/index/gpt-5-1/

まず、GPT-5.1 Instantは、日常的に最も多く使われる高速応答モデルです。

その特徴は、デフォルトの口調が、より自然で温かみのある会話調になった点にあります。ユーザーから「冷たい」「ロボットのようだ」と指摘されがちだった応答が、GPT-5.1では初期設定で親しみやすく調整されています。

また、ユーザーの細かな指示にも以前より的確に従うよう改良されました。例えば「敬語で答えて」「カジュアルに話して」などトーンの要望にも柔軟に応えます。

さらに、GPT-5.1 Instantには新機能「アダプティブ・リーズニング(適応型推論)」が導入されています。

これは、質問の難易度に応じて応答前に考える時間を自動調整する仕組みで、難しい質問では少し思考してから回答し、簡単な質問には即座に答えるというメリハリを実現しています。

GPT-5.1 Thinking

GPT-5.1 Thinkingの概要
参考:https://openai.com/index/gpt-5-1/

一方、GPT-5.1 Thinkingは、高度な推論を必要とするケース向けの上位モデルです。

こちらもアダプティブ・リーズニング機能を備え、複雑な問題ほどじっくり考え、簡単な問題には迅速に対応するよう最適化されています。

GPT-5時代に比べ、このThinkingモデルは「どの程度深く考えるか」をより賢く調整できるようになり、無駄に時間をかけすぎず、それでいて必要な場合は粘り強く思考して答えを導く柔軟性を身につけています。

また、回答内容の分かりやすさ(可読性)も大きく改善されています。

専門用語や業界用語に頼りすぎない説明を返すことを重視しており、専門知識がないユーザーでも理解しやすいクリアな回答を生成します。

例えば、技術的な質問でも、GPT-5.1 Thinkingならできるだけ平易な言葉で噛み砕いて説明してくれるのです。これによって、「賢いけれど難解」というAI特有のもどかしさが和らぎ、専門的な内容でも対話相手として親切な印象を受けることができると思います。

パーソナライズ機能

ChatGPTのパーソナライズ機能
参考:https://openai.com/index/gpt-5-1/

さらにGPT-5.1では、ChatGPT全体のパーソナライズ(個性設定)機能が強化された点も見逃せません。

OpenAIは今回、ユーザーが回答の口調やスタイルを好みに合わせて調整できる「パーソナリティプリセット(口調プリセット)」を大幅に拡充しました。

具体的には、ChatGPTの設定画面から「デフォルト」「プロフェッショナル(丁寧でフォーマル)」「フレンドリー(親しみやすい)」「率直(歯に衣着せぬ)」「風変わり(ユニークでユーモアあり)」「効率的(簡潔で要点重視)」「ギーク(オタク・学究肌)」「皮肉(シニカル)」といった8種類の話し方を選択できるようになりました。

これらプリセットを選ぶだけで、モデルの語調や文体がガラッと変化し、ユーザーは自分好みの会話スタイルを楽しめます。

また、応答をどれくらい温かくするか、どれくらい簡潔にするか、絵文字を使う頻度などを細かくスライダーで調整できる実験的なオプションも提供が始まっています。

そして、これらのパーソナライズ設定が全ての会話にすぐに反映される点も魅力です。

従来は会話ごとに個別設定する必要がありましたが、GPT-5.1では、一度設定を変えれば今進めているチャットにも遡って適用されるため、途中で口調を変えたい場合もシームレスに切り替えることができるようになっています。

なお、GPT-5について詳しく知りたい方は、以下の記事も参考にしてみてください。

GPT-5.1の性能

GPT-5.1の性能面での大きな改善点は、応答までの思考プロセスと速度の最適化にあります。

先述のアダプティブ・リーズニング機能によって、GPT-5.1は問いの難易度に応じて処理時間を動的に調整してくれます。

例えば「2+2はいくつ?」のような簡単な質問には以前よりもスピーディーに回答し、一方で、高度な数学パズルやプログラミングのデバッグのような複雑な課題には、あえて余分に時間をかけて慎重に推論するようになっています。

この仕組みによって、簡易タスクでは従来モデルの約2倍のスピードで答え、困難なタスクでは倍近く時間をかけて深く考察するようになったとOpenAI公式が発表しています。

こうした推論能力と正確性の向上は各種ベンチマークスコアにも表れています

GPT-5.1のベンチマーク指標
参考:https://openai.com/index/gpt-5-1/

OpenAIによれば、GPT-5.1 Instantは初めて「状況に応じた一時的な思考(adaptive reasoning)」を行うようになったことで、数学およびコーディングの評価指標(例えばAIME 2025やCodeforcesといった競技プログラミング/数学コンテスト)で有意なスコア向上が見られたとのことです。

AIME(数学競技試験)やCodeforces(プログラミング競技)での改善は、GPT-5.1が論理的思考力や計算能力で前モデルGPT-5を上回ったと発表されています。

GPT-5.1のライセンス

GPT-5.1はOpenAIの独自モデルであり、その利用にはOpenAIが提供するサービス(ChatGPTやOpenAI API)を通じたアクセスが必要です。

要するに、GPT-5.1自体のモデルデータやコードがオープンソースで公開されているわけではなく、ユーザーはOpenAIのプラットフォーム上でこのモデルを利用する形態となります。

利用用途可否
商用利用⭕️
改変❌️
配布❌️
特許使用⭕️
私的使用⭕️
GPT-5.1のライセンス

GPT-5.1の料金

GPT-5.1を利用するための料金は、利用形態(ChatGPTサービスを使うか、APIを使うか)やプランによって異なります。

一般向けには、ChatGPTの有料プラン加入者から無料プランまで、段階的にサービスが提供されています。

まずは、ChatGPTの有料ユーザー(Plus、Pro、Businessプランなど)に優先的に提供開始され、その後無料ユーザーにも順次開放されていくと発表されています。

したがって現在は、無料枠でも一定回数まではGPT-5.1を試せますが、本格的に使い倒したい場合は有料プランへの加入も推奨されると思います。以下に主なChatGPTプランの料金と特徴を表にまとめたものです。

スクロールできます
プラン料金(税込)
無料
Plus$20/月(約¥2,700)
Pro$200/月(約¥30,000)​
Business要問い合わせ
Enterprise要問い合わせ (カスタム契約)
ChatGPTの料金表

次に、API経由でGPT-5.1を利用する場合の料金についてです。

OpenAIのAPIでは、モデルごとにトークン(文字数相当)の使用量に応じた従量課金制が採用されています。

2025年11月13日現在、GPT-5.1専用の価格表はまだ公表されていませんが、従来のGPT-5と同等かやや割安な水準になると見込まれています。

参考までに、GPT-5のAPI利用料金は、入力が100万トークンあたり約$1.25、出力が同$10に設定されていました。

仮にGPT-5.1も同価格とすれば、日本語の文章で入力約200万文字、出力約20万文字ごとに1ドル程度の計算になります(実際にはトークンは英単語や漢字複合語に相当するため、この目安は前後すると思います)。

GPT-5.1の使い方

GPT-5.1は、基本的にChatGPTの従来モデルと同様の操作で利用することができますが、新機能を活かすためのポイントも併せて紹介します。

ChatGPTにアクセス

まずはChatGPTのウェブサイト(chat.openai.com)か公式アプリを開きます。

無料ユーザーの方も、GPT-5.1が順次デフォルトモデルとして適用されている場合があります(※もしまだGPT-5.1が利用できない場合は、数日中にロールアウトされる見込みです)。

有料プラン(PlusやPro)に加入している場合は、優先的にGPT-5.1へアップグレードされています。

モデルを確認・選択

ChatGPT画面の上部にあるモデル選択ドロップダウンメニューで、自分が使用するモデルが「GPT-5.1」になっていることを確認します。

「GPT-5.1 Auto」や「GPT-5.1 Instant」、「GPT-5.1 Thinking」と表示されているはずです。

通常は「Auto(自動)」モードで問題ありません。このモードでは、システムが質問内容に応じてInstantとThinkingを自動で使い分けてくれます。

もし自分でモードを切り替えたい場合は、ドロップダウンから「GPT-5.1 Instant」または「GPT-5.1 Thinking」を手動で選択できます。

Instantは日常的な質問向け、Thinkingは複雑な課題向けと覚えておくと良いでしょう(後からでも切り替え可能です)。

トーンをカスタマイズする

続いて、トーン(口調)のカスタマイズを試してみましょう。

画面左下のユーザーアイコンをクリックし、「設定 (Settings)」メニューを開くと、その中に「パーソナライズ」または「Personalization(パーソナライゼーション)」という項目があります。

そこを開くと、いくつかプリセットの人格スタイルが選択できるスライダーやドロップダウンが表示されるはずです。「デフォルト」は標準設定ですので、他の例えば「フレンドリー」や「プロフェッショナル」などに切り替えてみてください。

選択するとすぐにそのスタイルが適用されます。

例えば、フレンドリーにすれば絵文字を交えた砕けた口調になるでしょうし、プロフェッショナルなら丁寧できちんとした言い回しに変わると思います。

プリセット以外にも、文体の温かさ(フレンドリーさ)や回答の簡潔さ、絵文字利用頻度などを個別に調整できるコントロールがある場合もあります(※これらは実験的機能のため、順次ユーザーに展開される見込みです)。

(参考)APIで利用する

開発者や上級ユーザー向けになりますが、OpenAIのAPIを使ってGPT-5.1を利用する場合も手順を紹介します。

まず、OpenAIの開発者用ダッシュボードでAPIキーを取得し、適切なバージョンのエンドポイントを呼び出す必要があります。

GPT-5.1 Instantモデルはgpt-5.1-chat-latestというモデル名で、Thinkingモデルはgpt-5.1というモデル名でリクエストできるようになる見込みです。

こちらについては、OpenAIの公式ドキュメントや最新情報をチェックし、提供開始後に正確なモデルIDを指定してAPIを呼び出してください。

基本的な使い方はGPT-4等と同じで、HTTPリクエストにモデルID・APIキー・プロンプトを含めて送信すると、GPT-5.1からのレスポンス(JSON形式)が得られます。

APIではトークン数に注意しつつ、用途に応じてInstantとThinkingを使い分けるようにしましょう(Thinkingはmax_tokens等のパラメータも駆使して長めの応答を許可する設定がおすすめです)。

GPT-5.1 Thinking vs GPT-5 Thinkingで比較検証してみた

それでは実際に、GPT-5.1の性能を確認していきましょう。今回は比較対象として、従来モデルGPT-5を採用します。

専門用語の説明

プロンプトはこちら

ISoPとBB/Kについて説明して

どちらも野球における指標です。

GPT-5 Thinkingの出力結果はこちら

了解です。野球の打者指標(と投手で使う近縁指標)として、IsoP と BB/K を手短にまとめます。

IsoP(Isolated Power:長打純度)

定義:単打の価値を除いた「純粋な長打力」を表す指標。
式:IsoP = SLG − AVG = (2B + 2×3B + 3×HR) / AB

解釈:0に近いほど単打中心、数値が高いほど長打力が高い。
目安(MLB):だいたい .140 前後が平均、.200以上は強打者級、.250超で超強打者級。

例:打率 .280、長打率 .500 の打者 → IsoP = .500 − .280 = .220(強い長打力)

強み:単打に引っ張られず、長打能力だけを切り出せる。

弱み:打席数ではなく打数ベース(四球や死球を無視)。リーグ・球場補正なし。サンプルが小さいとブレやすい。

BB/K(四球/三振 比:選球眼の粗さ)

定義(打者):四球(BB)÷ 三振(K)。
「ストライクゾーン判断とコンタクトの両面」をざっくり示す。

解釈(打者):0.50 前後が平均、0.70 以上で良好、1.00 超なら極めて優秀。
数字が大きいほど「三振が少なく四球が多い=選球眼・接触力が良い」傾向。

例(打者):BB 60、K 120 → BB/K = 60 ÷ 120 = 0.50(平均的)

注意:

投手では通常 K/BB(奪三振/与四球) を使います(大きい方が良い)。

BB/K は比なので、極端に打席が少ないと解釈を誤りやすい。

強み:ゾーン管理(四球)とミスの少なさ(三振)を同時に見られる。

弱み:長打力や打球質は反映しない。比率ゆえに分母が小さいと不安定。

使い分けのコツ

長打力を見たい → IsoP(OPSやwOBAと併用して総合力を把握)。

選球眼・コンタクト傾向を見たい → BB/K(併せて BB%・K%、O-Swing%、Contact% などを見ると精度UP)。

比較は同一リーグ・同一時期・似た打席規模で行うのが基本。必要なら球場・時代補正(wRC+ など)も検討。

必要なら、あなたの手元の成績(打数・二塁打・三塁打・本塁打・四球・三振)から IsoP と BB/K をその場で計算します。数字を教えてください。

GPT-5.1 Thinkingの出力結果はこちら

ISoP と BB/K は、どちらも「打者がどんなタイプか」を見るための指標です。
ざっくり言うと、

ISoP:どれだけ長打が打てるか(純粋な長打力)

BB/K:四球と三振のバランス(打席での選球眼・コンタクト能力)

です。

1. ISoP(IsoP, Isolated Power)の説明
定義

ISoP = 長打率(SLG) − 打率(AVG)

打率:ヒットの「本数」を見る(単打も本塁打も全部 1 本)

長打率:塁打数(1塁打=1、2塁打=2、3塁打=3、本塁打=4)を打数で割った指標

**ISoP は「単打分を引いた長打率」**なので、
「どれだけ単打以外(2塁打・3塁打・本塁打)を打っているか」を表します。

例

打率 .300、長打率 .500 の打者
→ ISoP = .500 − .300 = .200

この場合、「打率は高いけど、それに加えて長打力もそこそこある打者」というイメージです。

解釈の目安(ざっくり)

.100 未満 … 長打が少ないタイプ(単打中心)

.150 前後 … 平均〜ちょい上ぐらいの長打力

.200 以上 … かなり長打力がある

.250 以上 … リーグトップクラスのパワーヒッター

※リーグや時代で水準は変わりますが、イメージとしてはこんな感じです。

2. BB/K(Base on Balls / Strikeouts)の説明
定義

BB/K = 四球の数 ÷ 三振の数

BB(Base on Balls)=四球

K(Strikeouts)=三振

打者なら「どれだけ三振するかに対して、どれだけ四球を選べているか」

投手なら「どれだけ四球を出すかに対して、どれだけ三振を取れているか」

打者の場合のイメージ

BB/K が高い
→ 三振が少なく、四球が多い
→ 選球眼がよく、コンタクト力も高い打者

BB/K が低い
→ 三振が多く、四球が少ない
→ ブンブン振るタイプ(荒いが長打力があることも多い)

例:

四球 60、三振 60 → BB/K = 1.00(かなり良い)

四球 40、三振 120 → BB/K ≒ 0.33(振りが荒め)

だいたいの感覚としては、

0.5 以上 … かなり良い(選球眼がいい/コンタクト能力も高め)

0.3 前後 … 平均的

0.2 未満 … 三振が多く、四球が少ないタイプ

※これもリーグや時代で変わりますが、目安として。

3. 2つを合わせてどう見るか

ISoP 高い × BB/K もそこそこ良い

「選球眼も良くて長打も打てる、理想的な中軸タイプ」

ISoP 高い × BB/K 低い

「三振は多いけど一発もある、典型的なフリースインガータイプ」

ISoP 低い × BB/K 高い

「長打は少ないが、出塁能力が高くて打席の質が良いタイプ(1・2番向き)」

こんなふうに、
ISoP = パワーの指標、BB/K = 打席での安定感・選球眼の指標
としてセットで見ると、打者の特徴がかなり分かりやすくなります。

もし手元に「この選手の成績表」があれば、ISoP と BB/K を一緒に計算してタイプ診断もできますよ。

いかがでしょうか?

もちろんどちらも的確に説明してくれていますが、GPT-5 Thinkingがどこか機械的で定義をつらつら並べているだけなのに対して、GPT-5.1 Thinkingはより人間的で、こちらに寄り添った回答を生成してくれていると感じます。

用語選びもGPT-5.1 Thinkingは固すぎず、適切なワードを使いながら回答してくれている印象です。

コーディング(3Dアプリ生成)

続いて、以下の記事でもご紹介している3Dアプリ生成タスクを検証してみます。

プロンプトはこちら

ドラッグで自在に編集できる、ブルータリズム建築のプロシージャルなビル生成・編集ツールを作って。実在の建物のように見えるようにして。まずは最小構成でいいので、しっかり考えて。

GPT-5 Thinkingの出力結果はこちら

すぐにコーディングを進めてくれましたが、3Dアプリ実行時に何度かエラーが発生し、バグ修正ののちに3Dアプリが完成しました。

GPT-5.1 Thinkingの出力結果はこちら

<!doctype html>
<html lang="ja">
<head>
  <meta charset="utf-8" />
  <title>Brutalist Building Procedural Editor (Safe)</title>
  <style>
    html, body {
      margin: 0;
      padding: 0;
      overflow: hidden;
      background: #000;
    }
    canvas {
      display: block;
      width: 100vw;
      height: 100vh;
    }
    #ui {
      position: fixed;
      top: 12px;
      left: 12px;
      z-index: 10;
      background: rgba(0, 0, 0, 0.75);
      color: #fff;
      font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
      font-size: 12px;
      padding: 8px 12px;
      border-radius: 8px;
      line-height: 1.5;
    }
    #ui button {
      padding: 4px 8px;
      border-radius: 4px;
      border: 1px solid #666;
      background: #222;
      color: #fff;
      cursor: pointer;
      font-size: 12px;
    }
    #ui button:hover {
      background: #333;
    }
  </style>
</head>
<body>
  <div id="ui">
    <button id="regen">ランダム生成</button>
    <div style="margin-top:4px;">
      操作:<br>
      ・左ドラッグ:視点回転<br>
      ・右ドラッグ:パン<br>
      ・ホイール:ズーム<br>
      ・<b>Shift+ドラッグ:高さ編集</b>
    </div>
  </div>

  <!-- Three.js本体とOrbitControls(バージョン固定) -->
  <script src="https://cdn.jsdelivr.net/npm/three@0.155.0/build/three.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/three@0.155.0/examples/js/controls/OrbitControls.js"></script>

  <script>
    // ====== 基本設定 ======
    const GRID_SIZE     = 10;   // グリッドの一辺のセル数
    const CELL_SIZE     = 1.4;  // セルの間隔
    const FLOOR_HEIGHT  = 0.6;  // 1フロアあたりの高さ
    const MIN_FLOORS    = 0;
    const MAX_FLOORS    = 20;

    let scene, camera, renderer, controls = null;
    let buildingGroup;
    const grid       = []; // [i][j] = floors
    const cellMeshes = []; // [i][j] = Mesh

    const raycaster = new THREE.Raycaster();
    const pointer   = new THREE.Vector2();

    let isEditing = false;
    let dragInfo  = null; // { i, j, startY, startFloors }

    init();
    animate();

    // ====== 初期化 ======
    function init() {
      // シーン
      scene = new THREE.Scene();
      scene.background = new THREE.Color(0x111111);

      // カメラ
      const aspect = window.innerWidth / window.innerHeight;
      camera = new THREE.PerspectiveCamera(55, aspect, 0.1, 1000);
      camera.position.set(12, 14, 18);

      // レンダラー
      renderer = new THREE.WebGLRenderer({ antialias: true });
      renderer.setPixelRatio(window.devicePixelRatio);
      renderer.setSize(window.innerWidth, window.innerHeight);
      renderer.shadowMap.enabled = true;
      renderer.shadowMap.type = THREE.PCFSoftShadowMap;
      document.body.appendChild(renderer.domElement);

      // OrbitControls(読み込めなかった場合は null のまま)
      if (THREE.OrbitControls) {
        controls = new THREE.OrbitControls(camera, renderer.domElement);
        controls.target.set(0, 4, 0);
        controls.enableDamping = true;
        controls.dampingFactor = 0.08;
      }

      // ライト(強めにして絶対見えるように)
      const hemi = new THREE.HemisphereLight(0xffffff, 0x444444, 0.6);
      scene.add(hemi);

      const dirLight = new THREE.DirectionalLight(0xffffff, 1.0);
      dirLight.position.set(12, 20, 10);
      dirLight.castShadow = true;
      dirLight.shadow.mapSize.set(2048, 2048);
      dirLight.shadow.camera.left   = -30;
      dirLight.shadow.camera.right  =  30;
      dirLight.shadow.camera.top    =  30;
      dirLight.shadow.camera.bottom = -30;
      scene.add(dirLight);

      // 床(かなり明るめ)
      const groundGeo = new THREE.PlaneGeometry(80, 80);
      const groundMat = new THREE.MeshStandardMaterial({
        color: 0x404040,
        roughness: 1.0,
        metalness: 0.0
      });
      const ground = new THREE.Mesh(groundGeo, groundMat);
      ground.rotation.x = -Math.PI / 2;
      ground.receiveShadow = true;
      scene.add(ground);

      // デバッグ用グリッドと軸(見えていれば WebGL は生きてる)
      const gridHelper = new THREE.GridHelper(40, 40, 0x555555, 0x333333);
      scene.add(gridHelper);
      const axesHelper = new THREE.AxesHelper(5);
      scene.add(axesHelper);

      // ビル本体グループ
      buildingGroup = new THREE.Group();
      scene.add(buildingGroup);

      // グリッドとメッシュの準備
      initGridAndMeshes();

      // 最初のランダム生成
      randomizeBuilding();

      // UI
      document.getElementById('regen').addEventListener('click', randomizeBuilding);

      // イベント
      window.addEventListener('resize', onWindowResize);
      renderer.domElement.addEventListener('pointerdown', onPointerDown);
      window.addEventListener('pointermove', onPointerMove);
      window.addEventListener('pointerup', onPointerUp);
    }

    // ====== グリッド&メッシュ生成 ======
    function initGridAndMeshes() {
      const boxGeo = new THREE.BoxGeometry(1, 1, 1);

      for (let i = 0; i < GRID_SIZE; i++) {
        grid[i] = [];
        cellMeshes[i] = [];
        for (let j = 0; j < GRID_SIZE; j++) {
          grid[i][j] = 0;

          // 微妙に色を変えたコンクリート風マテリアル
          const baseGray = 0.6 + (Math.random() - 0.5) * 0.12;
          const color = new THREE.Color(baseGray, baseGray, baseGray);
          const mat = new THREE.MeshStandardMaterial({
            color,
            roughness: 0.85,
            metalness: 0.12
          });

          const mesh = new THREE.Mesh(boxGeo, mat);
          mesh.castShadow = true;
          mesh.receiveShadow = true;

          const x = (i - GRID_SIZE / 2) * CELL_SIZE;
          const z = (j - GRID_SIZE / 2) * CELL_SIZE;
          mesh.position.set(x, 0.1, z);

          mesh.userData.i = i;
          mesh.userData.j = j;

          buildingGroup.add(mesh);
          cellMeshes[i][j] = mesh;
        }
      }
    }

    // ====== ビルのプロシージャル生成 ======
    function randomizeBuilding() {
      // タワーの「種」をランダム配置
      const seedCount = 3 + Math.floor(Math.random() * 3); // 3〜5個
      const seeds = [];
      for (let n = 0; n < seedCount; n++) {
        seeds.push({
          i: randInt(2, GRID_SIZE - 3),
          j: randInt(2, GRID_SIZE - 3),
          h: randInt(9, 17)
        });
      }

      for (let i = 0; i < GRID_SIZE; i++) {
        for (let j = 0; j < GRID_SIZE; j++) {
          let h = 0;
          for (const s of seeds) {
            const dx = i - s.i;
            const dz = j - s.j;
            const d = Math.sqrt(dx * dx + dz * dz);
            const attenuation = 0.85 + Math.random() * 0.45; // 減衰
            const contrib = Math.max(0, s.h - d * attenuation);
            if (contrib > h) h = contrib;
          }

          // テラス感を出すために端で少し抑える
          const edgeFactor =
            1 -
            (Math.abs(i - (GRID_SIZE - 1) / 2) +
             Math.abs(j - (GRID_SIZE - 1) / 2)) /
             (GRID_SIZE * 1.5);
          h *= Math.max(0, edgeFactor + 0.2);

          // ノイズを少し
          h += (Math.random() - 0.5) * 1.7;

          const floors = clamp(Math.round(h), MIN_FLOORS, MAX_FLOORS);
          grid[i][j] = floors;
          applyCellToMesh(i, j);
        }
      }
    }

    // ====== 1セルの高さをメッシュに反映 ======
    function applyCellToMesh(i, j) {
      const floors = grid[i][j];
      const mesh   = cellMeshes[i][j];
      if (!mesh) return;

      if (floors <= 0) {
        mesh.visible = false;
        return;
      }

      mesh.visible = true;
      const h = floors * FLOOR_HEIGHT;

      mesh.scale.x = 1.0;
      mesh.scale.z = 1.0;
      mesh.scale.y = Math.max(0.1, h);
      mesh.position.y = mesh.scale.y / 2.0;
    }

    // ====== マウス操作(編集系) ======
    function updatePointer(event) {
      const rect = renderer.domElement.getBoundingClientRect();
      pointer.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;
      pointer.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;
    }

    function onPointerDown(event) {
      // Shiftキーが押されているときだけ編集モード
      if (!event.shiftKey) return;

      event.preventDefault();
      event.stopPropagation();

      updatePointer(event);
      raycaster.setFromCamera(pointer, camera);
      const intersects = raycaster.intersectObjects(buildingGroup.children, false);

      if (intersects.length === 0) return;

      const obj = intersects[0].object;
      const i = obj.userData.i;
      const j = obj.userData.j;
      if (i === undefined || j === undefined) return;

      isEditing = true;
      if (controls) controls.enabled = false; // 視点回転を一時停止
      dragInfo = {
        i,
        j,
        startY: pointer.y,
        startFloors: grid[i][j]
      };
    }

    function onPointerMove(event) {
      if (!isEditing || !dragInfo) return;

      updatePointer(event);

      const delta = pointer.y - dragInfo.startY; // 上にドラッグで値が正
      const sensitivity = 10; // ドラッグ感度
      const deltaFloors = Math.round(delta * sensitivity);

      let newFloors = dragInfo.startFloors + deltaFloors;
      newFloors = clamp(newFloors, MIN_FLOORS, MAX_FLOORS);

      const i = dragInfo.i;
      const j = dragInfo.j;
      if (newFloors !== grid[i][j]) {
        grid[i][j] = newFloors;
        applyCellToMesh(i, j);
      }
    }

    function onPointerUp() {
      if (isEditing) {
        isEditing = false;
        dragInfo = null;
        if (controls) controls.enabled = true;
      }
    }

    // ====== ユーティリティ ======
    function onWindowResize() {
      const w = window.innerWidth;
      const h = window.innerHeight;
      camera.aspect = w / h;
      camera.updateProjectionMatrix();
      renderer.setSize(w, h);
    }

    function animate() {
      requestAnimationFrame(animate);
      if (controls) controls.update();
      renderer.render(scene, camera);
    }

    function randInt(min, max) {
      return Math.floor(Math.random() * (max - min + 1)) + min;
    }

    function clamp(v, min, max) {
      return v < min ? min : v > max ? max : v;
    }
  </script>
</body>
</html>

GPT-5.1 Thinkingはエラー発生懸念も考慮して、仕様確認などの前提条件を整理したのちにコーディングを進めてくれました。

HTML実行してみると、以下のような3Dアプリが確認できました。GPT-5 Thinkingと比べてビル群の描写が細かく再現されている気がしますが、最小構成ということで操作機能(ドラッグやズーム)までは反映されていませんでした。

そこで操作機能についても、追加実装を依頼してみると以下の通り操作もできるようになりました。

それぞれのモデルの性能差はあまり無い印象でしたが、GPT-5.1 Thinkingのほうが、若干クオリティの高い描写を再現してくれたのと、コーディングに入る前に要件を整理してくれたのが良いポイントだと感じました。

ぜひ、みなさんもご自身のタスクで試してみてください。

まとめ

GPT-5.1は、前モデルGPT-5の「賢さ」はそのままに、使いやすさと対話の心地よさを大幅に向上させたアップデートと言えます。

従来モデルは、性能面では高い評価を受けつつも、応答がそっけなくなった・個性が薄れたという指摘もSNS上でよく見られました。

しかし、今回のGPT-5.1では、そのような指摘をもとに、「より人間的で親しみやすいAIアシスタント」へ磨き上げられています。

性能面も申し分ありませんので、気になる方はぜひ一度試してみてください!

最後に

いかがだったでしょうか?

弊社では、AI導入を検討中の企業向けに、業務効率化や新しい価値創出を支援する情報提供・導入支援を行っています。最新のAIを活用し、効率的な業務改善や高度な分析が可能です。

株式会社WEELは、自社・業務特化の効果が出るAIプロダクト開発が強みです!

開発実績として、

・新規事業室での「リサーチ」「分析」「事業計画検討」を70%自動化するAIエージェント
・社内お問い合わせの1次回答を自動化するRAG型のチャットボット
・過去事例や最新情報を加味して、10秒で記事のたたき台を作成できるAIプロダクト
・お客様からのメール対応の工数を80%削減したAIメール
・サーバーやAI PCを活用したオンプレでの生成AI活用
・生徒の感情や学習状況を踏まえ、勉強をアシストするAIアシスタント

などの開発実績がございます。

生成AIを活用したプロダクト開発の支援内容は、以下のページでも詳しくご覧いただけます。
➡︎株式会社WEELのサービスを詳しく見る。

まずは、「無料相談」にてご相談を承っておりますので、ご興味がある方はぜひご連絡ください。
➡︎生成AIを使った業務効率化、生成AIツールの開発について相談をしてみる。

大規模言語モデル(LLM)比較レポート
LLM比較レポート

「生成AIを社内で活用したい」「生成AIの事業をやっていきたい」という方に向けて、生成AI社内セミナー・勉強会をさせていただいております。

セミナー内容や料金については、ご相談ください。

また、大規模言語モデル(LLM)を対象に、言語理解能力、生成能力、応答速度の各側面について比較・検証した資料も配布しております。この機会にぜひご活用ください。

投稿者

  • WEEL Media部

    株式会社WEELが運営する生成系AI関連メディア「生成AI Media」は、AIの専門家によるWebメディアです。 AIに特化した編集部がAIの活用方法、導入事例、ニュース、トレンド情報を発信しています。

  • URLをコピーしました!
  • URLをコピーしました!
目次