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분형편없는 프롬프트(점수 2.8)를 받아 7점 이상으로 끌어올린다
과제: 학술 기사 한 단락(content)에서 주제를 뽑아 JSON 배열로
먼저 평가를 1회 돌려 output.html의 채점 근거를 읽는다
명료하게 — 첫 줄을 단순·직접적으로 다시 써 점수를 끌어올린다
XML 태그로 content를 <text>로 감싸 연결을 또렷이 한다
구체적으로 — 단계(follow these steps)를 적고, 필요하면 예시까지
이번 실습의 과제는 학술 기사 텍스트 한 단락(content)을 받아, 거기 담긴 주제를 전부 뽑아 문자열 JSON 배열로 돌려주는 것입니다. 강사는 작업 설명·prompt_input_spec·extra_criteria만 바꾼 003_exercise 노트북을 준비했습니다.
# 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, )
시작 프롬프트는 일부러 형편없게 두었습니다. 그냥 평가를 돌리면 낮은 점수가 나옵니다.
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 배열이 아니다 — 공통적으로 지적됨content 하나뿐 — 텍스트 한 단락.["solar panels", …]).노트북에서 평가 셀을 최소 한 번 돌려 output.html을 만들고, 채점 근거를 읽으세요. 그런 다음 run_prompt의 프롬프트 변수만 고쳐 점수를 7점 이상으로 끌어올려 보세요.
content를 <text>…</text>로 감쌉니다.막히면 아래 풀이를 단계별로 따라오세요. 목표는 평균 7점 이상입니다.
먼저 평가를 한 번 돌려 output.html을 만들고 채점 근거를 읽습니다. 공통 지적은 하나 — 문자열 JSON 배열을 돌려주지 않는다는 점입니다. 그래서 첫 줄을 단순·직접적으로 다시 써, 무엇을 어떤 형식으로 원하는지 분명히 합니다.
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이 제대로 돌아오고 채점기도 만족합니다.
점수가 이미 좋지만, 출력을 더 확실히 하려고 기법을 더합니다. 끼워 넣는 content를 <text>…</text>로 감쌉니다. 첫 줄에서 “a passage of text”라고 했으니, 태그 이름을 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"와 연결
마지막으로 원하는 바를 아주 구체적으로 적습니다. “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 — 기사에서 주제를 뽑는 데 신뢰할 만한 프롬프트가 됐습니다.
네 단계를 직접 넘겨 보며, 기법을 더할 때마다 점수가 어떻게 오르는지 비교하세요.
단계를 눌러 보세요. 같은 평가 파이프라인으로 매번 측정하므로, 기법을 더할수록 점수가 오르는 것을 객관적으로 확인할 수 있습니다.
output.html의 채점 근거를 읽고 무엇이 문제인지 본다.Q1output.html의 채점 근거에서 가장 먼저 드러난 공통 문제는?
모델이 공통적으로 “JSON 배열을 돌려주지 않는다”를 지적했습니다. 그래서 형식을 명료·직접적으로 명시하는 게 첫 수입니다.
Q2점수를 2.8에서 9.5 수준으로 가장 크게 끌어올린 기법은?
“Extract … into a JSON array of strings” 한 줄이 결과물과 형식을 분명히 해, 거의 곧바로 점수가 뛰었습니다.
Q3content를 감싼 태그 이름을 <text>로 정한 이유는?
프롬프트가 말하는 “text”와 실제 입력을 같은 이름으로 묶어, 모델이 본문과 지시를 헷갈리지 않게 합니다.
기법을 직접 적용해 프롬프트를 끌어올려 봤습니다. 다음은 〈프롬프트 엔지니어링〉 섹션을 마무리하는 퀴즈입니다. → 프롬프트 엔지니어링 퀴즈
전 코스는 계속 무료입니다. 등록하면 이 코스의 남은 76개 레슨을 끝까지 읽을 수 있습니다.
이미 등록하셨다면 그때 쓰신 이메일을 넣어 주세요.