[파이썬 16] 간단한 챗봇 만들어보기, 터미널에서 대화하는 AI


이전 편에서 API 호출 기본기를 다뤘으니, 이번엔 그걸 조합해서 실제로 터미널에서 계속 대화할 수 있는 챗봇 하나를 완성한다. 핵심 구조는 "무한 반복문 + 대화 기록 리스트 + API 호출" 세 가지의 조합이다.


1. 기본 뼈대, while문으로 계속 대화받기


앞서 배운 while 반복문과 API 호출을 결합하면 기본적인 챗봇 구조가 완성된다.


import anthropic


client = anthropic.Anthropic()

history = []


print("챗봇 준비완료. 종료하려면 'quit' 입력\n")


while True:

user_input = input("나: ").strip()

if user_input.lower() == "quit":

break

if not user_input:

continue


history.append({"role": "user", "content": user_input})


response = client.messages.create(

model="claude-sonnet-4-6",

max_tokens=1024,

messages=history

)


reply = response.content[0].text

history.append({"role": "assistant", "content": reply})

print(f"챗봇: {reply}\n")


history 리스트가 대화 전체를 기억하는 역할을 한다. 사용자가 "내 이름은 철수야"라고 말한 뒤 나중에 "내 이름이 뭐였지?"라고 물으면, 이 리스트에 이전 내용이 그대로 남아있기 때문에 챗봇이 맥락을 이어서 답할 수 있다.


2. 시스템 프롬프트로 성격 부여하기


system 파라미터를 활용하면 챗봇에게 특정 역할이나 말투를 부여할 수 있다. 예를 들어 요리 전문가, 언어 튜터, 재무 상담가처럼 원하는 캐릭터를 만들 수 있다.


response = client.messages.create(

model="claude-sonnet-4-6",

max_tokens=1024,

system="당신은 지중해 요리를 전문으로 하는 셰프입니다. 친근하지만 전문적으로 답하세요.",

messages=history

)


3. 실시간으로 글자가 나오게, 스트리밍


기본 방식은 응답이 완성될 때까지 기다렸다가 한 번에 출력하는데, 사람이 타이핑하듯 글자가 하나씩 나오게 하려면 스트리밍 기능을 쓴다.


with client.messages.stream(

model="claude-sonnet-4-6",

max_tokens=1024,

messages=history

) as stream:

reply_text = ""

for text in stream.text_stream:

print(text, end="", flush=True)

reply_text += text

print()


history.append({"role": "assistant", "content": reply_text})


스트리밍은 사용자가 기다리는 체감 시간을 크게 줄여주기 때문에, 실시간 대화형 UI에서는 거의 필수적으로 쓰이는 방식으로 소개된다.


4. 오류 처리, 대화가 끊기지 않게


API 호출이 실패해도 지금까지의 대화 기록은 안전하게 보존되도록 예외 처리를 넣는 게 안정적인 챗봇의 기본이다.


try:

response = client.messages.create(

model="claude-sonnet-4-6",

max_tokens=1024,

messages=history

)

reply = response.content[0].text

history.append({"role": "assistant", "content": reply})

print(f"챗봇: {reply}")

except Exception as e:

print(f"오류 발생: {e}")

print("걱정 마세요, 이전 대화 기록은 그대로 남아있습니다.")


5. 실무에서 고려할 점들


대화가 길어질수록 매번 통째로 다시 보내는 이전 편의 특성상, 최근 몇 개 메시지만 유지하거나 오래된 내용을 요약해서 대체하는 방식으로 History 크기를 관리하는 게 비용 관리 측면에서 권장된다. 또한 대량 요청 시 발생할 수 있는 RateLimitError 같은 예외는 잠시 대기 후 재시도하는 방식으로 대응하는 게 일반적이다.


6. 정리


챗봇의 본질은 특별할 게 없다. while 반복문으로 계속 입력을 받고, 대화 기록을 리스트에 쌓아 매번 API에 함께 보내고, 그 응답을 다시 화면에 출력하는 순환 구조다. 여기에 system 프롬프트로 성격을 입히고, 스트리밍으로 응답 속도감을 더하면 실제 서비스에서 보는 챗봇과 크게 다르지 않은 결과물이 완성된다.