이번에는 프롬프트가 작업을 수행하는 추가 예시를 제공하고 그 과정에서 핵심 개념을 살펴보겠습니다. 개념을 배우는 가장 좋은 방법은 예시를 통해 이해하는 것입니다. 아래에서 잘 작성된 프롬프트가 다른 유형의 작업을 수행하기 위해 어떻게 사용되는지에 대한 몇 가지 예를 다루고 있습니다.
Topics:
- [문장 요약](#문장 요약)
- [정보 추출](#정보 추출)
- [질의 응답](#질의 응답)
- [텍스트 분류](#텍스트 분류)
- [회화](#회화)
- [코드 생성](#코드 생성)
- [추론](#추론)
---
## 문장 요약
문장 요약은 자연어 생성의 대표적인 작업 중 하나입니다. 문장 요약은 여러 주제와 도메인을 포함합니다. 사실, 언어 모델의 가장 유망한 응용 프로그램 중 하나는 기사와 개념을 빠르게 요약할 수 있는 능력입니다. 프롬프트를 사용하여 간단한 요약 작업을 실행해보겠습니다.
예를 들어 항생제에 대해 배우고 싶다면 다음과 같은 프롬프트를 시도할 수 있습니다:
_프롬프트:_
```
항생제에 대해 설명해줘
A:
```
_출력:_
```
항생제는 세균 감염을 치료하기 위해 사용되는 약제의 일종입니다. 세균을 죽이거나 재생을 방지하여 몸의 면역계가 감염에 대항할 수 있도록 합니다. 항생제는 정제, 캡슐, 액체의 형태로 일반적으로 입을 통해 섭취하지만 경우에 따라 정맥 내 투여되기도 합니다. 항생제는 바이러스 감염에는 효과가 없으며 남용 시 항생제 내성을 일으킬 수 있습니다.
```
"A:"는 질답 형식에 사용되는 명시적 프롬프트 형식을 띄고있습니다. 저는 모델에게 추가 질문을 할 것이라고 암시하기위해 이 방법을 사용했습니다. 이 예시가 어느 방식으로 유용한가에 대해서는 추후 살펴보도록하겠습니다. 우리가 원했던 것 보다 훨씬 더 많은 양의 정보를 받아서 요약이 필요하다고 가정해보도록 하겠습니다. 실제로 모델에게 다음과 같이 한 문장으로 요약하도록 지시할 수 있습니다:
_프롬프트:_
```
항생제는 세균 감염을 치료하기 위해 사용되는 약제의 일종입니다. 세균을 죽이거나 재생을 방지하여 몸의 면역계가 감염에 대항할 수 있도록 합니다. 항생제는 정제, 캡슐, 액체의 형태로 일반적으로 입을 통해 섭취하지만 경우에 따라 정맥 내 투여되기도 합니다. 항생제는 바이러스 감염에는 효과가 없으며 남용 시 항생제 내성을 일으킬 수 있습니다.
위 내용을 한 문장으로 요약해줘.
```
_출력:_
```
항생제는 박테리아를 죽이거나 번식을 막음으로써 감염을 치료하는 데 사용되는 약이지만, 바이러스에 효과적이지 않고 과도한 사용은 항생제 내성을 초래할 수 있습니다.
```
위 대답의 정확성은 추후 가이드에서 다룰 예정이므로 차치하고, 일단 모델이 단락을 한 문장으로 요약했다는 것에 초점을 맞춰보겠습니다. 좀 더 정확한 지시를 내리는 방법에 대해서도 뒷 장에서 살펴볼 예정이므로 잠시 잊어버리고 지금 당장은 자유롭게 더 나은 결과를 얻을 수 있는 방법을 실험해보세요.
---
## 정보 추출
언어 모델은 자연어 생성 관련 작업을 수행하도록 훈련되었지만 분류나 다양한 자연어 처리(NLP) 작업을 수행할 수도 있습니다.
주어진 단락에서 정보를 추출하는 프롬프트의 예시를 살펴봅시다.
_프롬프트:_
```
연구 논문의 저자 기고문과 인정서는 저자들이 원고 작성과 분석에 ChatGPT 등 AI 기술을 사용했는지 여부와 범위를 명확하고 구체적으로 명시해야 합니다. 또한 어떤 LLM이 사용되었는지 표시해야 합니다. 이를 통해 편집자와 검토자는 잠재적 편향, 부정확성 및 부적절한 출처에 대해 원고를 보다 신중하게 검토하도록 유도할 수 있습니다. 마찬가지로, 과학 저널은 투고된 원고 선정 시 LLMs를 사용한 경우에는 그 이력을 투명하게 공개해야 합니다.
위 단락에서 언급된 대규모 언어 모델 기반 제품을 알려줘.
```
_출력:_
```
위 단락에서 언급된 대규모 언어 모델 기반 제품은 ChatGPT입니다.
```
위의 결과를 개선하는 방법은 더러 있겠지만, 이미 그 자체로 꽤 쓸만합니다.
이제 우리는 단순한 지시만으로 모델이 다양한 작업을 수행하도록 할 수 있다는 사실을 배웠습니다. 이는 AI 제품 개발자들이 이미 강력한 제품이나 서비스를 구현하기 위해 사용하는 강력한 능력입니다.
원본 출처: [ChatGPT: five priorities for research](https://www.nature.com/articles/d41586-023-00288-7)
---
## 질의 응답
모델로부터 원하는 답변을 끌어내는 가장 좋은 방법 중 하나는 프롬프트 포맷을 개선하는 것입니다. 앞서 살펴본 바와 같이 프롬프트는 지시, 문맥, 입력 및 출력 인디케이터를 조합하여 더 나은 결과를 얻을 수 있습니다. 이러한 요소는 필수적인 것은 아니지만, 지시가 구체적일수록 더 좋은 결과를 얻을 수 있기때문에 적절히 사용하는 방법을 익히세요. 다음은 보다 구조화된 프롬프트를 실행해보겠습니다.
_프롬프트:_
```
아래 문맥을 고려해서 질문에 답변해줘. 답변은 짧고 간결하게 해줘. 답변이 정확하지 않다면, 「확실치 않은 대답」 이라고 응답해줘.
문맥: Teplizumab은 Ortho Pharmaceutical이라고 불리는 뉴저지의 약제 회사에서 유래했다. 그래서 과학자들은 OKT3라는 항체의 초기 버전을 생성했다. 원래 쥐에서 유래된 이 분자는 T 세포의 표면에 결합하여 세포를 죽이는 잠재력을 제한할 수 있다. 1986년, 신장 이식 후 장기 거부 반응 예방을 위해 승인되어 인간이 사용할 수 있는 최초의 치료용 항체가 되었다.
지금 까지, 우리는 작업 수행을 위 간단한 지시들을 사용해보았습니다. 프롬프트 엔지니어로서 점점 더 바른 지시를 내리는 것은 기본 소양입니다. 하지만 그것만이 전부는 아닙니다. 더 까다로운 작업을 수행하기 위해서는 지시만으로는 해결되지 않는다는 것을 깨닫게 될 것입니다. 문맥과 여러 요소들을 고려하여 적절한 프롬프트를 사용할 필요가 있습니다. `데이터 입력`이나 `예시`또한 요소로 사용됩니다.
텍스트 분류 예시를 제공하여 이를 설명해보겠습니다.
_프롬프트:_
```
문장을 중립, 부정 혹은 긍정으로 분류해줘.
문구: 그 음식은 그럭저럭이었어.
감정:
```
_출력:_
```
중립
```
모델에게 텍스트 분류법을 알려주었더니 모델은 `'중립'`이라는 올바른 답변을 반환했습니다. 오답은 아니지만, 우리가 원하는 특정 형식의 라벨이 있고 그것을 모델이 반환하기를 원한다고 가정해보겠습니다. `Neutral` 대신 `neutral`을 반환하도록 유도해봅시다. 그러기위해서는 어떻게 하면 될까요? 방법은 여러가지가 있습니다. 지금 이 예시에서는 정확성에 초점을 맞추고있고, 프롬프트에 더 많은 정보를 제공하는만큼 더 나은 결과를 얻을 수 있습니다. 원하는 결과를 얻기위해 예시들을 제공해보겠습니다. 다시 시도해보겠습니다 :
뭐가 문제일까요? 프롬프트에 입력된 "증립" 레이블은 모델에게 완전히 무시됐습니다. 대신, 모델은 "중립"을 출력하며 이는 해당 레이블에 대한 편향이 있기 때문입니다. 그러나 우리가 실제로 원하는 것은 "증립"이라고 가정해 봅시다. 이 문제를 해결하려면 어떻게 해야 할까요? 레이블에 설명을 추가하거나 프롬프트에 더 많은 예제를 추가해 볼 수 있을까요? 확신이 없으셔도, 우리는 다음 섹션에서 몇 가지 아이디어를 논의할 것 입니다.
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은 홀수입니다.
```
훨씬 낫지요? 참고로 저는 이 명령을 여러 번 시도했지만 시스템은 가끔 오답을 제시할 때도 있었습니다.더 나은 지시와 예시를 제공함으로써 보다 정확한 결과를 얻을 수 있겠지요.
이 가이드의 해당 섹션에서는 일반적인 응용 프로그램의 예시를 계속 소개 할 예정입니다.
다음 섹션에서는 이러한 모든 작업의 성능을 향상시키기 위한 보다 심화된 프롬프트 엔지니어링 개념과 기술에 대해 설명하겠습니다.