05. 요청하는 방법¶
AI에게 잘 요청하는 법이에요.
프롬프팅에 대한 오해¶
많은 사람이 "프롬프트 엔지니어링"에 집착합니다.
- "마법의 단어"를 찾으려 함
- 복잡한 지시문을 작성
- "전문가처럼 행동해"같은 역할 부여
결론부터 말하면: 대부분 불필요합니다.
보여주고, 설명은 줄이기¶
좋은 예시 하나가 긴 설명보다 낫다
— Prompting 101: Show, don't tell
핵심 원칙¶
[Bad] 지시를 개선하려고 노력
"전문적이고 간결하며 기술적으로 정확한 응답을 해주세요.
코드는 모범 사례를 따르고 에러 핸들링을 포함해야 합니다."
[Good] 예시를 개선하려고 노력
"이런 스타일로 코드 작성해줘:
def fetch_user(user_id: str) -> User | None:
try:
response = api.get(f'/users/{user_id}')
return User.from_dict(response.json())
except ApiError as e:
logger.error(f'Failed to fetch user {user_id}: {e}')
return None
"
왜 예시가 더 효과적인가?¶
| 지시문 | 예시 |
|---|---|
| "명확하게 써줘" | 해석의 여지가 있음 |
| "이런 형식으로" + 예시 | 정확히 무엇을 원하는지 알 수 있음 |
AI는 패턴 인식에 강합니다. 원하는 패턴을 보여주면 즉시 이해합니다.
프롬프팅 무용론¶
최신 AI 모델은 복잡한 프롬프트가 필요 없습니다.
불필요한 것들¶
실제로 필요한 것¶
실용적인 요청 패턴¶
좋은 프롬프트의 공통점
나쁜 예: "로그인 기능 만들어줘" 좋은 예: "JWT 기반 로그인 API 만들어줘. refresh token 포함, 기존 User 모델 활용, /api/v1/auth 경로로." 차이는 구체적인 맥락이에요. 컨텍스트가 많을수록 결과가 정확합니다.
패턴 1: 컨텍스트 + 질문¶
패턴 2: 현재 상태 + 원하는 상태¶
[현재]
def get_users():
users = db.query(User).all()
return users
[원하는 것]
- 페이지네이션 추가
- 총 개수도 함께 반환
- 정렬 옵션 추가
패턴 3: 예시 제공¶
이 함수를 다른 엔티티에도 적용하고 싶어:
# 기존 (참고용)
def create_user(data: UserCreate) -> User:
user = User(**data.dict())
db.add(user)
db.commit()
return user
# 만들어줘
create_order, create_product도 같은 패턴으로
패턴 4: 제약 조건 명시¶
피해야 할 것들¶
1. 과도한 역할 부여¶
2. 불필요한 강조¶
3. 모호한 요청¶
4. 한 번에 너무 많은 요청¶
대화로 발전시키기¶
한 번에 완벽한 결과를 기대하지 마세요. 대화를 통해 점진적으로 발전시키세요.
> 사용자 검색 API 만들어줘
[Claude 구현]
> 좋은데, 대소문자 구분 없이 검색되게 해줘
[수정]
> 검색 결과가 너무 많을 수 있으니 limit 파라미터 추가해줘
[최종]
이 방식이 처음부터 완벽한 요구사항을 작성하려는 것보다 빠르고 정확합니다.
효과적인 피드백¶
결과가 마음에 안 들 때
구체적으로¶
예시로¶
방향 제시¶
한 줄 요약¶
원하는 것을 보여주세요. 설명하지 말고.
복잡한 프롬프트 기법보다
- 명확한 컨텍스트
- 좋은 예시
- 구체적인 피드백
이 세 가지면 충분합니다.
다음 단계¶
프롬프트 요령을 익혔다면
- 03. 실무 워크플로우에서 이 요령들을 실제 개발에 적용해보세요
- 15. CLAUDE.md 마스터리에서 반복되는 프롬프트를 CLAUDE.md에 녹여 자동화하세요
참고 자료¶
- 프롬프팅 101: 보여주고 설명은 줄이기 - Gabriella Gonzalez
- How AI assistance impacts coding skills - Anthropic Research