본 포스팅은 OpenAI Prompt Engineering document를 참고로 제작되었습니다.
프롬프트 엔지니어링이란?
요즘 거대 LLM 모델들이 많이 사용되고 있는데 대표적으로 ChatGPT가 있을 수 있다.
간단한 비유를 하자면 얘네들은 세상 지식들을 전부 깨우치고 있는 애들이지만 굉장히 수동적인 친구들이다.
그래서 이런 똑똑한 친구들을 사용자가 원하는 결과를 얻기 위해 최적화하는 과정이 프롬프트 엔지니어링이라고 생각하면 된다.
프롬프트 엔지니어링 잘하는 법
총 아래 6가지 지침을 따른다면 더 나은 답변을 얻을 수 있다.
1. 명확한 지침을 작성하라
2. 레퍼런스를 제공하라
3. GPT에게 "생각"할 시간을 줘라
4. 복잡한 작업을 하위 작업으로 분할하라
5. 외부 도구를 사용하라
6. 변경 사항을 체계적으로 테스트하라
하지만 이 블로그에선 3개만 다룰 것이다. 그 이유는 필자 본인이 사용하는 프롬프트 엔지니어링은 위 3개로 대략적으로 지금까지 나름의 좋은 결과를 얻어왔다.(only 내 생각 ㅋㅋ)
그래서 전체 내용이 궁금한 사람들은 OpenAI API Prompt Engineering 탭을 확인해 보도록 하자
위 내용을 하나하나 따라가면서 분석해 보자
가보자고
1. 명확한 지침을 작성하라
거독심술사가 아니기 때문에 우리 마음을 읽을 수 없다.
1-1. 세부정보를 쿼리로 적용하라
나쁜 예시 | 좋은 예시 |
대통령은 누구인가요? | 2023년 대한민국 대통령은 누구인가? |
피보나치 수열을 계산하는 코드를 작성해줘 | 피보나치 수열을 효율적으로 계산하는 python함수를 작성하세요. 코드에 주석을달아 각 부분이 무엇을 의미하는지 왜 작성되었는지 설명하세요 |
그냥 단순하게 말하지 말고 아기 다루듯 하나하나 설명해 주면 더 나은 결과를 얻을 수 있다.
1-2. 모델에게 말하는 법을 가르쳐라
System : 내가 글을써달라고 요청하면 너는 모든 문단에 적어도 하나의 농담이나
장난 코멘트가 포함된 문서를 대답할것이다.
User : 서버 배포를 빠르게 처리해준 백엔드 개발 팀원에게 감사편지를 작성하세요
위 System은 우리가 대화하기 전 미리 말해두는 거라고 생각하면 된다.
1-3. 구분 기호를 잘 사용하라
백틱 내에 있는 내용을 100자 이내로 요약해줘 `[web발신]너는나를존중해야한다더보기...`
세부상황을 구분 기호를 통해 명확하게 하는 것이 좋다.
1-4. 작업을 완료하는데 필요한 단계를 제공하라
System : 사용자 입력에 응답하려면 다음 단계별 지침을 따르시오.
1단계 - 사용자는 백틱으로 묶인 텍스트를 제공합니다. 이 텍스트를 한문장으로 요악하시오
2단계 - 1단계의 요약된 텍스트를 영어로 번역하시오
User : `[web발신]너는나를존중해야한다더보기...`
필요한 지침을 정해주면 모델이 더 쉽게 따라갈 수 있다.
1-5. 예시를 제공하라.
System : 일관된 스타일로 대답하시오
System :
example :
input : `나는짱이야`
output : `짱`
input : `너는최고야`
output : `최고`
위처럼 예시를 제공함으로써 더 나은 결과를 얻는걸 Few-shot prompt라고 한다.
이 부분은 알아두면 좋으니 따로 검색을 하는 것도 좋다.
1-6. 원하는 출력 길이를 지정하라
따옴표 안에 있는 내용을 약 100자 내로 요약하라 "안녕하세요저는호.."
길이를 지정해 주면 안정적으로 결과를 생성할 수 있다.
2. 레퍼런스를 제공하라
2-1. 모델에게 레퍼런스를 사용하여 답변하도록 지시하라
System : 질문에 답하려면 백틱으로 구분된 뉴스를 사용해라.
기사에서 답변을 찾을수 없는경우 "답변을 찾지 못했습니다."
라고 대답해라.
User : `지리는뉴스` 질문 : 오늘 날씨는 뭐야?
좀 더 효율적인 지식검색을 해낼 수 있다.
2-2. 레퍼런스를 인용하라
System : 백틱으로 감싸진 문서와 질문이 제공된다.
너는 제공된 문서만을 이용해서 질문에 대답해라
만약 질문에 답변하는데 필요한 정보가 없다면 "정보가 부족합니다"라고 답변하라
질문에 대한 답변을 진행할 땐 인용 주석을 달아야한다
다음과같은 형식을 사용해라 (인용: ...)
User : (문서올림) 질문 : 위 논문에서 사용된 모델의 종류가 뭐야?
이런 식으로 필요한 정보만 가져와서 최적화를 진행할 수 있다.
3. GPT에게 "생각"할 시간을 줘라
3-1. 성급하게 결론을 내리기 전에 모델에게 자체 솔루션을 찾도록 지시해라
System : 사용자의 해결 방법이 올바른지 확인하시오
User : 저는 덧셈을 못합니다. 3 + 3 은 뭘까요?
1 + 1 = 2
2 + 2 = 4
3 + 3 = 7
Assistant : 사용자의 답이 맞습니다.
위 내용은 사실 답이 아니다. 그렇기 때문에 모델이 먼저 자체 솔루션을 생성하게끔 해야 한다.
System : 먼저 사용자가 말한 문제에 대해 자신만의 해결책을 찾아보시오.
너의 해법을 사용자의 해법과 비교하고 학생의 해법이 올바른지 평가하시오.
문제를 직접 해결하기전에는 학생의 해결책이 올바른지 결정하지 마십시오.
User : 저는 덧셈을 못합니다. 3 + 3 은 뭘까요?
1 + 1 = 2
2 + 2 = 4
3 + 3 = 7
수정된 Prompt대로 한다면 모델의 결과를 더 좋게 만들 수 있다.
3-2. 내부 독백이나 일련의 쿼리를 사용하여 모델의 추론 과정을 숨깁니다.
System : 사용자 질문에 응답하려면 다음 단계를 따르세요.
1단계 - 먼저 문제에 대한 자신만의 해결책을 찾아보세요.
해결책이 틀릴 수 있으므로 의존하지 마십시오.
2단계 - 사용자의 해법과 자신의 해법을 비교하고
학생의 해법이 올바른지 평가합니다.
3단계 - 사용자가 실수를 했다면 답을 포기하지 않고
학생에게 어떤 힌트를 줄 수 있는지 결정합니다.
4단계 - 사용자가 실수를 했다면 이전 단계의 힌트를 제공한다.
최종 사용자에겐 고민하는 자체 솔루션을 숨기는 것도 좋은 전술이다.
3-3. 이전에 놓친 것이 있는지 모델에게 물어봐라.
소스 문서가 너무 큰 경우 전부 나열하지 못할 수 있으니 모든 내용이 포함되어 있는지 한번 더 물어보는 게 좋다.
대충 알아보았다.
적다 보니 내용이 좀 길어진 감이 있는데 위 내용으로 GPT 또는 거대 LLM을 다루는 데 있어서 도움이 됐으면 좋겠다.
치얼스~