AIを使った記事制作は、SEO運用やコンテンツマーケティングの現場で急速に広がっています。
なかでも注目したいのが、低コストかつ高速に回しやすい OpenAI の GPT-5.4 nano です。
GPT-5.4 nano は、OpenAI が 「simple high-volume tasks(シンプルな大量処理向け)」 と位置づける GPT-5.4 系の小型モデルで、分類、抽出、ランキング、下書き生成のような処理に向いています。
2026年3月時点で特に重要なのは、GPT-5.4 nano は APIでのみ利用可能 という点です。
ChatGPT の通常のモデル切り替え画面で直接選ぶモデルではなく、OpenAI API を使ってアプリやPythonスクリプトから利用する前提のモデル です。
OpenAI の公式発表(GPT-5.4 mini と nano が登場 | OpenAI)でも、GPT-5.4 nano は “GPT‑5.4 nano は API でのみ利用可能” と案内されています。
本記事では、GPT-5.4 nano の特徴、用途に加え、GPTのAPIキーの取得方法とAPI利用料金の支払い方法、そして GPT-5.4 nano APIを使って、AI記事構成を量産するPythonスクリプト まで、初心者にも分かるようにまとめて解説します。
GPT-5.4 nanoとは
GPT-5.4 nano は、OpenAI の GPT-5.4 系列に属する 小型・高速・低コスト寄りのモデル です。

OpenAI のモデルページでは、「Our cheapest GPT-5.4-class model for simple high-volume tasks(単純な大量処理タスク向けの、最も低価格なGPT-5.4クラスのモデル)」 と説明されています。
用途例としては、以下 が挙げられています。
- classification(分類)
- data extraction(データ抽出)
- ranking(ランキング)
- sub-agents (サブエージェント)
さらに、入力には Textとimageが使用でき、出力は Text、コンテキストウィンドウは 400,000 とされています。
上位モデルの GPT-5.4 が 複雑な専門業務向けのフロンティアモデル と案内されているのに対し、GPT-5.4 nano は 速度とコストを重視した大量処理向け です。
つまり、複雑な推論を1件ずつ深く行うより、一定の品質で大量に処理を回す 使い方に向いています。
GPT-5.4 nano APIキーの取得方法
2026年3月17日の発表時点では、GPT-5.4 nano は APIでのみ利用可能となっており、GPT-5.4 nano を使うには、OpenAI Platform で APIキーを発行する必要があります。
APIの利用は、ChatGPT の契約とは別に Platform 側の設定 を設定する流れになります。
手順は次の通りです。
- OpenAI Platform にログインする
(アカウントが無い場合はサインアップ) - API keys の画面を開く
- 新しい secret key を作成する
- 表示されたキーを安全な場所に保存する


PowerShell なら、環境変数は次のように設定できます。
$env:OPENAI_API_KEY="作成したsecret key"API使用料金の支払い方法
OpenAI API の料金は、ChatGPTの月額プランとは別 です。
API を使う場合は、OpenAI Platform 側で支払い方法を設定し、使ったトークン量に応じた従量課金 になります。

料金は公式の API Pricing ページ(OpenAI API 料金 | OpenAI)で確認できます。
実務では、まず少量のテスト実行を行い、1件あたりの出力量と合計コストを確認しながら運用するのがおすすめです。
nano は比較的単価が低いため、試験導入しやすいモデルです。
AI記事構成量産Pythonスクリプトの作成
今回紹介するスクリプトは、CSVからキーワードを読み込み、GPT-5.4 nano を使ってSEO記事構成を生成し、結果をCSVに保存します。
keywords.csvからキーワードを読み込む- 成功したキーワードは次回スキップする
- 失敗したキーワードは次回再実行する
- 同じキーワードは 最新結果だけ残す
StatusとExecutedAtを保存する
事前準備
Pythonインストール状況の確認
>python --version
>Python 3.XX.Xインストールされていない場合は、公式サイトにアクセスに従いインストールする。
OpenAI の Pythonライブラリインストール
PythonでOpenAI APIを使用するために、Developer quickstartに従ってSDKをインストールします。
(参考:Developer quickstart | OpenAI API)
pip install -U openaiAPIキーの取得
こちらの手順に従ってAPIキーを取得し、環境変数に設定します。
$env:OPENAI_API_KEY="あなたのAPIキー(作成したsecret key)"API使用料金の支払い
こちらの手順に従って、API使用料金を支払います。
AI記事構成量産Pythonスクリプトの作成
などのエディタで、下記のGPT-5.4 nano でSEO記事構成を量産する下記スクリプトを作成し、ファイル名をgenerate_ai_seo_latest_only.py(任意)とします。
このスクリプトは、keywords.csv に入れたキーワードを1件ずつ GPT-5.4 nano APIを使って、
- 想定読者
- 検索意図
- タイトル案
- H2/H3構成を含むSEO記事構成
を生成し表示します。
さらに、結果は ai_seo_outlines_result.csv に保存され、同じキーワードは 最新結果だけ残す ようになっています。
2回目の実行からは、作成に成功したキーワードは次回スキップし、失敗したキーワードだけ再実行されします。
generate_ai_seo_latest_only.py
import os
import csv
import time
from datetime import datetime
from pathlib import Path
from typing import Dict, List
from openai import OpenAI
# =========================
# 設定
# =========================
MODEL = "gpt-5.4-nano"
INPUT_CSV = "keywords.csv"
OUTPUT_CSV = "ai_seo_outlines_result.csv"
REQUEST_INTERVAL_SEC = 0.5
RETRY_COUNT = 3
RETRY_WAIT_SEC = 3
# =========================
# OpenAI client
# =========================
api_key = os.environ.get("OPENAI_API_KEY")
if not api_key:
raise EnvironmentError("OPENAI_API_KEY が設定されていません。")
client = OpenAI(api_key=api_key)
# =========================
# 指示文
# =========================
DEVELOPER_MESSAGE = """
あなたは日本語SEO記事の構成作成に強い編集者です。
以下の条件で、検索上位を狙いやすい記事構成を作成してください。
条件:
- 出力は日本語
- まず「想定読者」を1行
- 次に「検索意図」を箇条書きで3点
- 次に「記事タイトル案」を3案
- 次に「記事構成」をH2とH3で出力
- H2は5〜7個
- 各H2の下に必要に応じてH3を2〜4個
- 最後に「この記事で入れると良い要素」を箇条書きで5点
- 誇張しない
- 具体的で、初心者にも分かりやすい構成にする
- 不要な前置きは書かない
""".strip()
def read_keywords_from_csv(csv_path: str) -> List[str]:
path = Path(csv_path)
if not path.exists():
raise FileNotFoundError(f"入力CSVが見つかりません: {csv_path}")
keywords: List[str] = []
with open(path, "r", encoding="utf-8-sig", newline="") as f:
reader = csv.DictReader(f)
if not reader.fieldnames or "keyword" not in reader.fieldnames:
raise ValueError("入力CSVに 'keyword' 列が必要です。")
for row in reader:
keyword = (row.get("keyword") or "").strip()
if keyword:
keywords.append(keyword)
if not keywords:
raise ValueError("入力CSVに有効なキーワードがありません。")
return keywords
def is_successful_outline(text: str) -> bool:
if not text:
return False
stripped = text.strip()
if not stripped:
return False
if stripped.startswith("ERROR:"):
return False
return True
def load_existing_results(output_csv: str) -> Dict[str, dict]:
path = Path(output_csv)
results: Dict[str, dict] = {}
if not path.exists():
return results
with open(path, "r", encoding="utf-8-sig", newline="") as f:
reader = csv.DictReader(f)
if not reader.fieldnames:
return results
required = {"Keyword", "Status", "ExecutedAt", "Outline"}
if not required.issubset(set(reader.fieldnames)):
for row in reader:
keyword = (row.get("Keyword") or "").strip()
if not keyword:
continue
outline = (row.get("Outline") or "").strip()
status = "SUCCESS" if is_successful_outline(outline) else "ERROR"
executed_at = (row.get("ExecutedAt") or "").strip()
results[keyword] = {
"Keyword": keyword,
"Status": status,
"ExecutedAt": executed_at,
"Outline": outline,
}
return results
for row in reader:
keyword = (row.get("Keyword") or "").strip()
if not keyword:
continue
results[keyword] = {
"Keyword": keyword,
"Status": (row.get("Status") or "").strip(),
"ExecutedAt": (row.get("ExecutedAt") or "").strip(),
"Outline": (row.get("Outline") or "").strip(),
}
return results
def write_results_csv(output_csv: str, results_by_keyword: Dict[str, dict]) -> None:
rows = list(results_by_keyword.values())
with open(output_csv, "w", encoding="utf-8-sig", newline="") as f:
writer = csv.writer(f)
writer.writerow(["No", "Keyword", "Status", "ExecutedAt", "Outline"])
for i, row in enumerate(rows, start=1):
writer.writerow([
i,
row["Keyword"],
row["Status"],
row["ExecutedAt"],
row["Outline"],
])
def generate_outline(keyword: str) -> str:
user_prompt = f"キーワード: {keyword}\nこのキーワードでSEO記事構成を作成してください。"
response = client.responses.create(
model=MODEL,
input=[
{"role": "developer", "content": DEVELOPER_MESSAGE},
{"role": "user", "content": user_prompt},
],
)
return response.output_text.strip()
def generate_outline_with_retry(keyword: str) -> str:
last_error = None
for attempt in range(1, RETRY_COUNT + 1):
try:
return generate_outline(keyword)
except Exception as e:
last_error = e
print(f" -> 試行 {attempt}/{RETRY_COUNT} 失敗: {type(e).__name__}: {e}")
if attempt < RETRY_COUNT:
time.sleep(RETRY_WAIT_SEC)
raise last_error
def main() -> None:
keywords = read_keywords_from_csv(INPUT_CSV)
existing_results = load_existing_results(OUTPUT_CSV)
success_count = sum(
1 for row in existing_results.values()
if row.get("Status") == "SUCCESS"
)
print(f"入力キーワード総数: {len(keywords)}")
print(f"既存の成功件数: {success_count}")
print(f"出力先: {OUTPUT_CSV}")
print()
for i, keyword in enumerate(keywords, start=1):
existing = existing_results.get(keyword)
if existing and existing.get("Status") == "SUCCESS":
print("=" * 100)
print(f"[{i}/{len(keywords)}] {keyword}")
print(" -> SUCCESS済みのためスキップ")
continue
print("=" * 100)
print(f"[{i}/{len(keywords)}] {keyword}")
executed_at = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
try:
outline = generate_outline_with_retry(keyword)
if not is_successful_outline(outline):
raise ValueError("応答が空、または不正な形式です。")
print(outline)
print()
existing_results[keyword] = {
"Keyword": keyword,
"Status": "SUCCESS",
"ExecutedAt": executed_at,
"Outline": outline,
}
except Exception as e:
error_message = f"ERROR: {type(e).__name__}: {e}"
print(error_message)
print()
existing_results[keyword] = {
"Keyword": keyword,
"Status": "ERROR",
"ExecutedAt": executed_at,
"Outline": error_message,
}
write_results_csv(OUTPUT_CSV, existing_results)
time.sleep(REQUEST_INTERVAL_SEC)
print("=" * 100)
print("完了しました。")
print(f"最新結果のみ保存したCSV: {OUTPUT_CSV}")
if __name__ == "__main__":
main()入力CSVの作成
generate_ai_seo_latest_only.pyを作成した同じフォルダに keywords.csv を作成し、1列目の見出しを keyword にします。
keyword
AIとは 初心者
生成AIとは わかりやすく
AI 活用事例
ChatGPT 使い方
AI Overview 対策スクリプトの実行
以下のコマンドで、スクリプトを実行します
python .\generate_ai_seo_latest_only.py実行後にできるファイル
実行すると、ai_seo_outlines_result.csv が作成されます。
列は次の5つです。
NoKeywordStatusExecutedAtOutline
Status は SUCCESS か ERROR です。ExecutedAt には実行日時が入ります。Outline には生成された記事構成、またはエラー内容が入ります。
使用方法の流れ
このスクリプトの使い方はシンプルです。
1. キーワードをCSVに入れる
まず keywords.csv を作り、記事構成を作りたいキーワードを並べます。
2. スクリプトを実行する
Pythonでスクリプトを実行すると、キーワードごとに構成生成が始まります。
3. 結果を画面とCSVで確認する
生成結果は、画面表示とともにCSVに保存されます。
CSVファイルは、Excelなどで確認できます。
4. 良い構成だけ本文作成に進める
量産した構成の中から使いやすいものを選び、次に記事本文の生成に進みます。
想定される費用
GPT-5.4 nano の標準料金は 入力 $0.20 / 100万トークン、出力 $1.25 / 100万トークン です。
記事構成の量産では、本文を丸ごと生成するより出力量が少ないため、100件程度なら比較的低コストで収まります。

運用のコツ
AI記事量産では、いきなり本文100本を作るより、まず 記事構成だけを大量生成 し、その中から良いものを選んでGPT-5.4 の上位モデルで記事本文を作成する方が良い記事ができます。
特に GPT-5.4 nano は、完成原稿を一発で仕上げるより、構成・案出し・分類・短文生成 に向いています。
上位モデルと役割を分けて使うと、コストも品質も管理しやすくなります。
まとめ
GPT-5.4 nano は、OpenAI が提供する API専用の小型・高速・低コストモデル です。
2026年3月時点では ChatGPT の通常画面で直接選ぶモデルではなく、APIから利用する開発者向けモデル です。
分類、抽出、ランキング、下書き生成、SEO記事構成の量産など、大量処理型の実務 に向いています。
今回紹介したPythonスクリプトを使えば、CSVに並べたキーワードから AI記事構成を自動で量産 できます。
記事制作の前工程を効率化したい人にとって、GPT-5.4 nano は使いやすい選択肢といえます。

