프롬프트 공학

프롬프트 공학(Prompt Engineering)은 챗GPT와 같은 AI 언어 모형으로부터 구체적이고 정확하며 관련성 있는 응답을 도출하기 위해 프롬프트(Prompt, 지시명령어)를 설계하고 개선하는 과정이다. 프롬프트의 품질이 GPT 모형 출력결과에 큰 영향을 미칠 수 있기 때문에 이 작업은 매우 중요하다. 프롬프트 엔지니어링의 목표는 사용자와 AI 모델 사이의 커뮤니케이션을 최적화하여 AI 시스템의 유용성과 효율성을 향상시키는 것이다.

프롬프트 엔지니어링은 반복적인 작업과정으로 AI의 응답에 따라 프롬프트를 조정하고 개선해야 할 수도 있다는 점을 항상 염두에 두고, 다음 프롬프트 구성요소를 프롬프트에 녹여 제작할 경우 AI 언어 모델이 목표에 부합하는 정확하고 관련성 있는 구체적인 답변을 효과적으로 생성할 수 있다.

프롬프트 공학을 코딩에 적용할 때의 장점은 자연어로 의도를 표현할 수 있어 코딩 입문자도 쉽게 접근할 수 있고, 수많은 프로그래밍 언어에 대한 장벽이 크게 낮아진 것을 들 수 있다. 또한 기존 코드를 수정하거나 새로운 코드를 작성할 때 생산성을 높일 수 있고, 언어모델이 제공하는 광범위한 지식을 활용할 수 있어 코드의 품질이 향상되었다. 하지만, 프롬프트를 잘 설계하기 위해서는 프롬프트 공학에 대한 지식과 경험이 필요하기 때문에 프롬프트 공학에 대한 깊은 이해가 필요하고, 언어모델 출력 결과가 완벽하지 않기 때문에 필연적으로 전문 개발자의 검토와 수정이 필요하며 저작권을 비롯한 보안 및 윤리 문제를 풀어야 하는 숙제가 남아있다.

프롬프트 공학을 코딩에 적용하는 절차는 전통적인 코딩 절차와 별반 다르지 않다. 첫째로 목표를 설정하고, 작성하려는 코드의 정확한 기능과 요구사항을 명시하여 코드가 어떤 입력을 받고, 어떤 출력을 내야 하는지 파악한다. 둘째로 목표를 자연어 프롬프트에 담아낸다. 가능한 상세하고 구체적인 프롬프트를 작성하고 사례, 제약조건 등도 포함한다. 셋째로 프롬프트를 대규모 언어모델에 입력한다. 언어모형이 프롬프트를 이해하고 관련 코드를 생성하는 본 작업을 진행하고 필요한 경우 추가 프롬프트를 언어모형에 피드백을 제공한다. 넷째로 생성된 코드를 주의 깊게 검토하고 오류, 비효율성, 스타일 이슈 등을 반영하여 코드품질을 향상시킨다. 다섯째로 다양한 입력 값으로 코드를 실행하고 출력을 검증하며 발견된 오류는 디버깅하여 수정한다. 마지막으로 테스트 결과를 바탕으로 프롬프트를 개선할 점을 파악하고, 프롬프트를 수정하여 새로운 코드를 생성한 후 결과를 비교하는 과정을 반복한다.

그림 1: 챗GPT 코딩 작업흐름

챗GPT 코딩 구성요소는 프롬프트와 언어모형으로 구성되어 있다고 보면 된다. 자연어 프롬프트를 통해 생성하고자 하는 코드의 목적과 요구사항을 명시하여 언어모형에 전달하면 언어모형은 프롬프트를 이해하고 관련 코드를 생성한다. 몇년전 영어가 가장 뜨거운 프로그래밍 언어라는 주장이 허언은 아닌 것이다.

프롬프트 구성요소

효과적인 AI 프롬프트 작성은 인공지능과의 상호작용을 최적화하는 핵심으로 매우 중요하다. 먼저 프롬프트를 구성하는 핵심 5가지 구성요소를 살펴보자.

  • 페르소나(Persona): AI가 특정 역할이나 관점을 취하도록 한다.
  • 지시사항 (Instruction): LLM에게 수행해야 할 작업을 명확히 알려주는 부분이다. 작업의 목적, 수행 방법, 주의사항 등을 포함한다. 명확하고 구체적인 지시는 모델이 원하는 결과를 생성하는 데 핵심적인 역할을 한다.
  • 예시/맥락 (Examples/Context): 모델에게 작업의 맥락을 제공하고 원하는 출력 형식을 보여준다. Few-shot 학습 예시를 통해 모델의 성능을 향상시킬 수 있다. 관련 배경 정보나 도메인 지식도 여기에 포함될 수 있다.
  • 입력 데이터 (Input data): 모델이 실제로 처리해야 할 구체적인 정보나 데이터다. 질문, 문장, 문단 등 다양한 형태가 될 수 있으며, 작업의 핵심 대상이 된다.
  • 출력 지표 (Output indicator): 원하는 출력의 형식, 구조, 스타일을 지정하는 부분으로 모델의 응답을 일관되고 예측 가능한 형태로 유도할 수 있다.

다음으로 SALT(Style, Audience, Length, Tone)를 반영하여 출력에 대한 제어를 통해 효과적으로 LLM으로부터 산출물을 추출할 수 있다.

  • 스타일(Style): 응답의 문체나 표현 방식
  • 청중(Audience): 대상 독자나 사용자
  • 길이(Length): 응답의 상세도나 분량
  • 어조(Tone): 글의 분위기나 감정

사례

프롬프트를 핵심적인 내용만 사용하여 작성하여보자.

지시사항:
간단한 김치찌게 레시피를 작성해주세요. 조리 시간은 30분 이내여야 합니다.

출력 형식:
1. 레시피 이름
2. 준비 시간 및 조리 시간
3. 재료 목록 (4인분 기준)
4. 조리 단계 (번호로 구분)
5. 영양 정보 (1인분 기준 칼로리)

맥락:
초보 요리사도 쉽게 따라할 수 있어야 합니다. 일반 슈퍼마켓에서 구할 수 있는 재료만 사용하세요.

예시:
조리 단계 예:
1. 큰 냄비에 물을 끓입니다.
2. 물이 끓으면 파스타를 넣고 8-10분간 삶습니다.
이 프롬프트에 따라 간단한 김치찌개 레시피를 작성해 드리겠습니다.

1. 레시피 이름: 
쉽고 빠른 김치찌개

2. 준비 시간 및 조리 시간:
- 준비 시간: 10분
- 조리 시간: 20분
- 총 소요 시간: 30분

3. 재료 목록 (4인분 기준):
- 김치 300g (약 2컵, 썰어서)
- 돼지고기 목살 150g (얇게 썬 것)
- 두부 1모 (약 400g)
- 대파 1대
- 고춧가루 1큰술
- 다진 마늘 1큰술
- 국간장 1큰술
- 참기름 1작은술
- 물 3컵

4. 조리 단계:
1. 김치는 가위로 썰고, 돼지고기는 얇게 썹니다. 두부는 1cm 두께로 깍둑썰기하고, 대파는 어슷썹니다.
2. 냄비에 참기름을 두르고 돼지고기를 넣어 중간 불에서 2-3분간 볶습니다.
3. 고기가 익으면 김치를 넣고 2분간 더 볶습니다.
4. 물 3컵을 붓고 끓으면 두부, 고춧가루, 다진 마늘을 넣습니다.
5. 중간 불로 줄여 10분간 끓입니다.
6. 국간장으로 간을 맞추고 대파를 넣어 2분 더 끓입니다.
7. 불을 끄고 그릇에 담아 맛있게 즐깁니다.

5. 영양 정보 (1인분 기준 칼로리):
약 220kcal

이 레시피는 초보자도 쉽게 따라할 수 있으며, 일반 슈퍼마켓에서 구할 수 있는 재료만을 사용했습니다. 30분 이내에 완성할 수 있는 간단하고 맛있는 김치찌개입니다.

이번에는 SALT 출력물을 제어하도록 기능을 추가하여 프롬프트를 작성한다.

지시사항:
전통적인 한국식 김치찌개 레시피를 작성해주세요. 

출력 형식:
1. 레시피 이름 (한글과 영문)
2. 준비 시간 및 조리 시간
3. 재료 목록 (2인분 기준)
4. 조리 단계 (번호로 구분)
5. 맛있게 먹는 팁

맥락:
한국을 방문한 외국인 관광객이 집에서 쉽게 따라 할 수 있어야 합니다. 

예시:
조리 단계 예:
1. 냄비에 식용유를 두르고 중간 불로 달굽니다.
2. 돼지고기를 넣고 반투명해질 때까지 볶습니다.

스타일:
친근하고 격려하는 어조로 작성하되, 정확한 조리법을 설명해주세요.

청중:
한국 음식에 관심 있는 20-30대 외국인 요리 초보자

길이:
각 조리 단계는 1-2문장으로 간결하게 설명하고, 전체 레시피는 100단어 이내로 작성해주세요.

어조:
열정적이고 긍정적인 어조를 유지하면서, 전문적인 조언을 제공하는 요리 전문가의 말투를 사용해주세요.
김치찌개 (Kimchi-jjigae)

준비 시간: 10분 | 조리 시간: 20분

재료 (2인분):
- 김치 2컵
- 돼지고기 150g
- 두부 1/2모
- 대파 1대
- 고춧가루 1큰술
- 물 2컵

조리 단계:
1. 김치를 적당한 크기로 자르고, 돼지고기는 얇게 썰어주세요.
2. 냄비에 돼지고기를 넣고 중간 불에서 볶아주세요.
3. 김치를 넣고 2분간 더 볶은 후, 물을 부어 끓여주세요.
4. 두부와 고춧가루를 넣고 10분간 더 끓이세요.
5. 대파를 송송 썰어 올리고 2분 더 끓이면 완성!

맛있게 먹는 팁: 뜨거울 때 드세요! 밥과 함께 즐기면 더욱 맛있답니다.