チャットインターフェースを理解する
LLM のチャット UI の仕組みとして、役割、ターン、セッションコンテキストについて学びます。
「チャットインターフェースを理解する」はCoddyKit上の無料AI Prompt Engineeringレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Prompt Engineering学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Prompt Engineeringコースには全4レッスンが含まれています。
3つの役割
LLMとのすべての会話は、system、user、assistantという3つの役割で構成されています。
systemロールは、会話が始まる前にルールとペルソナを設定します。userロールは、あなたがメッセージを送信する役割です。assistantロールは、モデルが返信する役割です。
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
message = client.messages.create(
model='claude-opus-4-5',
max_tokens=256,
system='You are a helpful cooking assistant.',
messages=[
{'role': 'user', 'content': 'What is mise en place?'}
]
)
print(message.content[0].text)システムメッセージ
システムメッセージは、モデルの取扱説明書です。最初のユーザーターンより前に実行され、セッション全体を通じて有効な状態が続きます。
これを使って、ペルソナ、トーン、対象領域の制限、出力形式などを設定します。モデルは会話中ずっと、システムメッセージを指針となるコンテキストとして扱います。
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
response = client.chat.completions.create(
model='gpt-4o',
messages=[
{
'role': 'system',
'content': 'You are a senior Python engineer. '
'Always include type hints and docstrings in your examples.'
},
{
'role': 'user',
'content': 'Show me a function that parses JSON safely.'
}
]
)
print(response.choices[0].message.content)ターンと会話の流れ
会話はターンの連続です。各ターンでは、ユーザーが話し、アシスタントが返信し、再びユーザーが話すという流れが交互に続きます。
モデルはリクエストごとに、ターン履歴全体を確認します。これによって連続した対話のように感じられますが、技術的には各API呼び出しはステートレスであり、そのたびに完全なコンテキストを受け取ります。
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
# Each call sends the FULL conversation history
history = [
{'role': 'system', 'content': 'You are a geography tutor.'},
{'role': 'user', 'content': 'What is the capital of France?'},
{'role': 'assistant', 'content': 'The capital of France is Paris.'},
{'role': 'user', 'content': 'And its population?'} # follow-up turn
]
response = client.chat.completions.create(
model='gpt-4o',
messages=history
)
print(response.choices[0].message.content)セッションコンテキスト
セッションコンテキストとは、会話の進行中に保持される記憶です。すべてのユーザーメッセージとアシスタントメッセージが履歴配列に蓄積されます。
モデルに独立したメモリーストアはありません。現在のコンテキストウィンドウで確認できる情報だけをもとに推論します。新しいセッションを開始すると、以前のセッションの情報を再注入しない限り、モデルはその内容を記憶していません。
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
# Simulating 3-turn session context
conversation = [
{'role': 'user', 'content': 'My name is Alex.'},
{'role': 'assistant', 'content': 'Nice to meet you, Alex!'},
{'role': 'user', 'content': 'What is 5 times 7?'},
{'role': 'assistant', 'content': '5 times 7 is 35.'},
{'role': 'user', 'content': 'Can you repeat my name?'} # uses session context
]
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=128,
messages=conversation
)
print(response.content[0].text) # expects: Your name is Alex.メッセージ履歴の構造
メッセージ履歴は、各要素にroleキーとcontentキーを持つ、単純な辞書のリストです。
このリストはコード内で自分で管理します。アシスタントが返信するたびにその応答を追加し、次のユーザーメッセージを追加して、次の呼び出しでリスト全体を再度送信します。
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
def chat(history, user_message):
history.append({'role': 'user', 'content': user_message})
response = client.chat.completions.create(
model='gpt-4o',
messages=history
)
reply = response.choices[0].message.content
history.append({'role': 'assistant', 'content': reply})
return reply, history
history = [{'role': 'system', 'content': 'You are a math tutor.'}]
reply, history = chat(history, 'What is a prime number?')
print(reply)
print('History length:', len(history))トークン制限の説明
すべてのモデルには、トークン数で測定されるコンテキストウィンドウがあります。1トークンは、英語ではおよそ4文字、または0.75語に相当します。
入力(システムメッセージとすべての履歴)とモデルの出力は、どちらもこの制限の対象になります。GPT-4oは128kトークン、Claude Opus 4.5は200kトークンに対応しています。制限に達すると、古いメッセージを削除するか要約する必要があります。
import tiktoken
# Count tokens before sending to avoid exceeding the limit
encoding = tiktoken.encoding_for_model('gpt-4o')
messages = [
{'role': 'system', 'content': 'You are a helpful assistant.'},
{'role': 'user', 'content': 'Explain quantum entanglement in simple terms.'}
]
total_tokens = 0
for msg in messages:
total_tokens += len(encoding.encode(msg['content']))
total_tokens += 4 # overhead per message
print(f'Estimated input tokens: {total_tokens}')
print(f'GPT-4o limit: 128,000 tokens')
print(f'Budget remaining: {128000 - total_tokens:,} tokens')トークン制限に達するとどうなるか
会話履歴がコンテキストウィンドウを超えるほど長くなった場合は、3つの方法があります。
- 切り捨て — 最も古いメッセージを削除する
- 要約 — 以前のやり取りを短い要約にまとめるようモデルに依頼する
- スライディングウィンドウ — 直近のN件のメッセージだけを保持する
間違った方法を選ぶと、モデルが重要なコンテキストを失い、支離滅裂な回答を返す可能性があります。
def trim_history(history, max_messages=10, keep_system=True):
'''Keep the system message and the last N non-system messages.'''
system_msgs = [m for m in history if m['role'] == 'system']
non_system = [m for m in history if m['role'] != 'system']
if len(non_system) > max_messages:
non_system = non_system[-max_messages:]
print(f'Trimmed to last {max_messages} messages.')
return system_msgs + non_system if keep_system else non_system
history = [{'role': 'system', 'content': 'You are a tutor.'}]
for i in range(15):
history.append({'role': 'user', 'content': f'Question {i}'})
history.append({'role': 'assistant', 'content': f'Answer {i}'})
trimmed = trim_history(history, max_messages=6)
print('Trimmed history length:', len(trimmed))マルチターンのコンテキストを実践で見る
コンテキストがどのように機能するか見てみましょう。マルチターンの会話では、モデルは以前のすべてのメッセージを使って、後続の質問に正しく回答します。
そのため、「それをもっと簡単に説明してください」と言うだけで、「それ」が何を指しているかを繰り返し説明する必要はありません。モデルは履歴全体を参照し、何を指しているのかを理解できるからです。
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
history = [{'role': 'system', 'content': 'You are a science teacher.'}]
# Turn 1
history.append({'role': 'user', 'content': 'What is photosynthesis?'})
r1 = client.chat.completions.create(model='gpt-4o', messages=history)
reply1 = r1.choices[0].message.content
history.append({'role': 'assistant', 'content': reply1})
# Turn 2 — refers to prior answer without repeating it
history.append({'role': 'user', 'content': 'Can you explain that using only 3 bullet points?'})
r2 = client.chat.completions.create(model='gpt-4o', messages=history)
print(r2.choices[0].message.content)ステートレスなAPIとステートフルなUX
ここで重要な点があります。APIは完全にステートレスです。サーバーは呼び出しと呼び出しの間で何も記憶しません。
ChatGPTのようなチャット製品は、会話履歴を独自のデータベースに保存し、それをすべてのAPI呼び出しに再び含めることで、記憶があるように見せています。同じ仕組みを自分で構築することもできます。
# Illustration: two isolated API calls vs one with history
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
# ❌ WITHOUT history — model has no memory
r1 = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'My dog is named Biscuit.'}]
)
r2 = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': "What's my dog's name?"}]
)
print('Without history:', r2.choices[0].message.content) # will not know
# ✅ WITH history injected
r3 = client.chat.completions.create(
model='gpt-4o',
messages=[
{'role': 'user', 'content': 'My dog is named Biscuit.'},
{'role': 'assistant', 'content': 'Got it, your dog is named Biscuit!'},
{'role': 'user', 'content': "What's my dog's name?"}
]
)
print('With history:', r3.choices[0].message.content)チャットインターフェースを使うための実践的なヒント
チャットインターフェースを最大限に活用するには、次の点を意識してください。
- 継続的に適用する指示は、すべてのユーザーターンで繰り返すのではなく、システムメッセージに記述する
- 以前のやり取りは簡潔に保つ — 冗長な履歴はすぐにトークンを消費する
- トピックを切り替えるときは、コンテキストの混入を避けるために新しいセッションを開始する
- 長期的なプロジェクトを再開するときは、過去のコンテキストから関連する部分だけを含める
# Good practice: compact system message + focused history
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
system = (
'You are a concise Python code reviewer. '
'Reply with: 1) one-line verdict, 2) top 3 issues, 3) fixed snippet.'
)
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=512,
system=system,
messages=[
{'role': 'user', 'content': 'def add(a,b): return a+b\nprint(add(1,2))'}
]
)
print(response.content[0].text)振り返り:チャットインターフェース
チャットインターフェースの仕組みに関する重要なポイントを確認しましょう。
- 3つの役割:systemがルールを設定し、userがプロンプトを送り、assistantが応答する
- 全履歴がすべてのAPI呼び出しで送信される — サーバーはステートレスである
- トークン制限がコンテキスト全体の上限になるため、上限に近づいたら削減または要約する
- セッションコンテキストは、自分のコードで管理する単なるリストである
- トピックを切り替えるときは新しいセッションを開始し、コンテキストを整理された状態に保つ
# Summary: minimal chat loop skeleton
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
history = [{'role': 'system', 'content': 'You are a helpful assistant.'}]
def ask(question):
history.append({'role': 'user', 'content': question})
res = client.chat.completions.create(model='gpt-4o', messages=history)
answer = res.choices[0].message.content
history.append({'role': 'assistant', 'content': answer})
return answer
print(ask('Hello! What can you help me with?'))理解度チェック
チャットインターフェースの仕組みについて、理解度を確認します。
ユーザーがまったく新しいセッションを開始し、AIに「昨日は何を話しましたか?」と尋ねました。AIには昨日のセッションの記憶がありません。なぜでしょうか。
学んだこと
これで、AIとのあらゆるチャットの基礎を理解できました。
- すべての会話の形を決めるsystem/user/assistantの役割構造
- 記憶を再現するため、すべての呼び出しで完全なメッセージ履歴が送信される仕組み
- APIがステートレスである理由と、その上にチャット製品が記憶機能を構築する方法
- トークン制限によるコンテキストへの制約と、その管理方法
このメンタルモデルは、より良いプロンプトを作成し、より賢いAI搭載アプリケーションを構築するのに役立ちます。
AI チューターと学ぶ AI Prompt Engineering — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 53
- レッスン
- 199
よくある質問
「チャットインターフェースを理解する」レッスンは無料ですか?
はい。「チャットインターフェースを理解する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Prompt Engineeringコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Prompt Engineeringコースには全4レッスンが含まれています。
「チャットインターフェースを理解する」で何を学びますか?
LLM のチャット UI の仕組みとして、役割、ターン、セッションコンテキストについて学びます。 ブラウザで直接実行するハンズオンコードでAI Prompt Engineeringを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Prompt Engineeringを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Prompt Engineeringは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「チャットインターフェースを理解する」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Prompt Engineeringレッスンでコードを書いて実行できますか?
はい。すべてのAI Prompt Engineeringレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- チャットインターフェースを理解する
- AI が処理できるリクエストの種類
- AI が応答を生成する仕組み
- AI にできないこと