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

  1. 명확성: 모호함 제거, 예시 제공
  2. 구조화: 단계별 지시, JSON/XML 형식 명시
  3. 예제: 최소 2~3개 Few-shot 예제
  4. 반복 검증: 생성된 온톨로지 → 재입력 → 개선
  5. 도메인 맥락: 도메인 특성 명시

관련 개념


관련 영상: Ontology Generation using Large Language Models (Video 2)