[번역] 프롬프트 엔지니어링(Prompt Engineering)으로 GPT 게임 레벨 업그레이드하기
이 포스트는 원문을 개인적으로 번역한 내용입니다. 오역이나 개인적인 견해가 포함되어 있을 수 있으니 양해 부탁드리며, 좀 더 정확한 정보는 원문을 참조하시길 바라겠습니다.
OpenAI와 .NET에 대한 블로그 시리즈에 다시 오신 것을 환영합니다!
만약 이 블로그 시리즈에 처음 오신 거라면, 먼저 이 시리즈를 소개하고 .NET에서 OpenAI를 활용하는 방법에 대해 다루는 첫 번째 포스트를 확인하세요.
이번 포스트에서는 프롬프트 엔지니어링과 OpenAI 모델에 제공하는 입력 정보를 개선하여 보다 적절한 응답을 생성하는 방법을 중점으로 다룹니다. 그럼 시작해 보겠습니다!
프롬프트란 무엇인가요?
프롬프트는 컴플리션을 생성하기 위해 모델에 제공되는 사용자 입력으로, 컴플리션이라고 하는 응답을 생성하도록 모델을 안내하는 역할을 합니다.
프롬프트와 컴플리션에 대한 자세한 내용은 .NET으로 OpenAI 컴플리션(Completions) 생성하기 포스트를 참조하세요.
프롬프트의 구조
프롬프트는 최소 두 가지 구성 요소로 이루어집니다:
- 콘텍스트(Context)
- 태스크(Task) / 쿼리(Query)
예를 들어 다음과 같은 프롬프트가 있을 때:
2학년 학생을 위해 이 내용을 요약하세요.
목성은 태양에서 다섯 번째 행성이며 태양계에서 가장 큰 행성입니다. 질량은 태양의 1000분의 1이지만 태양계의 다른 모든 행성을 합친 것보다 2.5배나 큰 가스 거성입니다. 목성은 밤하늘에서 육안으로 볼 수 있는 가장 밝은 천체 중 하나로, 역사가 기록되기 전부터 고대 문명에 알려져 왔습니다. 목성이라는 이름은 로마의 신 목성(Jupiter)에서 따온 것입니다. 지구에서 볼 때 목성은 반사된 빛이 눈에 보이는 그림자를 드리울 정도로 밝고, 평균적으로 밤하늘에서 달과 금성에 이어 세 번째로 밝은 천체입니다.
다음과 같이 구분할 수 있습니다:
- 콘텍스트 : 목성은 태양에서 다섯 번째 행성이며 태양계에서 가장 큰 행성입니다. 질량은 태양의 1000분의 1이지만 태양계의 다른 모든 행성을 합친 것보다 2.5배나 큰 가스 거성입니다. 목성은 밤하늘에서 육안으로 볼 수 있는 가장 밝은 천체 중 하나로, 역사가 기록되기 전부터 고대 문명에 알려져 왔습니다. 목성이라는 이름은 로마의 신 목성(Jupiter)에서 따온 것입니다. 지구에서 볼 때 목성은 반사된 빛이 눈에 보이는 그림자를 드리울 정도로 밝고, 평균적으로 밤하늘에서 달과 금성에 이어 세 번째로 밝은 천체입니다.
- 태스크/쿼리 : 2학년 학생을 위해 이 내용을 요약하세요.
프롬프트 엔지니어링이란 무엇인가요?
프롬프트 엔지니어링은 원하는 의도에 더 가까운 결과물을 생성하기 위해 프롬프트를 작성하는 프로세스 및 기법입니다.
프롬프트 작성을 위한 팁
전체 목록은 아니지만, 다음은 프롬프트와 컴플리션의 품질을 향상할 수 있는 간단한 팁입니다:
- 명확하고 구체적으로 작성하기
- 샘플 결과물 제공하기
- 관련 콘텍스트 제공하기
- 지속적으로 개선하기
명확하고 구체적으로 작성하기
프롬프트를 작성할 때, 제공되는 세부 정보가 적을수록 모델은 더 많은 가정을 하게 됩니다. 프롬프트에 제한과 제약 조건을 설정하여 모델이 원하는 결과를 출력하도록 안내합니다.
예를 들어, 다음과 같은 프롬프트를 사용하여 소셜 미디어 게시물의 감정을 분류한다고 가정해 보겠습니다:
이 게시물 분류
"내 고양이는 사랑스럽다 ❤️❤️"
다음과 같은 응답을 받을 수 있습니다: 이 게시물은 진술 또는 의견으로 분류됩니다.
보시다시피, 이 게시물에는 임의의 카테고리가 지정되었습니다. 그러나 이 카테고리는 감정과는 아무런 관련이 없습니다. 프롬프트에 더 많은 지침과 제약 조건을 제공하면 원하는 출력을 생성하도록 모델을 안내할 수 있습니다.
프롬프트를 보다 정확하게 작성하면, 게시물의 감정을 긍정, 중립 또는 부정 중 하나로 분류하도록 요청할 수 있습니다.
이 게시물의 감정을 긍정, 중립 또는 부정으로 분류
"내 고양이는 사랑스럽다 ❤️❤️"
이제 감정을 분류하고자 했던 원래 의도에 더 가깝게 긍정의 결과를 얻을 수 있습니다.
샘플 결과물 제공하기
결과물을 생성하는 가장 빠른 방법은 학습된 모델의 사전 구성된 설정을 사용하는 것입니다. 이것을 제로샷 학습(zero-shot learning)이라고 합니다. 작업할 데이터와 유사한 데이터를 사용하여 샘플을 제공하면, 모델이 보다 나은 결과물을 생성하도록 더 잘 안내할 수 있습니다. 이 기법을 퓨샷 학습(few-shot learning)이라고 합니다.
예를 들어, 이메일과 같은 문서에서 정보를 추출하여 JSON 객체를 생성하고 싶다고 가정해 보겠습니다.
이 텍스트에서 도시와 공항 코드를 JSON으로 추출:
"로스앤젤레스에서 마이애미까지 비행기를 타고 가고 싶어요."
다음과 같은 응답을 얻을 수 있습니다:
{
"From": {
"City": "로스앤젤레스",
"Airport Code": "LAX"
},
"To": {
"City": "마이애미",
"Airport Code": "MIA"
}
}
맞는 결과이긴 하지만, 생성된 JSON 객체의 스키마가 애플리케이션에서 예상하는 스키마와 일치하지 않을 수 있습니다. 이런 경우 의도한 대로 모델이 결과물의 형식을 지정하도록 안내할 샘플을 제공할 수 있습니다. 다음과 같이 프롬프트를 작성합니다:
이 텍스트에서 도시와 공항 코드를 JSON으로 추출:
Text: "로스앤젤레스에서 마이애미까지 비행기를 타고 가고 싶어요." JSON Output: { "Origin": { "CityName": "로스앤젤레스", "AirportCode": "LAX" }, "Destination": { "CityName": "Miami", "AirportCode": "MIA" } }
Text: "올랜도에서 보스턴까지 비행기를 타고 가고 싶어요."
이제 다음과 같은 응답을 얻을 수 있습니다:
{
"Origin": {
"CityName": "올랜도",
"AirportCode": "MCO"
},
"Destination": {
"CityName": "보스턴",
"AirportCode": "BOS"
}
}
관련 콘텍스트 제공하기
GPT와 같은 모델은 인터넷에 있는 수백만 개의 문서와 아티팩트에 대해 학습되었습니다. 따라서 질문에 대해 답변하는 것과 같은 작업을 요청할 때, 응답을 생성하는 데 사용할 수 있는 리소스의 범위를 제한하지 않으면 실행 가능한 올바른 응답을 얻을 수도 있지만(잘못된 응답일 수 있음) 최악의 경우에는 조작된 답변을 얻을 수도 있습니다.
예를 들어 누군가에게 해리 포터에 대한 요약을 작성해 달라고 요청하면 영화, 책 또는 비디오 게임 등 여러 가지를 언급할 수 있습니다. 이러한 매체들에서 캐릭터와 일부 요소는 유사할 수 있지만, 스토리 라인은 다를 수 있으므로 그럴듯하지만 정확하지 않은 응답을 얻을 수 있습니다.
모델이 생성할 것으로 예상되는 결과물의 샘플을 제공하는 제로샷 및 퓨샷 학습과 유사하게, 프롬프트에 명확한 사실 정보나 추가 관련 정보를 제공하여 모델이 질문에 답하고 다양한 기타 작업을 수행하도록 안내할 수 있습니다. 이 기법은 사실 정보를 기반으로 하기 때문에 그라운딩(grounding)이라고 하며, Bing의 일부 AI 기능이 작동하는 방식이기도 합니다. 먼저 검색을 수행하여 쿼리에 대한 응답과 가장 관련성이 높은 문서를 찾습니다. 그런 다음 가장 관련성이 높은 내용이 프롬프트에 추가 콘텍스트로 제공되고 AI 모델은 이 정보를 사용하여 보다 관련성 높은 응답을 생성합니다.
어떤 문서에 대한 몇 가지 질문에 답변을 한다고 가정해 보겠습니다. 이 문서는 위키피디아와 같은 공개 웹페이지이거나 회사 내부 기술 자료의 문서일 수 있습니다. 콘텍스트에 추가 정보가 포함된 프롬프트는 다음과 같습니다:
목성은 태양에서 다섯 번째 행성이며 태양계에서 가장 큰 행성입니다. 질량은 태양의 1000분의 1이지만 태양계의 다른 모든 행성을 합친 것보다 2.5배나 큰 가스 거성입니다. 목성은 밤하늘에서 육안으로 볼 수 있는 가장 밝은 천체 중 하나로, 역사가 기록되기 전부터 고대 문명에 알려져 왔습니다. 목성이라는 이름은 로마의 신 목성(Jupiter)에서 따온 것입니다. 지구에서 볼 때 목성은 반사된 빛이 눈에 보이는 그림자를 드리울 정도로 밝고, 평균적으로 밤하늘에서 달과 금성에 이어 세 번째로 밝은 천체입니다.
다음 질문에 답하세요:
Q: 태양에서 다섯 번째 행성은 무엇인가요?
A: 목성
Q: 태양에 비해 목성의 질량은 얼마인가요?:
다음과 유사한 응답을 얻을 수 있습니다:
A: 목성의 질량은 태양의 1000분의 1입니다.
이 예시에서는 단순히 사실과 정보를 제공하는 것뿐만 아니라, 모델이 응답의 일부로 사용할 수 있는 예시까지 제공했습니다.
지속적으로 개선하기
결과물을 생성하는 것은 시행착오의 과정일 수 있습니다. 첫 번째 시도에서 기대하는 결과물을 얻지 못했다고 실망하지 말고 이 포스트에서 설명하고 있는 기법 중 하나 이상을 적용하여 가장 적합한 방법을 찾아보세요. 모델이 생성한 초기 결과물 세트를 재사용하여 프롬프트에 추가적인 콘텍스트와 지침을 제공하면서 지속적으로 개선합니다.
독자적인 프롬프트를 작성해 보세요.
이제 몇 가지 프롬프트와 컴플리션을 개선하는 방법을 알았으니, 독자적인 프롬프트를 생성해 볼 차례입니다. 다음과 같이 시작할 수 있습니다.
- OpenAI 또는 Azure OpenAI Service에 가입하거나 액세스를 요청합니다.
- 자격 증명을 사용하여 OpenAI .NET 샘플을 참고합니다.
다음 주제는 무엇인가요?
다음 포스트에서는 ChatGPT에 대해 더 자세히 알아보고, 다양한 대화형 콘텍스트에서 OpenAI 모델을 사용하는 방법에 대해서도 다룰 예정입니다.
여러분의 의견을 듣고 싶습니다.
여러분이 애플리케이션에서 AI를 어떻게 활용하고자 하는지 좀 더 자세히 알고 싶습니다. 잠시 시간을 내어 이 설문조사에 참여해 주시면 감사하겠습니다.
또, 더 자세히 알아보고 싶은 주제가 있다면 댓글로 알려주세요.
추가 리소스
독자적인 프롬프트를 작성하기 위한 더 많은 기술을 배우고 싶다면, Prompt engineering techniques 설명서와 The Art of the Prompt: How To Get The Best Out Of Generative AI 기사를 참조하세요.
이 포스트 시리즈 전체 보기
3. [번역] 프롬프트 엔지니어링(Prompt Engineering)으로 GPT 게임 레벨 업그레이드하기
2. [번역] .NET으로 OpenAI 컴플리션(Completions) 생성하기