Patrick's 데이터 세상

ChatGPT Prompt Engineering 본문

Deep Learning/NLP 개발

ChatGPT Prompt Engineering

patrick610 2023. 6. 23. 15:31
반응형
SMALL

 

 
 
 

 
ChatGPT는 GPT를 개발해 온 OpenAI에서 GPT-3.5와 GPT4를 기반으로 운영하는 대화형 인공지능 서비스이다.
제공되는 API 기능을 통해 개발자들이 편리하게 ChatGPT 모델의 추론 기능을 사용할 수 있다.
현재 사내 프로젝트의 일환으로 모델 학습 데이터의 레이블 정보를 ChatGPT API를 활용하여 구축하였다.
시스템 프롬프트와 유저 프롬프트에서 Few-Shot 방식을 이용한 instruct를 구조화하고 원하는 결과를 얻기 위해 Prompt adjust를 지속적으로 시도한 내용과 Andrew Ng 교수님의 ChatGPT Prompt Engineering for Developers 강의 내용 중 일부를 정리하려고 한다.
예시는 실제 프로젝트에서 사용했던 예시와 강의 예시 모두 사용하였다.
 
 

토큰 당 비용

구분최대 토큰 수비용
gpt-3.5-turbo4096
약 8,000단어
1000개의 입력 토큰당 $0.003
1000개의 출력 토큰당 $0.004
gpt-432,768
약 64,000단어
1000개 질문 토큰 당 0.03달러
1000개의 답변 토큰 당 0.06달러

위 표는 GPT3.5와 GPT4의 토큰 당 비용.
GPT4에서 약 8배 정도의 토큰이 수용가능하다.
비용은 거의 10배 차이..ㄷㄷ
 
 
 

👉🏻 프롬프트를 위한 지침

프롬프트 작성 시에는 크게 아래 두 개의 지침을 따라야 효율적으로 작성할 수 있다.
1. 명확하고 구체적인 지침을 작성
2. 모델에게 생각할 시간을 주는 것
 
먼저 ChatGPT API를 사용하기 위해 아래 코드를 실행해야 한다.
라이브러리가 설치되어 있지 않은 경우 pip를 활용하여 openai를 설치한다.

!pip3 install openai
import openai

# OpenAI Api Key
openai.api_key = cfg.OPENAI.OPENAI_API_KEY # OpenAI 사이트에서 발급받은 API Key
model = "gpt-3.5-turbo"

나는 yaml 파일에 key를 저장하고 hydra 방식으로 불러왔다.
아래는 환경변수에 저장하고 불러오는 방식이다.

import openai
import os

from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())  # read local .env file
openai.api_key = os.getenv('OPENAI_API_KEY')

 
이후에 보조함수를 통해 api를 활용하여 생성된 출력을 받는다.

def generate_response(prompt, model="gpt-3.5-turbo"):
    messages = [{"role": "user", "content": prompt}]
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=0,
    )
    return response.choices[0].message["content"]
result = generate_response(prompt, model)

 

 
1. 명확하고 구체적인 지침을 작성

    ∙ 모델이 해야 할 일을 최대한 명확하고 구체적으로 서명해야 한다.
    ∙ 명확한 것이 짧은 것은 아니다.
    ∙ 모델이 구분할 수 있도록 입력의 다른 부분을 경계선을 활용하여 명확하게 표시한다.

 
        1. 구분 문자를 사용.
                Triple quotes: "'
                Triple backticks: '
                Triple dashes: -
                Angle brackets: ‹ ›,
                XML tags: «tag› ‹/tag›

                ex) prompt = "텍스트를 20 단어로 요약해 줘 ```서울시설공단은 24∼25일 광화문 청계광장에서 '2023 지하도상가 프리마켓'을 개최한다고 23일 밝혔다. 시내 지하도상가 점포가 지상으로 올라와 시민과 만나는 문화축제형 프리마켓으로, 2018년 이후 5년 만에 다시 추진됐다.```"
                서울시설공단, '2023 지하도상가 프리마켓' 24∼25일 광화문 청계광장에서 개최.

 
        2. HTML, JSON 등 구조화된 출력으로 요청.

                ex) prompt = "너는 판매 촉진을 위한 마케팅 문구에서 마케팅 정보를 만드는 카피라이터야. ```이번 봄 나들이는 놀이동산으로? 제철 과일 딸기 가득 시즌 쿠폰 쓰고 딸기 디저트 저렴하게 즐기자~``` 위 문장에서 마케팅 주체, 타겟을 다음 키로 JSON 형식으로 제공해 줘: 마케팅 주체-marketing_entity, 타겟-marketing_target"
                { "marketing_entity": "놀이동산", "marketing_target": "나들이객" }
               
                prompt = "웹사이트에서 사용할 수 있는 모든 것을 HTML로 포맷해 줘. 설명을 <div> 요소에 배치해 줘." 
                from IPython.display import display, HTML
                display(HTML(response))로 확인


        3. 모델이 조건이 충족되었는지 확인.
                가설을 만들고 충족할 때와 충족하지 않을 때는 구분한다.

                ex) text = "물을 끓인다. 끓는 물에 차백을 넣는다. (대략 한 컵에 대해 티스푼 한 스푼 정도가 적당합니다.) 차를 3-5분 정도 우려낸다. 차를 걸러낸 후, 설탕이나 우유를 첨가하여 마신다. (선택 사항)"
                prompt = '''삼중 따옴표로 구분된 텍스트가 제공됩니다.
일련의 지시사항이 포함되어 있으면 해당 지시사항을 다음 형식으로 다시 작성해 줘.
Step 1 - ...
Step 2 - ...
...
Step N - ...
텍스트에 일련의 지침이 포함되어 있지 않으면 \"제공된 단계 없음\"이라고 쓰면 돼.
\"\"\"{text}\"\"\"'''
 
                Step 1 - 물을 끓인다.
                Step 2 - 끓는 물에 차백을 넣는다. (대략 한 컵에 대해 티스푼 한 스푼 정도가 적당합니다.)
                Step 3 - 차를 3-5분 정도 우려낸다.
                Step 4 - 차를 걸러낸 후, 설탕이나 우유를 첨가하여 마신다. (선택 사항)

 

                위 프롬프트에서 일련의 지시사항이 없으면 "제공된 단계 없음"이라고 나온다.

 

        4. Few-shot Prompting

                학습 시에 Few-shot learning과 같이 모델이 충분한 아웃풋을 뽑을 수 있도록 예시를 넣는 것.

 

                ex) text = "갈 땐 가더라도... 전시회 할인 쿠폰 쓰는 것 정돈 괜찮잖아? 은하수를 닮은 다채로운 색감의 향연

                prompt = f'''너는 판매 촉진을 위한 마케팅 문구에서 마케팅 정보를 만드는 카피라이터야.

삼중 따옴표로 구분된 텍스트를 아래 예시처럼 ''안에 있는 원문에서 마케팅 주체, 타겟, 혜택을 추출할 거야.

```이번 봄 나들이는 놀이동산으로? 제철 과일 딸기 가득 시즌 쿠폰 쓰고 딸기 디저트 저렴하게 즐기자~```

마케팅 주체: 놀이동산, 타겟: 나들이를 즐기는 소비자, 혜택 : 쿠폰

\"\"\"{text}\"\"\"'''

                마케팅 주체: 전시회, 타겟: 전시회에 관심 있는 소비자, 혜택: 할인 쿠폰

 

2. 모델에게 생각할 시간을 준다.

       짧은 시간 내에 소수의 단어로 너무 복잡한 작업을 맡기면 잘못된 추측을 할 수 있다.
       위 같은 상황에서 더 많은 컴퓨팅을 사용하여 문제에 대해 더 오래 생각하도록 지시할 수 있다. - 실제로도 시간이 좀 더 걸린다.
 
        1. 작업을 완성하기 위해 단계를 지정한다.

                ex) text = """물을 끓인다. 끓는 물에 차백을 넣는다. (대략 한 컵에 대해 티스푼 한 스푼 정도가 적당합니다.) 차를 3-5분 정도 우려낸다. 차를 걸러낸 후, 설탕이나 우유를 첨가하여 마신다. (선택 사항)"""
                prompt = f"""너의 임무는 다음 작업을 수행하는 것이야.
1 - 한 문장 <>로 구분된 다음 텍스트를 요약합니다.
2 - 요약을 프랑스어로 번역합니다.
3 - 프랑스어 요약에 이름을 만듭니다.
4 - 다음 키가 포함된 json 개체를 출력: french_summary, names
 
다음 형식을 사용하십시오.
텍스트: <요약할 텍스트>
요약: <요약>
번역: <요약 번역>
이름: <이탈리아어로 요약된 이름 목록>
출력 JSON: <요약 및 숫자 이름이 있는 json>
 
텍스트: <{text}>
"""
                요약: 끓인 물에 차백을 넣고 3-5분 우려내어 걸러낸 후 설탕이나 우유를 첨가하여 마십니다. 번역: Faites bouillir de l'eau, ajoutez du thé et laissez infuser pendant 3 à 5 minutes. Filtrez le thé et ajoutez du sucre ou du lait si vous le souhaitez. 이름: Infusion de lait sucré 출력 JSON: {"french_summary": "Faites bouillir de l'eau, ajoutez du thé et laissez infuser pendant 3 à 5 minutes. Filtrez le thé et ajoutez du sucre ou du lait si vous le souhaitez.", "names": ["Infusion de lait sucré"]}

                
 

        2. 모델이 스스로 결론을 내리기 전에 스스로 해결책을 찾아내도록 지시
                답이 맞는지 아닌지 결론을 내리기 전에 문제를 해결하기 위해 모델에게 시간을 준다.

                prompt = """학생의 솔루션이 올바른지 확인하십시오.
질문:
저는 태양광 발전 시설을 짓고 있는데 재정 문제를 해결하는 데 도움이 필요합니다.
- 토지 비용 $100 / 평방 피트
- 평방 피트당 $250에 태양광 패널을 살 수 있습니다.
- 연간 $100,000의 고정 비용과 평방 피트당 $10의 추가 비용이 드는 유지 보수 계약을 협상했습니다.
평방 피트 수의 함수로 운영 첫 해의 총비용은 얼마입니까?
 
학생의 솔루션:
x를 평방 피트 단위의 설치 크기라고 합니다.
비용:
1. 토지 비용: 100배
2. 태양 전지 패널 비용: 250x
3. 유지비 : 100,000 + 100x
총비용: 100x + 250x + 100,000 + 100x = 450x + 100,000
"""
                모델에서는 계산을 마지막 총부분만 따져서 맞는지를 보기 때문에 유지비에서 $10달러를 곱해야 하는데 100을 곱했기 때문에위 프롬프트를 실행하면 '학생의 솔루션은 올바릅니다.'라고 나온다.
                따라서 아래와 같은 식으로 모델이 먼저 자신의 해를 구하고 학생의 해를 비교하도록 지시해야 한다.
                - 첫 번째로 질문을 먼저 계산하세요.
                - 그러고 나서 학생의 솔루션과 자신의 해결을 비교하고 학생이 한 솔루션이 맞는지를 평가하세요.
 
 

👉🏻 hallucination 피하기

모델의 한계로 환각 hallucination 문제가 있다.
언어 모델은 대량의 지식으로 학습되었지만 정보를 완벽하게 기억하지 못해서 자신의 지식의 경계를 잘 알지 못한다.
위 오류를 완벽하게 피할 수는 없지만 최소화하기 위해 추가적인 전략이 필요하다.
     ◉ 모델이 텍스트를 기반으로 답을 생성하기 위해 모델에게 먼저 텍스트에 관련된 인용구를 찾게 요청한다.
그런 다음 이 인용구로 질문에 답하도록 요청한다.
 
 
 

👉🏻 반복 프롬프트

기계학습 시에 먼저 갖는 아이디어로 코드를 작성하고, 데이터를 얻고, 모델을 훈련하면 실험 결과를 얻는다.
그리고 그 결과물을 보고 오류 분석을 하고 다시 이 사이클을 반복하면서 효과적인 머신러닝 모델을 만든다.
LLM으로 프롬프트를 작성할 때도 위와 동일할 수 있다.
 

프롬프트 가이드라인

∙ 명확하고 구체적으로
∙ 원하는 출력이 결과로 나오지 않은 이유를 분석
아이디어와 프롬프트 조정 - 지침을 명확하게 하고 생각을 시간을 줌.
 반복
 
 

1. 명확하고 구체적인 지침을 작성

얻을 수 있는 양의 출력 양을 조정

프롬프트 결과는 잘 나왔으나 결과가 너무 길 때 '최대 50 단어를 사용해 줘'를 추가.

    ex) fact_sheet_chair = """
제품 번호 SWC-110
마감
    실버
    스타라이트
    스페이스 그레이
    미드나이트

Apple M2 칩
    8코어 CPU(성능 코어 4개 및 효율 코어 4개)
    10코어 GPU
    16코어 Neural Engine
    100GB/s 메모리 대역폭
미디어 엔진
    하드웨어 가속형 H.264, HEVC, ProRes, ProRes RAW
    동영상 디코딩 엔진
    동영상 인코딩 엔진
    ProRes 인코딩 및 디코딩 엔진
디스플레이
디스플레이 번호 DSP-100
    Liquid Retina 디스플레이
    38.9cm(대각선) LED 백라이트 디스플레이(IPS 기술),1 2880 x 1864 기본 해상도(224ppi)로 10억 색상 지원
    500 니트 밝기
    넓은 색영역(P3)
    True Tone 기술
배터리 및 전원
    Apple TV 앱 동영상 재생 최대 18시간
    무선 인터넷 사용 최대 15시간
    66.5와트시 리튬 폴리머 배터리
    35W 듀얼 USB-C 포트 전원 어댑터
    USB-C-MagSafe 3 케이블
    70W USB-C 전원 어댑터로 급속 충전 가능
"""
    prompt = f"""귀하의 임무는 마케팅 팀이 기술 사양 기반으로 제품의 소매 웹사이트에 대한 설명을 작성하도록 돕는 것입니다.
        삼중 따옴표로 구분된 기술 사양에 제공된 정보를 기반으로 제품 설명을 작성합니다.
        최대 50단어를 사용해줘.
        기술 사양: '''{fact_sheet_chair}'''
        """
 

        새로운 제품은 다섯 가지 색상으로 제공됩니다: 실버, 스타라이트, 스페이스 그레이, 미드나이트. Apple M2 칩은 8코어 CPU, 10코어 GPU, 16코어 Neural Engine, 100GB/s 메모리 대역폭을 갖추고 있습니다. 또한, 하드웨어 가속형 H.264, HEVC, ProRes, ProRes RAW를 지원하며, Liquid Retina 디스플레이는 38.9cm(대각선) LED 백라이트 디스플레이(IPS 기술)로 10억 색상을 지원합니다. 배터리 수명은 최대 18시간입니다.
len(response.split(" "))

50

    '최대 50개 단어를 사용해줘'에서 '최대 3문장을 사용해줘'로 변경했을 때의 차이.

    새로운 MacBook Pro는 Apple M2 칩과 10 코어 GPU, 16 코어 Neural Engine을 탑재하여 놀라운 성능을 제공합니다. 또한, Liquid Retina 디스플레이와 넓은 색영역(P3)을 지원하여 생생한 색감을 제공합니다. 마지막으로, 66.5 와트시 리튬 폴리머 배터리를 탑재하여 최대 18시간의 Apple TV 앱 동영상 재생이 가능합니다.

   설명 끝에 모든 제품 ID 추가
    prompt = f"""
귀하의 임무는 마케팅 팀이 기술 사양 기반으로 제품의 소매 웹사이트에 대한 설명을 작성하도록 돕는 것입니다.
삼중 따옴표로 구분된 기술 사양에 제공된 정보를 기반으로 제품 설명을 작성합니다.
설명 끝에 기술 사양의 모든 7자 제품 ID를 포함하십시오.
최대 50개 단어를 사용해줘.
기술 사양: '''{fact_sheet_chair}'''

"""
    SWC-110은 실버, 스타라이트, 스페이스 그레이, 미드나이트 마감으로 제공됩니다. Apple M2 칩은 8코어 CPU(성능 코어 4개 및 효율 코어 4개), 10코어 GPU, 16코어 Neural Engine, 100GB/s 메모리 대역폭을 제공합니다. 미디어 엔진은 하드웨어 가속형 H.264, HEVC, ProRes, ProRes RAW, 동영상 디코딩 엔진, 동영상 인코딩 엔진, ProRes 인코딩 및 디코딩 엔진을 제공합니다. Liquid Retina 디스플레이(DSP-100)는 38.9cm(대각선) LED 백라이트 디스플레이(IPS 기술), 2880 x 1864 기본 해상도(224ppi)로 10억 색상 지원, 500 니트 밝기, 넓은 색영역(P3), True Tone 기술을 제공합니다. 배터리는 Apple TV 앱 동영상 재생 최대 18시간, 무선 인터넷 사용 최대 15시간을 제공하며, 66.5와트시 리튬 폴리머 배터리와 35W 듀얼 USB-C 포트 전원 어댑터, USB-C-MagSafe 3 케이블, 70W USB-C 전원 어댑터로 급속 충전 가능합니다. 제품 ID: SWC-110, DSP-100.

다양한 프로그램에서 성공적으로 사용된 프롬프트는 반복적인 과정을 통해 얻을 수 있다.
반복 시도 시에는 명확하고 구체적인 프롬프트를 작성하고 필요에 따라 모델에 생각을 시간을 주어야 한다.
 
 

👉🏻 요약하기

긴 텍스트를 요약하기 위한 프롬프트.
긴 문서 데이터의 요약, 수많은 리뷰 데이터를 요약하는 등의 요약으로 활용할 수 있다.
 
    배송부에 피드백을 주기 위해 배송 언급에 중점

    ex) prod_review = """Jason사의 쿨매트 제품을 주문했는데요. 땀이 너무 많아서 에어컨 선풍기랑 같이 사용할 제품 찾다가 알게 되었네요.
쿨매트라고 해서 그냥 좀 시원하겠네 했는데 이건 그냥 시원한 정도가 아니라 차가워요!
아직 날이 그렇게 덥지 않아서 얇은 패드나 이불을 깔고 사용하는데 시원한 걸 워낙 좋아하는 딸내미는 수영하듯 몸을 비비네요ㅎㅎ
배송이 조금 늦긴 했는데 가족들 모두 만족해서 다행입니다:)
"""
     prompt = f"""귀하의 임무는 배송부에 피드백을 주기 위해 전자 상거래 사이트에서 제품 리뷰에 대한 짧은 요약을 생성하는 것입니다.
삼중 백틱으로 구분된 아래 리뷰를 최대 30 단어로 요약하십시오.
그리고 제품의 배송 및 배송을 언급하는 모든 측면에 중점을 둡니다.
리뷰: '''{prod_review}'''
"""
    시원한 쿨매트, 얇은 패드로도 효과적. 배송은 조금 늦었지만 가족 모두 만족.

 
 

👉🏻 추론하기

전통적인 기계 학습 방법으로 긍부정 추론을 하기 위해서는 레이블 데이터 수집, 모델 훈련, 모델 배포 및 추론 등 굉장히 많은 작업이 필요한데 모든 작업에 대해 이를 매번 수행해야 된다는 큰 단점이 있다.
단순히 프롬프트로 다양한 TASK에 대해 결과를 생성하여 받을 수 있다는 것이 강력한 장점이고 엄청난 속도의 개선을 가져다준다.
 
 

    감정 분류기

    ex) 요약하기의 리뷰 데이터 활용

    prompt = f"""삼중 백틱으로 구분된 아래 제품 리뷰에 대한 감정은 무엇인가요?
'긍정'과 '부정' 중 하나의 단어로 대답해 주세요.
리뷰: '''{prod_review}'''
"""

    긍정
   

    감정 리스트 추출

    prompt = f"""다음 리뷰 작성자가 표현하고 있는 감정의 목록을 확인하십시오.
목록에 5개 이하의 항목을 포함하십시오.
쉼표로 구분된 소문자 단어 목록으로 답변 형식을 지정합니다.
리뷰: '''{prod_review}'''
"""
    시원함, 만족, 기쁨, 불만족, 놀람

 

    감정 포함 추출

    prompt = f"""다음 리뷰의 작성자가 분노를 표현하고 있습니까?
리뷰는 세 개의 백틱으로 구분됩니다.
예 또는 아니오로 대답하십시오.
리뷰: '''{prod_review}'''
"""
    아니오

 

    개체명 인식

    prompt = f"""검토 텍스트에서 다음 항목을 식별합니다.
- 리뷰어가 구매한 아이템
- 아이템을 만든 회사
리뷰는 세 개의 백틱으로 구분됩니다.
다음을 사용하여 응답을 JSON 개체로 형식화합니다.
'항목' 및 '브랜드'를 키로 사용합니다: Item, Brand
정보가 없으면 'unknown'를 값으로 사용합니다.
응답을 가능한 한 짧게 하십시오.
리뷰: '''{prod_review}'''
"""

    { "Item": "쿨매트", "Brand": "Jason사" }
 
 

    주제 추론

    주제 추출

    story = """교촌에프엔비가 창립 이래 처음으로 볶음면 신제품을 냈다.
‘오리지날’, ‘허니콤보’ 등 탄탄한 제품 라인업을 유지하면서 치킨사업에 집중해 온 교촌치킨이 치킨 이외의 메뉴로 확장한 것에 외식업계는 이례적이라는 평가를 내놓고 있다.
창업주 권원강 회장이 복귀 후 핵심 사업으로 점찍은 소스 사업 강화의 일환이자 소비자 접점을 늘리겠다는 의지로 해석된다.
26일 식품·유통업계에 따르면 11번가는 교촌치킨이 출시한 볶음면 신제품 ‘교촌 시크릿 볶음면’ 2종(교촌 레드시크릿 볶음면·교촌 블랙시크릿 볶음면)을 유통업계 최초로 공개하고 이날부터 판매를 개시하기로 했다.
이 제품은 교촌치킨이 MZ세대(밀레니얼+Z세대)를 겨냥해 만든 용기면으로 교촌치킨의 대표 메뉴에 들어가는 비법 소스가 함유됐다. 맵고 달고 짠 맛을 동시에 느낄 수 있는 것이 특징이다.
시중에 출시된 매운 컵라면은 많지만 그 주체가 교촌치킨이라는 것에 업계는 주목하고 있다.
교촌치킨은 권원강 회장 체제 하에서 수년간 보수적인 사업 전략을 이어왔기 때문이다.
권 회장은 경영진들에게도 점포수 확장보다는 가맹점들의 수익성을 높이는 데에 집중할 것을 주문해 왔다고 알려져 있다.
한 치킨업계 관계자는 “권 회장은 해외 진출, 인수합병(M&A) 등 무리한 사업확장은 지양해야 한다는 입장”이라며 “경쟁사 대비 신사업 진출에 소극적인 것에는 이 같은 배경이 있었다”라고 설명했다.
"""
     prompt = f"""세 개의 백틱으로 구분된 다음 텍스트에서 논의되고 있는 다섯 가지 주제를 결정합니다.
각 항목을 한 두 단어 길이로 만드십시오.
쉼표로 구분된 항목 목록으로 응답 형식을 지정하십시오.
텍스트 샘플: '''{story}'''
"""
    1. 교촌에프엔비의 신제품 볶음면 2. 교촌치킨의 메뉴 확장 3. 11번가의 유통업계 최초 공개 4. 교촌치킨의 MZ세대 겨냥 제품 5. 권원강 회장의 보수적인 사업 전략

 

    주제 분류


    해당 뉴스 기사가 임의로 선택한 아래 주제에 속하는 지를 0과 1로 구분 - 제로샷 학습 알고리즘 방식

    topic_list = ["식품", "정부", "경제", "공학", "직원 만족", "경영"]
    prompt = f"""다음 항목 목록의 각 항목이 삼중 따옴표 구분되는 아래 텍스트의 항목인지 확인합니다.
각 주제에 대해 0 또는 1로 목록으로 답변을 제공하십시오.
주제 목록: {", ".join(topic_list)}
텍스트 샘플: '''{story}'''
"""
    식품: 1 정부: 0 경제: 1 공학: 0 직원 만족: 0

 
 

👉🏻 텍스트 변환

LLM으로 한 언어의 텍스트를 입력하고 변환하거나 다른 언어로 번역, 철자 및 문법 수정을 할 수 있다.
 

    번역

    ex) "영어 문장을 스페인어 문장으로 번역해 줘. '''Hi, I would like to order to blender'''"
    "어떤 언어인지 알려줘. '''Combien coûte un lampadaire?'''"
    "다음 문장을 프랑스어와 스페인어와 영국 해적 말투로 번역해줘:'''I want to order a basketball'''"
    "다음 문장을 형식적인 말투와 일상 말투의 스페인어로 번역해줘.:'''Would you like to order a pillow?'''"
 

    말투 번역

    ex) "다음 문장을 속어에서 비즈니스 서신으로 번역해줘: '''야. 나 Jason인데, 빨리 스탠딩 램프 사양 확인해서 회신해.'''"""
 

    다른 형식으로 번역

    ex) data = {'employees':[{'name':'Shyam', 'email':'shyajaiswal@gmail.com'}]}
          prompt = f"다음 Python 사전을 JSON에서 열 머리글과 제목이 있는 HTML 테이블로 변환해줘: '''{data}'''"""

 

    철자 검사와 문법 검사

    다른 언어의 철자 검사와 문법 검사 시 사용.
    ex) """다음 텍스트를 교정 및 수정하고 수정된 버전을 다시 작성합니다. 오류를 찾을 수 없으면 "오류를 찾을 수 없습니다"라고 말하세요.: '''아버지가방에들어가신다'''"""
 

    문장 스타일 번경

    문장을 다른 스타일로 번경할 때 사용.
    실제 프로젝트에서는 광고 문구를 다른 스타일로 변경할 때 사용하였다.
    ex) """'''제목 : {title}, 본문 : {content}''' 삼중 따옴표 안의 제목과 본문에 소구점 : {result1}을 반영하여 매력있는 광고 제목과 광고 본문을 만들어줘.
           결과는 다음 두 개의 키로 JSON 형식으로만 제공해줘: title, content"""
           제목 : 홀케이크 예약 3천원 할인⚡마감임박!!
           본문 : 크리스마스 데일리 꿀팁🎁 케이크 맛집에서 3,000원 할인 중! 지금 모바일에서 [홀케이크 예약 3천원 할인쿠폰] 등록하시면 더 특별한 크리스마스 선물이 됩니다🎄
 
 
 

👉🏻 확장

짧은 텍스트로 언어 모델이 긴 텍스트로 생성하는 방법이다.
충분히 이러한 확장 기능을 악용하는 사례가 나올수 있으므로 책임감을 갖고 도움이 되기 위해서 사용해야한다.
 
Temperatue 매개변수를 통해 모델 답변의 다양성을 꾀할 수 있다.
temperature가 높을수록 다른 단어가 나올 확률이 높아진다.

def generate_response(prompt, model="gpt-3.5-turbo", temperature=0):
    messages = [{"role": "user", "content": prompt}]
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=temperature,
    )
    return response.choices[0].message["content"]

 
    ex) 고객의 리뷰의 감정에 따라 자동으로 답변을 생성해주는 봇.
 
 

👉🏻 챗봇 구현

적은 노력으로 ChatGPT를 활용하여 사용자 정의 대화형 챗봇을 구현해보자.
 

def generate_response_from_messages(messages, model="gpt-3.5-turbo", temperature=0):
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=temperature,
    )
    return response.choices[0].message["content"]

프롬프트 적용 시에 messages 매개 변수에 기존에는 messages = [{"role": "user", "content": prompt}]와 같이 roll에 user로 사용자 메시지로 입력하였다.
messages 입력 시에 프롬프트에 역할을 세분화하여 좀 더 체계적인 프롬프트 제공이 가능하다.
 

왼쪽 그림과 같이 시스템 메시지는 전체적인 지시를 제공한다.
보조자의 행동과 인격을 설정할 수 있고 이것은 대화에 대해 높은 수준의 지시로 작용하고 사용자와 보조자 사이에서 차례로 적용된다.
사용자 메시지는 유저가 입력하는 메시지이고 보조 메시지는 ChatGPT의 응답 메시지.
 
 
 
 
 
 
 
 
모델은 독립적인 상호작용을 하기 때문에 이전 대화를 기억할 수 없다.
따라서, 모든 관련 메시지를 제공해야 한다.
 

messages = [
    {'role':'system', 'content':'너는 친근한 챗봇이야.'},
    {'role':'user', 'content':'안녕! 내 이름은 Isa야.'},
]

response = generate_response_from_messages(messages, temperature=1)
print(response)

안녕 Isa! 반가워. 무엇을 도와줄까?
 

messages = [
    {'role':'system', 'content':'너는 친근한 챗봇이야.'},
    {'role':'user', 'content':'안녕! 내 이름은 Isa야.'},
    {'role':'assistant', 'content':'안녕 Isa! 반가워. 무엇을 도와줄까?'},
    {'role':'user', 'content':'응. 나를 기억해? 내 이름이 뭐야?'},
]

response = generate_response_from_messages(messages, temperature=1)
print(response)

당연히 기억해! 네 이름은 Isa야. 기억력이 좋아서 네 이름을 잊을 수는 없어. 어떤 도움이 필요하니까?
 
    ex) 피자 주문을 받는 챗봇
        system prompt에 주문 챗봇이 해야할 일과 가격, 피자 정보 등을 넣어 정보를 알도록 함.

import panel as pn  # GUI
pn.extension()

panels = [] # collect display 

context = [ {'role':'system', 'content':"""
        You are OrderBot, an automated service to collect orders for a pizza restaurant. \
        You first greet the customer, then collects the order, \
        and then asks if it's a pickup or delivery. \
        You wait to collect the entire order, then summarize it and check for a final \
        time if the customer wants to add anything else. \
        If it's a delivery, you ask for an address. \
        Finally you collect the payment.\
        Make sure to clarify all options, extras and sizes to uniquely \
        identify the item from the menu.\
        You respond in a short, very conversational friendly style. \
        The menu includes \
        pepperoni pizza  12.95, 10.00, 7.00 \
        cheese pizza   10.95, 9.25, 6.50 \
        eggplant pizza   11.95, 9.75, 6.75 \
        fries 4.50, 3.50 \
        greek salad 7.25 \
        Toppings: \
        extra cheese 2.00, \
        mushrooms 1.50 \
        sausage 3.00 \
        canadian bacon 3.50 \
        AI sauce 1.50 \
        peppers 1.00 \
        Drinks: \
        coke 3.00, 2.00, 1.00 \
        sprite 3.00, 2.00, 1.00 \
        bottled water 5.00 \
        """
        } ]  # accumulate messages


inp = pn.widgets.TextInput(value="Hi", placeholder='Enter text here…')
button_conversation = pn.widgets.Button(name="Chat!")

interactive_conversation = pn.bind(collect_messages, button_conversation)

dashboard = pn.Column(
    inp,
    pn.Row(button_conversation),
    pn.panel(interactive_conversation, loading_indicator=True, height=300),
)

dashboard

 
 

messages =  context.copy()
messages.append(
    {'role':'system', 'content':'create a json summary of the previous food order. Itemize the price for each item\
     The fields should be 1) pizza, include size 2) list of toppings 3) list of drinks, include size   4) list of sides include size  5)total price '},    
    )
 #The fields should be 1) pizza, price 2) list of toppings 3) list of drinks, include size include price  4) list of sides include size include price, 5)total price '},    

response = get_completion_from_messages(messages, temperature=0)
print(response)

Sure! Here's a JSON summary of your food order: { "pizza": { "size": "12.95", "toppings": ["extra cheese", "mushrooms"] }, "drinks": [ { "name": "coke", "size": "3.00" }, { "name": "sprite", "size": "2.00" } ], "sides": [ { "name": "fries", "size": "4.50" } ], "total_price": "25.45" } Please let me know if there's anything else you'd like to add to your order!
 
 
 

정리

LLM, ChatGPT로 다양한 태스크를 무궁무진하고 간편하게 사용할 수 있어 decoder 계열의 생성형 언어 모델의 굉장한 가능성을 볼 수 있었다.
실제로 현재 프로젝트에서도 데이터를 만들기 위해 사용중이며 프롬프트 작성 시 위 강의가 많은 도움이 되었다.
물론 아직은 한계점이 존재하지만 Langchain, autoGPT 등 다양한 시도가 나오고 있는 만큼 계속된 관심 가져볼만하다.
 
 
 
 
 
 


👉🏻 출처

ChatGPT Prompt Engineering for Developers - Isa Fulford, Andrew Ng
https://www.deeplearning.ai/short-courses/chatgpt-prompt-engineering-for-developers/

ChatGPT Prompt Engineering for Developers

What you’ll learn in this course In ChatGPT Prompt Engineering for Developers, you will learn how to use a large language model (LLM) to quickly build new and powerful applications.  Using the OpenAI API, you’ll...

www.deeplearning.ai

 
 
 
 

반응형
LIST
Comments