GPT-5徹底ガイド!OpenAI歴代最強モデルの性能・使い方・活用事例まで徹底解説

- OpenAI発の最新大規模言語モデル
- 「通常モード」と「深い推論」の2つの実行モードを自動または手動で選択可能
- 各種ベンチマークで過去モデルを圧倒的に上回る性能
2025年8月8日、OpenAIが「GPT-5」を正式発表しました!
前世代のGPT-4oやo3の良さを引き継ぎながら、「いつ素早く答え、いつ深く考えるか」を自動で切り替える統合設計が最大の特徴です。
日常的なタスク向けの「GPT-5」、推論する「GPT-5 Thinking」、深く推論する「GPT-5 Pro」の3種類のモデルが登場しています。日常的な質問は軽快に、難問や長い指示においては「思考(reasoning)」をオンにして回答精度を上げるといった選択ができるようになっています。ChatGPTでもAPIでもスタンダードで公開されており、開発者向けには、新パラメータの「verbosity(冗長度)」や、思考量を抑える“minimal reasoning”などの制御も追加されているようです!
OpenAI公式の紹介では、400Kの巨大コンテキストと最大128K出力に対応し、価格は入力$1.25/100万トークン、出力$10/100万トークンとのこと。ChatGPT Freeプラン(無料)ユーザーでも使うことができて、Proプランのユーザーは「GPT-5 Pro」でさらに深い推論が可能です。
本記事では、GPT-5の概要や性能、使い方や検証まで徹底的に解説します。
ぜひ最後までご覧ください。
\生成AIを活用して業務プロセスを自動化/
GPT-5の概要

GPT-5は、「通常モード」と「深い推論」を人が切り替えなくても済むように統合された設計。会話の内容や難易度、ツールの必要性、ユーザーが「しっかり考えて」などと明示した意図などを踏まえて、裏側のルーターが最適な思考量を自動で選ぶ仕組みになっています。
また、ChatGPTの画面では、モデルピッカーから手動でモデルを選ぶことも可能。「GPT-5 Thinking」や「GPT-5 Pro(2025年8月8日時点ではProユーザーのみ)」を明示的に指定でき、用途に応じて自動で任せる/あえて深く考えさせるを切り替えることができます。
公式情報によると、無料プランでは、5時間あたり最大10件のメッセージでGPT‑5が使えます。上限に達すると、自動的に「GPT‑5 mini」に切り替わる仕組みです。さらに、1日につき「GPT‑5 Thinking」モードは1回のみ利用可能、という制限もあります。
一方、Plusプランでは、3時間あたり最大80件のメッセージを使うことができます。こちらも上限を超えるとミニモデルに切り替えられますが、ミニへの切り替え自体は自動で行われます。
そして、Proプランでは無制限のアクセスが提供されており、GPT‑5やGPT‑5 Thinkingをほぼ制限なく利用できるとされています。さらに、Proプランのみ、GPT-5 Proも利用することができます。
開発者向けに公開されたAPIでは、モデルサイズが「gpt-5/gpt-5-mini/gpt-5-nano」の3段構成になっています。
さらに、応答の長さを調整するverbosity
、思考量を抑えるreasoning_effort
(minimal対応)、JSONに縛られない「custom tools」とCFG(文脈自由文法)による出力拘束など、運用時に活躍しそうな新しいパラメータも追加。エージェント的な長いツールの連鎖を、安定して動かすための実装で、実案件に近い使い方を前提に進化していることがわかりますね。
GPT-5の性能
公開された評価では、まずコーディングが強いということがわかります。
AIがソフトウェア開発タスクをどの程度正確に実行できるかを評価するベンチマークである「SWE-bench Verified」で74.9%とo3モデルを上回り、Aiderのポリグロットコーディングベンチマークでも新記録を出しました。


加えて、エージェント/ツール呼び出し系のτ²-bench(telecom)で96.7%を記録し、長い手順を誤らずに処理する力が高いことが見て取れます。

難問系評価指標のAIME’25やGPQAでも高得点を叩き出しており、思考量を増やさずに精度を保つ効率面でも進歩しているみたいですね。

マルチモーダル領域では、MMMUなどでも従来モデルを上回る性能を誇っています。

GPT-5の性能についてまとめると、単に点数が高いだけでなく、長いタスクについても思考が崩れずにやり切ってくれるモデルだということがわかります。
GPT-5のライセンス
GPT-5は、OpenAIのクラウドAPIおよびChatGPTサービスを通じて提供されるモデルであり、オープンソースの形でモデル自体が公開されているわけではありません。
そのため、モデルの利用に関するライセンスは、主にサービス利用規約によって定められています。
利用用途 | 可否 | 備考 |
---|---|---|
商用利用 | ⭕️ | |
改変 | ❌️ | モデルの重み・コードは非公開のためユーザ側で変更不可 |
配布 | ❌️ | モデルはOpenAIのサービス内でのみ利用可能 |
特許使用 | ❌️ | |
私的使用 | ⭕️ |
GPT-5モデルそのものは公開されていないため、ユーザがモデルを直接入手して改良・再配布することはできません。
一方で、OpenAIの利用規約により生成されたテキストなどのアウトプットはユーザに権利が帰属し、商用利用を含め自由に使用・共有できます。
つまり、o3を使って得られた回答や成果物は制限なく活用できますが、モデル本体についてはOpenAIのプラットフォーム上でのみ利用可能となっています。
また、OpenAIは本モデルに関連する技術特許を保有していますが、通常のAPI利用においてユーザが特別な手続きを取る必要はありません。
詳細は、OpenAIコミュニティサイトやOpenAI公式HPを確認するようにしましょう。
GPT-5の料金
大きく分けて「ChatGPT経由で使う方法」と、「OpenAI API経由で呼び出す方法」の2つがあります。
それぞれの詳細は以下の通りです。
プラン | 料金(税込) | 利用制限 |
---|---|---|
無料 | – | GPT-5にアクセス可(上限あり) |
Plus | $20/月(約¥2,700) | GPT-5にアクセス可(拡張) |
Pro | $200/月(約¥30,000) | GPT-5 Proにもアクセス可 |
Team | $30/ユーザ (月額、月払いの場合)※年契約なら$25/ユーザ/月 | 共同利用・管理機能 |
Enterprise | 要問い合わせ (カスタム契約) | 2025年8月14日から利用可 |
モデル | 料金(税込) |
---|---|
GPT-5 | 入力$1.25/100万トークン 出力$10.00/100万トークン |
GPT-5 mini | 入力$0.25、出力$2.00/100万トークン |
GPT-5 nano | 入力$0.05、出力$0.40/100万トークン |
APIはverbosity
やreasoning_effort
で冗長さや、推論量を制御することができるので、品質を担保しながら出力トークンを削るような運用も可能です。
GPT-5の使い方
GPT-5は「ChatGPTから使う方法」と「APIで使う方法」の2種類があります。それぞれ使い方は以下の通りです。
ChatGPTから使う方法
ログインして新しいチャットを開くと、既定のモデルがGPT-5になっています。o3やGPT-4.5などの過去モデルは利用できなくなっているので注意しましょう。

要件整理や長い仕様の読み込み、コードの設計などの難しい依頼は、画面左上のモデルピッカーを開いて、手動で「GPT-5 Thinking」を選ぶと出力が安定します。Plus/Pro/Teamプランでこのモデル選択することができ、Proプランだと「GPT-5 Pro」も指定することができます。

日常的なタスクを自動で任せる場合は「GPT-5」、少し考えさせることで出力内容を安定させたい場合は「GPT-5 Thinking」、より深く推論させたい場合は「GPT-5 Pro」を選択するのがおすすめ。過去モデルは消えてしまいましたが、用途に合わせて3つの選択肢から選べるのはシンプルで分かりやすいですね。
APIで使う方法
API で使うときは、まずOpenAIのダッシュボードでAPIキーを発行し、最新のSDKまたはHTTPから model="gpt-5"
を指定して呼び出すことでGPT-5モデルを利用できます。
今回の世代からは「どれくらい考えるか」を直接コントロールするパラメータ reasoning_effort
と、「最終回答の長さ」をコントロールする verbosity
が新しく用意されています。重いタスクではreasoningの値を上げて、日常の自動化や応答を速くしたいような場面では、最小に落とす、といった使い分けが効きそうです。
出力の冗長さは、verbosityで絞っておくと、読みやすさもコストも整えやすいです。公式クックブックには、この二つの効かせ方やエージェント系フローの設計メモがまとまっているので、まずは小さなタスクで試して、必要に応じて段階的に上げるのが良いと思います。
ちなみに、最小推論と出力コンテキスト少なめでGPT-5を呼び出すコード例は以下の通りです。
# pip install -U openai
from openai import OpenAI
client = OpenAI() # 環境変数 OPENAI_API_KEY を利用
resp = client.responses.create(
model="gpt-5",
input="このテキストを3行で要約して。最後に要点だけ箇条書きで3つ。",
reasoning={"effort": "minimal"}, # 最小思考で低レイテンシ狙い
text={"verbosity": "low"}, # 余計な前置きなしで要点だけ
max_output_tokens=600 # コスト管理も忘れずに
)
# 出力テキストの取り出し(Responses APIの標準パターン)
out = []
for item in resp.output:
if hasattr(item, "content"):
for c in item.content:
if hasattr(c, "text"):
out.append(c.text)
print("".join(out))
Codex CLIから呼び出す方法
Codex CLIからもGPT-5を呼び出すことができるようになりました!手順を簡潔にご紹介します。
ターミナルで以下コマンドを実行。
npm install -g @openai/codex
完了したら codex --version
コマンドでバージョン0.16以上になっているかを確認し、問題なければcodex
コマンドで起動し、ログイン画面で “Sign in with ChatGPT” を選びます。

Plus / Pro / Team のアカウントなら、そのまま追加課金なし(APIキー不要)でGPT-5にアクセスすることができます。
ちなみに、課金をAPIの従量制にしたい場合だけ、Provide your own API key
から設定して使います。
これだけでCodex CLIからChatGPTのサブスクだけでGPT-5を呼び出すことができるので、バイブコーディングも捗りそうです。
なお、バイブコーディングについて、詳しく知りたい方は以下の記事を参考にしてください。

GPT-5使ってみた
ここからは実際にGPT-5を使っていきます。画像生成タスクと3Dアプリ生成タスクの2つで、GPT-5の性能を確認していきましょう。
画像生成タスク
まずは簡単なタスク。画像生成を依頼してみます。
プロンプトはこちら
飛行機の中でMacbookを使っているペンギンの画像を作成してください
GPT-5の出力結果はこちら

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

あえてGPT-5とGPT-5 Thinkingで比較実行してみましたが、大差はないですね。Thinkingのほうがペンギンの手がMacbookに添えられていたり、全体的なタッチに臨場感がある気はします。いずれにせよプロンプトを忠実に再現してくれています。
3Dアプリ生成タスク
続いて、こちらの記事で紹介されている3D街ビルダーを実際に試してみます。
プロンプトはこちら
ドラッグで自在に編集できる、ブルータリズム建築のプロシージャルなビル生成・編集ツールを作って。実在の建物のように見えるようにして。まずは最小構成でいいので、しっかり考えて。
出力結果はこちら
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Brutalist Procedural Building Creator</title>
<style>
html, body { margin:0; height:100%; background:#0f1115; color:#e6e6e6; font-family: sans-serif; }
#ui, #help { position:fixed; background:rgba(15,17,21,.72); border:1px solid #2a2f3a; border-radius:10px; padding:10px; font-size:12px; color:#cfd6e4; backdrop-filter: blur(6px); }
#ui { top:10px; left:10px; }
#help { top:10px; right:10px; width:300px; }
#ui .row { display:flex; flex-wrap:wrap; gap:6px; margin-top:5px; }
button, input { background:#1b1f27; color:#e6e6e6; border:1px solid #2a2f3a; border-radius:6px; padding:4px 8px; font-size:12px; }
</style>
</head>
<body>
<div id="ui">
<h1>Brutalist Builder</h1>
<div class="row">
<button id="regen">再生成</button>
<label>Seed <input id="seed" type="number" value="1"></label>
<label>密度 <input id="density" type="number" value="0.55" step="0.05" min="0" max="1"></label>
</div>
<div class="row">
<button id="modeT">移動 (W)</button>
<button id="modeR">回転 (E)</button>
<button id="modeS">スケール (R)</button>
<label>スナップm <input id="snap" type="number" value="0.5" step="0.25" min="0"></label>
</div>
<div class="row">
<button id="add">選択に層を追加</button>
<button id="cantilever">選択にキャンチレバー</button>
<button id="ribs">選択にフィン/リブ</button>
<button id="dup">複製 (D)</button>
<button id="del">削除 (Delete)</button>
</div>
<div class="row">
<button id="export">エクスポート</button>
<button id="import">インポート</button>
<input id="importFile" type="file" accept="application/json" style="display:none" />
</div>
</div>
<div id="help">
<b>操作ガイド</b><br>
・クリックで建物を選択。<br>
・W/E/R で移動/回転/スケール。<br>
・Ctrl でスナップ。<br>
・Dで複製、Deleteで削除。
</div>
<canvas id="c"></canvas>
<script src="https://cdn.jsdelivr.net/npm/three@0.152.2/build/three.min.js"></script>
<script>
// --- 自前の簡易Orbit&Transform(CDN依存を減らして確実に動かす) ---
const canvas = document.getElementById('c');
const renderer = new THREE.WebGLRenderer({ canvas, antialias:true, powerPreference:'high-performance' });
if ('outputColorSpace' in renderer) renderer.outputColorSpace = THREE.SRGBColorSpace; else renderer.outputEncoding = THREE.sRGBEncoding;
renderer.setPixelRatio(Math.min(2, window.devicePixelRatio));
renderer.shadowMap.enabled = true;
const scene = new THREE.Scene();
scene.background = new THREE.Color(0x141821);
scene.fog = new THREE.Fog(0x141821, 80, 260);
const camera = new THREE.PerspectiveCamera(60, 2, 0.1, 1000);
camera.position.set(60, 42, 60);
// ===== SimpleOrbitControls =====
function makeSimpleOrbitControls(cam, dom){
const st = { target:new THREE.Vector3(20,0,20), phi: Math.PI/4, theta: Math.PI/4, r: 90, rotating:false, panning:false, lastX:0, lastY:0, enabled:true };
function updateCam(){
const x = st.target.x + st.r * Math.sin(st.phi) * Math.cos(st.theta);
const y = st.target.y + st.r * Math.cos(st.phi);
const z = st.target.z + st.r * Math.sin(st.phi) * Math.sin(st.theta);
cam.position.set(x,y,z); cam.lookAt(st.target);
}
updateCam();
function onWheel(e){ if(!st.enabled) return; st.r = Math.max(5, st.r + (e.deltaY>0 ? 4 : -4)); updateCam(); }
function onDown(e){ if(!st.enabled) return; st.lastX=e.clientX; st.lastY=e.clientY; if(e.button===0) st.rotating=true; if(e.button===2) st.panning=true; }
function onMove(e){ if(!st.enabled) return; const dx=(e.clientX-st.lastX); const dy=(e.clientY-st.lastY); st.lastX=e.clientX; st.lastY=e.clientY; if(st.rotating){ st.theta -= dx*0.005; st.phi = THREE.MathUtils.clamp(st.phi - dy*0.005, 0.05, Math.PI-0.05); updateCam(); } else if(st.panning){ const pan = new THREE.Vector3(); cam.getWorldDirection(pan); const right = new THREE.Vector3().crossVectors(pan, cam.up).normalize(); const up = new THREE.Vector3().copy(cam.up).normalize(); st.target.addScaledVector(right, -dx*0.05); st.target.addScaledVector(up, dy*0.05); updateCam(); } }
function onUp(){ st.rotating=false; st.panning=false; }
dom.addEventListener('contextmenu', e=>e.preventDefault());
dom.addEventListener('wheel', onWheel, {passive:true});
dom.addEventListener('pointerdown', onDown);
dom.addEventListener('pointermove', onMove);
dom.addEventListener('pointerup', onUp);
return { enabled:true, target:st.target, update:updateCam };
}
const controls = makeSimpleOrbitControls(camera, renderer.domElement);
const hemi = new THREE.HemisphereLight(0xb8c1d6, 0x0a0b0e, 0.7); scene.add(hemi);
const dir = new THREE.DirectionalLight(0xffffff, 1.1); dir.position.set(80,120,40); dir.castShadow=true; dir.shadow.mapSize.set(2048,2048); dir.shadow.camera.near=10; dir.shadow.camera.far=400; dir.shadow.camera.left=-120; dir.shadow.camera.right=120; dir.shadow.camera.top=120; dir.shadow.camera.bottom=-120; scene.add(dir);
const groundMat = new THREE.MeshStandardMaterial({ color:0x1b1f27, roughness:1, metalness:0 });
const ground = new THREE.Mesh(new THREE.PlaneGeometry(1000, 1000), groundMat);
ground.rotation.x = -Math.PI/2; ground.receiveShadow = true; scene.add(ground);
const grid = new THREE.GridHelper(400, 400, 0x6b7280, 0x2f3542); grid.position.y = 0.01; scene.add(grid);
function makeRNG(seed=1){ let s = seed|0; if(s<=0) s=1; return ()=> (s = (s*1664525 + 1013904223) >>> 0) / 0x100000000; }
// --- 依存なしの簡易 2D value noise + FBM ---
function valueNoise2D(x, y, rng){
// hash grid at integer coords
function hash(ix, iy){
let h = (ix*374761393 + iy*668265263) ^ 0x5bf03635; h = (h ^ (h>>13)) * 1274126177; return ((h ^ (h>>16)) >>> 0) / 0xFFFFFFFF;
}
const x0 = Math.floor(x), y0 = Math.floor(y);
const xf = x - x0, yf = y - y0;
function lerp(a,b,t){ return a + (b-a)*t; }
function fade(t){ return t*t*(3-2*t); }
const v00 = hash(x0,y0), v10 = hash(x0+1,y0), v01 = hash(x0,y0+1), v11 = hash(x0+1,y0+1);
const u = fade(xf), v = fade(yf);
return lerp(lerp(v00, v10, u), lerp(v01, v11, u), v);
}
function fbm2D(x,y,oct=4, amp=1.0, lac=2.0, gain=0.5, rng){
let sum=0, a=amp, f=1;
for(let i=0;i<oct;i++){ sum += a*valueNoise2D(x*f, y*f, rng); f*=lac; a*=gain; }
return sum;
}
function makeConcreteTexture(size=256, seed=1){
const cvs=document.createElement('canvas'); cvs.width=cvs.height=size; const ctx=cvs.getContext('2d'); const img=ctx.createImageData(size,size);
const rng = (function(s){ return ()=> (s = (s*1664525+1013904223)>>>0)/0x100000000; })(seed*997|0);
let i=0;
for(let y=0;y<size;y++){
for(let x=0;x<size;x++){
const nx = x/size, ny = y/size;
let n = fbm2D(nx*6, ny*6, 4, 1.0, 2.0, 0.5, rng);
n = (n/2); // normalize roughly to 0..1
const streak = (Math.sin(nx*40)+1)/40;
const v = Math.max(0, Math.min(1, 0.72 + (n-0.5)*0.35 - streak));
const g = Math.floor(v*190);
img.data[i++] = g; img.data[i++] = g; img.data[i++] = g; img.data[i++] = 255;
}
}
ctx.putImageData(img,0,0);
const tex=new THREE.CanvasTexture(cvs);
if('colorSpace'in tex) tex.colorSpace=THREE.SRGBColorSpace; else tex.encoding=THREE.sRGBEncoding;
tex.wrapS=tex.wrapT=THREE.RepeatWrapping; tex.anisotropy=8;
return tex;
}
function concreteMaterial(seed=1){ const map=makeConcreteTexture(256,seed); const rough=makeConcreteTexture(256,seed+1234); return new THREE.MeshStandardMaterial({ map, roughnessMap:rough, color:new THREE.Color(0xb4b8bd), roughness:0.95, metalness:0.02 }); }
const BUILDINGS = new Set(); const selectable = [];
function createBlock(w,h,d,mat){ const geo=new THREE.BoxGeometry(w,h,d,1,1,1); const pos=geo.attributes.position; const colors=new Float32Array(pos.count*3); for(let i=0;i<pos.count;i++){ const y=pos.getY(i); const k=THREE.MathUtils.clamp(0.5+(y/h)*0.5,0.25,1); colors[i*3]=k; colors[i*3+1]=k; colors[i*3+2]=k; } geo.setAttribute('color', new THREE.BufferAttribute(colors,3)); const m=mat.clone(); m.vertexColors=true; const mesh=new THREE.Mesh(geo,m); mesh.castShadow=true; mesh.receiveShadow=true; return mesh; }
function addVerticalRibs(group, spacing=2.5, depth=0.15, protrude=0.25){ if(group.children.length===0) return; const base=group.children[0]; base.updateMatrixWorld(); const box=new THREE.Box3().setFromObject(base); const size=new THREE.Vector3(); box.getSize(size); const mat=base.material.clone(); mat.color=new THREE.Color(0xa9adb2); const ribs=new THREE.Group(); const halfY=size.y/2+0.001; for(let side of [-1,1]){ const count=Math.max(1,Math.floor((size.x-0.5)/spacing)); for(let i=0;i<=count;i++){ const x=-size.x/2+(i/(count))*size.x; const r=createBlock(depth,size.y+0.2,protrude,mat); r.position.set(x,halfY,side*(size.z/2+protrude/2)); ribs.add(r);} } for(let side of [-1,1]){ const count=Math.max(1,Math.floor((size.z-0.5)/spacing)); for(let i=0;i<=count;i++){ const z=-size.z/2+(i/(count))*size.z; const r=createBlock(protrude,size.y+0.2,depth,mat); r.position.set(side*(size.x/2+protrude/2),halfY,z); ribs.add(r);} } group.add(ribs); ribs.name='ribs'; }
function createBrutalistTower(rng, lotSize=8, seed=1){ const group=new THREE.Group(); group.name='tower'; const mat=concreteMaterial(seed); const levels=THREE.MathUtils.randInt(3,10); let w=lotSize*(0.6+rng()*0.35); let d=lotSize*(0.6+rng()*0.35); let y=0; for(let i=0;i<levels;i++){ const h=2.6+rng()*2.4; const block=createBlock(w,h,d,mat); y+=h/2; block.position.y=y; y+=h/2; block.position.x+=(rng()-0.5)*0.6; block.position.z+=(rng()-0.5)*0.6; group.add(block); const taper=0.85+rng()*0.12; w*=taper; d*=taper; if(rng()<0.15){ w*=0.88; d*=0.88; y+=0.5+rng(); } } if(rng()<0.5){ const base=group.children[0]; const s=new THREE.Vector3(); new THREE.Box3().setFromObject(base).getSize(s); const colMat=concreteMaterial(seed+321).clone(); colMat.color=new THREE.Color(0x9da3a8); const colGeo=new THREE.CylinderGeometry(0.25+rng()*0.15,0.3+rng()*0.15,2.2,10); const cols=new THREE.Group(); const offs=Math.min(s.x,s.z)/2-0.9; for(let x of [-offs,offs]) for(let z of [-offs,offs]){ const c=new THREE.Mesh(colGeo,colMat); c.castShadow=true; c.receiveShadow=true; c.position.set(x,1.1,z); cols.add(c);} group.add(cols);} if(rng()<0.35){ const slab=createBlock(lotSize*0.9,0.5,lotSize*0.9,mat.clone()); slab.material.color=new THREE.Color(0xadb2b8); slab.position.set((rng()-0.5)*2.2, group.children[0].position.y+0.5, (rng()-0.5)*2.2); group.add(slab);} group.traverse(o=>{ if(o.isMesh){ o.userData.isBlock=true; }}); return group; }
const raycaster=new THREE.Raycaster(); const pointer=new THREE.Vector2(); let current=null;
// ===== Simple Transform Modes (translate/rotate/scale) =====
let transformMode='translate'; let dragging=false; let dragStart={x:0,y:0}; let startPos, startRotY, startScale; const groundPlane=new THREE.Plane(new THREE.Vector3(0,1,0),0);
function setPointer(ev){ const rect=renderer.domElement.getBoundingClientRect(); pointer.x=((ev.clientX-rect.left)/rect.width)*2-1; pointer.y=-((ev.clientY-rect.top)/rect.height)*2+1; }
function selectGroup(g){ current=g; }
function onCanvasDown(ev){ setPointer(ev); raycaster.setFromCamera(pointer,camera); const hits=raycaster.intersectObjects(selectable,true); if(hits.length){ let g=hits[0].object; while(g&&g.parent&&g.parent!==scene){ g=g.parent; } selectGroup(g); dragging=true; dragStart.x=ev.clientX; dragStart.y=ev.clientY; startPos=g.position.clone(); startRotY=g.rotation.y; startScale=g.scale.clone(); } else { selectGroup(null); }
}
function onCanvasMove(ev){ if(!dragging || !current) return; const snap=parseFloat(document.getElementById('snap').value||'0');
if(transformMode==='translate'){
setPointer(ev); raycaster.setFromCamera(pointer,camera); const hit=new THREE.Vector3(); raycaster.ray.intersectPlane(groundPlane, hit); if(hit){ let x=hit.x, z=hit.z; if(snap>0){ x=Math.round(x/snap)*snap; z=Math.round(z/snap)*snap; } const box=new THREE.Box3().setFromObject(current); const sz=new THREE.Vector3(); box.getSize(sz); current.position.set(x, sz.y/2, z); }
} else if(transformMode==='rotate'){
const dx = ev.clientX - dragStart.x; current.rotation.y = startRotY + dx*0.01;
} else if(transformMode==='scale'){
const dy = ev.clientY - dragStart.y; const f = Math.max(0.2, Math.min(5, 1 + dy*0.005)); current.scale.set(startScale.x*f, startScale.y*f, startScale.z*f);
}
}
function onCanvasUp(){ dragging=false; }
renderer.domElement.addEventListener('pointerdown', onCanvasDown);
renderer.domElement.addEventListener('pointermove', onCanvasMove);
renderer.domElement.addEventListener('pointerup', onCanvasUp);
function clearCity(){ BUILDINGS.forEach(g=>scene.remove(g)); BUILDINGS.clear(); selectable.length=0; current=null; }
function populate({seed=1,density=0.55}={}){ clearCity(); const rng=makeRNG(seed); const gridN=8, spacing=12; for(let gx=0;gx<gridN;gx++){ for(let gz=0;gz<gridN;gz++){ if(rng()>density) continue; const tower=createBrutalistTower(rng,8, seed+gx*31+gz*127); tower.position.set(gx*spacing,0,gz*spacing); tower.rotation.y=(rng()-0.5)*0.35; scene.add(tower); BUILDINGS.add(tower); selectable.push(tower);} } if(BUILDINGS.size===0){ const rng2=makeRNG(seed^9999); const t=createBrutalistTower(rng2,8,seed+777); scene.add(t); BUILDINGS.add(t); selectable.push(t); } }
// UI bindings
const ui = { regen:document.getElementById('regen'), seed:document.getElementById('seed'), density:document.getElementById('density'), add:document.getElementById('add'), cantilever:document.getElementById('cantilever'), ribs:document.getElementById('ribs'), modeT:document.getElementById('modeT'), modeR:document.getElementById('modeR'), modeS:document.getElementById('modeS'), dup:document.getElementById('dup'), del:document.getElementById('del'), exportBtn:document.getElementById('export'), importBtn:document.getElementById('import'), importFile:document.getElementById('importFile') };
ui.regen.onclick=()=>populate({ seed:parseInt(ui.seed.value||'1'), density:parseFloat(ui.density.value||'0.55') });
ui.modeT.onclick=()=>transformMode='translate'; ui.modeR.onclick=()=>transformMode='rotate'; ui.modeS.onclick=()=>transformMode='scale';
ui.add && (ui.add.onclick=()=>{ if(!current) return; const rng=makeRNG(Date.now()>>>0); const mat=concreteMaterial(rng()*1e6|0); const box=new THREE.Box3().setFromObject(current); const size=new THREE.Vector3(); box.getSize(size); const h=2.6+rng()*2.4; const w=Math.max(2.5, size.x*(0.82+rng()*0.1)); const d=Math.max(2.5, size.z*(0.82+rng()*0.1)); const block=createBlock(w,h,d,mat); block.position.set(0, size.y + h/2, 0); current.add(block); });
ui.cantilever && (ui.cantilever.onclick=()=>{ if(!current) return; const rng=makeRNG((Date.now()>>>0)^123); const base=current.children[0]; const s=new THREE.Vector3(); new THREE.Box3().setFromObject(base).getSize(s); const slab=createBlock(s.x*0.9,0.6,s.z*0.9, base.material.clone()); slab.material.color=new THREE.Color(0xb2b7bd); slab.position.set((rng()-0.5)*2.8, 0.7 + rng()*2.2, (rng()-0.5)*2.8 ); current.add(slab); });
ui.ribs && (ui.ribs.onclick=()=>{ if(current) addVerticalRibs(current); });
ui.dup.onclick=()=>{ if(!current) return; const clone=current.clone(true); clone.traverse(o=>{ if(o.isMesh) o.material=o.material.clone(); }); clone.position.x += 6; scene.add(clone); BUILDINGS.add(clone); selectable.push(clone); selectGroup(clone); };
ui.del.onclick=()=>{ if(!current) return; scene.remove(current); BUILDINGS.delete(current); const idx=selectable.indexOf(current); if(idx>=0) selectable.splice(idx,1); current=null; };
function serialize(){ const data=[]; BUILDINGS.forEach(g=>{ const item={ p:g.position.toArray(), r:g.rotation.toArray(), s:g.scale.toArray(), blocks:[] }; g.children.forEach(ch=>{ if(!ch.isMesh) return; const box=new THREE.Box3().setFromObject(ch); const size=new THREE.Vector3(); box.getSize(size); item.blocks.push({ w:size.x,h:size.y,d:size.z, offset:ch.position.toArray()}); }); data.push(item); }); return data; }
function downloadJSON(filename,obj){ const blob=new Blob([JSON.stringify(obj)], {type:'application/json'}); const url=URL.createObjectURL(blob); const a=document.createElement('a'); a.href=url; a.download=filename; a.click(); URL.revokeObjectURL(url); }
document.getElementById('export').onclick=()=>downloadJSON('brutalist.json', serialize());
document.getElementById('import').onclick=()=>document.getElementById('importFile').click();
document.getElementById('importFile').onchange=async (e)=>{ const file=e.target.files[0]; if(!file) return; const text=await file.text(); const data=JSON.parse(text); clearCity(); data.forEach(item=>{ const g=new THREE.Group(); g.position.fromArray(item.p); g.rotation.fromArray(item.r); g.scale.fromArray(item.s); g.name='tower'; const mat=concreteMaterial((Math.random()*1e6)|0); item.blocks.forEach(b=>{ const m=createBlock(b.w,b.h,b.d, mat.clone()); m.position.fromArray(b.offset); g.add(m); }); scene.add(g); BUILDINGS.add(g); selectable.push(g); }); };
window.addEventListener('keydown', (e)=>{ if(e.code==='KeyW') transformMode='translate'; if(e.code==='KeyE') transformMode='rotate'; if(e.code==='KeyR') transformMode='scale'; if(e.code==='KeyD'){ e.preventDefault(); ui.dup.click(); } if(e.code==='Delete' || e.code==='Backspace'){ e.preventDefault(); ui.del.click(); } });
function resize(){ const w=window.innerWidth, h=window.innerHeight; renderer.setSize(w,h,false); camera.aspect=w/h; camera.updateProjectionMatrix(); }
window.addEventListener('resize', resize); resize();
populate({ seed:1, density:0.55 });
renderer.setAnimationLoop(()=>{ renderer.render(scene, camera); });
</script>
</body>
</html>
指示通りに1発で、最小構成で操作可能な3D街ビルダーを生成してくれました。ここから以下のようなプロンプトを追加することで、よりリアルな3D街ビルダーを再現できるかと思いますので、気になる方は試してみてください。
「ビルの追加・削除をShift+クリックで切り替えできるようにしてください。」
「プリセットの街並み(低層/高層/ミックス)を3つ用意し、ドロップダウンで切り替えられるように。」
「ネオンの発光(夜景風)をオプションで切り替えできるように。既存の見た目は崩さないでください。」
GPT-5の活用事例
最後にGPT-5の活用事例についてご紹介します。
音声生成
OpenAIのサム・アルトマンCEOのポストでは、GPT-5を使った音声生成の様子が紹介されています。
「beatbotを使ってgpt-5を祝うかっこいいビートを作って」といったプロンプトをもとに、GPT-5が独自のUXを生成し、インターフェースが動的になるにつれてどのようなものになるかの素敵なプレビューとなっています。
実際に同様のプロンプトで試してみると1発回答でビートを生成してくれました。
ただ、実際に試したユーザーの声がサム・アルトマン氏のポストに多数寄せられていますが、同様のプロンプトでは失敗するケースも出ているようです。
ゲーミング
以下の方はGPT-5にポケモンゲームをプレイさせています。
数分ほどストリーム配信を見ていましたが、タイプ相性などもGPT-5がしっかり考えて、技を選択しているようでした。スゴいの一言。
データレポート
以下のポストでは、データレポート作成タスクでGPT-5 vs GPT-5 Thinking vs GPT-5 Proが試されています。
検索エンジンにてキーワードを入力した際に表示される検索結果であるSERPsデータを入力として、SEO日次レポートを作成されていますね。
やはり性能としては、GPT-5 < GPT-5 Thinking < GPT-5 Proの順のようです。
ポストにも書かれていますが、個人的な体感としては、GPT-5の文章力はo3に近しいものを感じるので、自然な日本語文章生成シーンにおいては、プロンプトの工夫などが必要となりそうです。
とはいえ、分析力やコーディング力は言うまでもなくハイレベルなので、GPT-5の活用可能性はまだまだあると感じます。
まとめ
GPT-5は、モデル側に自動切り替え機能を持たせており、我々ユーザーは余計な迷いなく簡単にモデルを利用することができます。
ChatGPTアプリ、WebUI上では、デフォルトのモデルがGPT-5になっていて、必要に応じてモデルピッカーで「GPT-5 Thinking」や「GPT-5 Pro」を選択するだけで多くのケースを最適化できると思います。
また、APIでは reasoning_effort
と verbosity
の2つのパラメータで、処理時間やコスト、読みやすさのバランスを要件に寄せていくこともできるので開発者にとっても非常にありがたいですね。
大規模言語モデルの新時代が始まった気がします。みなさんもぜひGPT-5のスゴさを体感してみてください!

生成系AIの業務活用なら!
・生成系AIを活用したPoC開発
・生成系AIのコンサルティング
・システム間API連携
最後に
いかがだったでしょうか?
AI導入を検討中の企業向けに、業務効率化や新しい価値創出を支援できる情報を提供します。最新のGPT-5を活用し、効率的な業務改善や高度な分析が可能です。
株式会社WEELは、自社・業務特化の効果が出るAIプロダクト開発が強みです!
開発実績として、
・新規事業室での「リサーチ」「分析」「事業計画検討」を70%自動化するAIエージェント
・社内お問い合わせの1次回答を自動化するRAG型のチャットボット
・過去事例や最新情報を加味して、10秒で記事のたたき台を作成できるAIプロダクト
・お客様からのメール対応の工数を80%削減したAIメール
・サーバーやAI PCを活用したオンプレでの生成AI活用
・生徒の感情や学習状況を踏まえ、勉強をアシストするAIアシスタント
などの開発実績がございます。
生成AIを活用したプロダクト開発の支援内容は、以下のページでも詳しくご覧いただけます。
➡︎株式会社WEELのサービスを詳しく見る。
まずは、「無料相談」にてご相談を承っておりますので、ご興味がある方はぜひご連絡ください。
➡︎生成AIを使った業務効率化、生成AIツールの開発について相談をしてみる。

「生成AIを社内で活用したい」「生成AIの事業をやっていきたい」という方に向けて、生成AI社内セミナー・勉強会をさせていただいております。
セミナー内容や料金については、ご相談ください。
また、サービス紹介資料もご用意しておりますので、併せてご確認ください。