AI Engineering Academy · レッスン

Chat Completionsエンドポイント

system、user、assistantの各ロールを持つmessages配列を理解し、最初のプロンプトを作成して、APIから返されるresponseオブジェクトを読み取ります。

レッスン 2/413 ステップ

「Chat Completionsエンドポイント」はCoddyKit上の無料AI Engineering Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Engineering Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Engineering Academyコースには全4レッスンが含まれています。

メッセージ配列アーキテクチャ

Chat Completions エンドポイントはメッセージ配列で動作します。これは、各ターンに system、user、assistant のいずれかのロールを持たせたリストです。モデルはステートレスなので、毎回履歴を送信します。

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model='gpt-4o-mini',
    messages=[
        {'role': 'system', 'content': 'You are a concise Python tutor.'},
        {'role': 'user', 'content': 'What is a list comprehension?'}
    ]
)

print(response.choices[0].message.content)

System ロールで動作を定義する

system messageは、最も大きな影響力を持つ要素です。ユーザーが一言入力する前に、モデルのペルソナ、ルール、形式を設定します。ここに時間をかけてください。すべての出力の方向性が決まります。コードを確認しましょう。

system_prompt = '''You are a customer support agent for TechShop.
You help customers with: order tracking, returns, and product questions.
You do NOT discuss pricing changes or competitor products.
Always respond in 2-3 sentences maximum.
If you cannot help, say: 'Let me connect you with a human agent.'
'''

response = client.chat.completions.create(
    model='gpt-4o-mini',
    messages=[
        {'role': 'system', 'content': system_prompt},
        {'role': 'user', 'content': 'Where is my order #12345?'}
    ]
)

複数ターンの会話を管理する

会話を続けるには、各ターンを追加して messages 配列に加え、全体を再送信します。モデルが覚えているように見えるのは、完全な履歴を毎回与えているからです。

history = [
    {'role': 'system', 'content': 'You are a helpful assistant.'}
]

def chat(user_message):
    history.append({'role': 'user', 'content': user_message})
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=history
    )
    assistant_reply = response.choices[0].message.content
    history.append({'role': 'assistant', 'content': assistant_reply})
    return assistant_reply

print(chat('My name is Alice.'))
print(chat('What is my name?'))  # model remembers 'Alice'

API レスポンスの構造

レスポンスは単なるテキストではなく、オブジェクトです。choicesには返信が入り、finish_reason は停止した理由を示し、usage はトークン数、つまりコストを数えます。本番環境ではこれらをログに記録してください。

response = client.chat.completions.create(
    model='gpt-4o-mini',
    messages=[{'role': 'user', 'content': 'Say hello in one word.'}]
)

# Accessing response fields
print('Content:', response.choices[0].message.content)
print('Finish reason:', response.choices[0].finish_reason)  # 'stop'
print('Model:', response.model)  # exact version like gpt-4o-mini-2024-07-18
print('Prompt tokens:', response.usage.prompt_tokens)
print('Completion tokens:', response.usage.completion_tokens)
print('Total tokens:', response.usage.total_tokens)

finish_reason を理解する

finish_reasonは生成が停止した理由を示します。'stop' は完了を意味し、'length' は max_tokens に達して回答の途中で切り詰められたことを意味します。切り詰めは見落としやすいバグなので、必ず確認してください。

def safe_completion(messages, max_tokens=500):
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=messages,
        max_tokens=max_tokens
    )
    choice = response.choices[0]
    
    if choice.finish_reason == 'length':
        print(f'WARNING: Response was truncated at {max_tokens} tokens!')
    elif choice.finish_reason == 'content_filter':
        print('WARNING: Response blocked by content filter!')
        return None
    
    return choice.message.content

適切なモデルを選ぶ

目的に合ったモデルを選びます。gpt-4oは難しい推論に適した高性能モデルです。一方、gpt-4o-mini ははるかに安価で、ほとんどのタスクを十分に処理できます。大きいモデルのほうが常に優れていると決めつけず、ベンチマークで確認してください。

# Model comparison guidance
models = {
    'gpt-4o': {
        'use_for': 'Complex reasoning, code generation, nuanced analysis',
        'input_cost_per_1M': 2.50,  # USD
        'output_cost_per_1M': 10.00
    },
    'gpt-4o-mini': {
        'use_for': 'Classification, extraction, summarization, Q&A',
        'input_cost_per_1M': 0.15,
        'output_cost_per_1M': 0.60
    }
}
# gpt-4o is ~17x more expensive on input tokens

メッセージのコンテンツタイプ

メッセージのcontentはテキストだけとは限りません。gpt-4o のようなビジョンモデルでは、テキストと画像を混在させたリストを渡せるため、グラフやスクリーンショットについて質問できます。

# Sending an image to a vision-capable model
response = client.chat.completions.create(
    model='gpt-4o',
    messages=[
        {
            'role': 'user',
            'content': [
                {
                    'type': 'text',
                    'text': 'What is in this image? Describe in one sentence.'
                },
                {
                    'type': 'image_url',
                    'image_url': {'url': 'https://example.com/photo.jpg'}
                }
            ]
        }
    ]
)

n パラメーター:複数の補完

nパラメーターを使うと、1つのプロンプトに対して複数の補完を返せます。最適な回答を選ぶ場合や、信頼度を確認する場合に便利です。n 個すべてが一致すればモデルの確信度は高く、食い違えば注意が必要です。

response = client.chat.completions.create(
    model='gpt-4o-mini',
    messages=[{'role': 'user', 'content': 'Name the capital of Germany.'}],
    n=3,  # generate 3 independent completions
    temperature=0.5
)

for i, choice in enumerate(response.choices):
    print(f'Completion {i+1}: {choice.message.content}')

# Check if all completions agree (confidence signal)
answers = [c.message.content.strip() for c in response.choices]
print('All agree:', len(set(answers)) == 1)

レスポンスを文字列として扱う

返信をテキストとして取得するパスは、常に response.choices[0].message.content です。ヘルパー関数でラップし、ツール呼び出しやフィルターによって発生するNoneにも対処してください。

def get_completion(prompt, system='You are a helpful assistant.', model='gpt-4o-mini'):
    '''Simple helper that returns the response text as a string.'''
    response = client.chat.completions.create(
        model=model,
        messages=[
            {'role': 'system', 'content': system},
            {'role': 'user', 'content': prompt}
        ]
    )
    content = response.choices[0].message.content
    if content is None:
        raise ValueError(f'No content in response. Finish reason: {response.choices[0].finish_reason}')
    return content

result = get_completion('Explain recursion in one sentence.')
print(result)

生のリクエストとレスポンスを調べる

返信がおかしい場合は、生のリクエストとレスポンスを調べます。OPENAI_LOG=debugを設定すると、本文全体がターミナルに出力されます。通信内容を確認する最も速い方法です。

import json
import httpx

# Enable debug logging (shows full request/response)
import os
os.environ['OPENAI_LOG'] = 'debug'

# Or use a custom logging client:
class LoggingClient(httpx.Client):
    def send(self, request, *args, **kwargs):
        print('REQUEST:', request.method, request.url)
        print('BODY:', json.loads(request.content))
        response = super().send(request, *args, **kwargs)
        print('STATUS:', response.status_code)
        return response

最小限のチャットループを構築する

これで最小限のチャットループを構築できます。messages リストを保持し、各ターンを追加して全体を送信する処理を繰り返します。この単純なパターンが、API 上のすべてのチャットアプリを支えています。コードで確認しましょう。

import openai

client = openai.OpenAI()

SYSTEM_PROMPT = 'You are a helpful assistant. Be concise.'

def simple_chat_loop():
    messages = [{'role': 'system', 'content': SYSTEM_PROMPT}]
    print('Chat started. Type "quit" to exit.')

    while True:
        user_input = input('You: ').strip()
        if user_input.lower() == 'quit':
            break
        if not user_input:
            continue

        messages.append({'role': 'user', 'content': user_input})

        response = client.chat.completions.create(
            model='gpt-4o-mini',
            messages=messages,
            max_tokens=500
        )

        assistant_reply = response.choices[0].message.content
        messages.append({'role': 'assistant', 'content': assistant_reply})
        print(f'Assistant: {assistant_reply}\n')

print('Example chat loop defined. Run simple_chat_loop() to start.')

クイックチェック

このレッスンで学んだ AI Engineering の概念を理解できているか確認しましょう。

レッスンのまとめ

チャットの基本を学びました。メッセージ配列が会話を制御し、レスポンスには content、finish_reason、トークン数が含まれます。次はパラメーターです。

無料で開始

AI チューターと学ぶ Python — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「Chat Completionsエンドポイント」レッスンは無料ですか?

はい。「Chat Completionsエンドポイント」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Engineering Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Engineering Academyコースには全4レッスンが含まれています。

「Chat Completionsエンドポイント」で何を学びますか?

system、user、assistantの各ロールを持つmessages配列を理解し、最初のプロンプトを作成して、APIから返されるresponseオブジェクトを読み取ります。 ブラウザで直接実行するハンズオンコードでAI Engineering Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AI Engineering Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAI Engineering Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Chat Completionsエンドポイント」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAI Engineering Academyレッスンでコードを書いて実行できますか?

はい。すべてのAI Engineering Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Python環境のセットアップ
  2. Chat Completionsエンドポイント
  3. パラメーターによるモデルの挙動制御
  4. エラーハンドリングとレート制限
← AI Engineering Academyに戻る