김진중(골빈해커)님의 '최고의 프롬프트 엔지니어링 강의'를 읽고 정리한 글입니다.
프롬프트 엔지니어링이란 AI로 원하는 결과를 생성하기 위해 컴퓨터와 대화하는 방법
1. 프롬프트 엔지니어링의 가장 대표적인 다섯 가지 방법
제로샷 프롬프팅
LLM에게 아무런 데이터나 예시를 주지 않고 바로 특정 작업을 수행하도록 지시하는 것
원샷 러닝
LLM에게 명령을 내릴 때 실행 방법에 대한 예시 한 개를 동시에 제공
ex) 영어를 한국어로 번역해줘. This is an apple을 한국어로 번역하면 ‘이것은 사과입니다’야.
퓨샷 러닝
LLM에게 명령을 내릴 때 2~3개부터 수십 개 정도의 예시를 함께 제공하는 것
데이터가 부족하거나 특정 작업에 대한 사례가 많지 않을 때 유용
CoT(Chain of Thought)
LLM에게 문제 해결 과정에서 따라야 할 생각의 단계나 논리적 순서를 제시하면 LLM은 이 사고 과정을 따라 문제를 분석하고 각 단계를 거치면서 최종 단계에 도달
→ AI가 문제 해결 과정에 필요한 논리적 사고를 모방하도록 하는 것
제로샷 CoT
CoT와 비슷하지만 문제 해결 과정에서 따라야 할 생각의 단계나 논리적 순서 등의 가이드를 제공하지 않음
→ 그 대신 해결할 문제를 주고 천천히 생각해보라고 지시
2. 기본적인 프롬프트 구성
시중에 돌아다니는 프롬프트 템플릿을 받아 사용하는 것은 블라인드 프롬프팅 or 프롬프트 라이팅이라고 함
기본적인 프롬프트의 구성은,
- 답변을 위해 필요한 적절한 컨텍스트 제공 -> 컨텍스트는 보통 정제하지 않은 긴 텍스트로 제공
- 원하는 결과 추출을 위한 프롬프트 작성
- 결과물의 형식을 지정
프로그램 = 데이터 + 알고리즘
프롬프트 = 컨텍스트 + 인스트럭션
→ 프롬프트 = 프로그램(앱)
프롬프트 엔지니어링 과정에서 생성한 정보는 다시 새로운 컨텍스트가 되기 때문에 사용자가 원하는 결과를 더 정교하게 생성 가능 → 인컨텍스트 러닝
3. 임베딩과 벡터 서치
사전적 의미: 무언가를 다른 공간이나 형태에 집어 넣는 것
LLM에서 임베딩이란 단어나 문장 같은 언어의 조각들을 숫자로 바꾸는 과정
임베딩 모델: 텍스트를 숫자로 바꾸는 머신 러닝 모델
벡터화: 각 단어들을 숫자의 집합(실수 형태의 집합)으로 바꾸는 과정
임베딩 벡터: 벡터화를 통해 변환된 숫자의 집합
우리가 LLM을 사용할 때는 일반 텍스트로 프롬프트를 입력하지만 실제로 LLM 모델이 받아들이는 것은 벡터화된 데이터
각 단어의 벡터 숫자들을 2차원 공간에 표현한다면?
- Apple과 Banana는 둘 다 과일이라는 공통점이 있기에 가까운 곳에 위치
- House와 Car는 먼 곳에 위치(의식주와 관련이 있기 때문)
임베딩 공간: 단어를 n차원에 배치한 것
벡터 서치: 임베딩 공간에서 기준이 되는 단어와 가까운 단어를 찾는 것
Apple과 Banana 간 위치를 거리 또는 유사도라고 함
→ 이 값이 가까운 것을 찾는 방법이 바로 벡터 서치
→ 의미 기반으로 검색하므로 ‘시멘틱 서치’라고 함
4. 벡터 서치의 명암
벡터 서치는 전통적인 검색 엔진처럼 복잡한 시스템을 필요로 하지 않음
→ 누구나 쉽고 빠르게 고성능의 검색 엔진 구축 가능
문제1. 속도 문제
모든 분야에 벡터 서치를 적용하기는 어려움
문제2. 성능 문제
ANN(Approximate Nearest Neighbor) 알고리즘은 정도는 약간 떨어지는 대신 빠르게 유사한 벡터를 찾을 수 있는 기술
ANN은 고차원 데이터 공간을 더 작은 공간으로 ‘근사화’
‘차원 축소’ 기법은, 데이터의 차원을 줄여 계산 복잡도를 낮추는 동싱 원본 데이터의 중요한 특성을 유지하려고 시도 → 정확도가 떨어짐
이를 보완하기 위해 ‘하이브리드 서치’라는 방식을 사용하기도
- 키워드 검색을 통해 DB에서 후보 데이터를 일부 검색
- 사용자가 요청한 내용과 유사한 데이터를 벡터 서치로 다시 필터링하는 방식
최근에는 벡터 서치를 위한 벡터 DB를 만드는 회사들이 관심을 받고 있음
5. 프롬프트 엔지니어링 과정의 세분화(5단계)
1. 프롬프트 결과 설정
최종적으로 얻고자 하는 정보의 종류와 형태를 결정
2. 프롬프트 결과 설계
설정한 목표를 달성하고자 할 때 프롬프트의 효과를 어떻게 평가할지에 대한 기준 마련 (가장 중요한 단계)
3. 그라운딩 설계 및 평가
그라운딩은 AI가 답변을 생성할 때 신뢰할 수 있는 정보나 데이터에 기반하여 정확성과 연관성을 확보하는 과정
4. 프롬프트 디자인
앞서 정의한 목표와 평가 기준에 따라 실제 프롬프트를 설계
5. 모니터링 및 개선
프롬프트가 실제 환경에서 사용되는 동안에는 지속적으로 성능을 모니터링하고 개선하는 것이 중요
6. 프롬프트 디자인 프레임 워크
역할 정의
AI의 페르소나 또는 역할을 정의
ex) 당신은 법률 전문가입니다. 법률 관련 질문에 답하세요
대상 명시
AI가 누구에게 정보를 제공하고 있는지, 즉 응답의 대상이 되는 사용자나 그룹을 명시
ex) 초등학생에게 태양계의 행성에 대해 설명해주세요
지식과 정보 제공
질문과 관련해서 참고할만한 지식과 정보를 DB나 검색 엔진 등에서 가져와 삽입
ex) 위키피디아의 내용에 따라 나폴레옹에 대해 설명해주세요
수행해야 할 작업 및 목표 명시
수행해야 하는 특정 작업이나 목표를 설정
ex) 500단어로 자기 소개서를 작성해주세요.
자기 소개서를 작성해주세요.
서론, 본론, 결론으로 나누어 작성해주세요.
경험, 성과, 개인적 성장 등 구체적 사례를 들어 설명력을 높여주세요.
정책 및 규칙, 스타일 가이드, 제약 사항 설정
응답을 만들 때 따라야 하는 특정 정책이나 규칙, 스타일 가이드, 제약 사항을 설정
ex) 성격의 긍정적인 측면만을 강조하며 자기 소개서를 작성해주세요.
140자 이내로 트윗을 작성해주세요.
형식 및 구조 설정
응답이 따라야 하는 특정 형식이나 구조를 설정
ex) JSON 형식으로 결과를 출력해주세요
구체적인 예시 제공
원하는 응답 형식이나 내용을 구체적으로 보여 주는 예시를 제공합니다.
ex) 다음의 예시를 참고하여 응답하세요.
User: I love you.
Assistant: 나는 당신을 사랑합니다.
프롬프트를 구성할 때는 최대한 명확하고 구체적으로 요구 사항을 기술하는 것이 중요.
참고) STICC
- 상황(Situation)
- 과제/작업(Task)
- 의도(Intent)
- 우려/고려사항(Concerns)
- 조정(Calibrate)
7. 프롬프트 테크닉 TOP8
원하는 결과를 더 정확하게 잘 이끌어내는 것을 목표로 프롬프트를 디자인하는 것을 프롬프팅이라고 부름
예시 제공
제로샷: 예제를 제공하지 않음
원샷: 한 개의 예제를 제공
퓨샷: 두 개 이상의 예제를 제공
퓨샷 예시
고양이: 동물
오렌지: 과일
토마토: 식물
비둘기:
퓨샷은 파라미터(모델의 크기) 크기가 큰 LLM에서 훨씬 성능이 좋게 나옴
정확한 답을 말해야하는 산술 추론 문제에는 적합하지 않지만, 랜덤하게 분포되어 있는 레이블에서 가장 확률이 높은 답변을 골라내는 일에 적합함
생각 사슬(Chain of Thought, CoT)
LLM이 문제의 이유 혹은 추론 과정에 대해 직접 설명하도록 만들어 답변을 더 정확하게 생성하는 기술
CoT 방식의 핵심: 생각의 과정을 먼저 제시
제로샷 CoT는
Let’s think step by step.
단계별로 생각해 봅시다.
차근차근 생각해 봅시다.
같은 문구를 마지막에 추가함으로써 마치 CoT 예제를 제공하는 것과 같은 효과를 내어 성능을 향상시키는 방법
자기 일관성
CoT를 한 단계 더 발전시켜 동일한 문제에 대해 여러 가지 다른 추론 경로를 고려한 후 가장 일관되게 나온 답을 선택
ex) 다양한 계산 방식의 예제를 먼저 주고나서 질문을 하면 LLM이 그 중 하나의 방식을 선택해서 답변 → 그리고 그 답변을 여러번 반복하게 함
자기 일관성 기법에서 중요한 것은 다양성
→ 즉, 하나의 문제에 대해 여러 가지 방식으로 접근하고 해결해 보는 것
→ AI가 복잡한 문제를 보다 신뢰할 수 있는 방법으로 해결하도록 돕는다.
자기 일관성은 추론 경로를 최대한 다양하게 제공해야 하므로 토큰 수(프롬프트 길이)를 굉장히 많이 사용하는 편
여러 번 실행한 결과를 취합하기 위한 후처리 작업도 필요
→ 아주 정확한 결과가 필요한 경우에만 사용하는 것을 권장
샘플링 투표(Sampling-and-Voting)
- 복잡한 CoT 프롬프팅 대신 기본적인 지시를 사용하고 출력을 가공 없이 활용
- 단순히 출력 간 유사도를 계산하여 다수결로 답안을 선정
- 추론 작업뿐만 아니라 코드 생성 등 다양한 작업에 대해 일반화된 접근법
- 자기 일관성과 결합하여 상호 보완적으로 활용 가능
핵심 아이디어: 여러 개의 LLM 에이전트를 활용하는 것
동일한 입력으로 LLM을 반복적으로 실행하여 여러 개의 출력 샘플을 생성
그 다음 다수결 투표를 통해 이 샘플들 중 가장 일관성 있는 출력을 최종 답변으로 선택
샘플링 단계에서는 작업에 대한 질의 혹은 지시를 LLM에게 N번 반복하여 출력 샘플을 다양하게 생성
이 때 다양한 출력을 얻기 위해 별도의 페르소나를 설정하거나 서로 다른 LLM 모델을 사용 or 서로 다른 LLM 모델 사용
→ 그냥 같은 LLM 여러번 실행해도 됨
투표 단게에서는 각각의 샘플에 대한 다른 모든 샘플과의 유사도를 계산하여 누적된 유사도 점수를 구함
→ 유사도는 임베딩 벡터로 계산하거나 BLEU 점수(기계 번역 성능을 평가하기 위해 사용되는 지표) 등을 사용
샘플링 투표 방식의 가장 큰 장점: 기존의 복잡한 프롬프트 설계나 에이전트 협업 체계 없이도 그에 비견될만한 성능을 낼 수 있다는 점
앙상블 규모(샘플 개수)를 충분히 늘리면 작은 LLM이 더 큰 모델의 단일 출력 성능을 능가 가능
→ 비용적인 측면에서 큰 이득은 없음
선택 추론(Selection-Inference)
복잡한 문제를 해결하기 위해 여러 추론 단계를 연결하는 기술
선택과 추론 사이를 번갈아가면서 해석 가능한 원인-결과의 추론 단계를 생성하여 최종 답변을 이끌어냄
→ 컨텍스트에서 답할 수 있는 정보를 먼저 선택한 다음 그 정보를 기반으로 답변
ex) 질문의 답에 필요한 내용을 Context에서 추출해서 나열하세요
선택 추론은 오류 원인을 분석해야하는 디버깅에 유용
→ 실제 케이스에 구현하려면 추론 단계를 생성하고 종료하는 프레임워크를 세심하게 구성해야
최소에서 최대로(Least-to-Most)
하나의 문제를 더 작은 여러 개의 하위 작업으로 분할하는 기법
이 방법의 핵심은 각 하위 문제의 해결을 통해 얻은 정보를 바탕으로 복잡한 문제를 점진적으로 해결해 나간다는 것
- 여기에 추가로 ‘단계적으로 생각해 보세요’라는 제로샷 CoT를 넣으면 좋음
연구 결과에 따르면 최소에서 최대로 기법은 다른 기법들에 비해 굉장히 높은 성능을 보임
최소에서 최대로 기법은 CoT와 선택 추론을 결합한 방법
리액트(ReAct)
실행 계획을 유도하고 추적하여 작업별로 실행할 액션을 선택하는 방법
ex) Search, Lookup, Finish 유형을 LLM에 알려주고, 실행시킴
리액트는 정보를 반복적으로 생성하거나 수집하여 프롬프트에 추가하는 방법이기 때문에, 프롬프트가 길어질 수 있어 토큰 제어에 유의해야
자기 평가(Self Evaluation)
LLM이 생성한 결과를 LLM 스스로 평가하게 하여 오류를 잡거나 결과를 향상시키는 기법
ex) 답변을 맞게 했는지 단계적으로 생각해보세요. 당신의 답변이 틀렸다면 틀린 이유를 설명하세요. 설명만 작성하세요. 그 외의 부가적인 말은 하지마세요.
자동 프롬프트 엔지니어나 자율 실행 에이전트와 같이 AI가 스스로를 평가하고 향상시키는 기술에 많이 사용
8. 예시를 제공하고 생각하게 만들기
전문가 역할극 프롬프팅(Expert Prompting)
LLM에게 전문가로서 응답하도록 요청하는 방법
위키피디아에 따르면(According to Wikipedia)
단순히 ‘위키피디아를 참조해서 답하세요’라고 하는 것만으로도 높은 성능을 얻을 수 있는 기법
위키피디아나 구글 스칼라같은 신뢰할만한 소스를 참고하라고 지시
지식 생성 프롬프팅(Generated Knowledge Prompting)
주어진 질문에 대한 관련 지식을 먼저 생성하라고 한 다음, 생성한 지식을 바탕으로 답변을 생성하는 기법
정확한 지식을 생성한다는 보장이 없으므로 유의
검색 증강 생성(Retrieval Augmented Generation, RAG)
답변을 생성하기 전에 사용자의 요청과 관련된 지식을 외부 검색 컴포넌트에서 검색한 후 해당 내용을 프롬프트에 컨텍스트로 제공하여 결과를 생성하는 기법
프롬프트 엔지니어링의 필수적인 구성 요소, 벡터 서치가 매우 중요한 구성 요소로 자리 잡음
복잡한 수식을 계산하는 수학 묹 풀이 엔진을 통해 결과를 계산해서 가져오는 것도 RAG
9. 전략을 짜고 스스로 평가하기
생각 트리(Tree-of-Thought)
트리 구조로 답변을 생성해 내면서 중간 단계에서 진행 상황을 스스로 평가하여 생각 트리를 확장하고 선택하는 방법
다른 프롬프팅 기법과의 비교
입출력 프롬프팅: 질문에 대한 답변을 직접적으로 생성
생각 사슬 프롬프팅: 질문에 답하기 위해 중간 단계의 추론을 먼저 생성
자기 일관성 프롬프팅: 여러 추론 경로를 고려하여 가장 일관된 답변을 선택
생각 트리 프롬프팅: 여러 단계의 추론 경로를 다양하게 탐색하며 최적의 추론 경로를 찾아나감. 각 노드(상자)는 하나의 추론 단계를 대표
생각 트리는 매우 많은 생성 단계를 거치기에 일반적으로 사용하기는 어렵지만, 다른 기법과 혼합해 사용하면 극도로 높은 성능을 기대 가능
계획-풀이 프롬프팅(Plan-and-Solve Prompting)
전체 작업을 더 작은 하위 작업으로 계획을 세우고 그 계획에 따라 하위 작업을 수행하거나 평가하면서 전체 문제를 해결
→ 미리 풀어야 할 하위 문제를 모두 생성해두고 문제를 품
자동 프롬프트 엔지니어(Automatic Prompt Engineer)
LLM이 프롬프트를 자동으로 생성하는 기법
프롬프트를 다양하게 생성하고 이를 채점하여 가장 높은 점수를 받은 프롬프트를 사용하는 방식
지금까지 배운 프롬프트 기법의 핵심
- 예시를 제공
- 생각을 많이 하게 함
- 문제 풀이 전략을 세우게 함
- 스스로 평가
10. 포맷팅
출력하는 포맷을 지정하는 것
ex) 9 + 10 x 3을 계산하세요. 다음 포맷으로 답변하세요. Answer: {number}
리스트
특별한 순서 없이 앞에 대시나 점 등으로 표현하는 방법, 순서(1,2,3)로 표현하는 방법
Key-Value Pair
앞에는 Key 값, 뒤에는 Value 값
테이블
표 형식으로 출력
마크다운
구조화된 문서를 작성할 때 HTML 태그 대신 간단한 텍스트 형식으로 구성해 이를 쉽게 HTML로 변환할 수 있도록 정한 규칙
YAML
사람이 쉽게 읽을 수 있는 데이터 직렬화 언어
JSON
구조화된 데이터를 표현하는데 가장 많이 사용되는 데이터 포맷
11. 프롬프트 체이닝
일련의 프롬프트와 그에 따른 응답을 순서대로 연결하여 하나의 지속적인 대화나 여러 하위 태스크로 이루어진 복잡한 태스크로 수행하는 기법
단순 프롬프트 연결하기
답변과 질문을 순차적으로 진행하면서 프롬프트를 연결
이전 결과에 따른 분기 처리하기
사용자의 입력 유형이나 출력 결과의 유형에 따라 다른 방식으로 결과를 도출하도록 유도
결과 내 유사 체이닝 효과 주기
12. 좋은 프롬프트 만들기
- 지시문을 명확하게 만들기
- 적절한 예시를 제공하기
- 모델에게 생각할 시간을 줌
- 작업을 하위 작업으로 분해
- 적절한 컨텍스트를 제공
- 프롬프트 엔지니어링 기법이 작동하지 않는 상황도 고려
- 프롬프트를 구조화하여 작성
전체적인 프롬프트를 다음과 같이 구성하자
- 작업의 목적 및 배경 설명
- 컨텍스트
- 구체적인 질문이나 지시 및 출력 형식이나 가이드
원하는 결과가 잘 나오지 않는다면?
- 지시문을 반복해서 사용
- 지시문이나 컨텍스트의 위치를 바꿈
- 지시문의 단어를 다른 단어로 바꿈
가장 중요한 것은 반복해서 개선하는 것
'AI' 카테고리의 다른 글
[프롬프트 엔지니어링] 함수 호출, 프롬프트 평가, LLM 보안, Autonomous Agent에 대하여 (1) | 2024.12.29 |
---|---|
[프롬프트 엔지니어링] 프롬프트 작성 도움, 환각 줄이기, 외부 지식 주입에 대하여 (1) | 2024.12.29 |
[프롬프트 엔지니어링] AI와 LLM에 대하여 (2) | 2024.11.24 |