byteforce

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

프롬프트 엔지니어링 · 실습

프롬프트 실습

Exercise on prompting

이번에는 배운 프롬프트 엔지니어링 기법을 직접 적용해 봅니다. 학술 기사 한 단락에서 주제를 뽑아 JSON 배열로 돌려주는 형편없는 프롬프트(점수 2.8)를 받아, 명료하게·XML 태그·구체적으로 같은 기법을 하나씩 더하며 점수를 7점 이상으로 끌어올립니다.

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

Stephen Grider · Anthropic 기술 스태프

프롬프트 엔지니어링을 얼마나 익혔는지, 짧은 실습으로 점검해 봅시다. 이번 실습을 위해 003_exercise라는 새 노트북을 만들었습니다. 이건 꼭 받지 않아도 됩니다 — 제가 한 일은 작업 설명(task description)과 prompt input spec을 바꾸고, 아래쪽 extra_criteria를 조금 손본 게 전부입니다. 원한다면 지금 쓰던 노트북에서 직접 그 부분만 바꿔도 되고, 아니면 003_exercise를 받아 제 상태에 맞춰도 됩니다.

이 실습의 목표는, 이 모듈에서 배운 모든 프롬프트 엔지니어링 기법을 써서 기존 프롬프트를 개선하는 것입니다. 다룰 데이터셋은 학술 기사에서 뽑은 여러 텍스트 단락을 생성합니다. 여러분 프롬프트의 목표는 그 텍스트 단락을 받아 거기 담긴 주제를 전부 뽑아 문자열 JSON 배열로 만드는 것입니다.

여기서 ‘주제(topic)’란, 정말 단순하게 ‘이 기사가 무엇에 대해 이야기하나’를 뜻합니다. 예를 들어 태양광 패널에 관한 기사라면, 저는 문자열 JSON 배열 안에 ‘solar panels’가 들어 있길 바라고, 텍스트에 언급된 다른 주제들도 함께 담기길 원합니다. 프롬프트의 입력은 content 속성 하나뿐 — 텍스트 한 단락입니다.

지금 열어 둔 노트북에서는 이미 셀을 실행해 데이터셋을 생성해 두었습니다. 그리고 여러분을 위해 시작 프롬프트도 준비해 뒀는데, 지금은 꽤 많이 개선할 수 있는 아주 형편없는 프롬프트입니다. 이 프롬프트를 가지고 우리가 배운 여러 기법을 적용해 보세요. 진행 상황을 평가하려면 아래 셀을 실행하면 됩니다. 정확한 결과에 다가가도록 extra_criteria도 몇 개 넣어 뒀습니다.

평가를 돌릴 때마다 report.html(=output.html) 파일을 열어 무슨 일이 벌어지는지 더 잘 파악할 수 있다는 점을 기억하세요. 기본 상태의 그 단순한 프롬프트로는 제 평균 점수가 2.8이었습니다. 적어도 평균을 7점 정도 이상으로는 올리고 싶습니다. 평소처럼 여기서 영상을 멈추고 직접 해 보시길 권합니다. 계속 보고 싶다면, 바로 풀이로 넘어가겠습니다.

풀이를 시작합니다. 우리가 손볼 곳은 의심의 여지 없이 이 prompt 변수 하나입니다 — 이 프롬프트를 어떤 식으로든 개선해 더 나은 출력을 받아야 합니다. 가장 먼저 할 일은, 평가를 적어도 한 번 돌려 output.html을 만드는 것입니다. 그 파일을 열어, 출력이 왜 그렇게 낮게 채점됐는지 근거(reasoning)를 살펴보세요. 공통된 흐름이 보일 겁니다 — 바로 우리가 문자열 JSON 배열을 돌려주지 않는다는 점을 모델이 싫어합니다.

이걸 해결하려고, 프롬프트 안에서 단순하고 직접적으로 쓰는 기법을 씁니다. 이 content에서 모든 주제를 담은 문자열 JSON 배열을 받고 싶다면, Claude에게 원하는 바를 아주 단순하고 직접적으로 말해야 합니다. 그래서 프롬프트 첫 줄을 이렇게 바꿉니다 — “Extract key topics mentioned from a passage of text from a scholarly journal into a JSON array of strings.” 제가 표현할 수 있는 가장 단순하고 직접적인 문장으로요.

그리고 평가를 다시 돌리면, 거의 곧바로 놀랍게도 9.5까지 올라갑니다. 사실 이렇게까지 잘 될 줄은 몰랐습니다 — 아직 시도해 볼 다른 기법들이 남아 있으니까요. 리포트를 보면 이제 언급된 여러 주제를 담은 JSON이 제대로 돌아오고, 모델 채점기도 이 출력에 매우 만족하는 모습입니다.

여기서 멈추긴 아쉬우니, 정확한 출력을 더 확실히 하려고 다른 기법도 더해 봅니다. 다음 기법은 XML 태그로 프롬프트를 조금 더 구조화하는 것입니다. 끼워 넣을 content 앞뒤로 XML 태그를 두르고, 이름은 그냥 text라고 붙입니다. 첫 줄에서 ‘a passage of text’라고 ‘text’를 언급했으니, 우리가 말하는 그 텍스트와 실제로 제공하는 텍스트 사이의 연결이 조금 더 또렷해집니다.

또 하나 더할 개선은, 원하는 바를 아주 구체적으로 적는 것입니다. Claude가 따를 단계들을 적어 줄 수 있죠. ‘follow these steps’라고 하고 단계별로 적습니다 — 제공된 텍스트를 자세히 살펴라, 언급된 각 주제를 식별하라, 각 주제를 JSON 배열에 추가하라, 마지막으로 그 JSON 배열로만 답하라. 다른 텍스트나 부연 설명은 하지 마라.

원한다면 one-shot이나 multi-shot으로 예시를 더 넣어도 좋습니다. 하지만 이미 점수가 꽤 좋으니 이 정도면 충분하다고 봅니다. 이 프롬프트를 정리하고 평가를 다시 돌리면 또 9.5가 나옵니다. 꽤 튼튼한 프롬프트라고 할 수 있고, 기사에서 주제 목록을 뽑는 데 충분히 신뢰할 만합니다.

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

약 9분
1

형편없는 프롬프트(점수 2.8)를 받아 7점 이상으로 끌어올린다

2

과제: 학술 기사 한 단락(content)에서 주제를 뽑아 JSON 배열

3

먼저 평가를 1회 돌려 output.html채점 근거를 읽는다

4

명료하게 — 첫 줄을 단순·직접적으로 다시 써 점수를 끌어올린다

5

XML 태그로 content를 <text>로 감싸 연결을 또렷이 한다

6

구체적으로 — 단계(follow these steps)를 적고, 필요하면 예시까지

먼저 짚고 갈 용어
003_exercise 노트북
작업 설명·prompt_input_spec·extra_criteria만 바꾼 실습용 노트북. 직접 받지 않고 기존 노트북을 수정해도 된다.
topic(주제)
그 텍스트가 무엇에 대해 이야기하는가. 예: 태양광 기사 → "solar panels" 등.
content
이 프롬프트의 유일한 입력 — 학술 기사 텍스트 한 단락.
output.html
평가를 돌릴 때마다 생기는 리포트. 케이스별 출력·점수·근거가 담겨 어디를 고칠지 알려 준다.

문제 — 주제를 JSON 배열로

The exercise

이번 실습의 과제는 학술 기사 텍스트 한 단락(content)을 받아, 거기 담긴 주제를 전부 뽑아 문자열 JSON 배열로 돌려주는 것입니다. 강사는 작업 설명·prompt_input_spec·extra_criteria만 바꾼 003_exercise 노트북을 준비했습니다.

003_exercise.ipynb · 데이터셋(주제 추출)
# 003_exercise.ipynb — 실습은 이 세 곳만 바뀐
evaluator.generate_dataset(
    prompt_purpose="Extract the topics discussed in a passage from a scholarly article",
    prompt_input_spec={
        "content": "One paragraph of text from a scholarly article",
    },
    num_test_cases=3,
)

시작 프롬프트는 일부러 형편없게 두었습니다. 그냥 평가를 돌리면 낮은 점수가 나옵니다.

run_prompt · 형편없는 초안
def run_prompt(prompt_inputs):
    prompt = f"""
Here is some text. Tell me about it.

{prompt_inputs["content"]}
"""
    # 형편없는 초안 — 무엇을, 어떤 형식으로 원하는지 전혀 없음
    return chat(prompt)
출력 · 기준 점수
Average score: 2.8
# 근거: 출력이 문자열 JSON 배열이 아니다 — 공통적으로 지적됨
직접 해보기 풀이를 보기 전에 먼저 시도해 보세요

노트북에서 평가 셀을 최소 한 번 돌려 output.html을 만들고, 채점 근거를 읽으세요. 그런 다음 run_prompt프롬프트 변수만 고쳐 점수를 7점 이상으로 끌어올려 보세요.

  1. 명료하게 — 첫 줄에 "무엇을(주제) 어떤 형식으로(문자열 JSON 배열)" 원하는지 단순·직접적으로 적습니다.
  2. XML 태그 — 끼워 넣는 content<text>…</text>로 감쌉니다.
  3. 구체적으로 — "follow these steps"로 단계(살펴보기 → 주제 식별 → 배열에 추가 → 배열만 응답)를 적습니다.
  4. (선택) one-shot/multi-shot으로 예시를 더해도 좋습니다 — 점수가 이미 좋다면 생략 가능.

막히면 아래 풀이를 단계별로 따라오세요. 목표는 평균 7점 이상입니다.

풀이 1 — 명료하고 직접적으로

Be clear and direct

먼저 평가를 한 번 돌려 output.html을 만들고 채점 근거를 읽습니다. 공통 지적은 하나 — 문자열 JSON 배열을 돌려주지 않는다는 점입니다. 그래서 첫 줄을 단순·직접적으로 다시 써, 무엇을 어떤 형식으로 원하는지 분명히 합니다.

run_prompt · 첫 줄을 명료하게
    prompt = f"""
Extract key topics mentioned from a passage of text from a
scholarly journal into a JSON array of strings.

{prompt_inputs["content"]}
"""
    # 명료·직접: 무엇을(주제) 어떤 형식으로(JSON 배열) 원하는지 한 줄로
출력 · 점수 급등
Average score: 9.5
# 첫 줄을 단순·직접적으로 바꾸자마자 거의 곧바로 급등
왜 이렇게 오르나

“Extract key topics … into a JSON array of strings” 한 줄이 원하는 결과물과 형식을 못 박습니다. 모델이 더는 형식을 추측하지 않아도 되니, 거의 곧바로 점수가 2.8에서 9.5 수준으로 뜁니다. output.html을 다시 열면 JSON이 제대로 돌아오고 채점기도 만족합니다.

풀이 2 — XML 태그로 구조화

Structure with XML tags

점수가 이미 좋지만, 출력을 더 확실히 하려고 기법을 더합니다. 끼워 넣는 content<text>…</text>로 감쌉니다. 첫 줄에서 “a passage of text”라고 했으니, 태그 이름을 text로 맞춰 지시와 입력의 연결을 또렷하게 합니다.

run_prompt · content를 <text>로 감쌈
    prompt = f"""
Extract key topics mentioned from a passage of text from a
scholarly journal into a JSON array of strings.

<text>
{prompt_inputs["content"]}
</text>
"""
    # <text> 태그로 content를 감쌈 — 첫 줄의 "passage of text"와 연결
왜 태그 이름을 text로?
  • 프롬프트가 말하는 “passage of text”와 실제로 건네는 입력이 같은 이름으로 묶입니다.
  • 모델이 어디까지가 ‘해석할 본문’이고 어디가 지시인지 헷갈리지 않습니다.
  • 입력이 길어질수록 이 경계가 더 큰 차이를 만듭니다.

풀이 3 — 구체적으로 + 완성

Be specific & finish

마지막으로 원하는 바를 아주 구체적으로 적습니다. “follow these steps”로 따를 단계를 나열합니다 — 본문 살펴보기 → 주제 식별 → 배열에 추가 → 배열로만 응답(부연 설명 금지).

run_prompt · follow these steps
    prompt = f"""
Extract key topics mentioned from a passage of text from a
scholarly journal into a JSON array of strings.

Follow these steps:
- Closely examine the provided text
- Identify each topic mentioned
- Add each topic to a JSON array
- Respond with the JSON array. Do not provide any other
  text or commentary.

<text>
{prompt_inputs["content"]}
</text>
"""
출력 · 최종 점수
Average score: 9.5
# 단계까지 명시 — 튼튼한 프롬프트. 신뢰하고 쓸 만함
예시는?

원한다면 one-shot/multi-shot으로 이상적인 입출력 예시를 더 넣어도 좋습니다. 다만 이미 점수가 충분히 좋으니 여기선 생략합니다. 평가를 다시 돌려도 9.5 — 기사에서 주제를 뽑는 데 신뢰할 만한 프롬프트가 됐습니다.

네 단계를 직접 넘겨 보며, 기법을 더할 때마다 점수가 어떻게 오르는지 비교하세요.

기법 적용 단계별 · 점수가 어떻게 오르나


단계를 눌러 보세요. 같은 평가 파이프라인으로 매번 측정하므로, 기법을 더할수록 점수가 오르는 것을 객관적으로 확인할 수 있습니다.

핵심 정리
  • 먼저 평가를 1회 돌려 output.html채점 근거를 읽고 무엇이 문제인지 본다.
  • 명료하게 — 무엇을(주제) 어떤 형식으로(JSON 배열) 원하는지 한 줄로 명시하면 점수가 급등한다.
  • XML 태그로 입력을 감싸 지시와 본문의 경계를 또렷이 한다.
  • 구체적으로 단계를 적고, 필요하면 예시까지 — 같은 평가로 매번 측정해 개선을 확인한다.

Q1output.html의 채점 근거에서 가장 먼저 드러난 공통 문제는?

Q2점수를 2.8에서 9.5 수준으로 가장 크게 끌어올린 기법은?

Q3content를 감싼 태그 이름을 <text>로 정한 이유는?

MEMBER SESSION REQUIRED · REGISTRATION IS FREE

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

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

등록하고 이어서 읽기

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