AI 개발 가이드

파이썬으로 AI 챗봇 만들기 - 초보자도 30분이면 완성

소개왕 탑백귀 2026. 4. 4. 09:53

파이썬으로 AI 챗봇 만들기 - 초보자도 30분이면 완성

2026년 4월 기준 | AI 개발 가이드 · 입문 튜토리얼

이 글에서 만드는 것: 터미널에서 동작하는 대화형 AI 챗봇입니다. Claude API를 사용하며, 대화 기록을 기억하고, 시스템 프롬프트로 성격을 지정할 수 있습니다. 코드 전체를 단계별로 설명합니다.

어떤 챗봇을 만드나

ChatGPT처럼 대화를 주고받는 챗봇을 만듭니다. 단, 웹 UI가 아니라 터미널에서 동작합니다. 이유는 간단합니다. UI를 만드는 데 시간 쓰지 않고, AI 핵심 로직에만 집중하기 위해서입니다.

완성하면 이런 모습입니다:

나: 파이썬에서 리스트와 튜플의 차이가 뭐야?

AI: 리스트와 튜플의 가장 큰 차이는 변경 가능 여부입니다.

- 리스트(list): 생성 후 요소를 추가, 삭제, 수정할 수 있습니다.
- 튜플(tuple): 한 번 생성하면 변경할 수 없습니다.

실무에서는 변경될 수 있는 데이터는 리스트, 변경되면 안 되는
데이터(좌표, 설정값 등)는 튜플로 관리합니다.

나: 그럼 언제 튜플을 쓰는 게 좋아?

AI: 튜플은 이런 경우에 유리합니다...

준비물

pip install anthropic

1단계: 최소 기능 챗봇

가장 단순한 형태부터 시작합니다. 질문을 입력하면 AI가 답하는 구조입니다.

import anthropic

client = anthropic.Anthropic()

while True:
    user_input = input("\n나: ")

    if user_input.lower() in ("quit", "exit", "종료"):
        print("챗봇을 종료합니다.")
        break

    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=1024,
        messages=[{"role": "user", "content": user_input}]
    )

    print(f"\nAI: {response.content[0].text}")

15줄로 동작하는 챗봇입니다. 하지만 치명적인 문제가 있습니다. 이전 대화를 기억하지 못합니다. 매 질문이 독립적인 새 대화로 처리됩니다.

2단계: 대화 기록 기억하기

대화 기록을 리스트에 쌓아서 매번 API에 함께 보내면 됩니다.

import anthropic

client = anthropic.Anthropic()
conversation = []  # 대화 기록 저장

while True:
    user_input = input("\n나: ")

    if user_input.lower() in ("quit", "exit", "종료"):
        break

    # 사용자 메시지를 기록에 추가
    conversation.append({"role": "user", "content": user_input})

    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=1024,
        messages=conversation  # 전체 대화 기록 전달
    )

    ai_message = response.content[0].text

    # AI 응답도 기록에 추가
    conversation.append({"role": "assistant", "content": ai_message})

    print(f"\nAI: {ai_message}")

핵심은 conversation 리스트입니다. 사용자 메시지와 AI 응답을 계속 쌓아가면서 매번 전체를 API에 보냅니다. 이러면 AI가 이전 맥락을 이해하고 답변합니다.

주의: 대화가 길어지면 토큰 사용량(= 비용)이 늘어납니다. 대화 20~30턴이 넘으면 오래된 기록을 잘라내는 로직을 추가하는 것이 좋습니다.

3단계: 시스템 프롬프트로 성격 부여

시스템 프롬프트를 지정하면 챗봇에 성격을 줄 수 있습니다. 예를 들어 "파이썬 전문 튜터"로 설정하면, 모든 답변을 파이썬 학습자 관점에서 해줍니다.

import anthropic

client = anthropic.Anthropic()
conversation = []

# 챗봇 성격 설정
SYSTEM_PROMPT = """당신은 친절한 파이썬 프로그래밍 튜터입니다.
- 초보자도 이해할 수 있게 쉬운 말로 설명합니다.
- 설명할 때 항상 코드 예제를 포함합니다.
- 한국어로 답변합니다.
- 질문이 모호하면 되물어봅니다."""

print("파이썬 튜터 챗봇입니다. '종료'를 입력하면 끝납니다.\n")

while True:
    user_input = input("나: ")

    if user_input.lower() in ("quit", "exit", "종료"):
        break

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

    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=1024,
        system=SYSTEM_PROMPT,  # 시스템 프롬프트 추가
        messages=conversation
    )

    ai_message = response.content[0].text
    conversation.append({"role": "assistant", "content": ai_message})

    print(f"\nAI: {ai_message}\n")

시스템 프롬프트를 바꾸면 완전히 다른 챗봇이 됩니다:

  • 영어 회화 연습: "You are an English conversation partner. Respond in English and correct grammar mistakes."
  • 코드 리뷰어: "당신은 시니어 개발자입니다. 코드를 보면 버그, 보안 취약점, 개선점을 지적합니다."
  • 요리 도우미: "당신은 한식 요리 전문가입니다. 재료를 알려주면 레시피를 추천합니다."

4단계: 완성 - 스트리밍 응답

마지막으로 스트리밍을 추가합니다. 스트리밍이란 AI가 답변을 생성하는 동시에 한 글자씩 화면에 출력하는 것입니다. ChatGPT에서 글자가 타이핑되듯 나오는 그 효과입니다.

import anthropic

client = anthropic.Anthropic()
conversation = []

SYSTEM_PROMPT = """당신은 친절한 파이썬 프로그래밍 튜터입니다.
초보자도 이해할 수 있게 쉬운 말로, 코드 예제와 함께 설명합니다."""

print("파이썬 튜터 챗봇입니다. '종료'를 입력하면 끝납니다.\n")

while True:
    user_input = input("나: ")

    if user_input.lower() in ("quit", "exit", "종료"):
        break

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

    print("\nAI: ", end="", flush=True)

    full_response = ""

    # 스트리밍으로 응답 받기
    with client.messages.stream(
        model="claude-sonnet-4-20250514",
        max_tokens=1024,
        system=SYSTEM_PROMPT,
        messages=conversation
    ) as stream:
        for text in stream.text_stream:
            print(text, end="", flush=True)
            full_response += text

    print("\n")

    conversation.append({"role": "assistant", "content": full_response})

바뀐 부분은 client.messages.createclient.messages.stream으로 변경된 것뿐입니다. stream.text_stream으로 실시간으로 텍스트 조각을 받아서 출력합니다.

스트리밍을 쓰면 체감 속도가 확 빨라집니다. 전체 응답을 기다리지 않고 바로 읽기 시작할 수 있으니까요.

더 발전시키려면

이 기본 챗봇을 기반으로 확장할 수 있는 방향들입니다.

  • 웹 UI 추가: Streamlit이나 Gradio를 쓰면 10줄 추가로 웹 챗봇이 됩니다
  • 대화 저장: conversation을 JSON 파일로 저장하면 다음에 이어서 대화 가능
  • RAG 추가: 문서를 읽어서 답변에 반영하는 기능 (다음 글에서 다룰 예정)
  • 도구 사용: 계산기, 웹 검색 등 외부 도구를 연결하면 더 똑똑한 챗봇이 됩니다

30분이면 만들 수 있는 기본 챗봇이지만, 여기서 출발하면 꽤 복잡한 AI 서비스까지 확장할 수 있습니다. 핵심은 API 호출 구조를 이해하는 것이고, 이 글의 4단계를 따라오셨다면 이미 충분히 이해하신 겁니다.

전체 코드: 이 글의 최종 완성 코드는 4단계 코드입니다. 복사해서 바로 실행할 수 있습니다. Python 3.10+, anthropic 라이브러리, API 키만 있으면 됩니다.