working_helen
[프롬프트 엔지니어링] 프롬프트 엔지니어링 연습 with ChatGPT Prompt Engineering for Developers 본문
[프롬프트 엔지니어링] 프롬프트 엔지니어링 연습 with ChatGPT Prompt Engineering for Developers
HaeWon_Seo 2024. 9. 1. 18:38DeepLearning.AI(Beta)에서 무료로 공개하고 있는 "ChatGPT Prompt Engineering for Developers" 강의를 수강하며 프롬프트 엔지니어링에 대해 학습한 과정을 정리한다.
1. GPT API Request / Response 형식
2. 파이썬에서 API 불러오기
3. Prompting Principles
4. Iterative Prompt Development
5. 프롬프트 엔지니어링 예시
1. GPT API Request / Response 형식
1) GPT-4 API Request Schema
- from : GPT-4 API Reference Guide
- GPT 모델 불어오는 과정
{
"model": "gpt-4",
"messages": [
{"role": "system", "content": "Set the behavior"},
{"role": "assistant", "content": "Provide examples"},
{"role": "user", "content": "Set the instructions"}
],
"temperature": 0.05,
"max_tokens": 256,
"top_p": 1,
"frequency_penalty": 0,
"presence_penalty": 0
}
- model : 사용할 모델과 버전
- messages : role과 content = 각 role이 어떤 행동 혹은 말을 하는지
- system : assistant의 페르소나 설정하고 구체적인 행동 지시
- user : 사용자가 모델에게 지시한 프롬프트 내용, assistant가 따라야할 지시문
- assistant : assistant가 수행해야할 행동의 예시를 제공
- temperature
: how creative or random the digital assistant’s responses will be
값이 작을수록 assistant는 consistency에 중점을 두고 일관적인 답을 제공
값이 커질수록 creativity와 unpredictability에 중점을 두고 더 새로운 답을 제공
- max_tokens
: the maximum number of words the assistant is allowed to use
assistant가 답에서 사용할 수 있는 토큰의 최대 길이
- top_p
: control the randomness of the response
각 단어가 올 확률을 계산한 후, 확률이 높은 단어들부터 누적 확률이 top_p 이상이 되는 단어 집합 생성
이 단어 집합 내에서 무작위적으로 다음 단어 예측
temperature와 함께 답변의 무작위성을 제어
값이 1에 가까울수록 단어 집합에 더 댜앙한 단어가 포함되기 때문에 더 랜덤한 답 제공
- frequency_penalty
: controls how likely the assistant is to use rare or uncommon words in its response
모델이 흔히 사용되지 않는 rare한 단어를 답에 얼마나 사용할 수 있는지 제어하는 패널티 크기
이 값이 작아질수록 패널티가 작아지는 것이므로 모델이 흔히 사용되지 않는 단어를 답에 더 많이 포함
presence_penalty
: controls how likely the assistant is to repeat itself or use similar phrases
모델이 유사한 표현이나 단어를 얼마나 반복적으로 사용할 수 있는지 제어하는 패널티 크기
이 값이 작아질수록 패널티가 작아지는 것이므로 모델이 유사한 표현을 더 많이 반복적으로 사용
2) GPT-4 API Response Schema
- from : GPT-4 API Reference Guide
- GPT 모델이 응답을 보내는 형식
{
"id": "chatcmpl-6viHI5cWjA8QWbeeRtZFBnYMl1EKV",
"object": "chat.completion",
"created": 1679212920,
"model": "gpt-4-0314",
"usage": {
"prompt_tokens": 21,
"completion_tokens": 5,
"total_tokens": 26
},
"choices": [
{
"message": {
"role": "assistant",
"content": "GPT-4 response returned here"
},
"finish_reason": "stop",
"index": 0
}
]
}
- id: unique identifier, 출력 결과물의 고유 번호
- object: chat.completion, 모델이 반환한 데이터의 타입
- created : 답이 생성된 시점, Jan 01 1970를 시작으로 초 단위로
- usage : API 호출과 관련된 토큰 사용량
- prompt_tokens : 사용자가 입력한 프롬프트에 사용된 토큰 수
- completion_tokens : 모델이 응답으로 생성한 텍스트에 사용된 토큰 수
- total_tokens = prompt_tokens + completion_tokens
- choices : 모델이 생성한 하나 이상의 응답을 포함하는 배열
- message : 모델이 생성한 role-content 응답
- index: 응답의 인덱스, choices 배열 내에서 응답의 순서
- finish_reason : 모델이 생성을 중단한 이유, natural stopping point (“stop”), 최대 길이 도달 ("length") 등
2. 파이썬에서 API 불러오기
- 파이썬에서 openai 모듈 설치 + OpenAI API key를 발급받기
import openai
import os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
openai.api_key = os.getenv("발급받은 opne api key 입력")
- helper function : 모델을 호출하고 프롬프트를 입력하는 함수
def get_completion(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"]
- response = openai.ChatCompletion.create(...)
: 사용자의 입력 메시지들을 모델에게 전달하여 그에 대한 응답을 생성
GPT-4 API Request Schema 형식에 맞춰서 파라미터 전달
- OpenAI's gpt-3.5-turbo model 사용, temperature = 0으로 무작위성을 최저로 부여
- print(response.choices[0].message.content) : 모델의 응답을 console에 출력
3. Prompting Principles
Principle 1 : Write clear and specific instructions, 명확하고 구체적으로 지시하기
- delimiters ( ```, """, < >, , : )를 사용하여 입력의 각 부분을 모델이 인식하기 좋게 구분해주기
- JSON이나 HTML 등 모델이 출력할 응답의 형식을 지정해주기
- 모델이 특정 task를 수행하기 전 특정한 조건을 만족하는지 확인하도록 설정하기
- "Few-shot" prompting으로 성공적인 실행 예시를 보여주기
text_1 = f"""
Making a cup of tea is easy! First, you need to get some \
water boiling. While that's happening, \
grab a cup and put a tea bag in it. Once the water is \
hot enough, just pour it over the tea bag. \
Let it sit for a bit so the tea can steep. After a \
few minutes, take out the tea bag. If you \
like, you can add some sugar or milk to taste. \
And that's it! You've got yourself a delicious \
cup of tea to enjoy.
"""
prompt = f"""
You will be provided with text delimited by triple quotes.
If it contains a sequence of instructions, \
re-write those instructions in the following format:
Step 1 - ...
Step 2 - …
…
Step N - …
If the text does not contain a sequence of instructions, \
then simply write \"No steps provided.\"
\"\"\"{text_1}\"\"\"
"""
response = get_completion(prompt)
print("Completion for Text 1:")
print(response)
Principle 2: Give the model time to “think”, 모델이 스스로 생각하게 만들기
- 문제 해결 과정에 대해서 명시적으로 지정해주기
: 어떤 steps을 거쳐 문제를 해결할 것인지에 대한 가이드라인 제시
text = f"""
In a charming village, siblings Jack and Jill set out on \
a quest to fetch water from a hilltop \
well. As they climbed, singing joyfully, misfortune \
struck—Jack tripped on a stone and tumbled \
down the hill, with Jill following suit. \
"""
prompt_1 = f"""
Perform the following actions:
1 - Summarize the following text delimited by triple \
backticks with 1 sentence.
2 - Translate the summary into French.
3 - List each name in the French summary.
4 - Output a json object that contains the following \
keys: french_summary, num_names.
Separate your answers with line breaks.
Text:
```{text}```
"""
response = get_completion(prompt_1)
print("Completion for prompt 1:")
print(response)
- 모델이 자신만의 풀이 과정을 사용해 스스로 문제를 해결하도록 유도
: 단순히 답이 맞는지 확인하는 과정만 요구한 prompt_1보다, 모델이 먼저 주어진 문제에 대해 답을 도출하고 본인의 답과 제시된 답이 맞는지 확인하도록 두 단계로 요구한 prompt_2에서 더 높은 정확도를 보임
prompt_1 = f"""
Determine if the student's solution is correct or not.
Question: 질문 내용
Student's Solution: 학생 풀이 내용
"""
prompt_2 = f"""
Your task is to determine if the student's solution is correct or not.
To solve the problem do the following:
- First, work out your own solution to the problem including the final total.
- Then compare your solution to the student's solution \
and evaluate if the student's solution is correct or not.
Don't decide if the student's solution is correct until
you have done the problem yourself.
Question: 질문 내용
Student's Solution: 학생 풀이 내용
"""
4. Iterative Prompt Development
- 반복적인 실험 과정에서 점점 더 원하는 결과를 만들어 내는 방향으로 프롬프트를 개선해나감
- 출력 결과가 너무 긴 경우 길이를 제한하는 프롬프트 추가, 원하는 특정 정보에 더 집중하도록 프롬프트 추가하는 등
# 청중에 대한 특성, 어떤 정보에 더 집중해야하는지 가이드 제시
# 출력 토큰 수 제한
prompt = f"""
Your task is to help a marketing team create a
description for a retail website of a product based
on a technical fact sheet.
Write a product description based on the information
provided in the technical specifications delimited by
triple backticks.
The description is intended for furniture retailers,
so should be technical in nature and focus on the
materials the product is constructed from.
Use at most 50 words.
Technical specifications: ```{fact_sheet}```
"""
5. 프롬프트 엔지니어링 예시
① Summarizing
- Text Summarization, Information Extraction 등에서 사용
- 요약문 길이에 제한을 두거나 특정 내용에만 집중해서 요약하도록 만들도록 설정
② Inferring
- 감정분석, 내용 추론 등의 task에서 사용
③ Expanding
- 모델이 텍스트를 직접 생성하는 task에서 사용
- 모델의 페르소나, 생성할 텍스트의 tone 등을 지정
- 모델 파라미터 조정을 통해 매번 생성되는 텍스트의 무작위성을 조정
④ Transforming
- 텍스트를 다른 형식으로 변환하는 task
- language translation, spelling and grammar checking, tone adjustment, format conversion 등에서 사용
⑤ Chatbot
- 대화를 수행하는 모델 생성
- 이전 대화 내용을 messages 파라미터로 입력받음
# 모델은 앞선 대화 문맥을 바탕으로
# 'I don't know'라는 사용자 입력에 대한 다음 대화를 출력함
messages = [
{'role':'system', 'content':'You are an assistant that speaks like Shakespeare.'},
{'role':'user', 'content':'tell me a joke'},
{'role':'assistant', 'content':'Why did the chicken cross the road'},
{'role':'user', 'content':'I don\'t know'} ]
response = get_completion_from_messages(messages, temperature=1)
print(response)
Reference
https://medium.com/sopmac-ai/gpt-4-api-reference-guide-e4ba18bcbc5f#:~:text=top_p%3A%20helps%20control%20the%20randomness,uncommon%20words%20in%20its%20response.
https://tech.kakaoenterprise.com/188
'deep daiv. > NLP project' 카테고리의 다른 글
[리뷰 감정분석] KOTE 논문 리뷰 / KOTE fine-tuning 모델을 활용한 감정분석 (2) | 2024.09.12 |
---|---|
[리뷰 감정분석] ELECTRA / Korean Pre-trained Language Models (6) | 2024.09.08 |
[데이터 전처리] 마켓컬리 리뷰 데이터 전처리 / kiwipiepy 형태소 분석기 (2) | 2024.09.05 |
[프롬프트 엔지니어링] 프롬프트 엔지니어링의 개념, 기법, 예시 (0) | 2024.08.30 |
[데이터 수집] 마켓컬리 리뷰 데이터 크롤링 (1) | 2024.08.29 |