DL/LLM

[LLM] Google Prompt Engineering Whiterpapers - 구글 프롬프트 엔지니어링 백서 요약

moonzoo 2025. 4. 14. 11:33

Google에서 API 사용자를 중심으로 프롬프트 엔지니어링 에 초점을 맞춘 68페이지 분량의 백서를 최근 공개했는데 , 구조, 형식, 구성 설정, 그리고 실제 사례에 대해 심도 있게 다루고 있습니다. 여러번 수정하여 최신 버전을 공개한 것 같네요.

 

이미 프롬프트 엔지니어링에 대한 지식을 갖고 있고, 경험도 많으신 분들은 가볍게 읽고 넘어가셔도 도움이 될 듯합니다.

LLM에 대해 처음부터 공부해보시거나, 프롬프트 엔지니어링에 관심이 있으신 분들은 기본적으로 읽고 시작하시면 좋을 것 같습니다. 저도 일부 처음보는 방법도 있어서 도움이 조금 될 듯하네요! 자료 링크 같이 첨부드립니다.

https://drive.google.com/file/d/1AbaBYbEa_EbPelsT40-vj64L-2IwUJHy/view

 

 

22365_3_Prompt Engineering_v7 (1).pdf

 

drive.google.com

 



Google Prompt Engineering 백서 요약 

Google의 프롬프트 엔지니어링 백서는 **대형 언어 모델(LLM)**을 효과적으로 활용하기 위한 프롬프트 설계 방법론을 상세히 다룹니다. 특히 Vertex AI 환경에서 Gemini 모델 사용 시 실질적인 팁과 함께 다양한 프롬프팅 기법 및 구성 설정, 모범 사례들을 체계적으로 제시합니다.

 

1. 프롬프트 엔지니어링 개요 (Prompt Engineering Overview)

  • 정의: 고품질 프롬프트를 설계하여 LLM이 정확한(accurate) 출력을 생성하도록 유도하는 과정입니다 [Page 7].
  • 중요성: 사용하는 모델, 학습 데이터, 단어 선택, 구조, 스타일, 모델 설정(Configuration) 등 다양한 요소가 결과 품질에 직접적인 영향을 미칩니다 [Page 6].
  • 반복적 설계: 최적의 프롬프트를 찾기 위한 실험과 조정은 반복적인(iterative) 과정이며 [Pages 6, 7], 이 과정에서 시도한 내용을 체계적으로 문서화하는 것이 매우 중요합니다 (후술) [Pages 64, 65].

2. LLM 출력 설정 (Output Configuration)

LLM의 출력을 제어하는 주요 설정값들에 대한 이해가 필요합니다 [Pages 7, 8].

  • 출력 길이 (Output Length): 생성할 최대 토큰 수를 제한합니다. 토큰 수가 많을수록 응답은 길어지지만, 컴퓨팅 자원, 에너지 소비, 비용, 응답 시간이 증가할 수 있습니다 [Pages 8, 9]. 출력 길이를 줄이는 것은 내용을 요약하는 것이 아니라, 해당 토큰 수에 도달하면 모델이 예측을 멈추는 것입니다 [Page 9].
  • 샘플링 제어 (Sampling Controls): LLM은 다음 토큰에 대한 확률 분포를 예측하며 [Page 9], 샘플링 설정은 이 확률을 바탕으로 실제 출력 토큰을 선택하는 방식을 제어합니다.
    • Temperature: 토큰 선택의 무작위성을 조절합니다. 낮을수록(0에 가까울수록) 결정론적(가장 확률 높은 토큰 선택)이고, 높을수록 다양하고 창의적인 결과가 나옵니다 [Pages 9, 10].
    • Top-K: 확률이 높은 상위 K개의 후보 토큰 중에서만 다음 토큰을 샘플링합니다 [Page 10]. K가 1이면 Temperature 0과 동일하게 결정론적입니다.
    • Top-P (Nucleus Sampling): 누적 확률이 P 값에 도달할 때까지의 상위 토큰들 중에서 다음 토큰을 샘플링합니다 [Page 11].
    • 상호작용: 설정값들은 서로 영향을 줍니다. 예를 들어, Temperature가 0이면 Top-K/P는 무시됩니다 [Page 12]. 반대로 Top-K가 1이거나 Top-P가 0에 매우 가까우면 다른 설정들이 무시될 수 있습니다 [Page 12].
    • 버그 주의 (Repetition Bug): 부적절한 샘플링 설정값, 특히 너무 낮거나 너무 높은 극단적인 Temperature 설정은 모델이 동일한 단어나 구문을 반복하는 루프(repetition loop) 버그를 유발할 수 있습니다 [Pages 12, 13].

3. 프롬프팅 기법 (Prompting Techniques)

  • (1) 일반 프롬프트 (General Prompt):
    • 제로샷 (Zero-shot): 예시(example) 없이 작업 설명만 제공하는 가장 간단한 방식입니다 [Page 13].
    • 원샷/퓨샷 (One-shot/Few-shot): 각각 1개 또는 여러 개의 예시를 프롬프트에 포함하여 모델이 요청을 더 잘 이해하고 원하는 출력 구조나 패턴을 학습하도록 유도합니다 [Page 15].
      • 퓨샷은 보통 최소 3~5개 예시가 권장되며 [Page 16], 다양하고(diverse) 품질 높은(high quality) 관련성 있는(relevant) 예시를 사용하고 **엣지 케이스(edge cases)**를 포함하는 것이 견고성 향상에 도움이 됩니다 [Page 17].
  • (2) 시스템 / 역할 / 맥락 프롬프트 (System / Role / Context Prompt): [Page 18]
    • 시스템 프롬프트: 모델의 전반적인 목표나 규칙 (예: 출력 형식 지정, 특정 작업 수행 지시)을 설정합니다 [Page 18]. 안전성(safety) 및 유해성(toxicity) 제어에도 유용하게 사용될 수 있습니다 ("정중하게 답변하세요" 등) [Page 21].
    • 역할 프롬프트: 모델에게 특정 역할이나 페르소나(예: 여행 가이드, 특정 분야 전문가)를 부여하여, 해당 역할의 어조, 스타일, 지식, 행동 방식에 맞는 일관된 응답을 유도합니다 [Page 18].
    • 맥락 프롬프트: 현재 대화나 작업과 관련된 구체적인 배경 정보나 세부 사항을 제공하여 모델이 상황을 더 잘 이해하고 정밀한 응답을 하도록 돕습니다 [Page 18].
  • (3) 고급 기법 (Advanced Techniques):
    • 스텝-백 프롬프팅 (Step-back Prompting): 특정 질문에 답하기 전에, 관련된 더 추상적이거나 일반적인 질문을 먼저 생각하게 하여 배경 지식과 추론 과정을 활성화시킨 후, 그 결과를 바탕으로 원래 질문에 답하게 하는 기법입니다 [Page 25]. 편향 완화에 도움이 될 수 있습니다 [Page 25].
    • 사고의 연쇄 (Chain of Thought, CoT): 복잡한 문제 해결을 위해 **중간 추론 단계(reasoning steps)**를 생성하도록 유도하여 정확도를 높입니다 [Page 29].
      • Few-shot과 결합 시 더 효과적이며 [Page 29], 해석 가능성(interpretability) [Page 29] 및 LLM 버전 간 견고성(robustness) [Page 29] 향상이라는 장점이 있지만, 더 많은 토큰 사용(비용/시간 증가) [Page 29] 단점이 있습니다.
      • '말로 설명하며 풀 수 있는(talking through)' 문제에 적합하며 [Page 31], Temperature 0 설정이 권장됩니다 [Page 64].
    • 자기 일관성 (Self-consistency): CoT의 한계를 보완하기 위해, **샘플링(주로 높은 temperature 사용)**을 통해 다양한 추론 경로를 생성하고, 각 경로에서 도출된 **답변 중 가장 자주 등장하는(일관된) 것을 다수결(majority voting)**로 선택하여 정확도를 높입니다 [Page 32]. CoT의 greedy decoding 한계를 보완하는 기법이며 [Page 32], 비용이 높습니다 [Page 32].
    • 사고의 트리 (Tree of Thoughts, ToT): CoT를 일반화하여, 동시에 여러 추론 경로를 트리(Tree) 형태로 탐색하며 문제를 해결하는 기법입니다 [Pages 36, 37]. 복잡한 탐색이 필요한 문제에 유용합니다.
    • ReAct (Reason + Act): **추론(Reason)**과 **행동(Act)**을 결합하여, LLM이 **외부 도구(API, 검색 엔진 등)**와 상호작용하며 정보를 얻고 문제를 해결하도록 합니다 [Page 37]. 생각-행동-관찰(thought-action-observation) 루프를 통해 작동하며 [Page 37], 실제 구현 시 대화 기록 관리가 중요합니다 [Page 39].
    • 자동 프롬프트 엔지니어링 (Automatic Prompt Engineering, APE): LLM을 사용하여 자동으로 프롬프트를 생성하고, BLEU나 ROUGE 같은 지표로 평가하여 최적의 프롬프트를 찾아내는 방법입니다 [Page 40, 41].

4. 코드 프롬프팅 (Code Prompting)

LLM은 텍스트 기반 프롬프트를 통해 코드 관련 작업도 수행할 수 있습니다 [Page 42].

  • 코드 작성: 특정 언어로 코드 생성을 요청 (예: Bash 스크립트 작성) [Pages 42, 43].
  • 코드 설명: 주어진 코드의 동작 방식을 설명 요청 [Pages 44, 45].
  • 코드 번역: 한 프로그래밍 언어에서 다른 언어로 코드 변환 요청 (예: Bash → Python) [Pages 46, 47].
  • 코드 디버깅 및 검토: 코드의 오류를 찾고 수정 방안이나 개선점을 제시하도록 요청 [Pages 48-53].
  • 주의: LLM이 생성한 코드는 반드시 사람이 직접 검토하고 테스트해야 합니다 [Page 43].

5. 멀티모달 프롬프팅 (Multimodal Prompting)

텍스트뿐만 아니라 **이미지, 오디오, 코드 등 다양한 형식의 입력(modalities)**을 함께 사용하여 LLM의 이해력과 응답 능력을 향상시키는 기법입니다 [Page 54]. 이는 코드 프롬프팅과는 별개의 개념입니다.

6. 모범 사례 (Best Practices)

효과적인 프롬프트 설계를 위한 핵심 지침들입니다 [Page 54].

  • 예시 제공 (Provide Examples): 원샷/퓨샷 방식은 모델에게 원하는 결과물의 형태를 보여주는 강력한 학습 도구입니다 [Page 54].
  • 간결하고 명확한 설계 (Design with Simplicity): 복잡하거나 불필요한 정보 없이, 쉽고 명확한 언어로 작성합니다 [Page 55].
  • 구체적인 출력 요구 (Be Specific about the Output): 원하는 결과물의 형식, 톤, 구조 등을 명확하게 명시합니다 [Page 56].
  • 긍정적 지시 우선 (Use Instructions over Constraints): '무엇을 하지 말라'는 제약보다는 '무엇을 하라'는 긍정적인 지시를 우선 사용합니다 [Page 57]. 제약은 안전성이나 특정 형식 요구 시 필요에 따라 사용합니다.
  • 최대 토큰 길이 제어 (Control Max Token Length): 비용 및 성능 최적화를 위해 출력 길이를 설정값 또는 프롬프트 내 지시로 관리합니다 [Page 58].
  • 변수 사용 (Use Variables): 프롬프트 재사용성과 동적 활용을 위해 변수를 사용합니다 (애플리케이션 연동 시 유용) [Page 58].
  • 다양한 형식/스타일 실험 (Experiment): 입력 형식(질문/문장/지시), 출력 형식(텍스트/JSON 등), 작성 스타일 등을 다양하게 시도하며 최적화합니다 [Pages 59, 60]. JSON 출력의 이점 [Page 60].
  • 퓨샷 분류 시 클래스 혼합 (Mix up Classes): 분류 작업에서 퓨샷 예시를 제공할 때는, 특정 순서에 과적합되지 않도록 클래스 레이블 순서를 섞어주는 것이 좋습니다 [Page 59].
  • 모델 업데이트 적응 (Adapt to Model Updates): 모델 개선에 맞춰 프롬프트를 테스트하고 조정합니다 [Page 60].
  • CoT 관련: 답변은 추론 과정 뒤에 오도록 하고, 최종 답변을 명확히 추출할 수 있게 하며, Temperature는 0으로 설정합니다 [Page 64].
  • 협업 및 문서화 (Collaborate & Document): 프롬프트 엔지니어링은 반복적인 과정이므로, 시도한 프롬프트(모델, 설정값, 프롬프트 내용, 결과, 피드백 등)를 상세히 기록하고 공유하는 것이 매우 중요합니다 [Pages 63, 64, 65].

7. JSON 출력 및 관련 팁 (JSON Output & Tips)

  • JSON 출력 장점: 구조화된 데이터 제공, 환각(hallucination) 감소, 데이터 타입 지정, 정렬 용이, 관계 표현 가능 [Page 61].
  • JSON 출력 단점: 텍스트보다 많은 토큰 소모 (비용/시간/에너지 증가), 최대 토큰 제한으로 인한 잘림(truncation) 및 유효하지 않은 JSON 생성 위험 [Page 61].
  • 보완법:
    • JSON Repair: json-repair 같은 라이브러리를 사용하여 잘리거나 손상된 JSON을 복구 시도 [Page 61].
    • 스키마 활용 (Schema):
      • 출력 스키마 명시: 프롬프트 내에 원하는 JSON 출력 구조(스키마)를 명시하여 모델이 형식을 따르도록 유도 (예: Table 4 [Page 20]).
      • 입력 스키마 활용: JSON Schema를 사용하여 입력 데이터의 구조와 타입을 정의하면, 모델이 입력 정보를 더 정확하게 이해하고 관련 필드에 집중하도록 도울 수 있습니다 [Page 62].

8. 결론 (Conclusion)

프롬프트 엔지니어링은 단순한 기술이 아닌, LLM의 성능을 극대화하기 위한 전략적 사고와 반복적인 실험, 그리고 체계적인 문서화와 협업이 요구되는 분야입니다 [Pages 6, 65]. 이 백서는 Vertex AI와 Gemini 모델 환경을 기반으로, 다양한 프롬프팅 기법의 이론과 실용적인 예제를 균형 있게 제공하여 실질적인 도움을 줍니다.