채팅 인터페이스 이해하기
LLM 채팅 UI의 작동 방식인 역할, 대화 차례 및 세션 맥락을 알아봅니다.
채팅 인터페이스 이해하기은(는) CoddyKit의 무료 AI Prompt Engineering 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Prompt Engineering 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Prompt Engineering 강의에는 총 4개의 강의가 포함되어 있습니다.
세 가지 역할
LLM과 나누는 모든 대화는 시스템, 사용자, 어시스턴트라는 세 가지 역할을 기반으로 합니다.
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)차례와 대화 흐름
대화는 차례가 이어지는 순서입니다. 각 차례는 번갈아 진행됩니다. 사용자가 말하고, 어시스턴트가 응답한 다음, 사용자가 다시 말합니다.
모델은 모든 요청에서 전체 차례 기록을 확인합니다. 이것이 대화를 연속적인 대화처럼 느끼게 하는 요소입니다. 하지만 기술적으로 각 응용 프로그램 인터페이스 호출은 상태를 저장하지 않으며 매번 전체 맥락을 전달받습니다.
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 키를 가진 키-값 사전 목록일 뿐입니다.
코드에서 직접 이 목록을 관리합니다. 어시스턴트가 응답할 때마다 그 응답을 append한 뒤 다음 사용자 메시지를 append하고, 다음 호출에서 전체 목록을 다시 전송합니다.
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))토큰 제한 설명
모든 모델에는 토큰으로 측정되는 문맥 창이 있습니다. 토큰 하나는 영어에서 대략 문자 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')토큰 제한에 도달하면 일어나는 일
대화 기록이 문맥 창보다 길어지면 세 가지 방법을 사용할 수 있습니다:
- 잘라내기 — 가장 오래된 메시지 삭제
- 요약하기 — 모델에 이전 대화 차례를 짧은 요약으로 압축해 달라고 요청
- 슬라이딩 창 — 마지막 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)무상태 애플리케이션 프로그래밍 인터페이스, 상태 유지 사용자 경험
여기서 중요한 통찰을 얻을 수 있습니다. 애플리케이션 프로그래밍 인터페이스는 완전히 무상태입니다. 서버는 호출 사이에 아무것도 기억하지 않습니다.
ChatGPT와 같은 채팅 제품은 자체 데이터베이스에 대화 기록을 저장하고 모든 호출에 다시 삽입하여 기억하는 것처럼 보이게 합니다. 같은 메커니즘을 직접 구축할 수도 있습니다.
# 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)복습: 채팅 인터페이스
채팅 인터페이스가 작동하는 방식에 관한 핵심 개념을 복습해 보겠습니다:
- 세 가지 역할: 시스템은 규칙을 설정하고, 사용자는 프롬프트를 보내며, 어시스턴트는 답변합니다
- 모든 호출에서 전체 대화 기록이 전송됩니다 — 서버는 무상태입니다
- 토큰 제한이 전체 문맥의 크기를 제한하므로, 제한에 가까워지면 줄이거나 요약하십시오
- 세션 문맥은 자체 코드에서 관리하는 목록일 뿐입니다
- 주제를 전환할 때는 문맥을 깔끔하게 유지하도록 새 세션을 시작하십시오
# 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?'))이해도 확인
채팅 인터페이스의 작동 방식을 이해했는지 확인해 보십시오.
사용자가 완전히 새로운 세션을 시작하고 인공지능에 「어제 무엇을 논의했나요?」라고 묻습니다. 인공지능은 어제 세션을 기억하지 못합니다. 이유가 무엇일까요?
배운 내용
이제 모든 인공지능 채팅 상호 작용의 기초를 이해했습니다:
- 모든 대화의 형태를 결정하는 시스템/사용자/어시스턴트 역할 구조
- 기억을 모방하기 위해 모든 호출에서 전체 메시지 기록을 전송하는 방식
- 애플리케이션 프로그래밍 인터페이스가 무상태인 이유와 채팅 제품이 그 위에 기억 기능을 구축하는 방식
- 토큰 제한이 문맥을 제한하는 방식과 이를 관리하는 방법
이러한 개념적 모델은 더 나은 프롬프트를 작성하고 더 똑똑한 인공지능 기반 애플리케이션을 구축하는 데 도움이 됩니다.
자주 묻는 질문
“채팅 인터페이스 이해하기” 강의는 무료인가요?
네 — “채팅 인터페이스 이해하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Prompt Engineering 강의 전체를 잠금 해제할 수 있습니다. AI Prompt Engineering 강의에는 총 4개의 강의가 포함되어 있습니다.
“채팅 인터페이스 이해하기”에서 뭘 배우나요?
LLM 채팅 UI의 작동 방식인 역할, 대화 차례 및 세션 맥락을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 AI Prompt Engineering을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
AI Prompt Engineering을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 AI Prompt Engineering은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“채팅 인터페이스 이해하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 AI Prompt Engineering 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 AI Prompt Engineering 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.