byteforce

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

API로 Claude에 접근하기

구조화된 데이터 · 실습

Structured data — exercise

prefill과 stop_sequences만으로, 세 개의 AWS CLI 명령을 주석 없이 한 블록에 받아 봅니다. 프롬프트는 건드리지 않습니다. prefill을 ``````bash → 안내 문장으로 단계별로 다듬으며 출력이 어떻게 깨끗해지는지 직접 봅니다.

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

Stephen Grider · Anthropic 기술 스태프

stop sequence와 message prefill 개념이 확실히 잡히도록 아주 짧은 실습을 해 봅시다. 화면의 코드를 그대로 작성해 보세요. 프롬프트는 "세 가지 서로 다른 AWS CLI 명령 예시를 생성하라"입니다. 이 코드를 그냥 실행하면 대략 이런 출력이 나옵니다. 읽기 쉽게 마크다운으로 렌더링해 봤습니다. 명령 세 개가 나오긴 하지만, 주변에 설명이 잔뜩 붙습니다 — 헤더가 있고, 각 명령마다 번호가 매겨져 있죠.

이번 실습의 목표는, message prefill과 stop sequence만 써서 세 명령을 한 응답에 나란히, 부가 설명 없이 받는 것입니다. 프롬프트는 절대 수정하지 마세요. 힌트도 하나 드립니다 — prefill은 백틱 같은 문자에만 쓰는 게 아닙니다. 원하는 어떤 prefill 응답이든 넣을 수 있습니다. 잠시 영상을 멈추고 직접 해 보세요. 아니면 바로 풀이로 넘어가겠습니다.

풀이를 시작합니다. 먼저 prefill이나 stop 없이 나온 출력을 보길 권합니다. 보면 세 명령이 각각 백틱 세 개로 감싸여 있습니다. 그러니 좋은 출발점은, prefill로 백틱 세 개를 넣어 Claude에게 "바로 명령 작성부터 시작하고 초반 설명은 건너뛰라"고 알려 주는 것입니다. 그리고 stop sequence로도 닫는 백틱 세 개를 넣습니다. 어디까지 되는지 봅시다.

assistant 메시지를 넣고 백틱 세 개로 시작합니다. stop sequence는 닫는 백틱 세 개. 실행하면 초기 출력은 그럴듯하지만 완벽하진 않습니다. 명령 세 개는 나오는데, 맨 앞에 bash라는 단어가 붙습니다. 이 단어는 어디서 왔을까요?

Claude가 뭘 하려는지 보겠습니다. 우리가 prefill로 백틱 세 개를 줬습니다. 백틱 세 개를 쓰면 마크다운을 작성한다는 신호입니다. 마크다운 코드 블록을 열 때는 선택적으로 언어 식별자를 붙일 수 있습니다. 붙이면 렌더링 시 그 언어의 문법 강조가 적용됩니다. 그래서 Claude가 bash를 붙인 겁니다 — "이건 bash 스타일로 강조해 줘"라는 뜻이죠. 우리에겐 필요 없습니다.

해결법 하나는, prefill 자체에 bash를 우리가 직접 넣는 것입니다. 그러면 Claude에게 "너는 지금 마크다운 코드 블록 안에 있고, 그 안에 bash 명령을 써라"가 분명해집니다. 다시 실행하면 더 나아 보입니다.

여기서부터 손볼 게 두 가지 더 있습니다. 첫째, 가끔 명령이 하나만 나오는데, Claude가 코드 블록 세 개를 따로 쓰려는 신호입니다. 둘째, bash 코드 블록이다 보니 Claude가 bash 주석(# 이 명령은 …)을 끼워 넣기도 합니다. 실습 요구사항상 그런 주석은 원치 않습니다.

주석을 없애고 세 명령을 더 안정적으로 받으려면, 드렸던 힌트를 씁니다. prefill은 백틱 같은 문자에만 국한되지 않습니다. prefill로 Claude의 답변 방식을 강하게 유도할 수 있습니다. 그래서 이렇게 넣습니다 — "Here are all three commands in a single block without any comments:" 그리고 콜론과 줄바꿈을 넣어 마크다운이 다음 줄부터 시작되게 합니다.

실행하면 훨씬 안정적인 출력이 나옵니다. 계속 실행해도 대체로 원하는 결과가 나옵니다. 좋습니다. LLM 출력은 매번 조금씩 다르니, 핵심은 prefill과 stop으로 출력의 시작과 끝을 충분히 제약했다는 점입니다.

이 실습에서 할 일What you'll do

약 6분
1

prefill + stop_sequences만으로 세 명령을 한 응답에 받는다 — 프롬프트 수정 금지

2

주석·설명·헤더 없이 명령만 남긴다

3

prefill ``` → 출력 맨 앞에 bash가 붙는 문제를 관찰한다

4

prefill ```bash언어 식별자 문제를 해결한다

5

prefill에 안내 문장을 더해 주석·단일 블록 문제를 잡는다

6

핵심: prefill은 문자뿐 아니라 응답 방식을 강하게 유도한다

문제 — 주석 없이 명령 3개만

The exercise

프롬프트는 "세 가지 AWS CLI 명령 예시를 생성하라"입니다. 그냥 실행하면 명령은 나오지만 헤더·번호·코드펜스·설명이 잔뜩 붙습니다. 목표는 prefill과 stop_sequences만으로 명령 세 개를 주석 없이 한 블록에 받는 것입니다.

005_exercise.ipynb · 시작 코드
messages = []

prompt = """
Generate three different sample AWS CLI commands. Each should be very short.
"""

add_user_message(messages, prompt)

text = chat(messages)
print(text)
출력 · 그냥 실행 (군더더기 잔뜩)
Here are three sample AWS CLI commands:

1. List S3 buckets:
```bash
aws s3 ls
```
2. Describe EC2 instances:
```bash
aws ec2 describe-instances
```
3. List Lambda functions:
… (헤더·번호·코드펜스·설명이 계속) …

각 명령이 ```bash … ```로 감싸이고, 헤더·번호가 붙어 있습니다 — 복사·파싱이 번거롭습니다.

직접 해보기 풀이를 보기 전에 먼저 시도해 보세요

시작 코드를 노트북에 그대로 작성하고 실행해 출력 형태를 관찰하세요. 그런 다음 프롬프트는 건드리지 말고, add_assistant_message로 prefill을 넣고 chat(messages, stop_sequences=[...])로 stop을 줘서 주석 없이 명령 세 개만 받아 보세요.

  1. 먼저 prefill·stop 없이 실행해, 각 명령이 ```로 감싸이는 걸 확인합니다.
  2. prefill에 코드펜스를, stop에 닫는 코드펜스를 넣어 봅니다.
  3. 출력에 남는 군더더기(bash·주석)를 prefill을 다듬어 제거합니다.

막히면 아래 풀이를 단계별로 따라오세요.

풀이 1 — 코드펜스로 시작

Prefill with backticks

출력에서 명령이 ```로 감싸여 있으니, prefill로 ```를 넣어 "바로 명령부터 쓰고 초반 설명은 건너뛰라"고 신호합니다. stop_sequences에도 닫는 ```를 넣습니다.

풀이 1 · prefill = ```
messages = []
add_user_message(messages, prompt)
add_assistant_message(messages, "```")            # prefill: 코드펜스만

text = chat(messages, stop_sequences=["```"])
print(text)
출력 · 명령은 나오지만 bash가 새어 나옴
bash
aws s3 ls
aws ec2 describe-instances
aws lambda list-functions
왜 bash가?

명령은 셋 다 나오지만 맨 앞에 bash가 붙습니다. ```는 마크다운 코드 블록을 여는 신호라, Claude는 그 뒤에 언어 식별자(bash)를 붙이려 합니다. prefill 자체는 응답에 포함되지 않으니, 그 언어 식별자가 출력의 첫 글자로 새어 나온 것입니다.

풀이 2 — 언어까지 명시

Prefill ```bash

bash가 새어 나오지 않게, prefill에 ```bash를 직접 넣습니다. "너는 마크다운 코드 블록 안이고, 그 안에 bash 명령을 써라"가 분명해집니다.

풀이 2 · prefill = ```bash
messages = []
add_user_message(messages, prompt)
add_assistant_message(messages, "```bash")        # 언어 식별자까지 명시

text = chat(messages, stop_sequences=["```"])
print(text)
출력 · bash는 사라졌지만 주석이 낌
aws s3 ls
# List all S3 buckets
aws ec2 describe-instances
# Show running EC2 instances
aws lambda list-functions
남은 문제 두 가지
  • 가끔 명령이 하나만 나옵니다 — Claude가 코드 블록 세 개를 따로 쓰려는 신호.
  • bash 코드 블록이라 Claude가 bash 주석(# …)을 끼워 넣기도 합니다 — 요구사항상 원치 않습니다.

풀이 3 — 문장으로 강하게 유도

Guide with a sentence

힌트를 씁니다. prefill은 백틱에만 국한되지 않습니다 — 안내 문장으로 답변 방식을 강하게 끌고 갈 수 있습니다. prefill 앞에 "주석 없이 한 블록에"라는 문장을 넣고, 줄바꿈 뒤에 ```bash를 둡니다.

풀이 3 · 안내 문장 + ```bash
messages = []
add_user_message(messages, prompt)
add_assistant_message(
    messages,
    "Here are all three commands in a single block without any comments:\n```bash"
)

text = chat(messages, stop_sequences=["```"])
text.strip()
출력 · 주석 없는 명령 3개
'aws s3 ls\naws ec2 describe-instances\naws lambda list-functions'
결과

주석도 번호도 없는 명령 세 개만 깔끔하게 나옵니다. text.strip()으로 앞뒤 줄바꿈만 정리하면 끝입니다. LLM 출력은 매번 조금씩 달라도, prefill과 stop으로 시작과 끝을 충분히 제약한 점이 핵심입니다.

한눈에 — 단계별 비교

Side by side

네 단계를 직접 넘겨 보며, prefill이 출력을 어떻게 정리하는지 비교하세요.

prefill 단계별 실험 · 출력이 어떻게 깨끗해지나
Assistant prefill
stop_sequences
출력

단계를 눌러 보세요. prefill을 ``````bash안내 문장으로 다듬을수록, 출력에서 군더더기(bash 잔류·주석·번호)가 사라집니다.

무엇을 배웠나

Takeaway
핵심
  • prefill은 ``` 같은 문자뿐 아니라 안내 문장으로도 쓴다 — 응답 방식을 강하게 유도한다.
  • 코드펜스 뒤의 언어 식별자가 새어 나오면, prefill에 ```bash처럼 직접 명시한다.
  • stop_sequences로 닫는 펜스에서 끊고, strip()으로 앞뒤 줄바꿈을 정리한다.
  • LLM 출력은 매번 다를 수 있다 — prefill·stop으로 시작과 끝을 충분히 제약하는 게 목표다.

Q1prefill로 ```만 넣었더니 출력 맨 앞에 bash가 붙었다. 이유는?

Q2이 실습에서 프롬프트를 수정하지 않고 출력을 정리한 도구는?

Q3주석·단일 블록 문제를 가장 효과적으로 잡은 방법은?

MEMBER SESSION REQUIRED · REGISTRATION IS FREE

여기부터는 등록한 분에게 열립니다.

전 코스는 계속 무료입니다. 등록하면 이 코스의 남은 76개 레슨을 끝까지 읽을 수 있습니다.

등록하고 이어서 읽기

이미 등록하셨다면 그때 쓰신 이메일을 넣어 주세요.