본문 바로가기

프롬프트 엔지니어링(Prompt Engineering)

기본적인 프롬프트

728x90

프롬프트의 기본

chaGPT를 사용하여 내가 어떠한 정보를 얻으려고 한다고 가정해 봅시다.

내가 원하는 정보를 정확히 얻는 것은 질문을 얼마나 정확하고 명료하게 하느냐에 따라 달라집니다.

한 두 단어 툭 던져서 질문을 한다면 원하는 정확한 답변을 기대하기는 어려울 것입니다.

 

결국 프롬프트는 GPT에 전달하는 지시사항, 질문뿐만 아니라 예제와 같은 세부 정보도 포함될 수 있습니다.

(우리가 원하는 것에 대해 더 많은 문맥과 지시사항을 제공해야 합니다)

 

이렇게 모델이 작업을 수행하도록 지시하는 최적의 프롬프트를 디자인하는 것프롬프트 엔지니어링이라고 합니다.

 

프롬프트(Prompt)란 :

대규모 언어 모델(Large Language Model, LLM)에게 작업을 수행하도록 지시하는 문장이나 문단. 예를 들어, 특정 질문에

대한 답변을 찾기 위해 LLM을 사용하려면, 해당 질문을 프롬프트로 전달하여 LLM이 답변을 생성하도록 지시할 수 있습니다.

 

프롬프트는 지시사항을 제공하고, LLM은 해당 지시사항에 따라 결과를 생성합니다. 이렇게

생성된 결과는 프롬프트에 따라 다를 수 있기 때문에, 프롬프트 엔지니어링(Prompt Engineering)을 통해 최정의 프롬프트를

디자인하고, LLM이 원하는 작업을 더 정확하게 수행할 수 있도록 개선하는 것이 중요합니다.

 

 

프롬프트의 결과를 좌우하는 중요한 매개변수

1. 온도(Temperature) - 이 값이 낮을수록 가장 높은 확률을 가진 대답이 항상 선택되기 때문에 보다 결정적입니다.

이 값을 올리면 무작위성이 증가하고  다양하고 창의적인 결과를 도출할 수 있습니다. 예를 들어, 사실 기반의 질문에 대한 

답변을 찾는 경우(QnA같은 경우) 이 값을 낮춤으로써 보다 사실에 근거한 간결한 대답을 촉구할 수 있습니다. 반대로, 시(詩)와 같이 

창조적인 작업을 요하는 경우에는 이 값을 높이는 것이 유리할 수 있습니다.

 

2. Top_p - 마찬가지로 핵 샘플링이라고 하는 샘플링 기법인 top_p를 사용하면 모델이 응답을 생성하는 데 얼마나 결정론적인지를 

제어할 수 있습니다. 정확하고 사실적인 답변을 찾는 경우 top_p의 값을 낮게 유지하는 것이 좋습니다. 보다 다양한 답변을 원하는 경우에는 값을 높이면 됩니다. 

 

일반적으로 둘 다가 아니라 둘 중 하나를 변경하는 것이 좋습니다.

 

표준적인 QnA방식의 프롬프트

예를 들어 무엇인가를 ChaGPT에 질문하는 다음과 같은 프롬프트가 있다고 가정해 봅시다.

xxx입니까?

이것은 QnA형식으로, 아래와 같이 모범답안을 몇 개 제시하여 LLM으로부터 올바른 답변을 얻을 확률을 높이는 

Few-shot prompting」 이라는 기법이 있습니다. 

 

Q: xxxですか?
A: 모범답안

Q: xxxですか?
A: 모범답안

Q: xxxですか?
A:

꼭 이 방법을 따라야 하는 것은 아닙니다.

예를 들어 간단한 분류 작업을 수행하고 다음과 같이 작업을 보여주는 예시를 제공할 수 있습니다.

 

굉장해!  // 긍정적
별로야!  // 부정적
너무 행복해!  // 긍정적

출력 :   정말 끔찍해!  // 부정적

이렇게 몇 가지 예제만으로 언어 모델이 작업을 학습을 가능하게 할 수 있습니다.

 

프롬프트 구성 요소 

지시문(Instruction) - 모델에 수행해야 할 구체적인 작업이나 명령

문맥(Context) - 모델이 더 나은 결과를 도출할 수 있도록 외부 정보나 추가적인 문맥

입력 데이터(Input Data) - 응답을 찾아야 하는 입력이나 질문

출력 지시자(Output Indicator) - 출력의 형식이나 유형 

모델이 처리하는 작업에 따라 필요한 요소가 달라집니다.

 

프롬프트 설계의 팁

간단하게 시작

  • 최적의 결과를 얻기 위해서는 반복적인 과정이 필요합니다.

OpenAI나 Cohere와 같은 심플한 PlayGround를 사용하는 것이 좋은 시작점입니다.

 

  • 프롬프트의 버전관리가 필요  

간단한 프롬프트부터 시작해서 더 많은 요소와 문맥을 추구하면서 결과를 개선해 나갈 수 있습니다.

  • 여러 가지 하위 작업이 포함된 큰 작업이 있다면 더욱 단순한 작업으로 분해합니다. 

프롬프트 디자인 과정에 너무 많은 복잡성이 추가되지 않도록 방지할 수 있습니다.

 

지시문을 명확히 하는 것

쓰기(Write), 분류(Classify), 요약(Summarize), 번역(Translate), 순서(Order) 을 사용하여 

모델이 달성하고자 하는 작업을 지시하여 간단한 작업에 대한 효과적인 프롬프트를 디자인할 수 있습니다.

 

다양한 키워드, 문맥, 데이터를 사용하여  다양한 프롬프트를 실험하여 가장 잘 작동하는 것을 찾아야 합니다.

 

지시문가 프롬프트의 시작 부분에 위치하도록 권장합니다. 또한 ###과 같은 명확한 구분자를 사용할 것을 권장합니다.

 

### 지시내용 ###
다음 텍스트를 스페인어로 바꿔주세요

텍스트 : "안녕"

결과

¡Hola!

 

구체성

모델이 수행해야 하는 지시와 작업에 대해 매우 구체적으로 명시해야 합니다. 

더 나은 결과를 얻기 위해 구체적이고 상세한 예시를 제공하는 것은 매우 효과적입니다.

 

프롬프트의 길이도 고려해야 합니다.

불필요한 세부정보는 결과에 악영향을 끼칠 가능성이 있습니다.

 

불명확함 피하기 

상세하고 형식을 개선하는 팁에 대한 이전 내용들을 고려하면, 프롬프트에 대해 너무 똑똑하고 부정확한 설명을 만들어 내려는 

유혹에 빠지기 쉽습니다. 특정적이고 직접적인 것이 더 나은 경우가 많습니다. 

 

불명확한 프롬프트

프롬프트 엔지니어링 개념을 설명해 주세요. 설명은 간결하게, 몇 개의 문장으로, 너무 구체적으로는 설명하지 마세요.

개선된 프롬프트

고등학생에게 프롬프트 엔지니어의 개념을 2~3 문장으로 설명해 주세요.

 

해야 할 것, 하지 말아야 할 것

하지 말아야 할 것보다는 무엇을 해야 할 것인가를 명확히 지시해야 하고, 모델이 좋은 응답을 이끌어 내는 세부 사항에 초점을 맞춥니다.

 

다음은 적절하지 않은 프롬프트의 예입니다.

다음은 고객과 영화를 추천해 주는 에이전트와의 대화입니다.
고객의 관심사나 개인정보를 요청하지 마십시오.

고객 : 관심사에 기반한 영화를 추천해 주세요.
에이전트 : 

출력 
당신은 어떤 장르를 좋아하세요? 액션, 드라마, 코미디, 로맨스, 서스펜스, 호러 등 고를 수 있습니다.
아니면 최근 관람한 영화 중에서 좋았던 것이 있으면 알려주세요. 그것에 기반해서 추천해 드리겠습니다.

지시를 무시하고, 에이전트는 고객의 흥미를 묻게 되었습니다.

 

개선한 프롬프트

다음은 고객과 영화를 추천해 주는 에이전트와의 대화입니다.
에이전트는 글로벌 트렌드에서 상위에 위치한 영화를 추천해야 할 책임을 지며, 사용자의 관심사를 묻지 않고 개인 정보를 요청하지 않아야 합니다. 에이전트가 추천할 영화가 없는 경우 "죄송합니다. 오늘 추천할 영화를 찾을 수 없습니다."라고 응답해야 합니다.

고객 : 관심사에 기반한 영화를 추천해 주세요.
에이전트 : 

출력
죄송합니다. 당신의 관심사에 대한 정보가 없습니다. 하지만 지금 글로벌 트렌드에서 상위에 위치한 영화 목록을 드리겠습니다: [영화 목록]. 당신이 마음에 드는 영화를 찾길 바랍니다!

지시한 데로 영화목록을 추천해 주고, 고객의 관심사나 개인정보를 끌어들이지 않습니다.  

728x90