byteforce

CPN 한국어 자습서 · 러닝패스 2 / 4 — Building with the Claude API

API로 Claude에 접근하기

챗봇 만들기 실습

Chat exercise

헬퍼 세 개를 한데 묶어, 노트북 안에서 도는 작은 챗봇을 만듭니다. 입력을 받고, 답을 받고, 그 답을 히스토리에 쌓는 한 바퀴를 직접 돌려보는 실습입니다.

전체 내레이션영상 나레이션 한국어 번역 (전체)

Stephen Grider · Anthropic 기술 스태프

지금까지 내용이 잘 이해됐는지 확인하는 간단한 실습을 해보겠습니다. 이번 실습에서는 Jupyter 노트북에서 도는 아주 작은 챗봇을 만듭니다.

동작 방식은 이렇습니다. 셀을 실행할 때마다 내장 input 함수로 사용자에게 텍스트를 입력받습니다. 입력한 내용을 메시지 목록에 추가하고, 그 목록을 방금 만든 chat 함수로 API에 넘깁니다. Claude가 생성한 텍스트가 돌아오면, 그 텍스트를 다시 메시지 목록에 추가합니다. 생성된 텍스트를 출력한 뒤 1단계로 돌아가 전체 과정을 반복합니다.

먼저 이게 어떻게 도는지 빠르게 보여드리겠습니다. 솔루션은 이미 만들어 이 셀 안에 숨겨 두었습니다. 셀을 다시 실행해 의도한 동작을 보여드리겠습니다. 셀을 실행하면 곧바로 내장 input 함수로 입력을 받습니다. input이 익숙하지 않아도 잠시 뒤에 설명하니 괜찮습니다.

“what's one plus one”처럼 입력합니다. 입력한 메시지가 바로 출력되고, chat 함수로 Claude의 응답을 받아 함께 출력합니다. 그러면 다시 입력을 받습니다. 이번에는 “그 답에 더해줘”처럼 후속 질문을 합니다. 대화의 히스토리, 즉 맥락이 유지되는 것을 확인할 수 있습니다. 이전 답 2에 더하면 4가 된다는 응답이 돌아옵니다. 이 과정은 Interrupt 버튼을 누르고 Esc를 칠 때까지 계속 반복됩니다.

input 함수가 익숙하지 않아도 괜찮습니다. 지금 힌트를 드리겠습니다. 템플릿으로 쓸 수 있는 코드를 붙여넣겠습니다. 전체 구조는 이렇습니다. 먼저 비어 있는 시작 메시지 목록을 만듭니다. 그다음 영원히 도는 while True 루프를 둡니다. 루프 안에서는 다시 내장 input 함수로 사용자에게 텍스트를 입력받습니다. 사용자가 입력창에 입력하면 그 값이 user_input 변수에 담깁니다. 단계별로 무엇을 해야 하는지는 주석으로 적어 두었습니다.

여기서 영상을 멈추고 직접 해보시길 권합니다. 아니면 계속 보시면 바로 솔루션을 함께 살펴보겠습니다.

어떻게 만드는지 보여드리겠습니다. 나머지는 적어 둔 주석을 그대로 따라가면 됩니다. 먼저 사용자 입력을 방금 만든 add_user_message 함수로 메시지 목록에 추가합니다. add_user_message를 호출해 메시지 목록과 user_input을 넘깁니다. 그다음 내장 chat 함수로 Claude를 호출하며 메시지 목록을 넘기면 answer가 돌아옵니다.

그 answer를 add_assistant_message로 assistant 메시지로서 목록에 추가합니다. 마지막으로 생성된 텍스트를 출력합니다. 선택적으로 대시 세 개로 구분선을 넣어, 이 텍스트가 AI가 생성한 것임을 분명히 할 수 있습니다. 대시 세 개를 출력하고, 그 사이에 받은 answer를 출력합니다. 그게 전부입니다.

실행해서 테스트해 보겠습니다. 셀을 실행하면 Claude와 대화를 시작한 뒤 셀 아래에 출력이 보입니다. “what's one plus one”이라고 물어보고 응답을 받습니다. 이어서 “two more”, 즉 2를 더해달라고 하면 1+1에 2를 더해 4가 된다는 응답이 보입니다. 좋습니다. 아주 단순한 반복 챗봇을 이렇게 구현했습니다.

이 장에서 배우는 것What you'll learn

약 4분
1

내장 input으로 사용자 입력 받기

2

while True 루프로 대화를 계속 돌리기

3

매 턴 add_user_message·add_assistant_message로 히스토리 누적

4

전체 히스토리를 다시 보내야 멀티턴 기억이 된다

5

영원히 도는 루프를 멈추는 법 — Interrupt

해볼 것

The challenge

방금 만든 헬퍼 함수 세 개로 작은 챗봇을 만듭니다. 셀을 실행하면 사용자에게 입력을 받아 Claude와 주고받기를 계속 반복합니다.

1입력 받기
2목록에 추가
3API 호출
4답을 목록에
5출력
6반복
진행

input이 익숙하지 않아도 괜찮습니다. 아래에 시작 템플릿을 드립니다. 직접 채워 본 뒤 솔루션을 펼쳐 비교하면 가장 잘 남습니다.

헬퍼 세 개 복습

Recap: three helpers

이 셋은 앞 레슨 멀티턴 대화에서 만들었습니다. 실습은 이걸 그대로 씁니다. 노트북에 이미 정의돼 있다면 다시 실행할 필요는 없습니다.

헬퍼 함수하는 일
add_user_message받은 텍스트를 {"role": "user", "content": text}로 만들어 목록 끝에 추가합니다.
add_assistant_message같은 일을 하되 role"assistant"입니다. Claude의 답을 목록에 넣을 때 씁니다.
chat현재 목록 전체create()로 보내고, 응답에서 content[0].text만 꺼내 돌려줍니다.
Code헬퍼 코드 다시 보기
헬퍼 세 개 · 노트북 셀
def add_user_message(messages, text):
    user_message = {"role": "user", "content": text}
    messages.append(user_message)


def add_assistant_message(messages, text):
    assistant_message = {"role": "assistant", "content": text}
    messages.append(assistant_message)


def chat(messages):
    message = client.messages.create(
        model=model,
        max_tokens=1000,
        messages=messages,
    )
    return message.content[0].text

시작 템플릿

Starting template

input은 사용자에게 한 줄을 입력받아 돌려주는 파이썬 내장 함수입니다. 아래 템플릿으로 시작하세요. 빈 메시지 목록과 while True 루프, 입력 받는 부분까지는 채워져 있습니다. 주석 네 줄을 채우면 됩니다.

시작 템플릿 · 노트북 셀
# 시작 메시지 목록 만들기
messages = []

# 'while True' 루프로 챗봇을 계속 돌립니다
while True:
    # 사용자 입력 받기
    user_input = input("> ")
    print(">", user_input)

    # 사용자 입력을 메시지 목록에 추가
    # 'chat' 함수로 Claude 호출
    # 생성된 텍스트를 메시지 목록에 추가
    # 생성된 텍스트 출력
input

input("> ")"> " 프롬프트를 띄우고, 사용자가 Enter를 칠 때까지 기다렸다가 입력한 문자열을 돌려줍니다. 그 값이 user_input에 담깁니다.

직접 해보세요
  • 위 템플릿을 노트북 셀에 붙여넣습니다.
  • 주석 네 줄을 헬퍼 호출로 채웁니다.
  • 셀을 실행해 Claude와 대화해 봅니다. 막히면 아래 솔루션을 펼치세요.

솔루션

Solution

나머지는 주석을 그대로 따라가면 됩니다. 사용자 입력을 목록에 넣고, 목록 전체를 chat에 보내 답을 받고, 그 답을 다시 목록에 넣은 뒤 출력합니다.

Solution솔루션 보기 — 먼저 직접 해보셨나요?
솔루션 · 노트북 셀
# 시작 메시지 목록 만들기
messages = []

# 'while True' 루프로 챗봇을 계속 돌립니다
while True:
    # 사용자 입력 받기
    user_input = input("> ")
    print(">", user_input)

    # 사용자 입력을 메시지 목록에 추가
    add_user_message(messages, user_input)
    # 'chat' 함수로 Claude 호출
    answer = chat(messages)
    # 생성된 텍스트를 메시지 목록에 추가
    add_assistant_message(messages, answer)
    # 생성된 텍스트 출력
    print("---")
    print(answer)
    print("---")

각 줄이 하는 일:

  • add_user_message(messages, user_input) — 사용자가 친 내용을 user 메시지로 목록에 넣습니다.
  • answer = chat(messages) — 목록 전체를 Claude에 보내고 답을 받습니다.
  • add_assistant_message(messages, answer) — 받은 답을 assistant 메시지로 목록에 넣습니다. 이게 있어야 다음 턴에 이 답까지 함께 전송됩니다.
  • print("---") · print(answer) · print("---") — 답을 구분선과 함께 출력합니다. 구분선은 선택이지만, AI가 생성한 부분임을 분명히 해 줍니다.

실행 결과 — 왜 기억하는가

Running it: why it remembers

셀을 실행하면 입력창이 뜹니다. What's 1+1?1+1 = 2. 이어서 And 2 more?라고 하면 — 그 자체로는 무엇에 2를 더하라는 건지 모호한데도 — 2 + 2 = 4라고 답합니다. 이전 질문과 답이 messages에 남아 있고, 매 턴 그 전체를 다시 보내기 때문입니다. 아래에서 한 턴씩 돌려 보세요.

챗봇 루프 시뮬레이터 · 한 턴씩 돌려보기

대화

사용자가 보는 화면

messages

실제로 API에 보내는 것

[▸ messages 전체를 chat()으로 전송]
messages: 0개

위젯의 오른쪽이 핵심입니다. 사용자에게는 새 한 줄만 보이지만, 실제로는 매 턴 목록 전체가 API로 갑니다. 이게 대화가 이어지는 유일한 이유입니다.

루프 멈추기

Stopping the loop

while True는 조건이 항상 참이라 영원히 돕니다. 끝내려면 실행 중인 셀을 중단합니다.

Interrupt

Jupyter에서 툴바의 Interrupt(중단)를 누르고 입력창에서 Esc를 칩니다. 그러면 KeyboardInterrupt가 발생하며 루프가 멈춥니다. 이건 정상적인 종료 방법입니다 — 오류가 아닙니다.

자주 하는 실수

Common mistakes
주의
  • assistant 메시지를 안 넣으면 기억이 끊깁니다. add_assistant_message를 빼면 다음 요청에 직전 답이 빠진 채로 가서 Claude가 맥락을 잃습니다.
  • 매 턴 목록을 새로 만들면 히스토리가 사라집니다. messages = []는 루프 바깥에서 한 번만 — 루프 안에 두면 매번 초기화됩니다.
  • 구분선은 선택입니다. print("---")는 보기 좋게 하는 용도일 뿐, 동작과는 무관합니다.

퀴즈

Quick check

Q1이 챗봇이 이전 답까지 기억하는 이유는?

Q2루프 안에서 Claude의 답(answer)은 어떻게 처리하나요?

Q3영원히 도는 while True 루프를 멈추려면?