**번역본입니다. 오역이 있을수 있습니다.
프롬프트 엔지니어링은 다양한 애플리케이션 및 연구 주제에 언어 모델(LMs)을 효율적으로 활용하기 위한 프롬프트를 개발하고 최적화하는 비교적 새로운 분야입니다. 프롬프트 엔지니어링 기술은 대규모 언어 모델(LLMs)의 기능과 한계를 더 잘 이해하는 데 도움을 줍니다.
연구자들은 프롬프트 엔지니어링을 사용하여 질의응답 및 산술적 추론과 같은 광범위한 일반적이고 복잡한 작업에서 LLM의 역량을 향상시킵니다. 개발자들은 LLM 및 다른 도구들과 상호작용하는 견고하고 효과적인 프롬프트 기법을 설계하기 위해 프롬프트 엔지니어링을 활용합니다.
프롬프트 엔지니어링은 단순히 프롬프트를 설계하고 개발하는 것에 그치지 않습니다. 이는 LLM과 상호작용하고 개발하는 데 유용한 광범위한 기술과 기법을 포괄합니다. LLM과 연결하고, LLM으로 구축하며, LLM의 기능을 이해하는 데 중요한 기술입니다. 프롬프트 엔지니어링을 사용하여 LLM의 안전성을 개선하고, 도메인 지식과 외부 도구를 통해 LLM을 확장하는 것과 같은 새로운 기능을 구축할 수 있습니다.
LLM을 활용한 개발에 대한 높은 관심에 힘입어, 우리는 최신 논문, 고급 프롬프트 기법, 학습 가이드, 모델별 프롬프트 가이드, 강의, 참고 자료, 새로운 LLM 기능 및 프롬프트 엔지니어링 관련 도구들을 모두 포함하는 이 새로운 프롬프트 엔지니어링 가이드를 만들었습니다.
소개
프롬프트 엔지니어링은 다양한 애플리케이션 및 사용 사례에 대규모 언어 모델(LLMs)을 효율적으로 적용하고 활용하기 위한 프롬프트를 개발하고 최적화하는 비교적 새로운 분야입니다.
프롬프트 엔지니어링 기술은 LLM의 기능과 한계를 더 잘 이해하는 데 도움이 됩니다. 연구자들은 프롬프트 엔지니어링을 사용하여 질의응답 및 산술적 추론과 같은 광범위한 일반적이고 복잡한 작업에서 LLM의 안전성과 역량을 향상시킵니다. 개발자들은 LLM 및 다른 도구들과 상호작용하는 견고하고 효과적인 프롬프트 기법을 설계하기 위해 프롬프트 엔지니어링을 활용합니다.
이 종합 가이드는 프롬프트 엔지니어링의 이론과 실제 측면, 그리고 LLM과 상호작용하고 구축하기 위한 최적의 프롬프트 기법을 활용하는 방법을 다룹니다.
별도로 명시되지 않는 한, 모든 예시는 OpenAI의 Playground에서 gpt-3.5-turbo를 사용하여 테스트되었습니다. 모델은 기본 설정(예: temperature=1, top_p=1)을 사용합니다. 이 프롬프트들은 gpt-3.5-turbo와 유사한 기능을 가진 다른 모델에서도 작동해야 하지만, 모델의 응답은 다를 수 있습니다.
LLM 설정
프롬프트를 설계하고 테스트할 때, 일반적으로 API를 통해 LLM과 상호작용합니다. 프롬프트에 대한 다양한 결과를 얻기 위해 몇 가지 매개변수를 구성할 수 있습니다. 이러한 설정을 조정하는 것은 응답의 신뢰성과 적합성을 개선하는 데 중요하며, 사용 사례에 맞는 적절한 설정을 찾아내는 데는 약간의 실험이 필요합니다. 다음은 다양한 LLM 제공업체를 사용할 때 접하게 될 일반적인 설정들입니다:
-
Temperature (온도) - 요약하자면, 온도가 낮을수록 가장 확률 높은 다음 토큰이 항상 선택된다는 점에서 결과가 더 결정론적입니다. 온도를 높이면 무작위성이 증가하여 더 다양하거나 창의적인 결과물을 얻을 수 있습니다. 이는 본질적으로 다른 가능한 토큰들의 가중치를 높이는 것입니다. 적용 측면에서, 사실 기반 Q&A와 같은 작업에서는 더 사실적이고 간결한 응답을 유도하기 위해 낮은 Temperature 값을 사용하는 것이 좋습니다. 시 생성이나 다른 창의적인 작업의 경우, Temperature 값을 높이는 것이 유리할 수 있습니다.
-
Top P - Temperature와 함께 사용되는 샘플링 기법으로, 핵 샘플링(nucleus sampling)이라고도 불리며, 모델의 결정론적 정도를 제어할 수 있습니다. 정확하고 사실적인 답변을 원한다면 이 값을 낮게 유지하세요. 더 다양한 응답을 원한다면 더 높은 값으로 높이세요. Top P를 사용한다는 것은 top_p 확률 질량에 해당하는 토큰들만 응답에 고려된다는 것을 의미하며, 따라서 낮은 top_p 값은 가장 확신 있는 응답을 선택합니다. 이는 높은 top_p 값이 모델이 덜 가능성 있는 단어를 포함하여 더 많은 가능한 단어를 고려하도록 하여, 더 다양한 결과물을 도출하게 됩니다. 일반적인 권장 사항은 Temperature 또는 Top P 중 하나만 변경하고 둘 다 변경하지 않는 것입니다.
-
Max Length (최대 길이) - 최대 길이를 조정하여 모델이 생성하는 토큰의 수를 관리할 수 있습니다. 최대 길이를 지정하면 길거나 관련 없는 응답을 방지하고 비용을 제어하는 데 도움이 됩니다.
-
Stop Sequences (정지 시퀀스) - 정지 시퀀스는 모델이 토큰 생성을 중단하게 하는 문자열입니다. 정지 시퀀스를 지정하는 것은 모델 응답의 길이와 구조를 제어하는 또 다른 방법입니다. 예를 들어, "11"을 정지 시퀀스로 추가하여 모델이 10개 이하의 항목을 가진 목록을 생성하도록 지시할 수 있습니다.
-
Frequency Penalty (빈도 페널티) - 빈도 페널티는 다음 토큰에 대해 해당 토큰이 응답과 프롬프트에 이미 나타난 횟수에 비례하여 페널티를 적용합니다. 빈도 페널티가 높을수록 단어가 다시 나타날 가능성이 줄어듭니다. 이 설정은 더 자주 나타나는 토큰에 더 높은 페널티를 부여함으로써 모델 응답에서 단어의 반복을 줄입니다.
-
Presence Penalty (존재 페널티) - 존재 페널티 또한 반복되는 토큰에 페널티를 적용하지만, 빈도 페널티와 달리 모든 반복되는 토큰에 동일한 페널티를 적용합니다. 두 번 나타난 토큰과 열 번 나타난 토큰은 동일하게 페널티를 받습니다. 이 설정은 모델이 응답에서 구문을 너무 자주 반복하는 것을 방지합니다. 모델이 다양하거나 창의적인 텍스트를 생성하기를 원한다면, 더 높은 존재 페널티를 사용하는 것이 좋습니다. 반대로 모델이 집중된 상태를 유지해야 한다면, 더 낮은 존재 페널티를 사용해 보세요. Temperature와 Top P와 마찬가지로, 일반적인 권장 사항은 빈도 또는 존재 페널티 중 하나만 변경하고 둘 다 변경하지 않는 것입니다.
몇 가지 기본 예시를 시작하기 전에, 사용하는 LLM 버전에 따라 결과가 달라질 수 있다는 점을 유의하세요.
LLM에 프롬프트 입력하기
간단한 프롬프트로도 많은 것을 이룰 수 있지만, 결과의 품질은 제공하는 정보의 양과 프롬프트가 얼마나 잘 만들어졌는지에 따라 달라집니다. 프롬프트는 모델에 전달하는 지시나 질문과 같은 정보를 포함할 수 있으며, 맥락, 입력, 예시와 같은 다른 세부 사항도 포함할 수 있습니다. 이러한 요소들을 활용하여 모델에 더 효과적으로 지시하고 결과의 품질을 향상시킬 수 있습니다.
간단한 프롬프트의 기본 예시부터 살펴보겠습니다:
프롬프트
하늘은
출력:
파랗다.
OpenAI 플레이그라운드 또는 다른 LLM 플레이그라운드를 사용한다면, 다음 스크린샷에 표시된 것처럼 모델에 프롬프트를 입력할 수 있습니다.
(스크린샷 이미지 설명: OpenAI Playground에서 "하늘은"이라는 프롬프트를 입력하고 모델이 "파랗다."라고 응답한 화면)
주목할 점은 gpt-3.5-turbo 또는 gpt-4와 같은 OpenAI 챗 모델을 사용할 때, 시스템(system), 사용자(user), 어시스턴트(assistant)의 세 가지 다른 역할을 사용하여 프롬프트를 구성할 수 있다는 것입니다. 시스템 메시지는 필수는 아니지만, 어시스턴트의 전반적인 행동을 설정하는 데 도움을 줍니다. 위 예시는 모델에 직접 프롬프트를 입력하는 데 사용할 수 있는 사용자 메시지만 포함합니다. 간소화를 위해, 명시적으로 언급된 경우를 제외한 모든 예시에서는 gpt-3.5-turbo 모델에 프롬프트를 입력하는 데 사용자 메시지만 사용합니다. 위 예시의 어시스턴트 메시지는 모델의 응답에 해당합니다. 또한, 원하는 행동의 예시를 전달하기 위해 어시스턴트 메시지를 정의할 수도 있습니다. 챗 모델 사용법에 대해 더 자세히 알아보려면 여기를 참조하세요.
위 프롬프트 예시에서 언어 모델이 "하늘은"이라는 맥락에 맞는 토큰 시퀀스로 응답하는 것을 확인할 수 있습니다. 출력은 예상과 다르거나 달성하고자 하는 작업과는 거리가 멀 수 있습니다. 사실, 이 기본적인 예시는 시스템으로 무엇을 구체적으로 달성하고 싶은지에 대한 더 많은 맥락이나 지시를 제공할 필요성을 강조합니다. 이것이 바로 프롬프트 엔지니어링의 핵심입니다.
좀 더 개선해 봅시다:
프롬프트:
문장을 완성하세요:
하늘은
출력:
낮에는 파랗고 밤에는 어둡습니다.
더 나은가요? 음, 위 프롬프트에서는 모델에게 문장을 완성하도록 지시했기 때문에, 지시한 내용("문장을 완성하세요")을 정확히 따르므로 결과가 훨씬 더 좋습니다. 모델이 원하는 작업을 수행하도록 지시하는 효과적인 프롬프트를 설계하는 이러한 접근 방식을 이 가이드에서는 프롬프트 엔지니어링이라고 합니다.
위 예시는 오늘날 LLM으로 무엇이 가능한지에 대한 기본적인 설명을 보여줍니다. 오늘날의 LLM은 텍스트 요약부터 수학적 추론, 코드 생성에 이르기까지 모든 종류의 고급 작업을 수행할 수 있습니다.
프롬프트 형식 지정
위에서 매우 간단한 프롬프트를 시도해 보았습니다. 표준 프롬프트는 다음과 같은 형식을 가집니다:
<질문>?
또는
<지시>
이를 많은 QA 데이터셋에서 표준인 질문 응답(QA) 형식으로 다음과 같이 구성할 수 있습니다:
Q: <질문>?
A:
위와 같이 프롬프트를 입력하는 것을 제로샷 프롬프팅(zero-shot prompting)이라고도 하는데, 이는 달성하고자 하는 작업에 대한 어떠한 예시나 시연 없이 모델에 직접 응답을 요청하는 것을 의미합니다. 일부 대규모 언어 모델은 제로샷 프롬프팅을 수행할 수 있지만, 이는 당면한 작업의 복잡성과 지식, 그리고 모델이 잘 수행하도록 훈련된 작업에 따라 달라집니다.
구체적인 프롬프트 예시는 다음과 같습니다:
프롬프트
Q: 프롬프트 엔지니어링이란 무엇인가요?
일부 최신 모델에서는 시퀀스 구성 방식에 따라 "Q:" 부분이 질문 응답 작업으로 암시되고 모델에 의해 이해되므로 이를 생략할 수 있습니다. 즉, 프롬프트는 다음과 같이 단순화될 수 있습니다:
프롬프트
프롬프트 엔지니어링이란 무엇인가요?
위에서 제시된 표준 형식을 바탕으로, 프롬프팅의 인기 있고 효과적인 한 가지 기술은 예시(즉, 시연)를 제공하는 퓨샷 프롬프팅(few-shot prompting)이라고 불립니다. 퓨샷 프롬프트는 다음과 같이 구성할 수 있습니다:
<질문>?
<답변>
<질문>?
<답변>
<질문>?
<답변>
<질문>?
QA 형식 버전은 다음과 같습니다:
Q: <질문>?
A: <답변>
Q: <질문>?
A: <답변>
Q: <질문>?
A: <답변>
Q: <질문>?
A:
QA 형식을 사용할 필요는 없다는 점을 명심하세요. 프롬프트 형식은 당면한 작업에 따라 달라집니다. 예를 들어, 다음과 같이 간단한 분류 작업을 수행하고 작업을 시연하는 예시를 제공할 수 있습니다:
프롬프트:
이것은 정말 멋져요! // 긍정
이것은 나빠요! // 부정
와우, 그 영화는 정말 대단했어요! // 긍정
정말 끔찍한 쇼였어요! //
출력:
부정
퓨샷 프롬프트는 언어 모델이 몇 가지 시연만으로 작업을 학습할 수 있는 능력인 인컨텍스트 학습(in-context learning)을 가능하게 합니다. 제로샷 프롬프팅과 퓨샷 프롬프팅에 대해서는 다음 섹션에서 더 자세히 다룰 것입니다.
프롬프트의 구성 요소
프롬프트 엔지니어링과 관련된 더 많은 예시와 응용 사례를 다루면서, 특정 요소들이 프롬프트를 구성한다는 것을 알게 될 것입니다.
프롬프트는 다음 요소 중 하나 이상을 포함합니다:
-
지시(Instruction): 모델이 수행하기를 원하는 특정 작업 또는 지시
-
맥락(Context): 모델이 더 나은 응답을 생성하도록 유도할 수 있는 외부 정보 또는 추가적인 맥락
-
입력 데이터(Input Data): 응답을 찾고자 하는 입력 또는 질문
-
출력 지시자(Output Indicator): 출력의 유형 또는 형식
프롬프트 구성 요소를 더 잘 보여주기 위해, 다음은 텍스트 분류 작업을 수행하는 것을 목표로 하는 간단한 프롬프트입니다:
프롬프트
텍스트를 중립, 부정, 긍정으로 분류하세요.
텍스트: 음식은 괜찮았던 것 같아요.
감정:
위 프롬프트 예시에서, '텍스트를 중립, 부정, 긍정으로 분류하세요'는 지시(Instruction)에 해당하며, 이는 분류 작업입니다. '음식은 괜찮았던 것 같아요.' 부분은 입력 데이터(Input Data)에 해당하고, 사용된 출력 지시자(Output Indicator)는 '감정:'입니다. 이 기본적인 예시에는 맥락(Context)이 사용되지 않았지만, 이것 역시 프롬프트의 일부로 제공될 수 있다는 점에 유의하세요. 예를 들어, 이 텍스트 분류 프롬프트의 맥락은 모델이 작업을 더 잘 이해하고 기대하는 출력 유형을 유도하는 데 도움이 되도록 프롬프트의 일부로 제공되는 추가 예시가 될 수 있습니다.
프롬프트에 네 가지 요소를 모두 사용할 필요는 없으며, 형식은 당면한 작업에 따라 달라집니다. 향후 가이드에서 더 구체적인 예시를 다룰 것입니다.
프롬프트 설계의 일반적인 팁
프롬프트를 설계할 때 염두에 두어야 할 몇 가지 팁이 있습니다:
간단하게 시작하기
프롬프트 설계를 시작할 때, 최적의 결과를 얻기 위해 많은 실험이 필요한 반복적인 과정이라는 점을 명심해야 합니다. OpenAI 또는 Cohere의 간단한 플레이그라운드를 사용하는 것이 좋은 시작점입니다.
간단한 프롬프트로 시작하여 더 나은 결과를 목표로 더 많은 요소와 맥락을 계속 추가할 수 있습니다. 이러한 이유로 프롬프트를 계속해서 반복하는 것이 중요합니다. 이 가이드를 읽다 보면, 구체성, 단순성, 간결성이 종종 더 나은 결과를 제공하는 많은 예시를 보게 될 것입니다.
여러 하위 작업이 포함된 큰 작업을 가지고 있다면, 작업을 더 간단한 하위 작업으로 분해하고 더 나은 결과를 얻으면서 계속 구축해 나갈 수 있습니다. 이는 처음부터 프롬프트 설계 과정에 너무 많은 복잡성을 추가하는 것을 방지합니다.
지시
"작성", "분류", "요약", "번역", "정리" 등과 같은 명령어를 사용하여 모델에 무엇을 달성하고 싶은지 지시함으로써 다양한 간단한 작업에 대한 효과적인 프롬프트를 설계할 수 있습니다.
무엇이 가장 잘 작동하는지 알아보기 위해 많은 실험이 필요하다는 점을 명심하세요. 다양한 키워드, 맥락, 데이터와 함께 다른 지시를 시도해보고 특정 사용 사례와 작업에 가장 적합한 것이 무엇인지 확인하세요. 일반적으로 수행하려는 작업과 맥락이 더 구체적이고 관련성이 높을수록 더 좋습니다. 향후 가이드에서 샘플링과 더 많은 맥락 추가의 중요성에 대해 다룰 것입니다.
일부 전문가들은 프롬프트 시작 부분에 지시를 배치할 것을 권장합니다. 또 다른 권장 사항은 "###"와 같은 명확한 구분자를 사용하여 지시와 맥락을 분리하는 것입니다.
예를 들어:
프롬프트:
지시
아래 텍스트를 스페인어로 번역하세요:
텍스트: "hello!"
출력:
¡Hola!
구체성
모델이 수행하기를 원하는 지시와 작업에 대해 매우 구체적으로 작성하세요. 프롬프트가 더 서술적이고 상세할수록 결과가 더 좋습니다. 이는 특히 원하는 결과나 생성 스타일이 있을 때 중요합니다. 더 나은 결과를 가져오는 특정 토큰이나 키워드가 있는 것은 아닙니다. 좋은 형식과 서술적인 프롬프트를 갖는 것이 더 중요합니다. 사실, 프롬프트에 예시를 제공하는 것은 특정 형식으로 원하는 출력을 얻는 데 매우 효과적입니다.
프롬프트를 설계할 때 프롬프트의 길이에 제한이 있으므로 프롬프트의 길이를 염두에 두어야 합니다. 얼마나 구체적이고 상세해야 하는지에 대해 생각해 보세요. 너무 많은 불필요한 세부 사항을 포함하는 것은 반드시 좋은 접근 방식은 아닙니다. 세부 사항은 관련성이 있어야 하며 당면한 작업에 기여해야 합니다. 이는 많이 실험해야 할 부분입니다. 애플리케이션에 대한 프롬프트를 최적화하기 위해 많은 실험과 반복을 권장합니다.
예를 들어, 텍스트에서 특정 정보를 추출하는 간단한 프롬프트를 시도해 봅시다.
프롬프트:
다음 텍스트에서 장소 이름을 추출하세요.
원하는 형식:
장소: <쉼표_로_구분된_장소_목록>
입력: "이러한 발전이 연구자들에게 고무적이지만, 여전히 많은 부분이 미스터리입니다. "우리는 종종 뇌와 말초에서 보는 효과 사이에 블랙박스가 있습니다."라고 리스본의 샴팔리모드 미지의 센터(Champalimaud Centre for the Unknown in Lisbon)의 신경면역학자인 엔리케 베이가-페르난데스(Henrique Veiga-Fernandes)는 말합니다. "치료적 맥락에서 사용하려면 메커니즘을 실제로 이해해야 합니다."
출력:
장소: 샴팔리모드 미지의 센터, 리스본
(입력 텍스트는 이 Nature 기사에서 가져왔습니다.)
저희의 새로운 AI 강좌에서 프롬프트 기법과 예시에 대해 더 자세히 알아보세요. 지금 가입하세요! PROMPTING20 코드를 사용하여 추가 20% 할인을 받으세요.
부정확함 피하기
위에서 언급된 세부 사항과 형식 개선에 대한 팁들을 고려할 때, 프롬프트에 대해 너무 영리하게 굴려 잠재적으로 부정확한 설명을 생성하는 함정에 빠지기 쉽습니다. 종종 구체적이고 직접적인 것이 더 좋습니다. 여기서의 비유는 효과적인 의사소통과 매우 유사합니다. 더 직접적일수록 메시지가 더 효과적으로 전달됩니다.
예를 들어, 프롬프트 엔지니어링의 개념을 배우는 데 관심이 있을 수 있습니다. 다음과 같이 시도해 볼 수 있습니다:
프롬프트 엔지니어링 개념을 설명하세요. 설명은 짧게, 몇 문장만 사용하고 너무 서술적으로 작성하지 마세요.
위 프롬프트에서는 몇 문장을 사용해야 하는지, 어떤 스타일로 작성해야 하는지 명확하지 않습니다. 위 프롬프트로도 어느 정도 좋은 응답을 얻을 수 있지만, 더 나은 프롬프트는 매우 구체적이고 간결하며 핵심을 짚는 프롬프트일 것입니다. 예를 들어:
고등학생에게 프롬프트 엔지니어링 개념을 2~3문장으로 설명하세요.
해야 할 일인가, 하지 말아야 할 일인가?
프롬프트를 설계할 때 또 다른 일반적인 팁은 무엇을 하지 말아야 할지 말하는 것을 피하고 대신 무엇을 해야 할지 말하는 것입니다. 이는 더 많은 구체성을 장려하고 모델로부터 좋은 응답을 얻는 데 기여하는 세부 사항에 집중합니다.
다음은 제가 지시를 작성한 방식, 즉 하지 말아야 할 것에 초점을 맞추었기 때문에 제가 원하지 않는 것을 정확히 실패한 영화 추천 챗봇의 예시입니다.
프롬프트:
다음은 고객에게 영화를 추천하는 에이전트입니다. 관심사를 묻지 마세요. 개인 정보를 묻지 마세요.
고객: 제 관심사에 따라 영화를 추천해 주세요.
에이전트:
출력:
물론, 고객님의 관심사에 따라 영화를 추천해 드릴 수 있습니다. 어떤 종류의 영화를 보고 싶으신가요? 액션, 코미디, 로맨스 또는 다른 것을 선호하시나요?
다음은 더 나은 프롬프트입니다:
프롬프트:
다음은 고객에게 영화를 추천하는 에이전트입니다. 이 에이전트는 전 세계적으로 가장 인기 있는 영화 중에서 영화를 추천해야 합니다. 사용자의 선호도를 묻는 것을 자제하고 개인 정보를 묻는 것을 피해야 합니다. 에이전트가 추천할 영화가 없다면, "죄송합니다, 오늘 추천할 영화를 찾을 수 없었습니다."라고 응답해야 합니다.
고객: 제 관심사에 따라 영화를 추천해 주세요.
에이전트:
출력:
죄송합니다, 고객님의 관심사에 대한 정보가 없습니다. 하지만, 현재 전 세계적으로 가장 인기 있는 영화 목록은 다음과 같습니다: [영화 목록]. 마음에 드는 영화를 찾으시길 바랍니다!
위 예시 중 일부는 "OpenAI API를 사용한 프롬프트 엔지니어링 모범 사례" 문서에서 가져왔습니다.
프롬프트 예시
이전 섹션에서는 LLM에 프롬프트를 입력하는 방법에 대한 기본적인 예시를 소개했습니다.
이 섹션에서는 다양한 작업을 수행하기 위해 프롬프트를 사용하는 방법에 대한 더 많은 예시를 제공하고, 그 과정에서 핵심 개념을 소개할 것입니다. 종종 개념을 배우는 가장 좋은 방법은 예시를 통해 익히는 것입니다. 아래의 몇 가지 예시는 잘 만들어진 프롬프트를 사용하여 다양한 유형의 작업을 수행하는 방법을 보여줍니다.
텍스트 요약
자연어 생성의 표준 작업 중 하나는 텍스트 요약입니다. 텍스트 요약은 다양한 종류와 도메인을 포함할 수 있습니다. 사실, 언어 모델의 가장 유망한 응용 프로그램 중 하나는 기사나 개념을 빠르고 읽기 쉬운 요약으로 요약하는 능력입니다. 프롬프트를 사용하여 기본적인 요약 작업을 시도해 봅시다.
항생제에 대해 알고 싶다고 가정해 봅시다. 다음과 같은 프롬프트를 시도해 볼 수 있습니다:
프롬프트:
항생제를 설명하세요.
A:
출력:
항생제는 세균 감염을 치료하는 데 사용되는 약의 일종입니다. 항생제는 박테리아를 죽이거나 번식을 막아 신체의 면역 체계가 감염과 싸우도록 돕습니다. 항생제는 일반적으로 알약, 캡슐 또는 액체 용액의 형태로 경구 투여되거나 때로는 정맥 주사됩니다. 항바이러스 감염에는 효과가 없으며, 부적절하게 사용하면 항생제 내성을 유발할 수 있습니다.
"A:"는 질문 응답에서 사용하는 명시적인 프롬프트 형식입니다. 여기서 이 형식을 사용하여 모델에 답변이 더 필요하다는 것을 알립니다. 이 예시에서는 이것이 유용한지 명확하지 않지만, 나중 예시에서 다시 다룰 것입니다. 이것이 너무 많은 정보이고 더 요약하고 싶다고 가정해 봅시다. 사실, 모델에 한 문장으로 요약하도록 지시할 수 있습니다:
프롬프트:
항생제는 세균 감염을 치료하는 데 사용되는 약의 일종입니다. 항생제는 박테리아를 죽이거나 번식을 막아 신체의 면역 체계가 감염과 싸우도록 돕습니다. 항생제는 일반적으로 알약, 캡슐 또는 액체 용액의 형태로 경구 투여되거나 때로는 정맥 주사됩니다. 항바이러스 감염에는 효과가 없으며, 부적절하게 사용하면 항생제 내성을 유발할 수 있습니다.
위 내용을 한 문장으로 설명하세요:
출력:
항생제는 박테리아를 죽이거나 번식을 막아 세균 감염을 치료하는 데 사용되는 약물이지만, 바이러스에는 효과가 없고 과도하게 사용하면 항생제 내성을 유발할 수 있습니다.
위 출력의 정확성에 너무 신경 쓰지 않고(나중에 다룰 내용입니다), 모델은 단락을 한 문장으로 요약하려고 노력했습니다. 지시를 더 영리하게 만들 수도 있지만, 그것은 나중 장으로 남겨두겠습니다. 여기서 잠시 멈추고 더 나은 결과를 얻는지 실험해 보세요.
정보 추출
언어 모델은 자연어 생성 및 관련 작업을 수행하도록 훈련되었지만, 분류 및 기타 다양한 자연어 처리(NLP) 작업도 매우 잘 수행할 수 있습니다.
다음은 주어진 단락에서 정보를 추출하는 프롬프트의 예시입니다.
프롬프트:
연구 논문의 저자 기여 및 감사의 글에는 저자가 원고 작성 및 분석에 ChatGPT와 같은 AI 기술을 사용했는지 여부와 그 정도를 명확하고 구체적으로 명시해야 합니다. 어떤 LLM이 사용되었는지도 명시해야 합니다. 이는 편집자와 심사위원이 잠재적인 편향, 부정확성 및 부적절한 출처 표시에 대해 원고를 더 신중하게 검토하도록 경고할 것입니다. 마찬가지로, 과학 저널은 제출된 원고를 선택할 때와 같이 LLM 사용에 대해 투명해야 합니다.
위 단락에 언급된 대규모 언어 모델 기반 제품을 언급하세요:
출력:
위 단락에 언급된 대규모 언어 모델 기반 제품은 ChatGPT입니다.
위 결과를 개선할 수 있는 방법은 많지만, 이것만으로도 매우 유용합니다.
이제 모델에 단순히 지시를 내리는 것만으로도 다양한 작업을 수행하도록 요청할 수 있다는 것이 명백해졌을 것입니다. 이는 AI 제품 개발자들이 강력한 제품과 경험을 구축하는 데 이미 사용하고 있는 강력한 기능입니다.
(단락 출처: ChatGPT: 연구를 위한 다섯 가지 우선순위)
질문 응답
모델이 특정 답변으로 응답하도록 하는 가장 좋은 방법 중 하나는 프롬프트의 형식을 개선하는 것입니다. 이전에 다룬 바와 같이, 프롬프트는 지시, 맥락, 입력, 출력 지시자를 결합하여 개선된 결과를 얻을 수 있습니다. 이러한 구성 요소는 필수는 아니지만, 지시가 더 구체적일수록 더 나은 결과를 얻을 수 있으므로 좋은 습관이 됩니다. 아래는 더 구조화된 프롬프트를 따른 모습의 예시입니다.
프롬프트:
아래 맥락을 바탕으로 질문에 답하세요. 답변은 짧고 간결하게 작성하세요. 답변을 확신할 수 없으면 "답변 불확실"이라고 응답하세요.
맥락: 테플리주맙(Teplizumab)은 뉴저지 제약회사 Ortho Pharmaceutical에서 시작되었습니다. 그곳에서 과학자들은 OKT3라고 불리는 항체의 초기 버전을 만들었습니다. 원래 쥐에서 유래한 이 분자는 T 세포 표면에 결합하여 세포 사멸 능력을 제한할 수 있었습니다. 1986년, 신장 이식 후 장기 거부를 예방하는 데 도움이 되도록 승인되어 인간에게 사용이 허용된 최초의 치료용 항체가 되었습니다.
질문: OKT3는 원래 어디에서 유래했나요?
답변:
출력:
쥐.
(맥락은 Nature에서 가져왔습니다.)
텍스트 분류
지금까지는 간단한 지시를 사용하여 작업을 수행했습니다. 프롬프트 엔지니어로서 더 나은 지시를 제공하는 데 능숙해져야 합니다. 하지만 그것이 전부가 아닙니다! 더 어려운 사용 사례의 경우, 단순히 지시를 제공하는 것만으로는 충분하지 않다는 것을 알게 될 것입니다. 이때 맥락과 프롬프트에서 사용할 수 있는 다양한 요소에 대해 더 많이 생각해야 합니다. 제공할 수 있는 다른 요소로는 입력 데이터나 예시가 있습니다.
텍스트 분류 예시를 통해 이를 보여주려고 합니다.
프롬프트:
텍스트를 중립, 부정 또는 긍정으로 분류하세요.
텍스트: 음식은 괜찮았던 것 같아요.
감정:
출력:
중립
텍스트를 분류하라는 지시를 내렸고 모델은 '중립'으로 응답했으며, 이는 올바릅니다. 이것은 아무런 문제가 없지만, 모델이 원하는 정확한 형식으로 레이블을 제공해야 한다고 가정해 봅시다. 그래서 'Neutral' 대신 'neutral'을 반환하기를 원합니다. 어떻게 이를 달성할 수 있을까요? 이를 위한 방법은 여러 가지가 있습니다. 여기서는 구체성이 중요하므로, 프롬프트에 더 많은 정보를 제공할수록 더 나은 결과를 얻을 수 있습니다. 올바른 행동을 지정하기 위해 예시를 제공해 볼 수 있습니다. 다시 시도해 봅시다:
프롬프트:
텍스트를 중립, 부정 또는 긍정으로 분류하세요.
텍스트: 휴가는 괜찮은 것 같아요.
감정: neutral
텍스트: 음식은 괜찮았던 것 같아요.
감정:
출력:
neutral
완벽합니다! 이번에는 모델이 찾고 있던 특정 레이블인 'neutral'을 반환했습니다. 프롬프트에 제공된 예시가 모델이 출력에서 구체적이 되도록 도왔던 것 같습니다.
때때로 구체적인 것이 왜 중요한지 강조하기 위해, 아래 예시를 확인하고 문제를 찾아보세요:
프롬프트:
텍스트를 nutral, negative 또는 positive로 분류하세요.
텍스트: 휴가는 괜찮은 것 같아요.
감정:
출력:
Neutral
여기서 무엇이 문제일까요? 힌트를 드리자면, 만들어진 'nutral' 레이블은 모델에 의해 완전히 무시됩니다. 대신, 모델은 해당 레이블에 대한 편향 때문에 'Neutral'을 출력합니다. 하지만 실제로는 'nutral'을 원한다고 가정해 봅시다. 어떻게 이 문제를 해결할 수 있을까요? 아마도 레이블에 대한 설명을 추가하거나 프롬프트에 더 많은 예시를 추가할 수 있을까요? 확실하지 않다면, 다음 섹션에서 몇 가지 아이디어를 논의할 것입니다.
대화
아마도 프롬프트 엔지니어링으로 달성할 수 있는 가장 흥미로운 것 중 하나는 LLM 시스템에 어떻게 행동하고, 어떤 의도를 가지며, 어떤 정체성을 가져야 하는지 지시하는 것입니다. 이는 고객 서비스 챗봇과 같은 대화 시스템을 구축할 때 특히 유용합니다.
예를 들어, 질문에 대해 더 기술적이고 과학적인 응답을 생성할 수 있는 대화 시스템을 만들어 봅시다. 지시를 통해 어떻게 행동해야 하는지 명시적으로 알려주는 방식에 주목하세요. 이는 때때로 역할 프롬프팅(role prompting)이라고 불립니다.
프롬프트:
다음은 AI 연구 보조원과의 대화입니다. 보조원의 어조는 기술적이고 과학적입니다.
사람: 안녕하세요, 누구시죠?
AI: 안녕하세요! 저는 AI 연구 보조원입니다. 오늘 어떻게 도와드릴까요?
사람: 블랙홀의 생성에 대해 알려줄 수 있나요?
AI:
출력:
물론입니다! 블랙홀은 중력이 너무 강해서 빛조차도 탈출할 수 없는 시공간의 영역입니다. 블랙홀은 매우 거대한 별이 죽고 그 중심부가 자체적으로 붕괴하여 무한 밀도의 특이점을 형성할 때 생성됩니다. 특이점의 강렬한 중력은 주변의 모든 물질과 복사 에너지를 끌어들여 블랙홀을 만듭니다.
저희 AI 연구 보조원이 너무 기술적인가요? 좋습니다, 이 행동을 변경하고 시스템에 더 이해하기 쉬운 답변을 제공하도록 지시해 봅시다.
프롬프트:
다음은 AI 연구 보조원과의 대화입니다. 보조원의 답변은 초등학생도 이해하기 쉬워야 합니다.
사람: 안녕하세요, 누구시죠?
AI: 안녕하세요! 저는 AI 연구 보조원입니다. 오늘 어떻게 도와드릴까요?
사람: 블랙홀의 생성에 대해 알려줄 수 있나요?
AI:
출력:
물론입니다! 블랙홀은 아주 아주 큰 별이 연료가 떨어져서 스스로 무너질 때 만들어져요. 별의 중력이 너무 강해서 빛조차도 그 힘에서 벗어날 수 없어요. 이것이 바로 시공간에서 아주 강한 중력을 가진 점을 만드는데, 그것이 블랙홀이라고 불리는 거예요.
조금 진전이 있었죠? 계속 개선할 수 있습니다. 예시를 더 추가하면 훨씬 더 좋은 결과를 얻을 수도 있습니다.
코드 생성
LLM이 매우 효과적인 응용 분야 중 하나는 코드 생성입니다. Copilot은 이에 대한 훌륭한 예시입니다. 영리한 프롬프트를 통해 수행할 수 있는 엄청난 수의 코드 생성 작업이 있습니다. 아래에서 몇 가지 예시를 살펴보겠습니다.
먼저, 사용자에게 인사하는 간단한 프로그램을 시도해 봅시다.
프롬프트:
/*
사용자에게 이름을 묻고 "Hello"라고 말합니다.
*/
출력:
let name = prompt("What is your name?");
console.log(Hello, ${name}!);
사용할 언어를 지정할 필요조차 없었다는 점에 주목하세요.
조금 수준을 바꿔봅시다. 아래 예시는 프롬프트 설계에 약간의 노력을 기울이면 LLM이 얼마나 강력해질 수 있는지 보여줍니다.
프롬프트:
"""
테이블 departments, 열 = [DepartmentId, DepartmentName]
테이블 students, 열 = [DepartmentId, StudentId, StudentName]
컴퓨터 과학 부서의 모든 학생을 위한 MySQL 쿼리를 생성하세요.
"""
출력:
SELECT StudentId, StudentName
FROM students
WHERE DepartmentId IN (SELECT DepartmentId FROM departments WHERE DepartmentName = 'Computer Science');
정말 인상적입니다. 이 경우, 데이터베이스 스키마에 대한 데이터를 제공하고 유효한 MySQL 쿼리를 생성하도록 요청했습니다.
추론
아마도 오늘날 LLM에게 가장 어려운 작업 중 하나는 어떤 형태의 추론을 요구하는 작업일 것입니다. 추론은 LLM에서 나올 수 있는 복잡한 애플리케이션의 유형 때문에 가장 흥미로운 분야 중 하나입니다.
수학적 능력과 관련된 작업에서 일부 개선이 있었습니다. 그렇다 하더라도, 현재 LLM은 추론 작업을 수행하는 데 어려움을 겪고 있으므로 이는 훨씬 더 고급 프롬프트 엔지니어링 기술을 필요로 한다는 점을 알아두는 것이 중요합니다. 이러한 고급 기술은 다음 가이드에서 다룰 것입니다. 지금은 산술적 능력을 보여주는 몇 가지 기본적인 예시를 다룰 것입니다.
프롬프트:
9,000 * 9,000은 얼마인가요?
출력:
81,000,000
좀 더 어려운 것을 시도해 봅시다.
프롬프트:
이 그룹의 홀수들을 합하면 짝수가 됩니다: 15, 32, 5, 13, 82, 7, 1.
A:
출력
아니요, 이 그룹의 홀수들을 합하면 홀수가 됩니다: 119.
이것은 틀렸습니다! 프롬프트를 개선하여 이를 개선해 봅시다.
프롬프트:
이 그룹의 홀수들을 합하면 짝수가 됩니다: 15, 32, 5, 13, 82, 7, 1.
문제를 단계별로 해결하세요. 먼저 홀수를 식별하고, 합산하고, 결과가 홀수인지 짝수인지 표시하세요.
출력:
홀수: 15, 5, 13, 7, 1
합계: 41
41은 홀수입니다.
훨씬 낫죠? 참고로, 이 작업을 몇 번 시도했는데 모델이 가끔 실패합니다. 더 나은 지시와 예시를 제공하면 더 정확한 결과를 얻는 데 도움이 될 수 있습니다.
다음 섹션에서는 이 모든 작업 및 더 어려운 작업의 성능을 향상시키기 위한 훨씬 더 고급 프롬프트 엔지니어링 개념과 기술을 다룰 것입니다.
노트북
위 프롬프트들을 Python을 사용하여 연습하고 싶다면, OpenAI 모델을 사용하여 일부 프롬프트를 테스트할 수 있는 노트북을 준비했습니다.
https://github.com/dair-ai/Prompt-Engineering-Guide/blob/main/notebooks/pe-lecture.ipynb
--------------------------------------------------------------------------------------광고(Advertising)--------------------------------------------------------------------------------------------------------