byteforce

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

프롬프트 엔지니어링

프롬프트 엔지니어링

Prompt engineering

이제 프롬프트를 더 좋게 다듬는 기법으로 넘어갑니다. 이 모듈은 하나의 예시 프롬프트(운동선수 식단)를 두고, 형편없는 초안에서 시작해 기법을 하나씩 적용하며 평가 점수가 오르는 것을 직접 확인하는 방식으로 진행됩니다.

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

Stephen Grider · Anthropic 기술 스태프

프롬프트 평가를 익혔으니, 이제 프롬프트 엔지니어링의 세계로 넘어갑니다. 프롬프트 엔지니어링은 이미 쓴 프롬프트를 어떤 식으로든 개선해 더 신뢰할 수 있고 더 높은 품질의 출력을 얻는 일입니다.

이 모듈은 이렇게 진행됩니다. 먼저 목표를 정하고, 그 프롬프트의 아주 형편없는 초안을 씁니다. 그걸 평가하면 곧바로 매우 낮은 점수가 나옵니다. 그다음 영상들에서 여러 프롬프트 엔지니어링 기법을 배우고 적용하는데, 적용할 때마다 평가를 다시 돌려 점수가 오르는 걸 봅니다.

평가는 이전 모듈에서 만든 파이프라인을 그대로 씁니다. 단, 함께 따라 코딩하려면 알아둘 점이 있습니다. 이전 파이프라인을 손봐서 특정 프롬프트가 아니라 거의 모든 프롬프트에 쓸 수 있게 더 유연하게 만들었습니다. 동봉된 노트북 001_prompting을 받으세요.

프롬프트의 목표는 이렇습니다. 운동선수의 키·몸무게·목표·식이 제한을 받아 하루치 식단을 생성하는 것입니다. 선수를 설명하는 입력을 받아 프롬프트에 끼워 모델에 보내고, 이상적인 출력을 얻는 게 목표입니다. 첫 버전은 그 이상과 전혀 다른 출력이 나오겠지만, 여러 기법으로 다듬어 점차 가까워집니다.

노트북을 열면 상단에 접힌 설정 셀들이 있습니다 — 최소 한 번은 실행하세요. 그다음 PromptEvaluator 인스턴스를 만듭니다. 데이터셋 생성·모델 채점 등을 한 클래스에 감싼 것입니다. 인자는 max_concurrent_tasks 하나 — 동시 API 호출 수입니다. 평가와 데이터셋 생성이 크게 빨라지지만, 서비스 할당량에 따라 rate limit 에러가 날 수 있습니다. 에러가 보이면 1(동시성 없음)로 낮추세요. 처음엔 3 정도를 권합니다.

generate_dataset 메서드로 데이터셋을 만듭니다. 프롬프트의 전체 목적(하루치 운동선수 식단)을 설명하고, prompt_input_spec 딕셔너리에 필요한 입력(height·weight·goal·dietary_restrictions)을 적습니다. 생성할 테스트 케이스 수는 빠른 진행을 위해 2~3개를 권합니다(실전 평가에선 훨씬 많이).

run_prompt 함수에서 프롬프트를 씁니다. 이 함수는 테스트 케이스마다 한 번씩 호출되고, 그 케이스의 prompt_inputs 딕셔너리를 인자로 받습니다. 그 입력을 프롬프트에 끼워 넣습니다. 일단 아주 단순하고 형편없는 첫 버전을 씁니다 — “이 사람은 뭘 먹어야 할까?”에 키·몸무게·목표·제한을 나열한 정도.

평가를 돌립니다. 평가 함수엔 extra_criteria라는 문자열 인자를 추가로 줄 수 있습니다. 모델 채점 시 고려할 추가 기준이죠. 여기선 “출력에 하루 총칼로리, 주요 영양소 분해, 정확한 음식·분량·시간이 포함돼야 한다”를 넣습니다.

첫 버전을 평가하면 형편없는 점수가 나옵니다 — 저는 2.32를 받았습니다. (점수가 오르는 걸 보여주려고 일부러 똑똑하지 않은 모델을 씁니다. 여러분 점수는 더 높을 수 있습니다.) 평가를 돌리면 노트북과 같은 폴더에 output.html이 생깁니다. 브라우저로 열면 케이스별 출력·점수·근거·기준이 잘 정리된 리포트가 보입니다 — 어디를 고칠지 파악하는 데 유용합니다.

이제 할 일은 하나 — 프롬프트를 개선하는 것입니다. 다음 영상부터 첫 번째 기법을 봅니다.

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

약 10분
1

이 모듈은 하나의 프롬프트(운동선수 식단)를 기법으로 점점 개선하는 방식

2

유연해진 PromptEvaluator로 데이터셋 생성·평가를 감싼다

3

max_concurrent_tasks로 동시성 — rate limit 나면 1

4

generate_dataset에 목적 + prompt_input_spec + 케이스 수

5

run_prompt에 형편없는 첫 프롬프트 → 평가 → 점수 2.32

6

extra_criteria로 채점 기준을 더하고, output.html로 결과를 본다

먼저 짚고 갈 용어
PromptEvaluator
데이터셋 생성·모델 채점·평가를 한데 감싼 클래스. 이전 모듈 파이프라인의 유연한 버전.
max_concurrent_tasks
동시 API 호출 수. 속도↑ 하지만 rate limit 위험 — 기본 1, 권장 3.
prompt_input_spec
프롬프트가 필요로 하는 입력 목록(딕셔너리). 데이터셋 각 케이스에 생성된다.
extra_criteria
모델 채점 시 추가로 고려할 기준 문자열.

이 모듈의 진행 방식

Write → eval → improve

프롬프트 엔지니어링은 이미 쓴 프롬프트를 개선해 더 신뢰할 수 있고 높은 품질의 출력을 얻는 일입니다. 이 모듈은 하나의 예시 — 운동선수 하루 식단 프롬프트 — 를 두고, 형편없는 초안에서 출발해 기법을 하나씩 더하며 점수가 오르는 걸 확인합니다.

점수 상승 여정 · 막대를 눌러 미리 보기
2.3
초기 프롬프트
(지금)
~4
명료하게
~5.5
구체적으로
~7
XML 태그
~8.5
예시 제공

점수는 예시입니다. 핵심은 같은 평가 파이프라인으로 매번 측정하면, 기법을 더할수록 점수가 오르는 걸 객관적으로 확인할 수 있다는 점입니다.

유연해진 평가 파이프라인

PromptEvaluator

이전 모듈의 평가 파이프라인을 거의 모든 프롬프트에 쓸 수 있게 다듬어 PromptEvaluator 클래스로 감쌌습니다. 동시성으로 속도도 올립니다.

001_prompting.ipynb · 평가기 + 데이터셋 생성
from prompt_evaluator import PromptEvaluator   # 모듈에 동봉된 클래스

evaluator = PromptEvaluator(max_concurrent_tasks=3)   # rate limit 나면 1로

evaluator.generate_dataset(
    prompt_purpose="Write a compact, concise, one day meal plan for a single athlete",
    prompt_input_spec={
        "height": "The athlete's height in cm",
        "weight": "The athlete's weight in kg",
        "goal": "The goal of the athlete",
        "dietary_restrictions": "The dietary restrictions of the athlete",
    },
    num_test_cases=3,
)
동시성 주의

max_concurrent_tasks가 높으면 빠르지만 rate limit 에러가 날 수 있습니다. 에러가 보이면 1로 낮추세요(강사는 50, 여러분은 3 정도부터). 케이스 수도 빠른 진행을 위해 2~3개를 권합니다.

형편없는 첫 프롬프트

A naive first draft

run_prompt은 테스트 케이스마다 호출되며 그 케이스의 prompt_inputs를 받습니다. 일단 아주 단순한 첫 버전을 씁니다.

run_prompt · 형편없는 초안
def run_prompt(prompt_inputs):
    prompt = f"""
What should this person eat?

{prompt_inputs["height"]}
{prompt_inputs["weight"]}
{prompt_inputs["goal"]}
{prompt_inputs["dietary_restrictions"]}
"""
    # 프롬프트를 모델에 보내 output을 반환
    return output

평가를 돌립니다. extra_criteria로 채점 시 고려할 기준을 더할 수 있습니다.

평가 실행 + extra_criteria
evaluator.run_eval(
    run_prompt,
    extra_criteria=(
        "The output should include a daily caloric total, a"
        " macronutrient breakdown, and meals with exact foods,"
        " portions, and timing."
    ),
)
출력 · 첫 점수
Average score: 2.32
# 형편없는 점수. 일부러 약한 모델을 써 개선 효과를 보여 줍니다.
output.html

평가를 돌릴 때마다 같은 폴더에 output.html 리포트가 생깁니다. 브라우저로 열면 케이스별 출력·점수·근거·기준이 정리돼 있어, 어디를 고칠지 파악하기 좋습니다.

정리 & 점검

Recap & check
핵심 정리
  • 이 모듈은 운동선수 식단 프롬프트를 기법으로 점점 개선하는 여정.
  • PromptEvaluator가 데이터셋 생성·채점·평가를 감싼다 — max_concurrent_tasks 주의.
  • 형편없는 첫 프롬프트 → 평가 → 기준 점수(2.32).
  • extra_criteria로 채점 기준을 더하고, output.html로 결과를 본다.

Q1이 모듈의 진행 방식은?

Q2rate limit 에러가 보이면?

Q3extra_criteria는 무엇에 쓰이나요?

MEMBER SESSION REQUIRED · REGISTRATION IS FREE

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

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

등록하고 이어서 읽기

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