체계적인 디버깅 접근법
프롬프트 구간을 이진 탐색합니다. 절반을 제거하고 테스트하면서 문제를 좁혀 갑니다.
체계적인 디버깅 접근법은(는) CoddyKit의 무료 AI Prompt Engineering 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Prompt Engineering 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Prompt Engineering 강의에는 총 4개의 강의가 포함되어 있습니다.
문제 해결 사고방식
프롬프트 문제 해결은 소프트웨어 문제 해결과 유사합니다. 동시에 여러 가지를 변경하지 말고, 무작위로 추측하지 말며, 설명할 수 없는 해결책을 배포하지 마십시오. 체계적인 접근 방식은 이진 검색 논리를 사용하여 각 시험마다 문제 공간을 절반으로 좁히고, 최소 실패 사례를 효율적으로 찾습니다.
1단계: 실패 재현
문제 해결을 시작하기 전에 실패를 안정적으로 재현하십시오. 일관되게 재현할 수 없는 실패는 체계적으로 해결할 수 없습니다.
동일한 입력으로 프롬프트를 5회 실행하십시오. 매번 실패하면 결정론적 실패이므로 해결하기 쉽습니다. 가끔 실패한다면 확률적 실패이므로 먼저 temperature=0으로 설정하여 무작위성을 제거한 다음 다시 시험하십시오.
import openai
client = openai.OpenAI(api_key='sk-...')
def run_prompt(prompt, user_input, temperature=0):
resp = client.chat.completions.create(
model='gpt-4o',
messages=[
{'role': 'system', 'content': prompt},
{'role': 'user', 'content': user_input}
],
temperature=temperature
)
return resp.choices[0].message.content
# Reproduce with temperature=0 to eliminate randomness
for i in range(5):
output = run_prompt(failing_prompt, test_input, temperature=0)
print(f'Run {i+1}:', output[:100])2단계: 최소 재현 가능 프롬프트 만들기
최소 재현 가능 프롬프트(MRP)는 실패를 계속 유발하는 가장 짧은 프롬프트입니다. 관련 없는 부분을 제거하면 문제가 있는 구간을 격리할 수 있고 실패를 명확하게 확인할 수 있습니다.
전체 프롬프트에서 시작하여 내용의 절반을 제거하십시오. 시험하십시오. 그래도 실패한다면 문제가 있는 구간은 남겨 둔 절반에 있습니다. 이 과정을 반복하십시오. 프롬프트에 대한 이진 검색입니다.
def binary_search_prompt(prompt_lines, user_input, fail_fn):
'''Binary search: find the minimal set of lines that causes the failure.'''
if len(prompt_lines) == 1:
return prompt_lines # Minimal failing unit found
mid = len(prompt_lines) // 2
first_half = prompt_lines[:mid]
second_half = prompt_lines[mid:]
# Test first half
if fail_fn('\n'.join(first_half), user_input):
return binary_search_prompt(first_half, user_input, fail_fn)
# Test second half
elif fail_fn('\n'.join(second_half), user_input):
return binary_search_prompt(second_half, user_input, fail_fn)
else:
# Both halves pass — interaction effect between halves
return prompt_lines제거 시험
이진 검색의 더 간단한 형태로, 개별 구간을 체계적으로 제거하면서 제거 후 문제가 해결되는지 확인합니다. 이 방법은 프롬프트에 명확히 구분된 구간(시스템 지침, 컨텍스트, 예시, 형식 사양)이 있을 때 효과적입니다.
sections = {
'role_instruction': 'You are a precise JSON API. Respond only with valid JSON.',
'context': 'The user is asking about our product catalog.',
'format_spec': 'Return a JSON object with keys: name, price, available.',
'examples': 'Example: {"name": "Widget", "price": 9.99, "available": true}',
'safety': 'Do not reveal internal pricing strategy.'
}
def test_without(section_to_remove, user_input):
reduced = {k: v for k, v in sections.items() if k != section_to_remove}
prompt = '\n'.join(reduced.values())
output = run_prompt(prompt, user_input)
print(f'Without {section_to_remove}: {evaluate(output)}')
for section in sections:
test_without(section, 'What is the price of a Widget?')프롬프트 부분 A/B 시험
A/B 시험은 하나의 부분에 대해 두 버전을 만들고 동일한 입력에서 출력 결과를 비교하는 것입니다. 제거 시험과 달리 A/B 시험은 특정 표현이 있는지 없는지가 아니라 대체 표현을 평가합니다.
# A/B test: vague vs precise format instruction
variant_A = 'Return a JSON object.'
variant_B = 'Return a valid JSON object. No markdown, no code fences, no prose. Only the raw JSON.'
test_inputs = [
'What is the price of Widget A?',
'List all available products.',
'Is Widget B in stock?'
]
def run_ab_test(base_prompt, variant, inputs, n_runs=5):
pass_count = 0
for inp in inputs:
for _ in range(n_runs):
prompt = base_prompt.replace('{{FORMAT}}', variant)
output = run_prompt(prompt, inp)
if is_valid_json(output):
pass_count += 1
return pass_count / (len(inputs) * n_runs)
print('A pass rate:', run_ab_test(template, variant_A, test_inputs))
print('B pass rate:', run_ab_test(template, variant_B, test_inputs))차이 비교 시험
차이 비교 시험은 거의 동일한 두 프롬프트를 비교하여 어떤 변경이 회귀를 일으켰는지 찾습니다. '지난주에는 작동했는데' 지금은 작동하지 않을 때 유용합니다.
이전 프롬프트와 새 프롬프트의 차이를 비교하고, 변경된 구간을 식별한 다음, 변경된 각 구간을 따로 시험하십시오.
import difflib
def show_prompt_diff(prompt_v1, prompt_v2):
diff = difflib.unified_diff(
prompt_v1.splitlines(),
prompt_v2.splitlines(),
fromfile='v1',
tofile='v2',
lineterm=''
)
for line in diff:
print(line)
show_prompt_diff(working_prompt, failing_prompt)
# Output shows exactly which lines changed between versions
# Test reverting each changed section individually입력 시험과 프롬프트 시험
시험해야 할 두 가지 측면은 프롬프트와 입력입니다. 프롬프트가 단순한 입력에서는 작동하지만 복잡한 입력에서는 실패할 수 있습니다. 유용한 문제 해결 방법은 복잡한 입력에서 프롬프트가 실패할 때 입력을 더 단순한 형태로 바꾸어 프롬프트 자체가 올바른지 확인하는 것입니다.
# Input complexity ladder
inputs_by_complexity = [
'What is 2 + 2?', # trivially simple
'Summarize this sentence.', # simple task
'Analyze this 500-word essay.', # moderate
'Compare 10 documents and extract contradictions.' # complex
]
# Find the complexity level where the prompt starts failing
for inp in inputs_by_complexity:
output = run_prompt(failing_prompt, inp)
result = 'PASS' if evaluate(output) else 'FAIL'
print(f'{result}: {inp[:60]}')
# First FAIL indicates where the prompt breaks down최소 재현 가능 프롬프트 방식
프롬프트 문제 해결 과정에서 사용하는 MRP는 다음 구조를 따릅니다:
- 한 문장으로 된 역할(필요한 경우)
- 한 문장으로 된 작업 지침
- 형식 지침
- 실패를 재현하는 최소 입력
이 4줄 프롬프트에서도 여전히 실패한다면 문제는 모델 또는 형식에 있습니다. 실패가 다시 나타날 때까지 한 번에 한 부분씩 복잡성을 되돌리십시오. 다시 추가한 부분이 원인입니다.
# Start minimal
MINIMAL_PROMPT = (
'You are a data extractor.\n'
'Extract the product name and price from the text.\n'
'Respond with JSON: {"name": "...", "price": ...}\n'
)
minimal_input = 'Widget Pro costs $49.'
# Test: if this works, the problem is in something added on top
output = run_prompt(MINIMAL_PROMPT, minimal_input)
print(output)
# Expected: {"name": "Widget Pro", "price": 49.0}문제 해결 과정 기록
문제 해결 과정에서 수행하는 각 시험을 문서화하십시오. 메모가 없으면 같은 시험을 반복하거나 어떤 가설을 배제했는지 잊을 수 있습니다.
debug_log = [
{
'test': 'base_prompt_v5',
'hypothesis': 'failing due to format conflict',
'result': 'FAIL',
'notes': 'JSON prefix still present'
},
{
'test': 'base_prompt_v5_no_markdown_hint',
'hypothesis': 'removing markdown hint from user message fixes conflict',
'result': 'PASS',
'notes': 'Output is clean JSON. Root cause confirmed: format conflict.'
}
]
import json
with open('debug_session.json', 'w') as f:
json.dump(debug_log, f, indent=2)문제 해결을 중단하고 전략을 바꿀 시점
때로는 프롬프트 문제 해결의 효과가 점점 줄어듭니다. 전략을 바꿀 때가 되었다는 징후는 다음과 같습니다:
- 같은 실패로 범위를 좁히는 데 2시간 넘게 사용함
- 명확하고 간단한 지침을 사용해도 최소 프롬프트가 여전히 실패함
- A/B 시험에서 통계적으로 유의미한 차이가 나타나지 않음
대안: 함수 호출(구조화된 출력)로 전환하거나, 후처리 검증 단계를 추가하거나, 작업을 더 간단한 두 개의 프롬프트로 분해하거나, 모델을 업그레이드하십시오.
수정과 강화
근본 원인을 찾고 수정한 후에는 유사한 실패를 방지하도록 프롬프트를 강화하십시오:
- 실패한 시험 사례를 회귀 시험으로 시험 모음에 추가하십시오
- '입력이 특이하더라도 항상 JSON을 반환하십시오'라는 방어적 지침을 추가하십시오
- 운영 환경이 아니라 프로그램에서 실패를 포착할 수 있도록 출력 검증을 추가하십시오
수정했지만 강화하지 않은 프롬프트는 다음 경계 사례에서 다시 실패합니다.
def safe_run_prompt(prompt, user_input):
output = run_prompt(prompt, user_input)
try:
parsed = json.loads(output)
return parsed
except json.JSONDecodeError:
# Fallback: ask the model to fix its own output
fix_prompt = f'The following is not valid JSON. Rewrite it as valid JSON only:\n{output}'
fixed = run_prompt('', fix_prompt)
return json.loads(fixed)지식 확인
프롬프트 이진 검색 문제 해결에서 프롬프트의 첫 번째 절반을 제거한 후 실패가 사라졌다면 무엇을 알 수 있습니까?
복습: 체계적 문제 해결
프롬프트 문제 해결에 대한 체계적인 접근 방식:
- 재현: 온도를 0으로 설정하고 5회 실행하여 실패가 일관되게 발생하는지 확인
- 최소화: 프롬프트 구간에 이진 검색을 적용하여 최소 실패 프롬프트 찾기
- A/B 시험: 실패한 구간의 대체 표현 비교
- 차이 비교: 작동하는 프롬프트 버전과 실패하는 프롬프트 버전의 차이를 비교하여 회귀 원인 찾기
- 문서화: 각 시험, 가설 및 결과 기록
- 강화: 수정한 사례를 시험 모음에 추가
다음 수업에서는 장기적인 프롬프트 유지 관리를 위한 기록 및 문서화 전략을 다룹니다.
AI 튜터와 함께 AI Prompt Engineering을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 53
- 레슨
- 199
자주 묻는 질문
“체계적인 디버깅 접근법” 강의는 무료인가요?
네 — “체계적인 디버깅 접근법” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Prompt Engineering 강의 전체를 잠금 해제할 수 있습니다. AI Prompt Engineering 강의에는 총 4개의 강의가 포함되어 있습니다.
“체계적인 디버깅 접근법”에서 뭘 배우나요?
프롬프트 구간을 이진 탐색합니다. 절반을 제거하고 테스트하면서 문제를 좁혀 갑니다. 브라우저에서 직접 실행하는 실습 코드로 AI Prompt Engineering을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
AI Prompt Engineering을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 AI Prompt Engineering은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“체계적인 디버깅 접근법” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 AI Prompt Engineering 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 AI Prompt Engineering 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 예상치 못한 출력 진단
- 프롬프트의 근본 원인 분석
- 체계적인 디버깅 접근법
- 로깅 및 문서화 전략