AI 챗봇 만들기 입문 - ChatGPT API와 Claude API로 나만의 챗봇 구축하는 방법

AI 챗봇, 이제 누구나 만들 수 있습니다

2024년부터 AI 챗봇은 더 이상 대기업의 전유물이 아닙니다. OpenAI의 ChatGPT API와 Anthropic의 Claude API가 공개되면서, Python 기초만 알면 누구나 자신만의 챗봇을 만들 수 있는 시대가 열렸습니다.

이 가이드는 프로그래밍 경험이 있지만 AI API를 처음 다루는 개발자를 대상으로 합니다. 프론트엔드 개발자, 백엔드 입문자, 사이드 프로젝트를 시작하려는 분 모두 환영합니다. 이 글을 끝까지 따라하면 실제로 동작하는 AI 챗봇 하나를 완성하게 됩니다.

구체적으로 다루는 내용은 다음과 같습니다:

  • ChatGPT API(GPT-4o)와 Claude API(Claude 4 Sonnet)의 차이점과 선택 기준
  • API 키 발급부터 첫 번째 대화 완성까지 단계별 진행
  • 대화 기록 관리, 시스템 프롬프트 설계, 스트리밍 응답 구현
  • 간단한 웹 UI 연결로 실제 사용 가능한 챗봇 완성

예상 소요 시간은 2~3시간이며, 난이도는 초중급입니다. Python 기본 문법(함수, 딕셔너리, 리스트)을 알고 있다면 충분합니다. 터미널에서 pip install을 해본 적 있다면 더 좋습니다.

비용 걱정은 크게 하지 않아도 됩니다. 두 API 모두 소규모 테스트 용도로는 월 $5 이내로 충분하고, OpenAI는 가입 시 무료 크레딧을 제공하기도 합니다. Anthropic도 첫 사용자에게 제한된 무료 크레딧을 제공합니다.

사전 준비 사항

본격적인 개발에 들어가기 전에 아래 항목을 먼저 준비해주세요.

필수 도구

  • Python 3.9 이상 — 터미널에서 python —version으로 확인. 없다면 python.org에서 설치
  • 코드 에디터 — VS Code 추천 (무료). PyCharm, Cursor 등도 가능
  • 터미널 — macOS Terminal, Windows PowerShell, 또는 VS Code 내장 터미널

계정 및 API 키

  • OpenAI 계정 — platform.openai.com에서 가입 후 API 키 발급
  • Anthropic 계정 — console.anthropic.com에서 가입 후 API 키 발급
  • 결제 수단(신용카드) 등록 필요 — 사용한 만큼만 과금되며, 사용 한도를 설정할 수 있음

사전 지식

  • Python 기본 문법 (변수, 함수, 딕셔너리)
  • pip로 패키지 설치하는 방법
  • JSON 형식에 대한 기본 이해

예상 비용

API모델입력 1K 토큰출력 1K 토큰테스트 100회 예상 비용
OpenAIGPT-4o$0.0025$0.01약 $0.50~$1.50
OpenAIGPT-4o mini$0.00015$0.0006약 $0.05~$0.10
AnthropicClaude Sonnet 4$0.003$0.015약 $0.80~$2.00
AnthropicClaude Haiku 3.5$0.0008$0.004약 $0.15~$0.40
처음에는 저렴한 모델(GPT-4o mini 또는 Claude Haiku)로 개발하고, 품질이 필요한 부분만 상위 모델로 교체하는 전략이 가장 효율적입니다.

단계별 AI 챗봇 만들기

1단계: 프로젝트 환경 설정

먼저 프로젝트 폴더를 만들고 가상환경을 설정합니다. 가상환경은 프로젝트별로 패키지를 분리해서 충돌을 방지합니다.

mkdir my-chatbot cd my-chatbot python -m venv venv

macOS/Linux

source venv/bin/activate

Windows

venv\Scripts\activate

필요한 패키지를 설치합니다:

pip install openai anthropic python-dotenv flask

프로젝트 루트에 .env 파일을 만들어 API 키를 안전하게 저장합니다:

OPENAI_API_KEY=sk-proj-여기에_실제_키_입력 ANTHROPIC_API_KEY=sk-ant-여기에_실제_키_입력

**주의:** .env 파일은 절대 Git에 커밋하지 마세요. .gitignore에 반드시 추가하세요.

2단계: ChatGPT API 첫 호출

가장 간단한 형태의 ChatGPT API 호출부터 시작합니다. chatgpt_basic.py 파일을 만드세요:

import os from dotenv import load_dotenv from openai import OpenAI

load_dotenv() client = OpenAI(api_key=os.getenv(“OPENAI_API_KEY”))

response = client.chat.completions.create( model=“gpt-4o-mini”, messages=[ {“role”: “system”, “content”: “당신은 친절한 한국어 AI 어시스턴트입니다.”}, {“role”: “user”, “content”: “안녕하세요! AI 챗봇이 뭔가요?”} ], temperature=0.7, max_tokens=500 )

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

실행하면 AI가 생성한 답변이 터미널에 출력됩니다. 여기서 핵심 개념을 짚어보겠습니다:

  • model: 사용할 모델. gpt-4o-mini는 가성비가 좋고, gpt-4o는 품질이 더 높음
  • messages: 대화 기록 배열. system(AI 성격 설정), user(사용자 입력), assistant(AI 응답) 역할이 있음
  • temperature: 0에 가까울수록 일관된 답변, 1에 가까울수록 창의적인 답변
  • max_tokens: 응답 최대 길이 제한

3단계: Claude API 첫 호출

이번에는 같은 기능을 Claude API로 구현합니다. claude_basic.py를 만드세요:

import os from dotenv import load_dotenv import anthropic

load_dotenv() client = anthropic.Anthropic(api_key=os.getenv(“ANTHROPIC_API_KEY”))

response = client.messages.create( model=“claude-sonnet-4-20250514”, max_tokens=500, system=“당신은 친절한 한국어 AI 어시스턴트입니다.”, messages=[ {“role”: “user”, “content”: “안녕하세요! AI 챗봇이 뭔가요?”} ] )

print(response.content[0].text)

ChatGPT API와의 주요 차이점:

  • system 메시지가 messages 배열이 아닌 별도 파라미터로 분리되어 있음
  • 응답 구조가 다름 — response.content[0].text로 접근
  • 모델명 형식이 다름 — Anthropic은 날짜가 포함된 모델 ID 사용

팁: 두 API를 비교 테스트할 때 같은 프롬프트를 넣어보면 각 모델의 성격 차이를 확인할 수 있습니다. Claude는 좀 더 신중하고 구조적인 답변을, ChatGPT는 좀 더 대화적이고 자연스러운 답변을 하는 경향이 있습니다.

4단계: 대화 기록 관리 구현

실제 챗봇은 이전 대화를 기억해야 합니다. 대화 기록을 관리하는 클래스를 만들어봅시다. chat_manager.py를 작성합니다:

class ChatManager: def init(self, provider=“openai”, system_prompt=""): self.provider = provider self.system_prompt = system_prompt self.history = []

def add_user_message(self, content):
    self.history.append({"role": "user", "content": content})

def add_assistant_message(self, content):
    self.history.append({"role": "assistant", "content": content})

def get_messages(self):
    if self.provider == "openai":
        messages = [{"role": "system", "content": self.system_prompt}]
        messages.extend(self.history)
        return messages
    else:
        return self.history

def trim_history(self, max_turns=20):
    """대화가 너무 길어지면 오래된 것부터 제거"""
    if len(self.history) > max_turns * 2:
        self.history = self.history[-(max_turns * 2):]

이 클래스가 중요한 이유는 **토큰 비용 관리** 때문입니다. API는 매 요청마다 전체 대화 기록을 보내야 하므로, 대화가 길어질수록 비용이 증가합니다. trim_history 메서드로 오래된 대화를 잘라내면 비용을 절약할 수 있습니다.

5단계: 통합 챗봇 클래스 만들기

두 API를 하나의 인터페이스로 통합하는 챗봇 클래스를 만듭니다. chatbot.py를 작성하세요:

import os from dotenv import load_dotenv from openai import OpenAI import anthropic from chat_manager import ChatManager

load_dotenv()

class AIChatbot: def init(self, provider=“openai”, model=None, system_prompt=""): self.provider = provider self.chat = ChatManager(provider, system_prompt) self.system_prompt = system_prompt

    if provider == "openai":
        self.client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
        self.model = model or "gpt-4o-mini"
    elif provider == "anthropic":
        self.client = anthropic.Anthropic(
            api_key=os.getenv("ANTHROPIC_API_KEY")
        )
        self.model = model or "claude-sonnet-4-20250514"

def send(self, user_input):
    self.chat.add_user_message(user_input)
    
    if self.provider == "openai":
        response = self.client.chat.completions.create(
            model=self.model,
            messages=self.chat.get_messages(),
            temperature=0.7,
            max_tokens=1000
        )
        reply = response.choices[0].message.content
    
    elif self.provider == "anthropic":
        response = self.client.messages.create(
            model=self.model,
            max_tokens=1000,
            system=self.system_prompt,
            messages=self.chat.get_messages()
        )
        reply = response.content[0].text
    
    self.chat.add_assistant_message(reply)
    return reply

이제 어떤 API든 동일한 방식으로 사용할 수 있습니다:

# ChatGPT 사용 bot = AIChatbot(provider=“openai”, system_prompt=“한국어로 답변해주세요.”) print(bot.send(“Python이 뭐예요?”)) print(bot.send(“그걸로 뭘 만들 수 있나요?”)) # 이전 대화를 기억함

Claude 사용

bot2 = AIChatbot(provider=“anthropic”, system_prompt=“한국어로 답변해주세요.”) print(bot2.send(“Python이 뭐예요?”))

6단계: 스트리밍 응답 구현

실제 서비스에서는 응답이 한 글자씩 나타나는 스트리밍이 필수입니다. 사용자가 긴 응답을 기다리지 않아도 되기 때문입니다. 챗봇 클래스에 스트리밍 메서드를 추가합니다:

def send_stream(self, user_input): self.chat.add_user_message(user_input) full_reply = ""

if self.provider == "openai":
    stream = self.client.chat.completions.create(
        model=self.model,
        messages=self.chat.get_messages(),
        temperature=0.7,
        max_tokens=1000,
        stream=True
    )
    for chunk in stream:
        delta = chunk.choices[0].delta.content
        if delta:
            full_reply += delta
            print(delta, end="", flush=True)

elif self.provider == "anthropic":
    with self.client.messages.stream(
        model=self.model,
        max_tokens=1000,
        system=self.system_prompt,
        messages=self.chat.get_messages()
    ) as stream:
        for text in stream.text_stream:
            full_reply += text
            print(text, end="", flush=True)

print()  # 줄바꿈
self.chat.add_assistant_message(full_reply)
return full_reply

두 API 모두 stream=True 또는 .stream() 메서드를 사용하면 됩니다. 응답이 생성되는 즉시 한 조각씩 전달받을 수 있어 체감 응답 속도가 크게 개선됩니다.

7단계: 시스템 프롬프트 설계

챗봇의 성격과 능력은 시스템 프롬프트가 결정합니다. 용도별 예시를 살펴보겠습니다:

# 고객 상담 챗봇 customer_prompt = """당신은 ‘스마트스토어’의 고객 상담 AI입니다.

  • 항상 존댓말을 사용하세요.
  • 환불 규정: 수령 후 7일 이내 가능, 착용한 상품은 불가
  • 배송: 주문 후 2-3일, 제주/도서산간 추가 1-2일
  • 모르는 질문은 “담당자에게 연결해드리겠습니다”라고 답변하세요.
  • 절대 할인이나 보상을 임의로 약속하지 마세요."""

코딩 튜터 챗봇

tutor_prompt = """당신은 Python 코딩 튜터입니다.

  • 초보자 눈높이에서 설명하세요.
  • 코드 예제를 반드시 포함하세요.
  • 직접 답을 알려주기보다 힌트를 먼저 주세요.
  • 잘못된 코드를 보면 왜 틀렸는지 설명하고 수정 방향을 제시하세요."""

**좋은 시스템 프롬프트의 공통점:**

  • 역할을 명확히 정의한다
  • 해야 할 것과 하지 말아야 할 것을 구체적으로 나열한다
  • 답변 형식이나 어조를 지정한다
  • 예외 상황 처리 방법을 알려준다

8단계: Flask 웹 UI 연결

터미널 챗봇을 웹 브라우저에서 사용할 수 있도록 간단한 Flask 앱을 만듭니다. app.py를 작성하세요:

from flask import Flask, request, jsonify, render_template_string from chatbot import AIChatbot

app = Flask(name) bot = AIChatbot( provider=“openai”, system_prompt=“친절한 한국어 AI 어시스턴트입니다.” )

HTML_PAGE = """

내 AI 챗봇

🤖 내 AI 챗봇

"""

@app.route(’/’) def index(): return render_template_string(HTML_PAGE)

@app.route(‘/chat’, methods=[‘POST’]) def chat(): user_msg = request.json.get(‘message’, ”) reply = bot.send(user_msg) return jsonify({‘reply’: reply})

if name == ‘main’: app.run(debug=True, port=5000)

python app.py를 실행하고 브라우저에서 http://localhost:5000에 접속하면 채팅 UI가 나타납니다.

9단계: 에러 처리와 안전장치 추가

실제 서비스에서는 다양한 예외 상황에 대비해야 합니다. chatbot.pysend 메서드에 에러 처리를 추가합니다:

def send(self, user_input): self.chat.add_user_message(user_input)

try:
    if self.provider == "openai":
        response = self.client.chat.completions.create(
            model=self.model,
            messages=self.chat.get_messages(),
            temperature=0.7,
            max_tokens=1000
        )
        reply = response.choices[0].message.content
    elif self.provider == "anthropic":
        response = self.client.messages.create(
            model=self.model,
            max_tokens=1000,
            system=self.system_prompt,
            messages=self.chat.get_messages()
        )
        reply = response.content[0].text
except Exception as e:
    error_msg = str(e)
    if "rate_limit" in error_msg.lower():
        reply = "요청이 너무 많습니다. 잠시 후 다시 시도해주세요."
    elif "invalid_api_key" in error_msg.lower():
        reply = "API 키 설정을 확인해주세요."
    else:
        reply = "일시적인 오류가 발생했습니다. 다시 시도해주세요."
    # 실패한 사용자 메시지를 기록에서 제거
    self.chat.history.pop()
    return reply

self.chat.add_assistant_message(reply)
self.chat.trim_history()  # 대화 길이 관리
return reply

추가로 고려할 안전장치:

  • 입력 길이 제한: 사용자 메시지를 최대 2000자로 제한하여 토큰 낭비 방지
  • 속도 제한: 같은 사용자가 초당 여러 요청을 보내는 것을 차단
  • 비용 알림: 일일 API 호출 횟수를 카운팅하고 임계값 도달 시 알림

10단계: 배포 준비

로컬에서 잘 동작하는 챗봇을 실제 서비스로 배포하려면 몇 가지 추가 작업이 필요합니다:

  • requirements.txt 생성: pip freeze > requirements.txt
  • 환경변수 관리: 배포 환경에서 .env 대신 서버의 환경변수 설정 사용
  • WSGI 서버: 프로덕션에서는 Flask 개발 서버 대신 Gunicorn 사용
  • HTTPS: API 키가 네트워크를 통해 전송되므로 반드시 HTTPS 적용

간단한 배포는 Railway, Render, Fly.io 같은 서비스를 추천합니다. Docker 없이 Git push만으로 배포할 수 있습니다.

흔한 실수와 해결법

1. API 키를 코드에 직접 하드코딩

절대 하지 마세요. GitHub에 푸시하는 순간 봇이 키를 스캔하여 악용합니다. 실제로 API 키가 유출되어 수백 달러의 요금이 청구된 사례가 빈번합니다. 대신 이렇게 하세요: .env 파일과 python-dotenv를 사용하고, .gitignore.env를 추가하세요.

2. 대화 기록을 무한정 보내기

대화가 50턴을 넘어가면 한 번 요청에 수천 토큰이 소모됩니다. 비용이 기하급수적으로 증가합니다. 대신 이렇게 하세요: 최근 15~20턴만 유지하고 오래된 대화는 잘라내세요. 또는 이전 대화를 요약하여 system 프롬프트에 넣는 방식도 효과적입니다.

3. 에러 처리 없이 바로 배포

API는 언제든 실패할 수 있습니다. rate limit, 네트워크 오류, 서버 점검 등 다양한 이유가 있습니다. 에러 처리가 없으면 사용자에게 Python traceback이 그대로 노출됩니다. 대신 이렇게 하세요: try-except로 감싸고, 사용자 친화적인 에러 메시지를 반환하세요.

4. system 프롬프트를 너무 길게 작성

system 프롬프트도 토큰으로 과금됩니다. 2000토큰짜리 시스템 프롬프트는 매 요청마다 약 $0.005가 추가됩니다. 하루 1000건이면 $5입니다. 대신 이렇게 하세요: 시스템 프롬프트는 300토큰(약 400~500자) 이내로 핵심만 담으세요.

5. ChatGPT와 Claude API 코드를 섞어서 작성

두 API의 요청/응답 형식이 다릅니다. messages 구조, system 메시지 위치, 응답 접근 방식이 모두 다릅니다. 복사-붙여넣기로 섞으면 에러가 발생합니다. 대신 이렇게 하세요: 이 가이드의 5단계처럼 provider 패턴으로 분기 처리하거나, 각 API별로 별도 어댑터를 만드세요.

자주 묻는 질문 (FAQ)

Q1. ChatGPT API와 Claude API 중 어떤 것을 선택해야 하나요?

용도에 따라 다릅니다. 일반 대화, 창의적 글쓰기는 ChatGPT(GPT-4o)가 좀 더 자연스럽습니다. 긴 문서 분석, 코드 작성, 지침 준수가 중요한 작업에는 Claude가 강점을 보입니다. 비용 차이는 크지 않으므로, 두 API를 모두 테스트해보고 자신의 용도에 맞는 것을 선택하는 것을 권장합니다. 이 가이드처럼 통합 클래스를 만들어두면 언제든 쉽게 전환할 수 있습니다.

Q2. API 비용을 줄이려면 어떻게 해야 하나요?

세 가지 핵심 전략이 있습니다. 첫째, 저렴한 모델부터 시작하세요. GPT-4o mini나 Claude Haiku는 가격이 10분의 1 수준이면서 대부분의 대화에 충분합니다. 둘째, 대화 기록을 관리하여 불필요한 토큰 전송을 줄이세요. 셋째, 캐싱을 적용하여 동일한 질문에 대해 API를 반복 호출하지 않도록 하세요. 자주 묻는 질문은 미리 답변을 저장해두는 것도 좋은 방법입니다.

Q3. 챗봇에 외부 데이터(PDF, 웹사이트 등)를 연결하려면 어떻게 하나요?

이것을 RAG(Retrieval-Augmented Generation)라고 합니다. 기본 원리는 간단합니다: 외부 데이터를 텍스트로 변환 → 벡터 DB에 저장 → 사용자 질문과 관련된 부분을 검색 → 검색 결과를 프롬프트에 포함하여 API 호출. Python에서는 langchain이나 llama-index 라이브러리를 사용하면 비교적 쉽게 구현할 수 있습니다. 이 주제는 별도의 심화 가이드가 필요한 분량입니다.

Q4. 회사 내부용 챗봇을 만들 때 보안 측면에서 주의할 점은?

가장 중요한 것은 민감 정보 유출 방지입니다. API로 전송된 데이터는 OpenAI나 Anthropic 서버를 거칩니다. 기밀 데이터를 직접 보내지 않도록 주의하세요. 두 회사 모두 API 데이터를 모델 훈련에 사용하지 않는다고 명시하고 있지만, 규정이 엄격한 환경에서는 Azure OpenAI Service나 AWS Bedrock처럼 자체 인프라에서 호스팅되는 옵션을 검토하세요. 또한 사용자 입력에 대한 유효성 검사와 프롬프트 인젝션 방지도 필수입니다.

Q5. 무료로 AI 챗봇을 운영할 수 있나요?

완전 무료는 어렵지만 거의 무료에 가까운 운영은 가능합니다. GPT-4o mini 기준으로 하루 100건 정도의 대화는 월 $3 미만으로 처리할 수 있습니다. 서버 비용은 Railway나 Render의 무료 티어를 활용하면 됩니다. 오픈소스 모델(Llama 3, Mistral 등)을 자체 서버에서 돌리면 API 비용을 완전히 없앨 수 있지만, GPU 서버 비용이 발생하므로 소규모에서는 오히려 더 비쌀 수 있습니다.

요약 및 다음 단계

이 가이드를 통해 다음을 완성했습니다:

  • ChatGPT API와 Claude API의 기본 호출 방법 이해
  • 대화 기록을 관리하는 ChatManager 클래스 구현
  • 두 API를 통합하는 AIChatbot 클래스 개발
  • 스트리밍 응답으로 사용자 경험 개선
  • 효과적인 시스템 프롬프트 설계 방법 학습
  • Flask 웹 UI를 통한 실제 동작하는 챗봇 완성
  • 에러 처리와 보안 안전장치 적용

다음으로 도전해볼 것들:

  • RAG 구현: 자신의 PDF나 문서를 기반으로 답변하는 챗봇으로 확장
  • Function Calling: AI가 날씨 API, 데이터베이스 등 외부 도구를 호출하도록 구현
  • 멀티모달: 이미지를 이해하고 분석하는 챗봇으로 업그레이드 (GPT-4o, Claude 모두 이미지 입력 지원)
  • 프레임워크 활용: LangChain, LlamaIndex 등을 사용하여 더 복잡한 AI 애플리케이션 구축
  • 프로덕션 배포: Docker, 로드밸런서, 모니터링을 갖춘 실제 서비스 환경 구성

AI 챗봇 개발은 빠르게 진화하고 있습니다. 오늘 기본기를 익혔다면, 내일은 더 복잡하고 유용한 AI 애플리케이션을 만들 수 있을 것입니다. 핵심은 작게 시작해서 점진적으로 확장하는 것입니다.

다른 도구 둘러보기

Antigravity AI 콘텐츠 파이프라인 자동화 가이드: Google Docs에서 WordPress 퍼블리싱까지 가이드 Bolt.new 사례 연구: 마케팅 에이전시가 하루 만에 클라이언트 대시보드 5개 구축 사례 Bolt.new 베스트 프랙티스: 자연어 프롬프트로 풀스택 앱 빠르게 생성하기 모범사례 ChatGPT 고급 데이터 분석(코드 인터프리터) 완벽 가이드: 업로드부터 시각화까지 가이드 ChatGPT Custom GPTs 고급 가이드: Actions, API 통합, 지식 베이스 설정 가이드 ChatGPT 음성 모드 가이드: 음성 중심 고객 서비스와 내부 워크플로우 구축 가이드 Claude API 프로덕션 챗봇 가이드: 안정적인 AI 어시스턴트를 위한 시스템 프롬프트 아키텍처 가이드 Claude Artifacts 활용 베스트 프랙티스: 인터랙티브 대시보드, 문서, 코드 미리보기 만들기 모범사례 Claude Code Hooks 가이드: Pre/Post 실행 훅으로 커스텀 워크플로우 자동화하기 가이드 Claude MCP 서버 설정 가이드: Claude Code와 Desktop을 위한 커스텀 도구 통합 가이드 Cursor 사례 연구: 1인 창업자가 AI 코딩으로 2주 만에 Next.js SaaS MVP 구축 사례 Cursor Composer 완벽 가이드: 멀티 파일 편집, 인라인 Diff, 에이전트 모드 가이드 Cursor Rules 고급 가이드: 프로젝트별 AI 설정과 팀 코딩 표준 가이드 Devin AI 팀 워크플로우 통합 베스트 프랙티스: Slack, GitHub, 코드 리뷰 자동화 모범사례 Devin 사례 연구: 500개 패키지 Python 모노레포 의존성 자동 업그레이드 사례 ElevenLabs 사례 연구: 에드테크 스타트업이 6주 만에 200시간 강의를 8개 언어로 현지화 사례 ElevenLabs 다국어 더빙 가이드: 글로벌 콘텐츠를 위한 자동화된 영상 현지화 워크플로우 가이드 ElevenLabs Voice Design 완벽 가이드: 게임, 팟캐스트, 앱을 위한 일관된 캐릭터 음성 만들기 가이드 Gemini 2.5 Pro vs Claude Sonnet 4 vs GPT-4o: AI 코드 생성 비교 2026 비교 Gemini API 멀티모달 개발자 가이드: 이미지, 비디오, 문서 분석 코드 예제 가이드