LLM 개발자를 위한 프롬프트 엔지니어링의 모든 것

궁금하면 500원·2025년 7월 15일
0

AI 미생지능

목록 보기
63/68

프롬프트는 프로그래밍 언어, 인간의 언어를 가장한 기계어!

많은 분들이 LLM(거대 언어 모델)을 단순히 자연어 대화 도구로만 생각하지만, 사실은 프롬프트라는 고유의 프로그래밍 언어를 통해 작동하는 거대한 소프트웨어입니다. 놀랍게도 이 프롬프트는 인간이 설계하기 어려운 기계어에 가깝습니다.

우리가 코딩하듯 명령어 하나하나를 입력하는 것이 아니라, 특정 방향으로 LLM의 **어텐션(Attention)**을 유도해서 원하는 결과를 얻어내는 방식이기 때문이죠. 이는 인간의 직관으로 완벽히 예측하기 어렵고, LLM 스스로가 가장 잘 이해하는 영역입니다.

그렇다면 좋은 프롬프트를 작성하려면 무엇을 고려해야 할까요?

1. 프롬프트의 '사용 빈도'가 중요하다

프롬프트를 제작할 때 가장 먼저 고려해야 할 것은 해결하려는 문제의 중요성보다 얼마나 자주 사용될지입니다.

  • 비정기적이고 특수한 문제: 어쩌다 한 번 발생하는 문제라면 프롬프트가 정교하지 않아도 괜찮습니다. 대략적인 방향만 제시해도 LLM이 적절한 답변을 내놓을 수 있습니다.
  • 정기적이고 일상적인 문제: 매일같이 반복되는 작업이라면 일관성이 매우 중요합니다. 예를 들어, 매번 같은 포맷으로 보고서를 요약해야 하거나, 채팅방 제목을 자동으로 생성해야 하는 경우죠. 이럴 때는 결과가 흔들리지 않도록 매우 정교하고 일관적인 프롬프트가 필요합니다.

2. LLM이 아니면 해결할 수 없는 문제들

일상 속 많은 문제들은 LLM이 없으면 해결하기 힘든 함수성(Functionality) 문제를 가지고 있습니다. 예를 들어, 새로운 챗봇 채팅방의 제목을 사용자의 첫 질문을 기반으로 요약하는 작업이 그렇죠.

\<예시: 채팅방 제목 생성>

사용자의 첫 질문: "제주도 여행 가면 뭐 먹어야 돼요?"
이 질문을 10자 내외로 요약하는 알고리즘을 짠다고 가정해 봅시다. 단순 키워드 추출이나 불용어 제거만으로는 '제주도 맛집 추천', '제주 여행', '제주도 맛집'처럼 맥락을 살린 제목을 만들기 어렵습니다. 욕설이나 민감한 내용이 포함된 경우도 필터링해야 하죠.

이러한 문제를 해결하기 위해 LLM에게 다음과 같은 프롬프트를 사용할 수 있습니다.

# LLM에 전송할 프롬프트 예시 (Python)
# 이 프롬프트는 사용자의 질문을 요약해 채팅방 제목을 만드는 함수 역할을 합니다.

def create_chat_title(user_query):
    prompt = f"""
    아래 사용자의 질문을 10자 내외의 명사형 문구로 요약하여 새로운 채팅방의 제목을 생성해 주세요.
    욕설이나 비속어, 성적 또는 위험한 내용은 반드시 제거해야 합니다.

    <예시>
    - 질문: "오늘 날씨 어때?" -> 제목: "오늘의 날씨"
    - 질문: "영화 추천 좀 해줘요" -> 제목: "영화 추천"

    <사용자 질문>
    {user_query}

    <생성할 제목>
    """
    
    # 이 프롬프트를 LLM API에 전송하고 결과를 받습니다.
    # LLM API 호출 코드는 사용하시는 라이브러리에 따라 다릅니다.
    # 예: response = llm_model.generate(prompt)
    
    # return response.text.strip()

이처럼 단순한 요약 작업조차 알고리즘으로 완벽하게 구현하는 것은 불가능합니다. LLM은 이러한 맥락적 요약을 통해 일관된 품질을 보장합니다.

3. 입력 편향과 출력 편향, 그리고 어텐션 희석

프롬프트는 어텐션 편향을 조종하는 도구입니다. 어텐션은 모든 토큰을 대상으로 계산되어 문맥에 따라 단어의 의미를 재조정하는 역할을 합니다.

  • 입력 편향(Input Bias): 최초에 주어진 프롬프트(토큰)가 LLM의 답변 방향을 유도하는 것입니다.
  • 출력 편향(Output Bias): LLM이 생성한 답변(토큰)이 다시 다음 답변에 영향을 미치는 것입니다. 'Chain-of-Thought(CoT)' 같은 기법이 바로 이 출력 편향을 이용합니다.
    • CoT 예시: "한 번에 대답하지 말고, 중간 과정을 계속 말하면서 최종 답을 내놔"라고 지시하면, LLM은 중간 출력에 영향을 받아 더 정확한 최종 답변을 도출할 수 있습니다.

그런데 **어텐션 희석(Attention Dilution)**이라는 문제가 발생합니다. 토큰의 수가 많아질수록 개별 토큰의 영향력이 줄어드는 현상이죠. 프롬프트가 길어지면 초반에 입력했던 중요한 내용이 뒤로 갈수록 희미해져 LLM이 맥락을 잃어버리기도 합니다.

이를 방지하는 가장 좋은 방법은 토큰 임베딩(Token Embedding) 차원이 큰 모델을 사용하는 것입니다. 임베딩 차원이 크면 개별 토큰의 영향력이 줄어들어도 여전히 충분한 정보를 담을 수 있기 때문이죠. 최신 모델일수록 임베딩 차원이 큰 경향이 있어 더 좋은 성능을 보입니다.

4. LLM 모델 선택과 프롬프트 개선

LLM을 함수처럼 사용하려면 비용이 적고 빠르게 처리할 수 있는 작은 모델이 유리합니다. 하지만 작은 모델은 정교한 프롬프트 기술이 필요합니다. 이때 튜닝 모델(DPO, SFT 등)의 특성을 이해하는 것이 중요합니다.

  • 튜닝 모델: 특정 편향을 학습한 모델로, 일반적인 대화에는 더 인간처럼 자연스럽게 답변하지만, 정교한 프롬프트에는 오히려 잘 따르지 않을 수 있습니다.
  • 기본 모델: 튜닝되지 않은 모델은 프롬프트의 지시를 훨씬 잘 따르므로 함수적 호출에 더 적합합니다.

프롬프트를 개선하는 가장 좋은 방법은 다음과 같은 반복적인 프로세스를 거치는 것입니다.

  1. 초안 작성: 원하는 바를 간단한 프롬프트로 작성합니다.
  2. 테스트: 프롬프트에 다양한 입력을 넣어 결과를 확인합니다.
  3. GPT로 개선: 초안 프롬프트, 테스트 결과, 그리고 원하는 정답을 함께 ChatGPT에 제공하고 개선을 요청합니다.
  4. 반복: 개선된 프롬프트를 다시 테스트하고, 그 결과를 반영해 다시 ChatGPT에게 개선을 요청하는 과정을 반복합니다. 이 과정에서 영어를 사용하면 더 좋은 결과를 얻을 수도 있습니다.

이 과정을 거치면 처음에는 인간이 작성한 단순한 프롬프트가 점점 알고리즘처럼 정교하고 복잡한 형태로 진화하게 됩니다. 이는 결국 인간의 언어 형식을 띈 **'기계어'**에 가까워지는 것이죠.


결론적으로 프롬프트는 단순한 명령어가 아니라 LLM의 동작 원리(어텐션 편향)를 깊이 이해하고 조작하는 새로운 형태의 프로그래밍 언어입니다. 인간은 LLM의 도움을 받아 이 언어를 배우고 활용해야만 진정한 AI 시대의 개발자로 거듭날 수 있습니다.

profile
꾸준히, 의미있는 사이드 프로젝트 경험과 문제해결 과정을 기록하기 위한 공간입니다.

0개의 댓글