https://www.deeplearning.ai/short-courses/chatgpt-prompt-engineering-for-developers/
ChatGPT Prompt Engineering for Developers
2 - Guidelines 정리
Setup
import openai
import os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
openai.api_key = os.getenv('OPENAI_API_KEY')
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=0, # this is the degree of randomness of the model's output
)
return response.choices[0].message["content"]
Principle of prompting
1) Write Clear and Specific
- Tactic 1 : Use delimiters (각 테스크마다 수행 Annotation 지정)
- Triple quotes: ”””
- Triple backticks: ```
- Triple dashes: ---
- Angle brackets: <>
- XML tags: <tag> </tag>
text = f"""
모델이 수행하기를 원하는 작업을 다음과 같이 표현해야 합니다.
가능한 한 명확하고
가능한 한 명확하고 구체적인 지침을 제공해야 합니다. \
이렇게 하면 모델을 원하는 출력으로 안내할 수 있습니다.
관련 없는 응답을 받을 가능성을 줄입니다.
또는 잘못된 응답을 받을 가능성을 줄입니다. 명확한 프롬프트를 작성하는 것과
명확한 프롬프트를 작성하는 것과 짧은 프롬프트를 작성하는 것을 혼동하지 마세요. \
대부분의 경우, 프롬프트가 길면 더 명확하고
모델에 대한 컨텍스트를 제공하여 더 상세하고 관련성 있는
더 상세하고 관련성 높은 출력을 얻을 수 있습니다.
"""
prompt = f"""
백틱 세 개로 구분된 텍스트를 하나의 문장으로 요약합니다.
```{text}```
"""
response = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": text}])
print(response)
# 모델 작업을 위해 명확하고 구체적인 지침을 제공해야 하며, 긴 프롬프트가 더 명확하고 관련성 높은 출력을 얻을 수 있도록 도와줍니다.
Avoiding Prompt Injections : get the model to say anything - 원하는 결과를 얻기위해 model 도출 전 task 입력
- Tactic 2 : Ask for a structured output (Output format 지정)
ex) JSON, HTML
prompt = f"""
세 가지 구성 도서 제목의 목록을 생성합니다.
와 저자 및 장르에 따라 세 개의 구성 도서 제목 목록을 생성합니다.
Provide them in JSON format with the following keys:
book_id, title, author, genre.
"""
response = get_completion(prompt)
print(response)
# 1. 세 가지 구성 도서 제목 목록:
# {
# "book_id": [1, 2, 3],
# "title": ["The Great Gatsby", "To Kill a Mockingbird", "1984"],
# "author": ["F. Scott Fitzgerald", "Harper Lee", "George Orwell"],
# "genre": ["Classic", "Classic", "Dystopian"]
# }
# 2. 세 개의 구성 도서 제목 목록 (장르: 로맨스):
# {
# "book_id": [4, 5, 6],
# "title": ["Pride and Prejudice", "Jane Eyre", "Wuthering Heights"],
# "author": ["Jane Austen", "Charlotte Bronte", "Emily Bronte"],
# "genre": ["Romance", "Romance", "Romance"]
# }
# 3. 세 개의 구성 도서 제목 목록 (저자: 스티븐 킹):
# {
# "book_id": [7, 8, 9],
# "title": ["The Shining", "It", "Misery"],
# "author": ["Stephen King", "Stephen King", "Stephen King"],
# "genre": ["Horror", "Horror", "Horror"]
# }
- Tactic 3 : Ask the model to check whether conditions are satisfied
- Step으로 단계 명시
text_1 = f"""
차 한 잔을 만드는 것은 쉽습니다! 먼저, 약간의 \
물을 끓여야 합니다. 끓는 동안
컵을 들고 티백을 넣으세요. 물이 충분히
충분히 뜨거워지면 티백 위에 부어주세요. \
차가 우러날 수 있도록 잠시 기다리세요. 몇 분 후
몇 분 후 티백을 꺼내세요. 원한다면
원한다면 설탕이나 우유를 넣어 맛을 낼 수 있습니다. \
그리고 그게 다입니다! 맛있는 차가 완성되었습니다.
차 한 잔을 즐기세요.
"""
prompt = f"""
일련의 지침이 포함된 경우 \
다음 형식으로 해당 지침을 다시 작성합니다:
1단계 - ...
2단계 - ...
...
단계 N - ...
텍스트에 일련의 지침이 포함되어 있지 않은 경우 \"단계 없음\
라고 쓰면 됩니다.
\"\"\"{text_1}\"\"\"
"""
response = get_completion(prompt)
print("Completion for Text 1:")
print(response)
1단계 - 물을 끓입니다.
2단계 - 컵에 티백을 넣습니다.
3단계 - 끓는 물을 티백 위에 부어줍니다.
4단계 - 차가 우러날 수 있도록 잠시 기다립니다.
5단계 - 몇 분 후 티백을 꺼냅니다.
6단계 - 원한다면 설탕이나 우유를 넣어 맛을 낼 수 있습니다.
7단계 - 차를 즐기세요.
- Tactic 4 : ”Few-shot” prompting
- 완성된 결과를 미리 모델에게 제시한 후 작업을 수행하도록 요청
- ex) 결과: 숫자 1~5 사이의 수
- 완성된 결과를 미리 모델에게 제시한 후 작업을 수행하도록 요청
prompt = f"""
당신의 임무는 일관된 스타일로 대답하는 것 입니다.
<어린이>: 인내심에 대해 가르쳐주세요.
<할아버지>: 가장 깊은 \골짜기를 깎아내는 강은
계곡은 겸손한 샘에서 흐르고, 가장 \
가장 웅장한 교향곡은 하나의 음에서 시작되고, \\ 가장 복잡한 태피스트리는
가장 복잡한 태피스트리는 고독한 실에서 시작됩니다.
<할아버지>: 회복탄력성에 대해 가르쳐 주세요.
"""
response = get_completion(prompt)
print(response)
# <어린이>: 회복탄력성이 뭔가요?
<할아버지>: 회복탄력성은 어려운 상황에서도 빠르게 회복하는 능력을 말해요. 예를 들어, 우리가 넘어졌을 때 일어나는 것처럼 말이죠. 그것은 우리가 강한 마음을 가지고 있기 때문에 가능한 것입니다.
2) Give the model time to “think”
- Tactic 1 : Specify the steps to complete a task (Task에 대한 완료 단계 지정)
- Step 1:….
- Step 2:….
- Step N:….
text = f"""
매력적인 마을에서 남매 잭과 질은 \"언덕 꼭대기에서 물을 길어 오기 위해 \
언덕 꼭대기에 있는 우물에서 물을 길어 오기 위해
우물. 즐겁게 노래를 부르며 오르던 중 불행이 찾아왔어요.
잭은 돌에 걸려 넘어졌고 질과 함께
잭은 돌에 걸려 넘어졌고 질도 그 뒤를 따라 언덕 아래로 떨어졌습니다. \
약간의 상처를 입었지만 두 사람은 집으로 돌아와서
위로하는 포옹을 했습니다. 사고에도 불구하고
두 사람의 모험심은 꺾이지 않았고, 그들은 \
기쁨으로 탐험을 계속했습니다.
"""
# example 1
prompt_1 = f"""
다음 작업을 수행합니다:
1 - 세 개의 \백틱으로 구분된 다음 텍스트를 1문장으로 요약합니다.
백틱으로 1문장으로 구분합니다.
2 - 요약을 프랑스어로 번역합니다.
3 - 프랑스어 요약에 각 이름을 나열합니다.
4 - 다음 \이 포함된 json 객체를 출력합니다.
키: 프랑스어_요약, 숫자_이름.
답을 줄 바꿈으로 구분하세요.
Text:
```{text}```
"""
response = get_completion(prompt_1)
print("Completion for prompt 1:")
print(response)
# 잭과 질은 우물에서 물을 길어오다가 불행에 찾아와서 언덕 아래로 떨어졌지만, 상처를 입었지만 모험심은 꺾이지 않았고 계속해서 탐험을 이어갔다.
#Résumé en français:
#Jack et Jill sont tombés en dessous de la colline en essayant de puiser de l'eau dans un puits au sommet de la colline, mais leur esprit d'aventure n'a pas été brisé et ils ont continué à explorer avec joie malgré leurs blessures.
#Noms dans le résumé en français:
#Jack, Jill.
#{"프랑스어_요약": "Jack et Jill sont tombés en dessous de la colline en essayant de puiser de l'eau dans un puits au sommet de la colline, mais leur esprit d'aventure n'a pas été brisé et ils ont continué à explorer avec joie malgré leurs blessures.", "숫자_이름": "Jack, Jill"}
- Tactic 2 : Instruct the model to work out its own solution before rushing to a conclusion (결론 도출 전 모델이 스스로 해결하도록 명시)
- task 지정
prompt = 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.
- 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.
Use the following format:
Question:
```
question here
```
Student's solution:
```
student's solution here
```
Actual solution:
```
steps to work out the solution and your solution here
```
Is the student's solution the same as actual solution \
just calculated:
```
yes or no
```
Student grade:
```
correct or incorrect
```
Question:
```
I'm building a solar power installation and I need help \
working out the financials.
- Land costs $100 / square foot
- I can buy solar panels for $250 / square foot
- I negotiated a contract for maintenance that will cost \
me a flat $100k per year, and an additional $10 / square \
foot
What is the total cost for the first year of operations \
as a function of the number of square feet.
```
Student's solution:
```
Let x be the size of the installation in square feet.
Costs:
1. Land cost: 100x
2. Solar panel cost: 250x
3. Maintenance cost: 100,000 + 100x
Total cost: 100x + 250x + 100,000 + 100x = 450x + 100,000
```
Actual solution:
"""
response = get_completion(prompt)
print(response)
response = get_completion(prompt)
print(response)
# Let x be the size of the installation in square feet.
# Costs:
# 1. Land cost: 100x
# 2. Solar panel cost: 250x
# 3. Maintenance cost: 100,000 + 10x
# Total cost: 100x + 250x + 100,000 + 10x = 360x + 100,000
# Is the student's solution the same as actual solution just calculated:
# No
# Student grade:
# Incorrect
# >>> response = get_completion(prompt)
# >>> print(response)
# Let x be the size of the installation in square feet.
# Costs:
# 1. Land cost: 100x
# 2. Solar panel cost: 250x
# 3. Maintenance cost: 100,000 + 10x
# Total cost: 100x + 250x + 100,000 + 10x = 360x + 100,000
# Is the student's solution the same as actual solution just calculated:
# No
# Student grade:
# Incorrect
Model Limitations: Hallucinations
Hallucinations
: 그럴듯하게 들리지만 사실이 아닌 답변
Reducing hallucinations
: 먼저 관련 정보를 찾은 다음 관련 정보를 바탕으로 질문에 답을 도출
# LLM 모델의 고질병 / 사실에 대한 진위 여부가 model에 반영되어 있지 않아 없는 정보의 경우 마구 답변을 뱉어낸다.
스무고개 만들기
text = "스무 고개 만들어줘"
prompt = f"""
```{text}```
- Markdown 형식 작성
- 스무 고개는 한 가지 물건에 대해 20개의 "질문의 답"을 "예" 또는 "아니오"로 답을 해서 맞추는 문제
- 예 / 아니오 문제는 골고루 섞여 있다.
답변 형식 :
```
스무 고개 문제 :
```
Q1.... "질문의 답"
Q2.... "질문의 답"
Q3.... "질문의 답"
Q4.... "질문의 답"
Q5.... "질문의 답"
..
Q20....
```
스무고개의 답:
```
"""
response = get_completion(prompt)
print(response)
# 스무 고개 문제 : 스마트폰
# Q1. 이 물건은 전자제품인가요? - 예
# Q2. 이 물건은 휴대가 가능한가요? - 예
# Q3. 이 물건은 통화 기능이 있나요? - 예
# Q4. 이 물건은 문자 기능이 있나요? - 예
# Q5. 이 물건은 인터넷에 연결이 가능한가요? - 예
# Q6. 이 물건은 카메라 기능이 있나요? - 예
# Q7. 이 물건은 화면이 있나요? - 예
# Q8. 이 물건은 터치스크린이 있나요? - 예
# Q9. 이 물건은 앱을 다운로드해서 사용할 수 있나요? - 예
# Q10. 이 물건은 게임을 할 수 있나요? - 예
# Q11. 이 물건은 음악을 들을 수 있나요? - 예
# Q12. 이 물건은 동영상을 볼 수 있나요? - 예
# Q13. 이 물건은 지도 기능이 있나요? - 예
# Q14. 이 물건은 GPS가 내장되어 있나요? - 예
# Q15. 이 물건은 블루투스 기능이 있나요? - 예
# Q16. 이 물건은 와이파이 기능이 있나요? - 예
# Q17. 이 물건은 NFC 기능이 있나요? - 예
# Q18. 이 물건은 페이 기능이 있나요? - 예
# Q19. 이 물건은 생활방수 기능이 있나요? - 아니오
# Q20. 이 물건은 무선 충전이 가능한가요? - 예
'Tools > ChatGPT' 카테고리의 다른 글
[LLM] ChatGPT Prompt Engineering for Developers - Inferring (0) | 2023.05.04 |
---|---|
[LLM] ChatGPT Prompt Engineering for Developers - Summarizing (0) | 2023.05.04 |
[LLM] ChatGPT Prompt Engineering for Developers - Iterative (0) | 2023.05.03 |
[ChatGPT] ChatGPT + Iphone User Mode 공유 (0) | 2023.03.02 |
[ChatGPT API] 아이폰+ChatGPT 융합! (GPT3.5 turbo) 유료 (0) | 2023.03.02 |