Prompt-Engineering-Guide/pages/introduction/examples.kr.mdx
j-kim 83bce96e2c Fix examples.kr.mdx
English prompt words to Korean.
FIx wrong word.
2023-04-26 12:10:49 +09:00

330 lines
15 KiB
Plaintext

# 프롬프트 예시
이전 파트에서, LLM에 프롬프트를 입력하는 기본적인 예를 다뤄보았습니다.
이번에는 프롬프트가 작업을 수행하는 추가 예시를 제공하고 그 과정에서 핵심 개념을 살펴보겠습니다. 개념을 배우는 가장 좋은 방법은 예시를 통해 이해하는 것입니다. 아래에서 잘 작성된 프롬프트가 다른 유형의 작업을 수행하기 위해 어떻게 사용되는지에 대한 몇 가지 예를 다루고 있습니다.
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년, 신장 이식 후 장기 거부 반응 예방을 위해 승인되어 인간이 사용할 수 있는 최초의 치료용 항체가 되었다.
질문: OKT3는 어디서 유래했는가?
답변:
```
_출력:_
```
쥐.
```
문맥 원문의 출처는 [Nature](https://www.nature.com/articles/d41586-023-00400-x) 입니다.
---
## 텍스트 분류
지금 까지, 우리는 작업 수행을 위 간단한 지시들을 사용해보았습니다. 프롬프트 엔지니어로서 점점 더 바른 지시를 내리는 것은 기본 소양입니다. 하지만 그것만이 전부는 아닙니다. 더 까다로운 작업을 수행하기 위해서는 지시만으로는 해결되지 않는다는 것을 깨닫게 될 것입니다. 문맥과 여러 요소들을 고려하여 적절한 프롬프트를 사용할 필요가 있습니다. `데이터 입력`이나 `예시`또한 요소로 사용됩니다.
텍스트 분류 예시를 제공하여 이를 설명해보겠습니다.
_프롬프트:_
```
문장을 중립, 부정 혹은 긍정으로 분류해줘.
문구: 그 음식은 그럭저럭이었어.
감정:
```
_출력:_
```
중립
```
모델에게 텍스트 분류법을 알려주었더니 모델은 `'중립'`이라는 올바른 답변을 반환했습니다. 오답은 아니지만, 우리가 원하는 특정 형식의 라벨이 있고 그것을 모델이 반환하기를 원한다고 가정해보겠습니다. `Neutral` 대신 `neutral`을 반환하도록 유도해봅시다. 그러기위해서는 어떻게 하면 될까요? 방법은 여러가지가 있습니다. 지금 이 예시에서는 정확성에 초점을 맞추고있고, 프롬프트에 더 많은 정보를 제공하는만큼 더 나은 결과를 얻을 수 있습니다. 원하는 결과를 얻기위해 예시들을 제공해보겠습니다. 다시 시도해보겠습니다 :
_프롬프트:_
```
문장을
문장을 중립, 부정 혹은 긍정으로 분류해줘.
문구: 이번 휴가는 그럭저럭이었어.
감정: neutral
문구: 그 음식은 그럭저럭이었어.
감정:
```
_출력:_
```
중립
```
우와! 의도한 대로 모델은 소문자로 시작하는 `중립`이라는 대답을 반환했습니다. 프롬프트에 예시를 제공함으로써 모델로부터 원하는 답변을 끌어낼 수 있었습니다. 꼼꼼히 질문하는 것이 중요하다는 것을 다음 예시를 통해서 살펴보도록 합시다:
_프롬프트:_
```
문장을 증립, 부정 혹은 긍정으로 분류해줘.
문구: 이번 휴가는 그럭저럭이었어.
감정:
```
_출력:_
```
중립
```
뭐가 문제일까요? 프롬프트에 입력된 "증립" 레이블은 모델에게 완전히 무시됐습니다. 대신, 모델은 "중립"을 출력하며 이는 해당 레이블에 대한 편향이 있기 때문입니다. 그러나 우리가 실제로 원하는 것은 "증립"이라고 가정해 봅시다. 이 문제를 해결하려면 어떻게 해야 할까요? 레이블에 설명을 추가하거나 프롬프트에 더 많은 예제를 추가해 볼 수 있을까요? 확신이 없으셔도, 우리는 다음 섹션에서 몇 가지 아이디어를 논의할 것 입니다.
---
## 회화
아마 프롬프트 엔지니어링을 통해 접할 수 있는 흥미로운 점들 중 하나는 LLM 시스템의 행동과 의도 그리고 정체성을 고려하여 지시를 내리는 것일겁니다. 이러한 특성은 고객 서비스 챗봇과 같은 대화형 시스템을 구축할 때 특히 유용합니다.
예시로, 주어진 질문에 기술적이고 과학적인 대답을 반환 할 수있는 대화형 시스템을 구축해보겠습니다. 이른바 *role prompting*이라 불리우는 것입니다.
_프롬프트:_
```
다음은 AI 연구 보조원과의 대화입니다. 이 보조원의 어조는 기술적이고 과학적입니다.
인간: 안녕, 너는 누구니?
AI: 반갑습니다! 저는 AI 연구 보조원입니다. 무엇을 도와드릴까요?
인간: 블랙홀 생성에 대해 설명해줄래?
AI:
```
_출력:_
```
물론입니다! 블랙홀은 중력이 너무 강해서 심지어 빛조차도 벗어날 수 없는 시공간의 영역입니다. 거대한 별이 죽고 그 중심핵이 스스로 붕괴하여 무한 밀도의 특이점을 형성할 때 생성됩니다. 특이점의 강한 중력은 그 주변의 모든 물질과 방사선을 끌어당겨 블랙홀을 만듭니다.
```
우리 AI 연구원의 대답은 쉽게 이해할 수 있는 논조는 아니지요? 이 행동을 변경하여 시스템에 보다 접근하기 쉬운 답변을 지시해봅시다.
_프롬프트:_
```
다음은 AI 연구 보조원과의 대화입니다. 보조원은 초등학생도 이해할 수 있는 수준으로 답변해야합니다.
인간: 안녕, 너는 누구니?
AI: 반갑습니다! 저는 AI 연구 보조원입니다. 무엇을 도와드릴까요?
인간: 블랙홀 생성에 대해 설명해줄래?
AI:
```
_출력:_
```
물론이죠! 블랙홀은 아주 큰 별이 연료를 다 써버려 붕괴함으로써 만들어집니다. 별의 중력이 매우 강하기 때문에 빛조차도 끌어당겨 그 중력장에 의한 공간에 점이 생깁니다. 그것이 블랙홀이지요.
```
진전이 보이시지요? 여기서 더 개선할 수도 있어보입니다. 더 많은 예시를 지시할 수록 더 나은 결과가 나올것이라 확신합니다.
---
## 코드 생성
LLM은 매우 효과적인 코드 생성 애플리케이션 중 하나입니다. Copilot이 대표적인 예시이지요.
프롬프트를 영리하게 사용해서 많은 양의 코드를 생성할 수 있습니다. 아래에서 몇 가지 예시를 살펴보겠습니다.
먼저, 유저에게 인사를 건네는 단순한 프로그램을 생성해보겠습니다.
_프롬프트:_
```
/*
유저의 이름을 입력받고 "안녕"이라고 해줘
*/
```
_출력:_
```
let name = prompt("이름이 뭐예요?");
console.log(`안녕하세요, ${이름}!`);
```
어느 프로그래밍 언어를 써야하는지 조차도 알려주지 않았습니다.
좀 더 레벨을 올려보겠습니다. 프롬프트를 어떻게 디자인하느냐에따라 LLM이 얼마나 더 강력해질 수 있는 지 보여주겠습니다.
_프롬프트:_
```
"""
DB테이블 departments, columns = [DepartmentId, DepartmentName]
DB테이블 students, columns = [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은 홀수입니다.
```
훨씬 낫지요? 참고로 저는 이 명령을 여러 번 시도했지만 시스템은 가끔 오답을 제시할 때도 있었습니다.더 나은 지시와 예시를 제공함으로써 보다 정확한 결과를 얻을 수 있겠지요.
이 가이드의 해당 섹션에서는 일반적인 응용 프로그램의 예시를 계속 소개 할 예정입니다.
다음 섹션에서는 이러한 모든 작업의 성능을 향상시키기 위한 보다 심화된 프롬프트 엔지니어링 개념과 기술에 대해 설명하겠습니다.