ブログに戻る

ChatGPT API解説:企業システムへの組み込み方と料金計算

chatgpt-api-guide

ChatGPT APIを業務に使うなら、最初に決めるのは、モデルと予算です。上位のGPT-6 Astraと小型のGPT-6 Lunaでは、料金表の単価が入力・出力ともちょうど100倍違います。上位モデルで正解の基準を作り、小型モデルが同じ水準を出せるかを試して、下げられるところまで下げるのがおすすめです。

1. ChatGPT APIとは

この記事でいう「ChatGPT API」は、OpenAIが開発者向けに提供しているAPI(OpenAI API)のことです。自社のアプリやシステムから、GPTのモデルを呼び出して使えます。ChatGPTの契約とAPIの料金は別で、たとえばChatGPT Businessの契約にはAPIの利用が含まれません。

使えるモデルは、GPT-6 Astra、GPT-6.1 Sol、GPT-6 Lunaなどです。Astraは最上位のモデルで、Solはそれに近い性能を低めのコストで使えます。Lunaは大量の定型処理向けで、最も効率のよいモデルです。モデルの一覧と用途は公式で確認できます。

2. API利用の基本ステップ

使い始めるまでの流れは、次の3つです。

2.1 アカウント作成とAPI認証

  1. OpenAIの開発者向けサイトでアカウントを作成
  2. ダッシュボードでAPIキーを発行
  3. 支払い情報の設定(クレジットの追加)

APIキーは、コードに書かず環境変数に入れます。公式のSDKは、環境変数 OPENAI_API_KEY を自動で読み込みます(公式のクイックスタート)。キーを書いたコードをリポジトリに入れると、漏れたものとして再発行が必要になるため、最初から環境変数にしておきます。

# APIキーは、コードに書かず環境変数に入れる(macOS / Linux の例)
export OPENAI_API_KEY="(発行したAPIキー)"

2.2 基本的なAPIリクエスト

ChatGPT APIへのリクエストは、基本的にHTTP POSTで行います。公式SDKを使うと、次のように書けます。OpenAIが新しいアプリに勧めているのは、Responses APIです。従来のChat Completions APIも、引き続き使えます(移行ガイド)。

// 基本的なリクエスト例(Node.js。ファイル名は example.mjs など)
import OpenAI from "openai";
const client = new OpenAI(); // 環境変数 OPENAI_API_KEY を自動で読み込む

const response = await client.responses.create({
  model: "gpt-6.1-sol",
  instructions: "あなたは役立つアシスタントです。",
  input: "日本の首都について教えてください。",
});

console.log(response.output_text);

2.3 主要なパラメータ

  • model: 使用するモデル(例:gpt-6.1-sol、gpt-6-luna。指定するモデルIDはOpenAIの公式ドキュメントで確認)
  • input: 質問や会話の履歴。文字列か、roleとcontentを持つメッセージの配列
  • instructions: AIの役割や守るルール(systemメッセージに相当)。そのリクエストにだけ効く
  • temperature: 出力の多様性(0〜2の範囲、低いほど決定的)
  • top_p: 核サンプリングの確率閾値(0〜1の範囲)
  • max_output_tokens: 生成するトークン数の上限。推論トークンを含み、最小値は16
  • previous_response_idとstore: 前の応答を引き継ぐ指定と、応答を保存するかどうかの指定(既定は保存)

temperatureとtop_pは、モデルによって指定できるかが違うことがあるため、使うモデルのリファレンスで確認してください。従来のChat Completions APIのmessagesは、Responses APIではinputに当たります。frequency_penaltyとpresence_penaltyは、Responses APIの公式リファレンスの引数一覧にありません。

3. 企業システムへの組み込み方

3.1 アーキテクチャ設計

企業システムにChatGPT APIを組み込む際の一般的な構成は、次の5つです。

  1. フロントエンド: ユーザーインターフェース(ウェブ、モバイル、社内ポータルなど)
  2. バックエンド: API制御、リクエスト管理、認証処理。APIキーはここだけに置き、ブラウザやアプリからOpenAIを直接呼ばない
  3. ミドルウェア: プロンプト管理、コンテキスト処理
  4. API連携: OpenAI APIとの通信
  5. データストア: 会話履歴、ユーザー情報の保存

3.2 プロンプトエンジニアリング

指示は、役割(instructions)と、前提や質問(input)に分けて渡すと、あとから直しやすくなります。

// プロンプトの例
const response = await client.responses.create({
  model: "gpt-6.1-sol",
  // instructions でAIの役割を定義する
  instructions: "あなたは日本の法律に詳しい専門家アシスタントです。簡潔で正確な回答を心がけてください。",
  // input に、前提となる情報と具体的な質問を渡す
  input: "私は小売業を営んでいます。消費税の軽減税率について簡単に説明してください。",
});

3.3 APIリクエストの最適化

  1. バッチ処理: 複数のリクエストをまとめて処理
  2. キャッシュ: 同じクエリに対する応答をキャッシュ
  3. 非同期処理: 長時間実行が予想される処理の非同期化
  4. リトライ機構: 一時的な障害に対する再試行ロジック

リトライは自作せず、まずSDKの設定を使います。公式のNode.js SDKは、429(レート制限)や5xxなどのエラーを、既定で2回まで自動で再試行します。回数は maxRetries で変えられます(SDKのREADME)。

// リトライ回数の設定例(429や5xxなどは、既定で2回まで自動で再試行される)
const client = new OpenAI({ maxRetries: 5 });

4. 料金体系と計算方法

ChatGPT APIの料金は、使用するモデルと処理されるトークン数に基づいて計算されます。

4.1 トークンとは

トークンは、テキストの処理単位です。日本語の場合、およそ1文字が1トークンに相当します(ただし、漢字や複雑な文字はより多くのトークンを消費する場合があります)。

4.2 主要モデルの料金

モデル入力料金(100万トークンあたり)出力料金(100万トークンあたり)
GPT-6 Astra$10.00$50.00
GPT-6.1 Sol$2.00$10.00
GPT-6 Luna$0.10$0.50

※料金は変更される可能性があるため、最新情報はOpenAIの公式サイトでご確認ください。

4.3 料金計算例

例: GPT-6.1 Solで1日あたり1000回のリクエストを処理し、各リクエストで平均500トークンの入力と300トークンの出力がある場合

  1. 入力コスト: 1000 × 500 ÷ 1,000,000 × $2.00 = $1
  2. 出力コスト: 1000 × 300 ÷ 1,000,000 × $10.00 = $3
  3. 1日あたりの総コスト: $1 + $3 = $4
  4. 月間コスト(30日): $4 × 30 = $120

同じ条件で、GPT-6 Astraなら月$600、GPT-6 Lunaなら月$6です。最上位と小型では、月額が100倍違います。

ただし、この計算は、見えている出力だけで出したものです。GPT-6のように推論を行うモデルでは、画面に出ない推論トークンも出力として課金されます。推論の量は reasoning.effort で調整でき、指定できる値はモデルごとに違います。見積もりは、少量で試し、実際に課金されたトークン数で見直してください。

もう1つ見落としやすいのが、会話の長さです。会話のたびに、それまでの履歴をAIに渡し直すので、10往復目の1回分は1往復目の何倍にもなります。OpenAI側に履歴を持たせる previous_response_id を使っても、それまでの入力トークンは毎回入力として課金されます。見積もりは「1リクエスト」ではなく、「1会話」で行ってください。

4.4 コストを下げる順番

いちばん効くのは、モデルの選び方です。次の順で進めるのがおすすめです。

  1. 上位モデル(GPT-6 Astra)で、実際の入力20件ほどの「正解」を作る
  2. 同じ20件をGPT-6.1 SolとGPT-6 Lunaで動かし、正解と見比べる
  3. 品質が足りるモデルのうち、最も安いものを使う

安いモデルから始めると、誤りの原因がモデルの限界なのか、プロンプトの不備なのかを切り分けられません。そのうえで、不要な情報を入力に含めない、長い履歴は要約して渡す、同じ質問への答えはアプリ側で再利用する、といった工夫を足します。

5. 実装例と活用シナリオ

5.1 カスタマーサポートチャットボット

// カスタマーサポートチャットボットの実装例
async function customerSupportBot(userQuery, previousMessages = []) {
  const input = [...previousMessages, { role: "user", content: userQuery }];

  const response = await client.responses.create({
    model: "gpt-6.1-sol",
    instructions:
      "あなたは親切なカスタマーサポートアシスタントです。製品情報に基づいて回答し、不明な点は担当者への連絡を案内してください。",
    input,
  });

  return {
    reply: response.output_text,
    updatedMessages: [...input, { role: "assistant", content: response.output_text }],
  };
}

5.2 社内ナレッジベース検索強化

# Python実装例:社内文書検索システム
from openai import OpenAI

client = OpenAI()

def ask(instructions, text):
    response = client.responses.create(
        model="gpt-6-luna", # 単純な処理は、小型モデルから試す
        instructions=instructions,
        input=text,
    )
    return response.output_text

def enhanced_document_search(query, documents):
    # 検索クエリの最適化
    optimized_query = ask("検索クエリを最適化してください。", f"元のクエリ: {query}\n最適化してください。")

    # 文書検索(別途検索エンジンを実装)
    search_results = search_engine.search(optimized_query, documents)

    # 検索結果の要約と関連性評価
    summary = ask(
        "検索結果を要約し、クエリとの関連性を評価してください。",
        f"クエリ: {query}\n\n検索結果:\n{search_results}\n\n要約と関連性を評価してください。",
    )

    return {
        "original_query": query,
        "optimized_query": optimized_query,
        "results": search_results,
        "summary": summary,
    }

ほかにも、文書の要約や翻訳、議事録の整理、コード補助など、入力も出力も文章で決まる作業に向いています。

6. セキュリティ対策と注意点

6.1 データ保護

  1. プロンプトフィルタリング: 機密情報が含まれないよう事前チェック
  2. データ匿名化: 個人情報の匿名化処理
  3. トークン化: 機密データをトークンに置き換え

// 機密情報のフィルタリング例
function sanitizeInput(input) {
// 個人情報(メール、電話番号など)のパターン
const patterns = [
/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g, // メールアドレス
/(\d{3}[-\.\s]??\d{4}[-\.\s]??\d{4}|\d{4}[-\.\s]??\d{4}[-\.\s]??\d{4})/g, // 電話番号
/\d{4}[-\.\s]??\d{4}[-\.\s]??\d{4}[-\.\s]??\d{4}/g, // クレジットカード
];

let sanitized = input;

patterns.forEach(pattern => {
sanitized = sanitized.replace(pattern, "[削除された情報]");
});

return sanitized;
}

送ったあとに何が残るかも、先に確認してください。APIに送った内容は、既定ではモデルの学習に使われません。ただし、「学習されない」と「保存されない」は別です。不正利用の監視ログは既定で最長30日保存され、Responses APIの応答も既定で30日間保存されます(storeをfalseにすると、応答の保存は止められます)。ゼロデータ保持は、OpenAIの事前承認が必要です。個人情報や機密を送る場合は、保存の扱いまで含めて、社内のセキュリティ担当に公式の説明を共有してください。

6.2 API認証とアクセス制御

  1. APIキー管理: 環境変数として保存、定期的なローテーション
  2. 最小権限の原則: 必要最小限の権限付与
  3. アクセスログ: 全てのAPI呼び出しの記録と監視

6.3 プロンプトインジェクション対策

プロンプトインジェクションとは、悪意あるユーザーが意図しない動作をAIにさせるための入力です。

// プロンプトインジェクション対策
function preventPromptInjection(userInput) {
// システム指示を上書きする可能性のあるパターンをチェック
const suspiciousPatterns = [
/ignore previous instructions/i,
/forget your instructions/i,
/you are now/i,
/system:/i,
/\<\|\>/
];

// 怪しいパターンが見つかった場合は警告
for (const pattern of suspiciousPatterns) {
if (pattern.test(userInput)) {
console.warn("潜在的なプロンプトインジェクション試行を検出:", userInput);
return "入力に不審なパターンが含まれています。サポートにお問い合わせください。";
}
}

return userInput;
}

固定の語句だけを調べる検査は、言い換えで簡単にすり抜けられます。OWASPも、プロンプトインジェクションを確実に防ぐ方法があるかは不明だとしています。本線は、AIに渡すツールやデータの権限を最小にすることと、影響の大きい操作を人が承認することです(OWASP LLM01)。

6.4 コンプライアンスへの配慮

  1. 個人情報保護法: 個人情報の適切な取り扱い
  2. 著作権: 生成コンテンツの著作権管理
  3. 業界固有の規制: 金融、医療、法律など特定領域の規制対応

チームの社内Wikiに、AIのような賢さを

「その質問、また聞いてない?」

生成AIで情報を作るだけでは、チーム全体のナレッジにはなりません。
「誰かが聞くたびにまた答える」という状態を脱するには、社内に“賢いWiki”があることがカギになります。

AIが、忙しいあなたの代わりにSlack上の質問に回答します

「社内Wikiに書いてあるのに、また同じ質問をされた…」
Slackでよくあるこの悩み、Kipwiseなら解決できます。

KipwiseのAI搭載ボットは、Slack上の会話から質問を自動で検出し、社内ナレッジに基づいて即座に回答。
まるで社内専用のAIのように、チーム内の情報共有をサポートし、知識の定着と自己解決を促進します。

Slackを活用するチームにぴったりな理由

Kipwiseは、Slackを中心にコミュニケーションを行うチームに向いているナレッジツールです。

  • /kipwiseコマンドで、Slack上からナレッジの検索・作成が可能

  • AIチャットボットが、社内ナレッジに基づいて質問に直接回答

  • Q&Aのやりとりも自動でナレッジとして蓄積

さらに、Googleドキュメントやスプレッドシートとの連携もスムーズ。
UIもシンプルで直感的なので、テンプレートの知識やコードは不要。誰でもすぐに使い始められます。

Slackを日常的に使っているなら、Kipwiseは最適な選択肢のひとつです。

今すぐ試せる!Kipwiseを14日間無料で体験する

‍

まず20件で試す

1つの業務を選び、実際の入力を20件用意して、上位モデルと小型モデルの出力を並べて比べてください。月額の見積もりは、その20件の平均トークン数から出せます。

‍

関連ブログ

Slack に、AI の同僚を

インストールで無料トライアル開始。高速モデルを7日間、2ドル分まで使えます。