[프로그래밍] 프롬프트 엔지니어링

[프롬프트 엔지니어링] 프롬프팅 기법

JHVan 2024. 5. 28. 11:03

문맥 내 학습

언어모델은 주어진 입력에서 패턴을 파악해 알맞은 응답을 만드는 능력이 있음

샷 프롬프트(Shot Prompting)

제로샷 (Zero-Shot)

특정 예시 없이 질문을 바로 제시하는 방식

모델의 일반적인 지식을 기반으로 응답을 생성

Q: 서울의 인구는 몇 명인가요? 
A: 서울의 인구는 약 1000만 명입니다.

 원샷 (One-Shot)

하나의 예시를 제공하여 모델이 응답 패턴을 파악하게함

Q: 서울의 인구는 몇 명인가요?
A: 서울의 인구는 약 1000만 명입니다. 
Q: 부산의 인구는 몇 명인가요? 
A: 부산의 인구는 약 350만 명입니다.

 퓨샷 (Few-Shot)

여러 개의 예시를 제공하여 더 정확한 패턴 파악하게함

Q: 서울의 인구는 몇 명인가요? 
A: 서울의 인구는 약 1000만 명입니다. 
Q: 부산의 인구는 몇 명인가요?
A: 부산의 인구는 약 350만 명입니다. 
Q: 인천의 인구는 몇 명인가요? 
A: 인천의 인구는 약 300만 명입니다.

 

템플릿화 (Templating)

일정한 형식의 프롬프트를 만들어 모델이 그 형식에 맞춰 응답하도록 유도

[도시 인구 조사]
도시 이름: 서울
인구: 약 1000만 명

도시 이름: 부산
인구: 약 350만 명

도시 이름: 인천
인구: 약 300만 명

도시 이름: 대구
인구: 약 100만 명

 

역할 부여 (Role Assignment)

모델에게 특정 역할을 부여해 더 자연스럽고 일관된 응답을 생성

당신은 한국의 인구 통계 전문가입니다. 각 도시의 인구에 대해 답변해주세요.

Q: 서울의 인구는 몇 명인가요?
A: 서울의 인구는 약 1000만 명입니다.

 

제약 조건 설정 (Constraint Setting)

모델이 준수해야 할 규칙이나 제약을 명시

간단하고 정확한 답변을 제공해주세요. 
Q: 서울의 인구는 몇 명인가요?
A: 약 1000만 명

 

few shot 프롬프팅의 구성요소

프롬프트 (지시)

모델에게 특정 작업이나 질문을 명확하게 제시

이는 모델이 어떤 정보를 제공해야 하는지 이해할 수 있도록 도움

Q: 서울의 인구는 몇 명인가요?

예시(Examples)

모델이 작업을 이해하고 패턴을 학습할 수 있도록 여러 개의 예시를 제공

예시는 질문과 그에 대한 답변으로 구성

Q: 서울의 인구는 몇 명인가요?
A: 서울의 인구는 약 1000만 명입니다.

Q: 부산의 인구는 몇 명인가요?
A: 부산의 인구는 약 350만 명입니다.

새로운 질문(New Prompt)

모델이 예시에서 학습한 패턴을 적용해 응답할 새로운 질문을 제시

Q: 인천의 인구는 몇 명인가요?

컨텍스트(Context)

예시와 새로운 질문 사이의 문맥을 제공

이는 모델이 응답을 생성할 때 참고할 수 있는 추가 정보를 포함할 수 있음

다음은 한국 주요 도시의 인구에 대한 정보입니다.

응답 형식(Response Format)

예시에서 일관된 응답 형식을 사용하여 모델이 동일한 형식을 따르도록 유도

이는 일관성을 유지하고 정확한 답변을 얻는 데 중요

Q: 서울의 인구는 몇 명인가요?
A: 서울의 인구는 약 1000만 명입니다.

Q: 부산의 인구는 몇 명인가요?
A: 부산의 인구는 약 350만 명입니다.

예시를 포함한 전체 구성

다음은 한국 주요 도시의 인구에 대한 정보입니다.

Q: 서울의 인구는 몇 명인가요?
A: 서울의 인구는 약 1000만 명입니다.

Q: 부산의 인구는 몇 명인가요?
A: 부산의 인구는 약 350만 명입니다.

Q: 대구의 인구는 몇 명인가요?
A: 대구의 인구는 약 250만 명입니다.

Q: 인천의 인구는 몇 명인가요?
A:

 

 

장점
  • 말로 표현하기 어려운 지시사항을 언어모델이 자동으로 감지하여 따름
  • 예시를 잘 선택하면 성능이 크게 향상
단점
  • 입력의 길이가 크게 증가함
  • 잘못된 패턴을 이용하거나 예시를 과하게 따라하여 성능이 하락할 수 있음
  • 선택된 예시에 매우 민감
 

Few-Shot 프롬프팅을 사용할 때 주의해야 할 점:

  • 다양한 주제의 예시를 포함하여 모델이 다양한 맥락에서 패턴을 학습할 수 있도록 해야함
  • 예시의 응답 형식을 일관되게 유지하여 모델이 동일한 형식을 따르도록 유도해야함
  • 예시의 수를 적절히 조절하여 모델이 과도하게 특정 패턴에 치우치지 않도록 해야함
  • 예시를 통해 모델이 학습할 수 있는 명확하고 구체적인 정보를 제공해야함
  • 목표에서 벗어난 질문, 답변이 난해할 질문, 추가 정보가 필요한 질문 등 엣지 케이스에 대한 대처를 충분히 하여 할루시네이션(비슷한 맥락의 가짜 정)을 방지해야함

예시의 갯수는 많을수록 좋음

하지만 예시가 길어지면 비용 또한 증가하므로, 허용 가능한 비용의 범위에서 최대의/효과적인 예시를 사용해야함

 

언어모델의 약점: 복잡한 추론에 대한 한계

계획이나 다단계 추론을 요하는 복잡한 문제에 대해 낮은 성능을 나타냄

숫자, 심볼에 대한 이해가 부족함

복잡한 추론: 신뢰할 수 잇는 합리적 의사결정에 필수

 

COT(Change Of Thought) 기법

언어 모델이 복잡한 문제를 단계별로 풀어나가는 방식

각 단계를 명시적으로 표현하여 추론 과정을 더 투명하게 만들고, 정답을 도출하는 데 도움을 주는 기법

문제 해결 과정에서 논리적 단계를 따르도록 유도

 

COT 의 개념

Chain of Thought 추론의 기본 아이디어는 모델이 문제를 해결하기 위해 거쳐야 하는 중간 단계를 명확히 제시하는 것

단순히 입력에 대한 출력만을 생성하는 것이 아니라, 문제를 단계별로 분석하고 각 단계에서 논리적 추론을 수행

 

COT 의 장점

  • 추론 과정의 투명성 증가: 각 단계의 논리적 진행을 명시함으로써 모델의 추론 과정을 이해하기 쉬워짐
  • 복잡한 문제 해결 능력 향상: 문제를 작은 단계로 나누어 해결함으로써 더 복잡한 문제도 처리할 수 있음
  • 에러 디버깅 용이: 각 단계별로 진행 상황을 확인할 수 있어, 어디서 오류가 발생했는지 쉽게 파악할 수 있음

예시

COT를 사용하여 철수가 몇 개의 테니스 공을 가지고 있는지 계산하는 예시

Q: 철수가 6개의 테니스공을 가지고 있고, 2개의 테니스 공 세트를 샀고, 
각각의 테니스 공 세트에는 3개의 테니스 공이 있다면,
철수는 지금 몇 개의 테니스 공을 가지고 있는지?

1. 철수가 원래 가지고 있는 테니스 공의 개수를 확인합니다.
   - 철수는 6개의 테니스 공을 가지고 있습니다.
2. 철수가 구매한 테니스 공 세트의 개수를 확인합니다.
   - 철수는 2개의 테니스 공 세트를 샀습니다.
3. 각각의 테니스 공 세트에 포함된 테니스 공의 개수를 확인합니다.
   - 각각의 테니스 공 세트에는 3개의 테니스 공이 있습니다.
4. 구매한 테니스 공 세트에서 추가된 테니스 공의 총 개수를 계산합니다.
   - 2세트 × 3개/세트 = 6개
5. 철수가 원래 가지고 있던 테니스 공의 개수에 추가된 개수를 더합니다.
   - 6개 + 6개 = 12개

A: 철수는 지금 총 12개의 테니스 공을 가지고 있습니다.

 

복잡한 문제에서의 COT

관계에 기반한 추론 문제에서 COT 사용

Q: 철수 +- 영희 이고, 영희 +- 바둑 이면, 철수 +- 바둑?

1. 철수와 영희의 관계를 방정식으로 나타냅니다.
   - 철수 = 영희 ± n
2. 영희와 바둑의 관계를 방정식으로 나타냅니다.
   - 영희 = 바둑 ± m
3. 철수를 바둑의 값과 관계짓기 위해 두 방정식을 조합합니다.
   - 철수 = (바둑 ± m) ± n
4. 두 개의 ±를 결합하여 하나의 ±로 나타냅니다.
   - 철수 = 바둑 ± (m ± n)

A: 철수는 바둑 ± k이고, 여기서 k는 m ± n의 결과입니다.

 

워킹 메모리 :  인간의 인지과정에서 정보를 단기적으로 저장하고 조작하는 능력

 

 

언어 모델과 워킹 메모리

언어 모델, 특히 GPT와 같은 대형 언어 모델은 인간의 워킹 메모리와 비슷한 방식으로 작동하지는 않지만, 비슷한 기능을 수행할 수 있는 구조를 가지고 있음.

  1. 컨텍스트 윈도우(Context Window)
    • 언어 모델은 입력 텍스트의 일정한 길이 내에서만 정보를 처리
    • 이 윈도우는 워킹 메모리의 일시적 저장 기능과 유사합니다.윈도우 크기(컨텍스트 길이)가 제한되어 있어, 긴 문맥을 처리하는 데 한계가 있음
  2. 단계적 처리(Step-by-Step Processing)
    • Chain of Thought 기법을 통해 언어 모델이 단계별로 문제를 해결할 수 있음
    • 이는 워킹 메모리의 중앙 집행기 역할과 유사함
    • 단계별로 정보를 처리하고, 각 단계에서 나온 결과를 다음 단계의 입력으로 사용하는 방식
  3. 추론 및 문제 해결(Reasoning and Problem-Solving)
    • 언어 모델은 입력된 정보를 기반으로 추론하고 문제를 해결할 수 있음
    • 이는 워킹 메모리의 다양한 요소(중앙 집행기, 에피소드 버퍼 등)가 협력하는 방식과 유사합니다.

워킹 메모리와 언어 모델의 한계 및 개선 방안

  1. 맥락 유지의 한계
    • 언어 모델의 컨텍스트 윈도우가 제한되어 있어, 긴 문맥이나 복잡한 정보를 처리하는 데 어려움이 있음
    • 이를 개선하기 위해 모델의 컨텍스트 윈도우 크기를 늘리거나, 외부 메모리 시스템과 결합하는 연구가 진행되고 있음
  2. 장기 기억과의 통합 부족
    • 현재의 언어 모델은 주로 단기적인 정보를 처리하며, 장기적인 기억과의 통합이 부족함
    • 이를 해결하기 위해, 장기 기억 네트워크를 추가하거나, 모델이 학습한 정보를 효율적으로 참조하는 방법을 개발하는 연구가 필요
  3. 연산 자원의 한계
    • 언어 모델이 복잡한 문제를 해결할 때, 필요한 연산 자원이 많아지고 모델의 효율성을 떨어뜨림
    • 모델의 효율성을 높이기 위해, 다양한 최적화 기술과 더 나은 알고리즘이 필요함

트리거 프롬프트("차근차근 생각해봅시다") 로 중간과정을 자세히 서술하도록 유도

 

Input-Output 프롬프팅

특정 입력에 대해 기대하는 출력을 명확히 정의하여 모델이 올바른 응답을 생성하도록 유도하는 방식

모델이 특정 패턴이나 형식을 따르도록 훈련된 경우 유용

예시

**입력:** 서울의 인구는 몇 명인가요?
**출력:** 서울의 인구는 약 1000만 명입니다.

구성 요소

  1. 명확한 입력: 질문이나 명령 등의 형태로, 모델에게 제공되는 정보
  2. 기대 출력: 모델이 생성해야 하는 응답의 형태

Self-Consistency with Chain of Thought (CoT)

모델이 여러 개의 독립적인 Chain of Thought를 생성하여 그 중에서 가장 일관된 답변을 선택하는 방법

복잡한 문제를 해결할 때 다양한 경로를 탐색하고, 가장 신뢰할 수 있는 경로를 선택하게 함

예시

**문제:** 철수가 6개의 테니스 공을 가지고 있고, 2개의 테니스 공 세트를 샀고, 각각의 테니스 공 세트에는 3개의 테니스 공이 있다면, 철수는 지금 몇 개의 테니스 공을 가지고 있는지?

**Chain of Thought 1:**
1. 철수가 원래 가지고 있는 테니스 공의 개수: 6개
2. 철수가 구매한 테니스 공 세트의 개수: 2세트
3. 각 세트에 포함된 테니스 공의 개수: 3개
4. 추가된 테니스 공의 개수: 2세트 × 3개/세트 = 6개
5. 총 테니스 공의 개수: 6개 + 6개 = 12개

**Chain of Thought 2:**
1. 철수가 원래 가지고 있는 테니스 공의 개수: 6개
2. 각 세트에 포함된 테니스 공의 개수: 3개
3. 2개의 세트는 총 6개의 테니스 공을 추가합니다.
4. 총 테니스 공의 개수: 6개 + 6개 = 12개

**결론:** 철수는 지금 총 12개의 테니스 공을 가지고 있습니다.

여러 Chain of Thought를 생성하여 동일한 결론에 도달했음을 확인하는 방식

Tree of Thoughts

Tree of Thoughts는 문제 해결 과정에서 여러 가지 가능한 경로를 탐색하고, 각 경로의 분기점에서 최선의 선택을 찾아가는 방식입니다. 이는 여러 단계의 추론을 필요로 하는 복잡한 문제를 해결하는 데 유용함

예시

**문제:** 철수 +- 영희 이고, 영희 +- 바둑 이면, 철수 +- 바둑?

**Tree of Thoughts:**
1. **첫 번째 분기점:**
   - 철수와 영희의 관계: 철수 = 영희 ± n
2. **두 번째 분기점:**
   - 영희와 바둑의 관계: 영희 = 바둑 ± m
3. **결합:**
   - 철수 = (바둑 ± m) ± n

**결론:** 철수는 바둑 ± k이고, 여기서 k는 m ± n의 결과입니다.

각 분기점에서 가능한 모든 경로를 탐색하고, 최적의 경로를 선택하여 문제를 해결하는 방식

비교 및 결론

  • Input-Output 프롬프팅: 명확하고 일관된 입력과 출력을 제공하여 모델의 응답을 유도
  • Chain of Thought (CoT): 문제를 단계별로 나누어 각 단계에서 논리적인 추론을 수행하는 방식
  • Self-Consistency with CoT: 여러 개의 독립적인 추론 경로를 생성하여 일관된 답을 선택
  • Tree of Thoughts: 복잡한 문제를 해결하기 위해 다양한 경로를 탐색하고, 최적의 경로를 선택
  •