빅데이타 & 머신러닝/생성형 AI (ChatGPT etc)

LLM 모델과 프롬프트 작성 방법

Terry Cho 2023. 9. 13. 14:08

LLM 모델과 프롬프트 작성 방법

조대협 (http://bcho.tistory.com)

 

LLM (Large Language Model)은 생성형 AI (Generative AI) 중의 하나로, 자연어 처리를할 수 있는 머신러닝 모델로, 자연어로 내리는 명령어 대해서 텍스트 아웃풋을 내는 모델이다. 예를 들어 문장을 요약하거나, 검색 엔진처럼 특정 질문에 대해서 답변을 하는 등의 기능을 수행할 수 있다.

 

일반적으로 LLM로 제공되는 모델들은 다음과 같다.

  • LLM : 일반적인 LLM으로 일반적인 자연어 처리 엔진이다.
  • Coding : 코딩에 최적화된 모델로 자연어로 입력을 받아서 소스 코드를 생성하거나, 코드 자동완성, 코드에 대한 주석 생성등을 지원한다.Coding LLM도 일반적인 Q&A나 명령을 수행하는 일반적인 Coding LLM과, Chat LLM 두가지로 분류 된다.  
  • Embedding : 텍스트 문장을 벡터 행렬로 변환해준다. 이렇게 변환된 벡터 행렬을 벡터 데이터 베이스에 저장해서, 추후에 문서 검색등에 사용될 수 있다. 임베딩에 대한 개념은 추후에 따로 성명하도록 한다. 

 

ChatGPT이나 Google Generative AI LLM에서 제공하는 모델들의 분류는 위와 같지만 마케팅 메세지 생성이나, 법률, 의료 지식 관련 LLM등 전문화된 기업에서 특정 도메인에 최적화된 LLM을 제공한다.  

프롬프트

LLM은 앞에서도 잠깐 언급했듯이, 자연어로 입력을 받아서 명령을 수행하는데, 프롬프트 엔지니어링이란, LLM 모델에게 질문을 할때, 좋은 답변을 얻기 위해서 질문을 최적화하는 기법을 이야기 한다.

 

이 글에서는 효과적인 프롬프트를 생성하기 위한 기본적인 가이드에 대해서 설명하고자한다.

좋은 프롬프트의 조건

  • 질문에서 가장 중요한 컨텐츠나 정보가 무엇인지를 명확하게 한다. 
  • 메세지를 구성할때 컨택스트를 명확히 한다. 예를 들어 LLM의 역할을 정해주면 좋다. “너는 미국 여행 가이드인데…”, “너는 어린이 동화를 쓰는 작가이다.” 
  • 프롬프트에 질문과 답에 대한 예제를 적어주면 조금 더 명확한 답을 얻을 수 있다.
  • 복잡한 질문은 하나의 프롬프트로 해결하려고 하지 말고, 여러개의 프롬프트로 나눠서 질문을 한다. 

 

일반적인 프롬프트의 구조

보통 초보자의 경우 질문이나 명령만 있는 간단한 프롬프트를 사용하지만 다음과 같은 구조를 가지면 좀 더 좋은 결과를 얻을 수 있다. 

  • Input (질문이나 지시)
  • (Optional) Context (Input에 대한 부가적인 상황)
  • (Optional) Example (질문에 대한 답변 예제들)

 

예를 들어,

샌프란 시스코 한국 식당 10개를 추천해줘

보다

너는 한국 관광객에게 샌프란 시스코 투어를 제공하는 에이전트이다. Context : LLM의 역할을 정의해준다
다음 상황에 맞는, 한국 식당 10개를 추천해줘.  Input : 질문
- 한국에서 온 10명의 여행객들이 있습니다. 
- 여행객은 모두 30대~50대 사이입니다. 
- 여행객들은 쇠고기를 좋아합니다. 
- 저녁 디너를 모두함께 하고 싶습니다.
Context : 질문에 대한 추가적인 정보
- 아웃풋에는 식당 이름,주소,전화번호, 구글 평가점수를 같이 알려줘.
 주차가 가능한곳을 찾아주세요
Context : 답변에 대한 추가적인 조건

이런 형태의 프롬프트가 훨씬 더 정확한 답변을 얻을 수 있다. (노트 : 위의 예제에서는 Example을 프롬프트에 추가하지 않았다.)

 

그러면 좀 더 정확한 답변을 얻기 위해서 어떤식의 프롬프트 입력 타입이 있는지 알아보도록 하자. 

Input

LLM에 내리는 명령이나 질문의 형태는 다양한데, 일반적으로 다음과 같이 형태로 분류할 수 있다. 

  • 질문형 (Question promt)
    정보에 대한 질의 용도로 사용된다. 
세계에서 가장 규모가 큰 기업 5개는 무엇인가?

위와 같이 오픈 질문형으로 질의할 수 도 있지만, 선택형 답변이 가능한 질문을 할 수 도 있다.

김치는 한국 음식인가?
- 추가적인 설명 없이 간결하게 답변해줘

답변 : 네, 김치는 한국음식입니다. 

 

  • 명령형 프롬프트 (Order Prompt)
    모델에게 특정 작업을 수행하도록 하는 프롬프트로, 번역, 요약, 문법 교정 등이 이에 해당한다.
    요약 프롬프트
다음 문장들을 간략하게 정리해줘
“ 정리할 내용들.. “


번역 프롬프트

다음 문장을 한글로 번역해줘
“Please tell me about types of the prompts in LLM”

 

이외에도, 문법 교정이나, 글을 정중한 표현으로 바꿔줘, 친구에게 보내는 문체로 바꿔줘와 같은 rewrite 명령들도 있다.

  • 롤 프롬프트 (Role Prompt)
    Chat 형 LLM에서 많이 사용하는 프롬프팅인데, LLM agent의 역할을 정의한 후에, 질문을 이어 나가는 방식이다.

너는 미국 캘리포니아 고등학교 카운셀러이다.
첫학년 학생에게 추천하는 과목들을 리스팅해줘

 

  • 아이디어 생성 (Idea Generation)
    사실을 기반으로 한 답변이나 문장을 수정하는 기능이외에도 LLM은 일부 창조적인 작업을 수행할 수 있다. 어린이 동화를 쓰거나, 대학 입시 에세이를 쓰는 것들이 가능하다. 
  • 데이타 조작
    자연어 텍스트에서 특정 데이터를 추출할 수 있다. 예를 들어 이메일 TEXT에서 발신인, 수신인, 미팅 날짜 시간등을 추출한 후에, JSON으로 포매팅 하거나 또는 데이터 베이스 테이블의 내용들을 컨버팅 하는 시나리오등이 해당된다. 
  • 분류
    텍스트 내용을 기준에 따라 분류할 수 있다. 일반 적으로 분류 명령은 다음과 같이 몇개의 예제를 주는 것이 답변이 명확해진다. 
다음을 분류하세요.
옵션: 

레드 와인 
화이트 와인 

텍스트: 샤르도네 
답변은: 화이트 와인 
텍스트: 카베르네 
답변은: 레드 와인 
텍스트: 모스카토 
답변은: 화이트 와인 

텍스트: 리슬링 
답변은?

 

이외에도 다양한 종류의 프롬프트가 있는데, 좋은 답변을 얻기 위해서는 좋은 프롬프트를 작성하는 것이 당연히 중요하고, 좋은 프롬프트는 위의 원칙 이외에도 LLM 모델 제작 회사들이 제공하는 프롬프트 샘플을 이용하면 도움이 많이 된다. https://developers.generativeai.google/prompt-gallery 에는 구글에서 제공하는 다양한 프롬프트 샘플이 있으니 참고하기 바란다. 

Context

Input으로 LLM에 명령을 내릴때, 컨텍스트를 추가할 수 있는데, 컨텍스트는 Input에 대한 추가적인 정보나 또는 출력값의 형태에 대해서 서술한다.

 

입력에 대한 추가 정보는 상황이나 부가적인 정보 또는 입/출력에 대한 예제이다.

예를 들어

 

아래 편지 내용을 교정해줘 Input : 명령형

 

와 같은 Input이 있을때, 아래와 같이 추가적인 정보를 제공함으로써 LLM에게 상황에 맞는 출력을 생성하도록 한다. 

 

아래 편지 내용을 교정해줘 Input : 명령형
이 편지는 고등학교 선생님이 학생들에게 보내는 편지야 입력에 대한 추가적인 정보

 

아래는 출력값에 대한 형태 예제이다.  이메일을 파싱해서 특정 필드를 추출해내는 프롬프트인데, 파싱 방법을 가이드 하기 위해서 추가적으로 예제를 프롬프트에 삽입하였다

이메일에서 특정 필드를 추출해서 다음과 같은 포맷으로 리턴해줘 Input : 명령
" 안녕하세요? 홍길동 상무님
에비 컴퍼니의 김상우 실장입니다. 이번 클라우드 도입 관련 미팅에 시간을 내주셔서 감사합니다. 미팅은 서울 강남구 삼성동의 에비 빌딩 5층 바다 회의실에서 진행될 예정이며, 시간이 9월28일 10시입니다. 도착하신후에, 제 전화번호 010-232-2222 로 연락 주시면 모시러 나가겠습니다."
Context : 추가 데이타
{이메일 제목}
{보내는 사람 이름}
{보내는 사람 직함}
{보내는 사람 연락처}
{받는 사람 이름}
{받는 사람 직함}
{받는 사람 연락처}
{미팅 장소}
{미팅 시간}
위의 포맷이외에 다른 내용은 출력하지 말아줘. 이메일에 값이 없는 경우 "null" 값으로 표시해줘
Context : 출력 포맷
이름에서 이름과 직함은 다음과 같다
이름 입력 : 김규민 상무
이름 : 김규민
직함 : 상무
이름 입력: 김말동 실장
이름 : 김말동
직함 : 실장
Example

출력

이메일 제목: [이메일 제목]
보내는 사람 이름: 김상우
보내는 사람 직함: 실장
보내는 사람 연락처: 010-232-2222
받는 사람 이름: 홍길동
받는 사람 직함: 상무
받는 사람 연락처: [받는 사람 연락처]
미팅 장소: 서울 강남구 삼성동의 에비 빌딩 5층 바다 회의실
미팅 시간: 9월28일 10시

Example

프롬프트에서 정확한 결과를 얻기 위해서 예제를 주는 방법을 One shot, few show, multi shot 프롬프팅이라고 한다. 하나의 예제를 주면 원샷 프롬프팅, 수개(작은수)의 프롬프트를 주면 few 샷 프롬프팅 이라고 하고, 예제 없이 Input 만 주는 프롬프팅은 Zero shot (제로샷) 프롬프팅이라고 한다.