1. 프롬프트 엔지니어링의 필요성과 기본 개념 [0]

thumbnail LLM의 답변 품질은 프롬프트 작성 방식에 따라 크게 달라지므로, 명확하고 구체적인 지시와 다양한 예시 활용이 중요하다.

1.1. 프롬프트 엔지니어링의 중요성 [8]

  1. LLM 답변 품질의 가변성 [9]
    1. LLM의 답변은 사용하는 모델, 학습 데이터, 모델 설정값, 단어 선택, 스타일, 톤, 구조 등 다양한 변수에 따라 크게 달라진다. [9]
    2. 이로 인해 프롬프트 엔지니어링은 주관적이고 즉각적인 결과 도출이 어렵기 때문에 고려해야 할 사항이 많다. [9]
  2. LLM의 작동 원리 [10]
    1. LLM은 다음 단어를 예측하여 문장을 생성하는 구조로 작동한다. [10]
    2. 따라서 프롬프트 작성 방식에 따라 이전 토큰과 학습 데이터를 기반으로 답변을 생성하는 LLM의 예측 정확도가 달라진다. [10]

1.2. 출력 제어: 토큰 수와 샘플링 설정 [13]

  1. 출력 토큰 수 제한 (Output Length) [14]
    1. LLM 설정 시, 생성할 토큰 수를 제한하는 것은 중요한 변수 중 하나이다. [15]
    2. 토큰 수 제한은 에너지 소비량, 답변 속도, API 비용을 절감하는 데 도움이 된다. [16]
    3. 토큰 수 제한이 답변 품질을 저하시키는 것은 아니며, 프롬프트가 잘 작성되었다면 제한된 토큰 내에서도 높은 품질의 답변을 얻을 수 있다. [18]
  2. 샘플링 제어 (Sampling Control) [20]
    1. 온도 (Temperature): 답변의 창의성 또는 확실성을 조절한다. 0에 가까울수록 확실한 답변, 1에 가까울수록 창의적인 답변을 생성한다. [22]
    2. Top-K: 다음 토큰 예측 시, 상위 K개의 토큰만 고려하여 답변을 생성한다. K값이 높을수록 창의적이고, 낮을수록 확실한 답변을 생성한다. [25]
    3. Top-P: 예측 점수가 P값 안에 있는 토큰들만 고려하여 답변을 생성한다. 0은 확실한 답변, 1은 모든 토큰을 고려한다. [27]
    4. 상관관계:
      • 온도를 0으로 설정하면 Top-K와 Top-P는 효과가 없어진다. [30]
      • Top-K를 1로 설정하면 온도와 Top-P는 효과가 없어진다. [32]
      • Top-P를 0으로 설정하면 온도와 Top-K는 효과가 없어진다. [32]
  3. 권장 설정값 및 상황별 적용 [33]
    1. 일반적인 경우: 온도 0.2, Top-P 0.95, Top-K 35를 권장한다. [33]
    2. 창의적인 답변이 필요한 경우: 설정값을 조정한다. [33]
    3. 수학 문제 등 정해진 답이 있는 경우: 온도를 반드시 0으로 설정하여 오류를 방지한다. [34]

2. 다양한 프롬프트 엔지니어링 기법 소개 [35]

thumbnail 프롬프트 엔지니어링은 LLM의 성능을 극대화하기 위한 다양한 기법들을 포함한다.

2.1. 기본 프롬프트 기법: 제로샷, 원샷, 퓨샷 [36]

  1. 제로샷 프롬프트 (Zero-shot Prompt) [37]
    1. 별도의 예시 없이 바로 질문을 던지는 방식이다. [37]
    2. 예시: 영화 리뷰가 긍정적인지 부정적인지 판단 요청. [38]
  2. 원샷 프롬프트 (One-shot Prompt) [40]
    1. 프롬프트에 하나의 예시를 포함하여 질문하는 방식이다. [41]
    2. 답변의 정확도를 높이기 위해 사용된다. [40]
  3. 퓨샷 프롬프트 (Few-shot Prompt) [41]
    1. 프롬프트에 여러 개의 예시를 포함하여 질문하는 방식이다. [41]
    2. 예시 구성 조언 [43]
      1. 3~5개의 예시를 포함하는 것이 좋다. [43]
      2. 최대한 다양한 예시를 포함해야 LLM이 여러 유스케이스를 이해하고 올바른 답변을 생성할 수 있다. [43]
    3. 예시 활용 방안 [44]
      1. 고객의 피자 주문 사항을 JSON 형태로 변환하는 예시를 제공한다. [44]
      2. 다양한 사이즈와 재료를 포함한 여러 주문 예시를 제시한다. [45]
      3. 제시된 예시를 바탕으로 새로운 주문에 대한 JSON 응답을 생성하도록 요청한다. [49]
    4. 예시의 중요성 [51]
      1. 예시 구문은 다양하고 퀄리티가 높아야 LLM이 제대로 인식하여 좋은 답변을 생성한다. [51]
      2. 그렇지 않으면 LLM이 실수를 하거나 환각(Hallucination)을 일으킬 확률이 높아진다. [52]

2.2. 구조화된 프롬프트 기법: 시스템, 컨텍스트, 역할 [55]

  1. 시스템 프롬프트 (System Prompt) [56]
    1. LLM 모델 자체에 대한 기본적인 역할, 기능, 페르소나를 설정하는 프롬프트이다. [56]
    2. 예시: 리뷰가 긍정적인지 부정적인지 판단하도록 요청. [60]
  2. 컨텍스트 프롬프트 (Context Prompt) [58]
    1. LLM이 참고해야 할 배경 지식을 제공하는 프롬프트이다. [58]
    2. 예시: 80년대 아케이드 비디오 게임에 대한 블로그 글 작성을 위한 컨텍스트 제공. [71]
  3. 역할 프롬프트 (Role Prompt) [58]
    1. LLM이 특정 역할을 수행하도록 지시하는 프롬프트이다. [58]
    2. 예시: 투어 가이드 역할을 부여하여 여행 일정 추천 요청. [62]

2.3. 고급 프롬프트 기법 [72]

  1. 스텝백 프롬프트 (Step-back Prompt) [72]
    1. LLM이 답변 생성 전에 더 일반적인 원칙이나 개념을 먼저 생각하도록 유도하는 기법이다. [73]
    2. 작동 방식 [74]
      1. 먼저, LLM에게 일반적인 질문에 대한 답변을 생성하게 한다. [74]
      2. 생성된 답변을 바탕으로, 더 구체적인 질문에 대한 답변을 생성하도록 요청한다. [74]
    3. 예시: FPS 게임 스토리라인 생성 [75]
      1. 일반적인 FPS 게임 스토리라인 요청 시, 매우 일반적인 답변이 나온다. [76]
      2. 먼저, 인기 있는 FPS 게임들의 인기 요인 5가지를 생성하도록 요청한다. (예: 밀리터리 베이스, 사이버펑크, 에일리언, 좀비 등) [77]
      3. 생성된 인기 요인 중 하나를 선택하고, 해당 요인에 맞는 구체적인 스토리라인을 작성하도록 요청한다. [79]
      4. 이 과정을 통해 훨씬 특화되고 구체적인 답변을 얻을 수 있다. [81]
  2. 사고 연쇄 (Chain-of-Thought, CoT) [83]
    1. 복잡한 문제 해결 시, LLM에게 단계별로 생각하며 답변을 생성하도록 지시하는 기법이다. [84]
    2. 효과 [87]
      1. LLM이 답변을 서두르면서 발생하는 실수를 줄여준다. [87]
      2. "단계별로 생각하면서 문제를 풀어봐"와 같은 문구 추가만으로도 정확도와 퀄리티 높은 답변을 얻을 수 있다. [89]
    3. 원샷/퓨샷 CoT 활용 [92]
      1. 단계별 풀이 과정을 포함한 예시를 함께 제공하면 더 좋은 답변을 얻을 수 있다. [92]
  3. 자기 일관성 (Self-Consistency) [95]
    1. LLM의 추론 능력 한계를 보완하기 위해, 여러 답변을 생성하고 그중 가장 일관된 답변을 선택하는 기법이다. [95]
    2. 작동 방식 [97]
      1. 동일한 질문에 대해 여러 개의 답변을 생성한다. [97]
      2. 생성된 답변들 중 가장 많이 반복되는 답변을 최종 결과로 선택한다. [97]
    3. 예시: 이메일 중요도 판단 [98]
      1. 인간의 유머, 설득, 친근한 톤 등이 복합된 이메일의 중요도를 판단하는 데 활용된다. [99]
      2. LLM을 3번 실행하여 답변을 생성한다. (예: 중요, 중요하지 않음, 중요) [101]
      3. 가장 많이 나온 답변(중요)을 최종 결과로 선택한다. [104]
  4. 사고의 트리 (Tree-of-Thoughts, ToT) [106]
    1. CoT가 1차원적인 단계별 사고라면, ToT는 여러 답변을 생성하고 그중 좋은 것을 선택하는 과정을 반복하며 최적의 답변을 찾아가는 기법이다. [106]
    2. 복잡한 수학, 물리 문제 해결에 유용하다. [107]
  5. ReAct (Reasoning and Acting) [108]
    1. 에이전트가 외부 도구(검색, 코드 해석 등)를 활용하여 문제를 해결하는 데 효과적인 기법이다. [108]
    2. 작동 방식 [110]
      1. 문제를 단계별로 분해한다. [110]
      2. 생각(Reasoning)하고, 행동(Acting)하는 과정을 반복한다. [111]
    3. 예시: 메탈리카 멤버 자녀 수 계산 [113]
      1. 질문: 메탈리카 멤버들의 총 자녀 수는 몇 명인가? [113]
      2. 생각: 멤버 수를 파악해야 한다. -> 행동: 멤버 수 검색 (4명). [114]
      3. 생각: 각 멤버별 자녀 수를 파악해야 한다. -> 행동: 제임스 멤버의 자녀 수 검색 (3명). [115]
      4. 생각: 나머지 멤버들의 자녀 수도 파악해야 한다. -> 행동: 각 멤버별 자녀 수 검색. [117]
      5. 생각: 모든 자녀 수를 합산한다. -> 결과: 총 10명. [118]

2.4. 특수 목적 프롬프트 기법 [121]

  1. 산술적 프롬프트 엔지니어링 (Arithmetic Prompt Engineering, APE) [121]
    1. 프롬프트 작성이 익숙하지 않은 사용자를 위해 LLM이 자동으로 프롬프트를 생성하도록 하는 기법이다. [123]
    2. 작동 방식 [125]
      1. LLM에게 다양한 사용자 요청 유형을 생성하도록 프롬프팅한다. [125]
      2. 예시: 티셔츠 웹사이트 챗봇 학습을 위해, 고객이 특정 사이즈 티셔츠를 구매하고 싶을 때 발생할 수 있는 다양한 요청 형태 생성. [126]
      3. 생성된 요청 유형 중 가장 연관성 높은 것을 선택한다. [130]
      4. 선택된 요청을 바탕으로 챗봇을 학습시킨다. [130]
  2. 코드 프롬프트 (Code Prompt) [132]
    1. 코드 작성, 설명, 번역, 디버깅 등 코드 관련 작업을 위한 프롬프트 기법이다. [133]
    2. 주요 기능 [134]
      1. 특정 기능에 대한 코드 작성. [134]
      2. 코드 설명. [134]
      3. 코드 번역 (예: JavaScript를 Python으로). [135]
      4. 디버깅 및 코드 리뷰. [136]

3. 효과적인 프롬프트 작성을 위한 실천 팁 [138]

thumbnail 프롬프트 작성 시 명확성, 간결성, 구체적인 지시, 그리고 반복적인 테스트가 중요하다.

3.1. 프롬프트 작성 원칙 [139]

  1. 예시 활용의 중요성 [139]
    1. 항상 3~5개의 창의적이고 다양하며 확실한 예시를 함께 제공해야 좋은 답변을 얻을 수 있다. [140]
  2. 단순함과 명료함 [141]
    1. 너무 복잡하게 질문하면 LLM이 제대로 이해하지 못할 수 있으므로, 심플하고 명료하게 작성해야 한다. [141]
  3. 명령형 어조 사용 [142]
    1. "이것은 이렇게 해야 해"와 같이 생각을 말하는 방식보다, "네가 이렇게 행동해서 이렇게 해줘"와 같이 직접적인 명령 어조가 더 효과적이다. [142]
    2. 행동 동사 활용 [144]
      1. Act, Analyze, Categorize, Classify, Contrast, Compare 등 LLM이 직관적으로 이해할 수 있는 행동 동사를 많이 사용해야 한다. [145]
  4. 구체적인 출력 형식 지정 [146]
    1. LLM이 생성해야 하는 답변의 형식을 구체적으로 명시해야 한다. [147]
    2. 'Do'에 집중하기 (Do or Do Not) [149]
      1. LLM에게 '하지 말아야 할 것'보다 '해야 하는 것'에 집중하도록 지시하는 것이 더 효과적이다. [149]
      2. '해야 하는 것'(Instruction)을 더 많이 포함할수록 좋은 답변을 생성한다. [151]
      3. 예시: "이것에 대해 작성해줘"가 "이것에 대해 이야기하지 말아줘"보다 긍정적인 결과를 가져온다. [153]

3.2. 출력 형식 및 테스트 전략 [155]

  1. 토큰 제한 및 변수 활용 [156]
    1. 생성 가능한 토큰 수를 제한하면 더 좋은 답변을 얻을 수 있다. [156]
    2. 프롬프트 내에 변수를 설정하면 동적으로 값을 조정할 수 있어 유용하다. [156]
  2. 다양한 질문 형식 테스트 [158]
    1. 질문 형식, 문장 형식, 지시 사항 형식 등 다양한 형태로 요청하고 테스트하는 것을 추천한다. [159]
  3. 퓨샷 프롬프트 시 다양한 예시 활용 [162]
    1. 퓨샷 프롬프트 작성 시, 최대한 다양한 예시를 포함해야 한다. [162]
  4. 모델 업데이트 인지 [163]
    1. 모델 업데이트 시마다 최신 정보를 인지하고 있어야 한다. [163]
  5. JSON 또는 XML 형식 활용 [164]
    1. JSON이나 XML과 같은 구조화된 형식으로 답변을 받으면 편차가 줄어든다. [164]
    2. 코딩 시 유리하며, 일관된 스타일의 답변을 생성하고 필요한 데이터에 집중할 수 있게 한다. [165]
    3. 환각(Hallucination)을 줄이는 데도 도움이 된다. [167]

3.3. 특정 기법 활용 및 관리 [169]

  1. CoT 프롬프트 시 온도 설정 [169]
    1. CoT 프롬프트는 답변이 정해진 문제에 주로 사용되므로, 온도를 0으로 설정하는 것이 좋다. [169]
  2. 프롬프트 기록 및 관리 [170]
    1. 앱이나 챗봇 개발 시 사용한 프롬프트들을 기록하고 관리하는 것이 중요하다. [170]
    2. 구글 시트 등을 활용하여 프롬프트 이름, 목표, 사용 모델, 설정값, 프롬프트 내용, 결과 등을 기록하면 관리가 용이하다. [171]