Prompt Engineering
정의
**Prompt Engineering (프롬프트 엔지니어링)**은 LLM의 성능을 최대화하기 위해 입력 텍스트(프롬프트)를 체계적으로 설계하고 최적화하는 기술입니다.
같은 작업도 프롬프트 방식에 따라 정확도가 30~50% 차이날 수 있습니다.
핵심 전략
1. 명확한 지시문 (Clear Instruction)
나쁜 예:
"온톨로지를 생성해줘"
좋은 예:
"다음 의료 텍스트로부터 온톨로지를 JSON 형식으로 생성하세요.
출력 형식:
{
"classes": [{"name": "...", "attributes": [...]}],
"relationships": [{"from": "...", "to": "...", "type": "..."}]
}
"
2. Few-shot 예제 (Examples)
"지시문: [명확한 설명]
예제 1:
입력: [샘플 텍스트]
출력: [원하는 형식의 출력]
예제 2:
입력: [샘플 텍스트]
출력: [원하는 형식의 출력]
실제 입력: [사용자의 실제 입력]"
3. 역할 할당 (Role-based Prompting)
"당신은 온톨로지 설계 전문가입니다.
다음 텍스트로부터 도메인 온톨로지를 생성하세요..."
4. 단계별 추론 (Chain-of-Thought)
직접 답변 (정확도 낮음):
"이 텍스트에서 엔티티는 뭔가?"
단계별 추론 (정확도 높음):
"다음 단계로 진행하세요:
1. 텍스트에서 명사를 모두 찾으세요
2. 각 명사가 누구/무엇인지 분류하세요
3. 각 엔티티를 클래스로 정의하세요
4. 최종 엔티티 리스트를 반환하세요"
온톨로지 생성에서의 프롬프트 엔지니어링
전체 프롬프트 구조:
=== 역할 설정 ===
"당신은 온톨로지 설계 전문가입니다."
=== 명확한 지시문 ===
"다음 의료 도메인 텍스트로부터 온톨로지를 자동 생성합니다.
산출물:
- 클래스 (Class): 도메인의 주요 개념
- 속성 (Attribute): 각 클래스의 특성
- 관계 (Relationship): 클래스 간의 연결"
=== Few-shot 예제 ===
"예제 1:
텍스트: '환자 Alice는 2023년 1월에 고혈압으로 진료받았습니다.'
클래스: Patient, Diagnosis, Date
속성: Patient.name, Diagnosis.type, Date.year
관계: Patient --HAS--> Diagnosis"
=== 반복 지시 ===
"위와 같은 방식으로 다음 텍스트를 처리하세요:
[사용자의 실제 텍스트]"
=== 출력 형식 ===
"JSON으로 반환하세요:
{
'classes': [...],
'attributes': [...],
'relationships': [...]
}"
프롬프트 성능 최적화
| 기법 | 효과 | 비용 |
|---|---|---|
| 명확한 지시문 | +20~30% | 무료 |
| Few-shot 추가 | +30~50% | 무료 (컨텍스트만 증가) |
| 역할 할당 | +10~20% | 무료 |
| Chain-of-Thought | +20~40% | 토큰 사용량 증가 |
| 구조화 출력 형식 | +15~25% | 무료 |
| Fine-tuning | +30~50% | 비용 높음 |
프롬프트 엔지니어링 Best Practices
- 명확성: 모호함 제거, 예시 제공
- 구조화: 단계별 지시, JSON/XML 형식 명시
- 예제: 최소 2~3개 Few-shot 예제
- 반복 검증: 생성된 온톨로지 → 재입력 → 개선
- 도메인 맥락: 도메인 특성 명시
관련 개념
- Few-shot Learning — 프롬프트에 포함되는 예제들
- Generative AI — LLM 성능 최적화 기법
- — 온톨로지를 생성하는 목표
관련 영상: Ontology Generation using Large Language Models (Video 2)