mirror of
https://github.com/dair-ai/Prompt-Engineering-Guide
synced 2024-11-19 21:25:35 +00:00
293 lines
15 KiB
Plaintext
293 lines
15 KiB
Plaintext
# 프롬프트 예시
|
|
|
|
이전 절에서, 대규모언어모델(LLM)에 프롬프트를 입력하는 기본적인 예를 살펴보았습니다.
|
|
|
|
이번 절에서는 프롬프트를 사용하여 다양한 작업을 수행하는 예시를 통해 핵심 개념을 살펴보겠습니다. 종종, 개념을 배우는 가장 좋은 방법은 예시를 통해 이해하는 것입니다. 아래의 잘 작성된 프롬프트 예시를 통해 서로 다른 유형의 작업을 어떻게 수행할 수 있는지에 대해 알아보겠습니다.
|
|
|
|
Topics:
|
|
- [문장 요약](#문장-요약)
|
|
- [정보 추출](#정보-추출)
|
|
- [질의응답](#질의응답)
|
|
- [텍스트 분류](#텍스트-분류)
|
|
- [대화](#대화)
|
|
- [코드 생성](#코드-생성)
|
|
- [추론](#추론)
|
|
|
|
---
|
|
|
|
## 문장 요약
|
|
문장 요약은 자연어 생성의 대표적인 작업 중 하나입니다. 문장 요약은 여러 주제와 도메인을 포함합니다. 사실, 언어 모델의 가장 유망한 애플리케이션 중 하나는 기사와 개념을 빠르고 읽기 쉽게 요약할 수 있는 능력입니다. 프롬프트를 사용하여 간단한 요약 작업을 시도해 보겠습니다.
|
|
|
|
예를 들어 항생제에 대해 배우고 싶다면 다음과 같은 프롬프트를 시도할 수 있습니다:
|
|
|
|
*Prompt:*
|
|
|
|
```
|
|
항생제에 대해 설명해 줘
|
|
|
|
A:
|
|
```
|
|
|
|
*Output:*
|
|
|
|
```
|
|
항생제는 세균 감염을 치료하기 위해 사용되는 약물의 일종입니다. 세균을 죽이거나 번식을 방지하여 신체의 면역 체계가 감염에 대항할 수 있도록 합니다. 항생제는 보통 알약, 캡슐, 액체의 형태로 경구 복용하거나 때때로 정맥 주사로 투여되기도 합니다. 항생제는 바이러스 감염에는 효과적이지 않고, 남용할 경우 항생제 내성이 생길 수 있습니다.
|
|
```
|
|
|
|
"A:"는 질의응답에 사용되는 명시적 프롬프트 형식을 띠고 있습니다. 여러분은 모델에게 추가적으로 답변을 기대하고 있다는 것을 전달하기 위해서 이 방법을 사용했습니다. 이 예시가 얼마나 유용한가에 대해서는 추후에 다른 예시에서 살펴보도록 하겠습니다. 이제 이 출력이 우리가 원했던 것보다 더 많은 양의 정보라서 추가적인 요약이 필요하다고 가정해 보겠습니다. 실제로 모델에게 다음과 같이 한 문장으로 요약하도록 지시할 수 있습니다:
|
|
|
|
*Prompt:*
|
|
```
|
|
항생제는 세균 감염을 치료하기 위해 사용되는 약물의 일종입니다. 세균을 죽이거나 번식을 방지하여 신체의 면역 체계가 감염에 대항할 수 있도록 합니다. 항생제는 보통 알약, 캡슐, 액체의 형태로 경구 복용하거나 때때로 정맥 주사로 투여되기도 합니다. 항생제는 바이러스 감염에는 효과적이지 않고, 남용할 경우 항생제 내성이 생길 수 있습니다.
|
|
|
|
위 내용을 한 문장으로 요약해 줘:
|
|
```
|
|
|
|
*Output:*
|
|
```
|
|
항생제는 박테리아를 죽이거나 번식을 막음으로써 감염을 치료하는 데 사용되는 약이지만, 바이러스에 효과적이지 않고 과도한 사용은 항생제 내성을 초래할 수 있습니다.
|
|
```
|
|
|
|
위 대답의 정확성은 추후 가이드에서 다룰 예정이므로 차치하고, 일단 모델이 단락을 한 문장으로 요약했다는 것에 초점을 맞춰 보겠습니다. 좀 더 정확한 지시를 내리는 방법에 대해서도 뒷장에서 살펴보기로 하고, 지금은 자유롭게 더 나은 결과를 얻을 수 있는지 실험해 보겠습니다.
|
|
|
|
---
|
|
## 정보 추출
|
|
언어 모델은 자연어 생성과 관련된 작업을 수행하도록 훈련되었지만 분류나 다양한 자연어 처리(NLP) 작업을 수행할 수도 있습니다.
|
|
|
|
주어진 단락에서 정보를 추출하는 프롬프트의 예시를 살펴보겠습니다.
|
|
|
|
*Prompt:*
|
|
```
|
|
연구 논문의 저자 기여도 진술서과 사사는 저자들이 원고 작성과 분석에 ChatGPT 등 AI 기술을 사용했는지 여부와 범위를 명확하고 구체적으로 명시해야 합니다. 또한 어떤 LLM이 사용되었는지 표기해야 합니다. 이를 통해 편집자와 심사자가 잠재적 편향, 부정확성 및 부적절한 출처 등의 문제를 고려해 원고를 보다 신중하게 검토하도록 유도할 수 있습니다. 마찬가지로, 과학 저널은 투고된 원고 선정 시 LLM 사용 여부를 투명하게 공개해야 합니다.
|
|
|
|
위 단락에서 언급한 대규모언어모델 기반 제품을 알려줘.
|
|
```
|
|
|
|
*Output:*
|
|
```
|
|
위 단락에서 언급한 대규모언어모델 기반 제품은 ChatGPT입니다.
|
|
```
|
|
|
|
위의 결과를 개선하는 방법은 여러 가지가 있겠지만, 이미 그 자체로도 꽤 유용합니다.
|
|
|
|
이제 우리는 단순히 무엇을 할지 지시하는 것으로 모델이 다양한 작업을 수행하도록 할 수 있다는 사실을 배웠습니다. 이는 AI 제품 개발자들이 이미 강력한 제품이나 서비스를 구현하기 위해 사용하고 있는 강력한 능력입니다.
|
|
|
|
원본 출처: [ChatGPT: five priorities for research](https://www.nature.com/articles/d41586-023-00288-7)
|
|
|
|
---
|
|
## 질의응답
|
|
|
|
모델로부터 원하는 답변을 끌어내는 가장 좋은 방법 중 하나는 프롬프트 형식을 개선하는 것입니다. 앞서 살펴본 바와 같이 프롬프트는 지시, 문맥, 입력 데이터와 출력 지시자를 조합하여 더 나은 결과를 얻을 수 있습니다. 이러한 요소는 필수적인 것은 아니지만, 지시가 구체적일수록 더 좋은 결과를 얻을 수 있습니다. 다음은 보다 구조화된 프롬프트를 실행해 보겠습니다.
|
|
|
|
*Prompt:*
|
|
```
|
|
아래 문맥을 고려해서 질문에 답변해 줘. 답변은 짧고 간결하게 해 줘. 답변이 정확하지 않다면, 「확실치 않은 대답」이라고 응답해 줘.
|
|
|
|
문맥: Teplizumab은 Ortho Pharmaceutical이라는 뉴저지의 제약 회사에서 유래했다. 그곳에서, 과학자들은 OKT3라는 항체의 초기 버전을 만들어 냈다. 원래 쥐에서 유래된 이 분자는 T 세포의 표면에 결합하여 세포를 죽이는 잠재력을 제한할 수 있다. 1986년, 신장 이식 후 장기 거부 반응 예방을 위해 승인되어 인간이 사용할 수 있는 최초의 치료용 항체가 되었다.
|
|
|
|
|
|
질문: OKT3는 어디서 유래했는가?
|
|
|
|
답변:
|
|
```
|
|
|
|
*Output:*
|
|
```
|
|
쥐.
|
|
```
|
|
|
|
문맥의 출처는 [Nature](https://www.nature.com/articles/d41586-023-00400-x)입니다.
|
|
|
|
---
|
|
|
|
## 텍스트 분류
|
|
지금까지 우리는 간단한 지시를 사용하여 작업을 수행했습니다. 프롬프트 엔지니어로서 점점 더 나은 지시를 내리는 것은 기본 소양입니다. 하지만 그것이 전부는 아닙니다. 더 까다로운 작업을 수행하기 위해서는 지시만으로는 충분하지 않다는 것을 깨닫게 될 것입니다. 문맥과 여러 요소들을 고려하여 적절한 프롬프트를 사용할 필요가 있습니다. `입력 데이터`나 `예시` 또한 요소로 할 수 있습니다.
|
|
|
|
텍스트 분류를 예시로 이를 설명해 보겠습니다.
|
|
|
|
*Prompt:*
|
|
```
|
|
문장을 neutral, 부정 혹은 긍정으로 분류해 줘.
|
|
|
|
문구: 그 음식은 그럭저럭이었어.
|
|
감정:
|
|
```
|
|
|
|
*Output:*
|
|
```
|
|
Neutral
|
|
```
|
|
|
|
모델에게 텍스트 분류를 지시하자 모델은 `'Neutral'`이라는 올바른 답변을 반환했습니다. 오답은 아니지만, 모델이 우리가 원하는 특정 형식의 라벨을 반환하길 원한다고 가정해 보겠습니다. `Neutral` 대신 `neutral`을 반환하도록 유도해 봅시다. 그러기 위해서는 어떻게 해야 할까요? 방법은 여러 가지가 있습니다. 지금 이 예시에서는 정확성에 초점을 맞추고 있고, 프롬프트에 더 많은 정보를 제공할수록 더 나은 결과를 얻을 수 있습니다. 원하는 결과를 얻기 위해 예시들을 추가하여 다시 시도해 보겠습니다:
|
|
|
|
*Prompt:*
|
|
```
|
|
문장을 neutral, 부정 혹은 긍정으로 분류해 줘.
|
|
|
|
문구: 이번 휴가는 그럭저럭이었어.
|
|
감정: neutral
|
|
|
|
문구: 그 음식은 그럭저럭이었어.
|
|
감정:
|
|
```
|
|
|
|
*Output:*
|
|
```
|
|
neutral
|
|
```
|
|
|
|
우와! 의도한 대로 모델은 소문자로 시작하는 `neutral`을 반환했습니다. 프롬프트에 예시를 제공함으로써 모델로부터 원하는 답변을 끌어낼 수 있었습니다.
|
|
|
|
구체적으로 질문하는 것이 중요하다는 것을 다음 예시를 통해서 살펴보겠습니다:
|
|
|
|
*Prompt:*
|
|
```
|
|
문장을 nutral, 부정 혹은 긍정으로 분류해 줘.
|
|
|
|
문구: 이번 휴가는 그럭저럭이었어.
|
|
감정:
|
|
```
|
|
|
|
*Output:*
|
|
```
|
|
Neutral
|
|
```
|
|
|
|
어떤 점이 문제일까요? 프롬프트에 입력된 `nutral` 라벨은 모델에게 완전히 무시됐습니다. 대신, 모델은 `Neutral`을 출력했으며 이는 해당 라벨에 대한 편향이 있기 때문입니다. 그러나 우리가 실제로 원하는 것은 `nutral`이라고 가정해 보겠습니다. 이 문제를 해결하려면 어떻게 해야 할까요? 라벨에 설명을 추가하거나 프롬프트에 더 많은 예제를 추가해 보는 것은 어떨까요? 확신이 들지 않는다면, 다음 절에서 몇 가지 생각을 논의해 보겠습니다.
|
|
|
|
---
|
|
|
|
## 대화
|
|
아마 프롬프트 엔지니어링을 통해 접할 수 있는 흥미로운 점들 중 하나는 LLM 시스템의 행동과 의도 그리고 정체성을 고려하여 지시를 내리는 것일 겁니다. 이러한 특성은 고객 서비스 챗봇과 같은 대화형 시스템을 구축할 때 특히 유용합니다.
|
|
|
|
예를 들어 주어진 질문에 기술적이고 과학적인 대답을 반환할 수 있는 대화형 시스템을 구축해 보겠습니다. 이른바 *역할 프롬프팅(role prompting)*이라 불리는 것입니다.
|
|
|
|
*Prompt:*
|
|
```
|
|
다음은 AI 연구 보조원과의 대화입니다. 이 보조원의 어조는 기술적이고 과학적입니다.
|
|
|
|
인간: 안녕, 너는 누구니?
|
|
AI: 반갑습니다! 저는 AI 연구 보조원입니다. 오늘은 무엇을 도와드릴까요?
|
|
인간: 블랙홀 생성에 대해 설명해 줄래?
|
|
AI:
|
|
```
|
|
|
|
*Output:*
|
|
```
|
|
물론입니다! 블랙홀은 중력이 너무 강해서 심지어 빛조차도 벗어날 수 없는 시공간의 영역입니다. 아주 거대한 별이 죽고 그 중심핵이 스스로 붕괴하여 무한한 밀도의 특이점을 형성할 때 생성됩니다. 특이점의 강한 중력은 그 주변의 모든 물질과 방사선을 끌어당겨 블랙홀을 만듭니다.
|
|
```
|
|
|
|
우리 AI 연구 보조원의 대답은 너무 기술적인 것 같습니다. 이 행동을 변경하여 시스템에 보다 접근하기 쉬운 답변을 지시해 보겠습니다.
|
|
|
|
*Prompt:*
|
|
```
|
|
다음은 AI 연구 보조원과의 대화입니다. 보조원은 초등학생도 이해할 수 있는 수준으로 답변해야 합니다.
|
|
|
|
인간: 안녕, 너는 누구니?
|
|
AI: 반갑습니다! 저는 AI 연구 보조원입니다. 오늘은 무엇을 도와드릴까요?
|
|
인간: 블랙홀 생성에 대해 설명해줄래?
|
|
AI:
|
|
```
|
|
|
|
*Output:*
|
|
```
|
|
물론이죠! 블랙홀은 아주 거대한 별이 연료를 다 써 버려서 스스로 붕괴함으로써 만들어집니다. 별의 중력이 매우 강하기 때문에 빛조차도 벗어날 수 없습니다. 이렇게 강력한 중력을 가진 시공간의 한 점이 블랙홀입니다.
|
|
```
|
|
|
|
우리는 결과를 개선했습니다. 여기서 더 개선할 수도 있습니다. 더 많은 예시를 추가한다면 더 나은 결과를 얻을 수도 있습니다.
|
|
|
|
---
|
|
|
|
## 코드 생성
|
|
LLM은 매우 효과적인 코드 생성 애플리케이션 중 하나입니다. 코파일럿(Copilot)이 대표적인 예시입니다. 프롬프트를 영리하게 사용해서 코드를 생성하는 다양한 작업들이 있습니다. 아래에서 몇 가지 예시를 살펴보겠습니다.
|
|
|
|
먼저, 유저에게 인사를 건네는 단순한 프로그램을 생성해 보겠습니다.
|
|
|
|
*Prompt:*
|
|
```
|
|
/*
|
|
유저의 이름을 입력받고 "안녕"이라고 해 줘
|
|
*/
|
|
```
|
|
|
|
*Output:*
|
|
```
|
|
let name = prompt("이름이 뭐예요?");
|
|
console.log(`안녕하세요, ${이름}!`);
|
|
```
|
|
|
|
어느 프로그래밍 언어를 사용해야 하는지 지정할 필요도 없었습니다.
|
|
|
|
좀 더 수준을 올려 보겠습니다. 프롬프트를 어떻게 디자인하느냐에 따라 LLM이 얼마나 더 강력해질 수 있는지 살펴보겠습니다.
|
|
|
|
*Prompt:*
|
|
```
|
|
"""
|
|
DB테이블 departments, columns = [DepartmentId, DepartmentName]
|
|
DB테이블 students, columns = [DepartmentId, StudentId, StudentName]
|
|
컴퓨터과학부에 속한 모든 학생에 대한 MySQL 쿼리를 작성해 줘
|
|
"""
|
|
```
|
|
|
|
*Output:*
|
|
```
|
|
SELECT StudentId, StudentName
|
|
FROM students
|
|
WHERE DepartmentId IN (SELECT DepartmentId FROM departments WHERE DepartmentName = 'Computer Science');
|
|
```
|
|
|
|
꽤나 인상적입니다. 이 경우, 우리는 데이터베이스 스키마에 대한 정보를 제공하고 정상 작동하는 MySQL 쿼리를 작성하도록 요청했습니다.
|
|
|
|
---
|
|
|
|
## 추론
|
|
어떤 형태로든 추론이 필요한 작업은 아마도 오늘날 LLM으로 하기 가장 어려운 작업에 속합니다. 추론은 LLM에서 나타날 수 있는 복잡한 애플리케이션의 유형 중에서 가장 흥미로운 분야 중 하나입니다.
|
|
|
|
수학적인 능력을 필요로 하는 작업에서는 눈에 띄는 개선을 보여 주었지만, 현재의 LLM은 추론 작업을 수행하는 데 어려움을 겪기 때문에 훨씬 더 향상된 프롬프트 엔지니어링 기술을 필요로 합니다. 고급 기술에 대해서는 추후의 가이드에서 다루고, 지금은 산술 능력을 증명할 몇 가지 기본적인 예시를 다뤄 보겠습니다.
|
|
|
|
*Prompt:*
|
|
```
|
|
9,000 * 9,000는 뭐야?
|
|
```
|
|
|
|
*Output:*
|
|
```
|
|
81,000,000
|
|
```
|
|
|
|
좀 더 어려운 문제를 시도해 보겠습니다.
|
|
|
|
*Prompt:*
|
|
```
|
|
주어진 수 중에서 홀수를 모두 더해서 짝수를 만들어 줘: 15, 32, 5, 13, 82, 7, 1.
|
|
|
|
A:
|
|
```
|
|
|
|
*Output*
|
|
```
|
|
아니요, 주어진 수 중 홀수를 모두 더한 값은 홀수입니다: 119.
|
|
```
|
|
|
|
이번에는 틀렸습니다! 프롬프트를 개선하여 정확도를 향상해 보겠습니다.
|
|
|
|
*Prompt:*
|
|
```
|
|
주어진 수 중에서 홀수를 모두 더해서 짝수를 만들어 줘: 15, 32, 5, 13, 82, 7, 1.
|
|
|
|
문제를 단계별로 해결해 봐. 먼저 주어진 수 중 홀수를 찾아낸 뒤, 그것들을 합해서, 결과가 홀수인지 짝수인지 판별해 줘.
|
|
```
|
|
|
|
*Output:*
|
|
```
|
|
홀수: 15, 5, 13, 7, 1
|
|
총합: 41
|
|
41은 홀수입니다.
|
|
```
|
|
|
|
훨씬 낫지 않나요? 참고로 저는 이 명령을 여러 번 시도했지만 시스템은 가끔 오답을 제시했습니다. 더 나은 지시와 예시를 결합하는 것으로 보다 정확한 결과를 얻을 수 있습니다.
|
|
|
|
가이드의 이 절에서는 일반적인 애플리케이션의 예시를 계속 소개할 예정입니다.
|
|
|
|
다음 섹션에서는 이러한 모든 작업의 성능을 향상하기 위해 보다 심화된 프롬프트 엔지니어링의 개념과 기법에 대해 설명하겠습니다.
|