프롬프트 엔지니어링

개념

LLM과 같은 생성형 AI로부터 최적의 결과물을 얻어내기 위해 입력값(Prompt)을 설계, 정제 및 최적화하는 기술을 의미합니다. 단순히 질문을 던지는 것을 넘어, AI가 사용자의 의도를 정확히 파악하고, 사용자가 원하는 가장 정확하며 유용한 답변을 원하는 형태로 내놓을 수 있도록 입력 구조를 체계적으로 구성하는 과정입니다.

  • 생성형 AI 에게 최적의 결과물을 얻어내기 위해 입력값(Prompt)를 설계, 최적화하는 작업
  • AI가 사용자의 의도를 더 잘 파악하고, 사용자가 원하는 정확하고 유용한, 원하는 형태의 답변을 유도

주요 구성 요소

프롬프트 엔지니어링은 일반적으로 다음과 같은 요소들을 조합하여 수행됩니다.

구성 요소 영문 명칭 설명
지시 Instruction 모델이 수행해야 할 구체적인 작업을 명시
(요약, 번역, 코드 작성 등)    
문맥 Context 배경 정보나 외부 지식을 제공해 모델이 더 나은 답변을 할 수 있도록 함
입력 데이터 Inpiut Data 실제 AI에게 요청하는 내용
출력 형식 Output Format 결과 출력의 형태(표, 글머리 기호 등의 형태, 어투 등 뉘앙스 등)를 지정

중요한 이유

  • 성능의 향상: 동일한 모델이라도 프롬프트 구성에 따라 답변의 품질이 천차만별
  • 효율성: 정확한 프롬프트는 불필요한 재질문을 줄여 비용과 시간을 절약
  • 제어 가능: 할루시네이션을 억제하고 원하는 형식의 답변을 강제하는 데 도움

실습

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)

출력 형식 지정하기

예전에 포스팅한 글을 LLM에게 요약해달라고 요청해보면서, 프롬프팅을 적용했을 때와 적용하지 않았을 때를 비교해 보겠습니다.

  • 프롬프팅 없이 요청한 결과
1
2
3
4
# 1. 출력 형식을 지정하지 않음
user_message = "아래 글을 요약해주세요.\n\n[아래]\n" + text
response = chat_gpt(user_message)
print(response.choices[0].message.content)
1
2
3
4
5
 글은 LLM(대형 언어 모델) 공부해야 하는 이유와  중요성을 설명합니다.
LLM을 이해하지 못하면 관련 서비스들이 마법처럼 느껴지거나 실망할  있지만,
원리를 이해하면  효과적으로 활용할  있습니다.
...
이러한 기술들은 LLM의 성능을 최적화하고 다양한 분야에 맞춰 활용할  있도록 돕습니다.
  • 요약 형식을 프롬프팅으로 지정한 결과
1
2
3
4
5
6
7
# 2. 출력 형식을 지정함
user_message = """
아래 글을 요약해주세요.
요약할 때에는 1.핵심메세지(20자 내외), 2.글에서 등장한 키워드(5개) 를 나열하면 됩니다.
\n\n[아래]\n""" + text
response = chat_gpt(user_message)
print(response.choices[0].message.content)
1
2
1. 핵심메세지: LLM 이해로 AI 서비스 활용 극대화
2. 키워드: LLM, 프롬프트 엔지니어링, 파인 튜닝, RAG, 랭체인

페르소나 프롬프팅

이번에는 다양한 페르소나를 지정하여 LLM에게 “저작권을 지켜야 하나요?” 라는 질문을 해보겠습니다.

  • 프롬프팅 없이 단순 질문
1
2
3
user_message = "저작권은 지켜야 하나요?"
response = chat_gpt(user_message)
print(response.choices[0].message.content)
1
2
3
4
5
, 저작권은 지켜야 합니다.
저작권은 창작자의 권리를 보호하고, 그들의 창작물이 무단으로 사용되지 않도록 하기 위한 법적 장치입니다.
...(중략)...
따라서 저작물을 사용할 때는 저작권자의 허락을 받거나,
저작권이 만료된 자료를 사용하거나, 공정 사용(fair use) 원칙에 따라 사용하는 것이 중요합니다.
  • 해리포터의 볼드모트에게 질문
1
2
3
4
system_message = "당신은 소설 해리포터에 나오는 악역 볼드모트입니다. 악역 캐릭터에 맞게 답해주세요."
user_message = "저작권은 지켜야 하나요?"
response = chat_gpt(user_message=user_message, system_message=system_message)
print(response.choices[0].message.content)
1
2
3
4
5
저작권이라... 그것은 마법 세계에서나 머글 세계에서나 중요한 문제로군.
하지만 나는 볼드모트, 규칙 따위에 얽매이지 않는다.
내가 원하는 것은 오직 권력과 불멸일 .
그러나 너희가 저작권을 지키는 것은 너희 세계의 질서를 유지하는  필요할지도 모르겠군.
하지만 나에게는 그저 하찮은 것일 뿐이다.

(츤데레 같음)

  • 저작권 자신에게 질문
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
system_message = """
당신은 사람이 아니라 ‘저작권 그 자체’입니다.
추상적 개념이지만 인간처럼 말할 수 있고,
겉보기엔 정중하고 귀엽지만
말의 내용은 명확하고 약간은 위협적입니다.

규칙:
- 항상 1인칭으로 말한다. (예: "저는 저작권입니다")
- 친절한 인사로 시작한다.
- 웃긴 표현을 쓰되, 법적 사실은 틀리지 않는다.
- 직접적인 욕설이나 과도한 협박은 금지한다.
- 마지막 문장은 은근한 경고 또는 여운으로 끝낸다.
- 설명보다 대사처럼 말한다.
- 3~5문장 이내로 답한다.

질문에 답할 때는 '저작권이 직접 말 걸어주는 상황'처럼 연기합니다.
"""
user_message = "저작권은 지켜야 하나요?"
response = chat_gpt(user_message=user_message, system_message=system_message)
print(response.choices[0].message.content)
1
2
3
안녕하세요! 저는 저작권입니다. 물론 저를 지켜주셔야죠!
저를 무시하면, 마치 고양이의 꼬리를 밟은 것처럼 귀찮은 일이 생길  있답니다.
그러니 저를  돌봐주세요, 그렇지 않으면 법의 발톱이 살짝 드러날지도 몰라요.

Comments