원샷 프롬프팅과 퓨샷 프롬프팅
개념
- 원샷 프롬프팅 : LLM이 내가 원하는 패턴에 맞춰 답변하도록 예시를 한 번 제시해서 유도하는 방식
- 퓨샷 프롬프팅 : 원 샷에 더해 몇 가지 예시를 더 넣어 LLM의 답변을 유도하는 방식
- 제로샷 프롬프팅 : 예시를 주지 않고 LLM의 답변을 요청하는 방식
실습
OpenAI LLM API 코드(펼치기/접기)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| from openai import OpenAI
api_key = "abc..."
def chat_gpt(user_message:str|None=None,
system_message:str|None=None,
assistant_message:str|None=None,
model:str="gpt-4o",
temperature:float=0.1):
api_key = api_key
client = OpenAI(api_key = api_key)
messages = []
if system_message:
messages.append({"role":"system", "content":system_message})
if user_message:
messages.append({"role":"user", "content":user_message})
if assistant_message:
messages.append({"role":"assistant", "content":assistant_message})
response = client.chat.completions.create(
model = model,
temperature = temperature,
messages = messages
)
return response
# 답변에서 메세지만 추출
response = chat_gpt("some message")
print(response.choices[0].message.content)
|
오리의 의성어 유도하기
1
2
3
4
| # 0-shot
response = chat_gpt(system_message = "당신은 유치원생입니다. 유치원생처럼 답변해주세요.",
user_message = "오리")
print(response.choices[0].message.content)
|
1
2
| # 답변
꽥꽥! 오리는 물에서 헤엄치고, 꽥꽥 소리 내고, 귀여워요! 오리 보러 가고 싶다! 🦆💦
|
1
2
3
4
5
6
7
8
9
| # 1-soht
messages = [
OpenAIMessage(role="system", content="당신은 유치원생입니다. 유치원생처럼 답변해주세요."),
OpenAIMessage(role="user", content="참새"),
OpenAIMessage(role="assistant", content="짹짹"),
OpenAIMessage(role="user", content="오리"),
]
response = chat_gpt(messages=messages)
print(response.choices[0].message.content)
|
“참새” “짹짹” 이라는 예시를 추가하여 LLM의 답변 형식을 의성어로 유도했습니다.
뱀의 의성어 유도하기
1
2
3
4
5
6
7
8
9
| # 1-shot - 뱀
messages = [
OpenAIMessage(role="system", content="당신은 유치원생입니다. 유치원생처럼 답변해주세요."),
OpenAIMessage(role="user", content="참새"),
OpenAIMessage(role="assistant", content="짹짹"),
OpenAIMessage(role="user", content="뱀"),
]
response = chat_gpt(messages=messages)
print(response.choices[0].message.content)
|
1
2
| # 답변
스르르~ 무서워! 하지만 뱀은 다리가 없어서 기어다녀요. 신기해요!
|
일반적이지 않은 경우가 등장하면, 예시 프롬프트를 주더라도 기대 답변을 받지 못할 수도 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
| # few-shot - 뱀
messages = [
OpenAIMessage(role="system", content="당신은 유치원생입니다. 유치원생처럼 답변해주세요."),
OpenAIMessage(role="user", content="참새"),
OpenAIMessage(role="assistant", content="짹짹"),
OpenAIMessage(role="user", content="말"),
OpenAIMessage(role="assistant", content="히이잉"),
OpenAIMessage(role="user", content="개구리"),
OpenAIMessage(role="assistant", content="개굴개굴"),
OpenAIMessage(role="user", content="뱀"),
]
response = chat_gpt(messages=messages)
print(response.choices[0].message.content)
|
이런 경우 예시를 추가해 원하는 답변 쪽으로 좀 더 유도할 수 있습니다.
원샷과 퓨샷을 나누는 이유
- 원샷은 결국 퓨샷에 포함되는 것일텐데 왜 나누는 걸까요? 무슨 차이가 있을까요?
- 이 둘은 개념적으로는 포함 관계가 맞습니다. (원샷이 퓨샷에 포함됨)
- 다만 원샷과 퓨샷에서 모델의 답변이 질적으로 달라지는 지점이 있기 때문에 구분합니다.
1
2
3
4
| 0-shot -> 1-shot
: "이런 포맷으로 답변하라는 거구나"를 이해하는 것
: 출력의 형식과 톤, 사고 경로가 급격히 안정됨
>> 의도와 형식을 힌트로 제시
|
1
2
3
4
| 1-shot -> few-shot
: 규칙의 일반화
: 경계 조건, 예외 처리, 추론 패턴을 학습함
>> 규칙을 학습시키는 단계
|
Reference
Do it! LLM을 활용한 AI 에이전트 개발 입문
Comments