개요
업무를 진행하면서 혹은 개인적으로 배운 내용을 짧게나마 정리를 하고자 블로그 글을 작성했습니다.
프롬프트 소개 (Introduction to Prompting)
현재 AI에서 가장 쉽게 접근 가능한 방법으로 프롬프트를 작성해서 생성하는 기능입니다.
프롬프트는 일반적으로 다음과 같은 요소를 포함합니다.
- 작업 설명 (Task description)
모델이 수행해야 할 작업, 모델이 수행해야 할 역할, 출력 형식을 설명합니다. - 작업 수행 예시 (Examples of how to do this task)
예를 들어, 텍스트에서 유해성을 감지하는 모델을 원한다면, 유해한 경우와 유해하지 않은 경우의 예제를 제공할 수 있습니다. - 작업 (The task)
모델이 실제로 수행해야 할 구체적인 작업을 포함합니다. 예를 들어, 질문에 답하거나 책의 내용을 요약하는 것이 될 수 있습니다.
여기서 모델을 선정하는 기준이 나오는데 모델이 지시를 따르는 능력이 부족하다면, 프롬프트가 아무리 좋아도 원하는 결과를 얻을 수 없습니다.
대부분의 모델에서는 GPT-4와 같이 프롬프트의 작업 설명이 앞에 있을 때 더 좋은 성능을 보입니다.
하지만 LLaMA와 같은 일부 모델은 작업 설명이 뒤에 있을 때 더 좋은 성능을 낼 수도 있습니다.
제로샷 및 퓨샷 (Zero-Shot and Few-Shot)
맥락 학습(In-Context Learning)은 모델이 단절된 데이터가 아닌 연속적인 문맥을 이해하도록 돕는 방식입니다.
프롬프트에 포함된 각 예제는 샷(Shot) 이라고 하며, 예제의 개수에 따라 학습 방식이 달라집니다.
- 퓨샷 학습(Few-Shot Learning): 여러 개의 예제를 제공하여 모델이 학습하도록 유도하는 방식
- 제로샷 학습(Zero-Shot Learning): 예제를 제공하지 않고 모델이 직접 문제를 해결하도록 하는 방식
단, 여기서 중요한 점으로 모델이 수용할 수 있는 최대 컨텍스트 길이(context length) 에 의해 제한됩니다. 즉, 예제가 많을수록 성능이 좋아질 수 있지만, 계산 비용이 증가하는 단점이 있습니다. 추가로 gpt3는 퓨샷이 효과적이였지만 최신 GPT4나 Claude3.5 모델은 퓨샷으로 큰 성능 향상을 보이지 않았습니다.
이는 최신 모델이 더욱 강력해지면서, 적은 예제만으로도 패턴을 이해하고 일반화하는 능력이 향상되었기 때문입니다.
다만, 특정 도메인에서는 퓨샷이 효과적이므로 몇 개의 예제만으로도 모델의 성능이 크게 향상이 될 수가 있습니다.
시스템 프롬프트(System Prompt)와 사용자 프롬프트(User Prompt)
대부분의 AI 모델 API는 프롬프트를 시스템 프롬프트(System Prompt) 와 사용자 프롬프트(User Prompt) 로 나눌 수 있습니다.
- 시스템 프롬프트: 모델이 수행해야 할 작업을 정의하는 부분
- 사용자 프롬프트: 실제 사용자가 요청하는 질문 또는 작업 내용
Phi4 의 프롬프트 템플릿 예시
<|im_start|>system<|im_sep|>
You are a medieval knight and must provide explanations to modern people.<|im_end|>
<|im_start|>user<|im_sep|>
How should I explain the Internet?<|im_end|>
<|im_start|>assistant<|im_sep|>
여기서 시스템 프롬프트는 "You are a medieval knight and must provide explanations to modern people."이고 사용자 프롬프트는 "How should I explain the Internet?"를 의미합니다.
프롬프트 템플릿 오류 사례
프롬프트 템플릿이 잘못 사용되면 예상치 못한 문제가 발생할 수 있습니다.
다음은 템플릿 오류의 몇 가지 사례 입니다:
- 모델이 템플릿을 사용하는 방식을 문서에서 확인하고, 입력을 이에 맞춰 조정해야 합니다.
- 일부 라이브러리나 API는 템플릿을 다르게 처리할 수도 있습니다.
- 이런 문제는 발견하기 어렵고, 모델이 silent failure 할 수도 있습니다.
- 모델에 프롬프트를 보내기 전에, 템플릿이 올바르게 적용되었는지 검토해야 합니다.
시스템 프롬프트가 성능을 향상시키는 이유
1. 시스템 프롬프트가 먼저 처리되기 때문
- 모델은 먼저 입력된 내용을 더 잘 이해하는 경향이 있습니다.
- 따라서, 시스템 프롬프트가 먼저 주어지면 모델이 이를 우선적으로 학습할 가능성이 높습니다.
2. 모델이 사전 훈련에서 시스템 프롬프트를 더 중시하도록 학습되었기 때문
- 모델은 사전 훈련 중에 시스템 프롬프트를 더 신뢰하도록 학습 될 수 있습니다.
- 이는 시스템 프롬프트가 보안 공격(예: 프롬프트 인젝션) 방지에도 도움이 될 수 있음을 의미합니다.
컨텍스트 길이와 컨텍스트 효율성 (Context Length and Context Efficiency)
GPT-2의 1K 컨텍스트 길이에서 5년 만에 Gemini-1.5 Pro의 2M 컨텍스트 길이까지 2,000배 증가 했습니다.
- 100K 토큰의 컨텍스트 길이: 중간 크기 책 한 권(약 12만 단어)을 처리할 수 있음
- 2M 토큰의 컨텍스트 길이: 약 2,000개의 위키백과 페이지 또는 PyTorch와 같은 복잡한 코드베이스를 처리할 수 있음
추가로 프롬프트의 앞쪽이나 끝부분에 정보가 있을 때 모델이 이를 더 잘 찾습니다.
프롬프트 엔지니어링 팁
초기에는 상금을 걸어두는 방법이나 질문 앞에 Q를 적는 방법이 효과적이지만 최근에는 효과가 미비합니다.
현재 다양한 방법이 존재하고 각 사이트별로 다양한 팁들이 존재하지만 대표적인 방법을 아래에 적어두고 자세한 부분은
[LLM] 프롬프트 엔지니어링 정리(2)에 추가로 정리하겠습니다.
- 명확하고 구체적인 지시 작성하기 (Write Clear and Explicit Instructions)
- 모델에게 특정 인물(Persona)을 설정하도록 요청하기
- 예제 제공하기 (Provide Examples)
- 프롬프트 형식 선택: 입력 길이를 고려하기
- 출력 형식 지정하기 (Specify the Output Format)
- 충분한 컨텍스트 제공하기 (Provide Sufficient Context)
- 모델이 제공된 컨텍스트 내에서만 답변하도록 제한하기
- 복잡한 작업을 더 작은 하위 작업으로 나누기
- 모델이 "생각할 시간"을 가질 수 있도록 하기(CoT)
- 자기 평가(Self-Critique)를 통하여 모델 성능 개선하기
- AI 모델을 사용하여 프롬프트 생성 자동화하기
- 프롬프트 엔지니어링 도구 평가하기
- 프롬프트 관리 및 버전 관리하기
'머신러닝 & 딥러닝 > LLM' 카테고리의 다른 글
[LLM] 프롬프트 엔지니어링 정리(3) (2) | 2025.02.21 |
---|---|
[LLM] 프롬프트 엔지니어링 정리(2) (0) | 2025.02.20 |
SDXL 및 Flux 모델에서 세부적인 요소 퀄리티 올리는 방법 (0) | 2024.11.26 |
챗봇 시각화 솔루션 3종 Gradio, Streamlit, Dash (1) | 2024.11.20 |
[LLM] 챗봇 시각화 솔루션 3종 Gradio, Streamlit, Dash (1) | 2024.04.19 |