『프롬프트 엔지니어링』

프롬프트 엔지니어링(Prompt engineering)은 LLM이 정확한 출력을 낼 수 있도록 고품질의 프롬프트를 설계하는 기술을 말한다. LLM은 주어진 입력 텍스트 뒤에 이어질 토큰을 예측하는 엔진이다.

기법

제로샷(Zero-shot) 프롬프트

가장 단순한 형식의 프롬프트. 태스크에 대한 설명한 제공한다. 이때 설명은 질문이나 이야기, 지시 등 무엇이듯 될 수 있다. 제로샷이라는 이름은 예시를 전혀 제공하지 않는다는 의미다.

원샷(One-shot) 프롬프트

하나의 예시를 제공하는 프롬프트. 여러 개의 예시를 제공하는 경우 few-shot 프롬프트라고 부른다. 예시는 다양해야 하며, 높은 품질을 갖춰야 한다.

시스템 프롬프트

전반적인 맥락과 목절을 설정하는 프롬프트. 모델이 할 일에 대한 큰 그림을 설명한다. 출력을 특정 요구사항에 맞게 생성할 때 유용하다. e.g., 특정 프로그래밍 언어로 코드 작성, 욕설 필터링 등.

맥락 프롬프트

대화나 태스크에 대한 특정 디테일이나 배경 정보를 제공하는 프롬프트. 모델이 요청을 더 명확히 이해할 수 있고, 뉘앙스를 파악할 수 있도록 돕는다. e.g., “Context: You are writing for a blog about retro 80’s arcade video games”

역할 프롬프트

특정 성격이나 정체성을 부여하는 프롬프트. 모델이 부여받은 역할에 관련된 지식, 행동에 따라 일관적으로 응답하도록 유도할 수 있다.

스텝백 프롬프트

특정 태스크와 관련된 일반적인 질문을 던지고, 그 응답을 다시 입력으로 제공하는 방식으로 구성하는 프롬프트. 태스크에 대한 일련의 프롬프트를 추가하는 방식으로 성능을 개선할 수 있다.

Chain of Thought (CoT)

모델이 생각하는 중간 과정을 생성하도록 함으로써 응답의 정확성을 높일 수 있다. few-shot 프롬프트와 결합하면 강력해진다. CoT는 장점이 많은데, 특히 모델이 잘못된 추론을 했는지 파악하는데 도움이 된다. 단, 출력 길이가 길어진다는 단점이 있다. e.g, “Let’s think step by step”

ReAct (Reasoning & Acting)

모델이 추론(Reasoning)과 행동(Acting)을 교대로 수행하도록 유도하는 프롬프트로, 에이전트 모델링의 첫걸음이다. 추론은 모델이 문제를 이해하고 중간 추론을 수행하는 과정이다. 행동은 외부 도구 호출, 결과 관찰 등 모델이 실제 행위를 하는 과정이다. 모델은 먼저 문제에 대해 사고하고 행동 계획을 세운 뒤, 계획된 행동을 실행하고 결과를 관찰한다. 그리고 이 관찰 결과를 바탕으로 추론을 갱신하고 새로운 행동 계획을 생성한다. 모델은 이 과정을 문제가 해결될 때까지 반복한다. ReAct 프롬프트를 실제로 적용하려면 이전에 주고받은 프롬프트와 응답을 계속해서 다시 제공해야 한다.

자동 프롬프팅 엔지니어링

각종 프롬프팅 기법이 너무 복잡하다면 모델에게 프롬프트를 생성하도록 할 수 있다. 태스크에 대한 설명과 함께 프롬프트 N개를 추천해달라고 하는 방식으로 사용할 수 있다.

모범사례

  • 예시를 제공하기.
  • 단순명료하게 작성하기: 사용자에게 혼란스러우면 모델에게도 혼란스럽다. 프롬프트에서 불필요한 정보는 모두 제ㅎ외해야 한다. “Act”, “Analyze”, “Categorize”, “Describe”, “Write”, "Translate"와 같은 동사를 사용하는 것이 좋다.
  • 구체적으로 명령하기: 요청이 너무 광범위하면 좋지 않다. 시스템 프롬프트나 맥락 프롬프트를 이용해 구체적인 내용을 제공해야 한다.
  • 제약보다는 지식하기: 긍정 지시문이 제약 사항에 기대는 것보다 효과적이다. 제약이 유용한 상황은 모델이 유해 콘텐츠를 생성하지 못하도록 방지하는 경우다.
  • 변수 사용하기: 프롬프트에 변수를 사용함으로써 프롬프트를 동적으로 활용할 수 있다. e.g., “VARIABLES {city} = “Seoul”, PROMPT You are a travel guide. Tell me a fact about the city: {city}”
  • JSON 포맷을 출력하는 경우: JSON을 출력으로 얻고 싶을 때는 각 필드의 종류와 타입을 명시한 스키마를 제공하는 것이 좋다. JSON은 장황하기 때문에 모델이 실수하기 쉽다. 모델이 생성한 JSON 결과물은 항상 별도의 도구를 이용해 검증해야 한다.
  • 토큰 길이를 제한하기.
  • 분류 작업에는 few-shot 프롬프트를 사용하기.

이 문서를 인용한 문서