학습자료: 최고의 프롬프트 엔지니어링 강의(김진중)
LLM 구성 요소
토큰
언어 모델에 입력하거나 출력하는 텍스트의 구성 요소
단어 단위가 아니라 텍스트를 구성하는 요소들로 이루어지기 때문에 토큰 개수는 때마다 달라짐
실제로 LLM 모델에 들어갈 때는 각 토큰이 가지고 있는 고유 번호 형태로 들어감
BPE(Byte-Pair Encoding): 토큰을 분리하는 대표적인 방법. 가장 많이 나타나는 문자열 쌍을 합치는 방식으로, 문장 혹은 단어 안에 있는 글자들을 적절한 단위로 나눈 다음 빈도가 높은 글자 조합을 토큰으로 사용
일반적으로 영어 알파벳은 한 글자당 한 바이트를 사용하지만 한글, 중국어, 일본어 등은 한 글자당 여러 바이트를 사용하기 때문에 일반적으로 영어보다 토큰을 더 많이 사용하게 됨
토큰 사용 최적화 전략
1. 입력과 출력 프롬프트를 모두 영어로 작성
- 출력 품질이나 추론 성능이 향상되는 효과도 존재
2. 입출력하기 전 먼저 번역하여 사용
- 번역 품질과 번역 비용 및 속도도 함께 고려해야 함
- 최대한 고유명사가 필요 없는 경우에만 사용하거나 검수 단계를 거쳐야 함
컨텍스트 윈도우(Context Window)
문맥을 판단하거나 다음 단어를 예측하기 위해 참고할 토큰의 범위 또는 언어 모델이 다룰 수 있는 최대 토큰 수
ex. 컨텍스트 윈도우가 5개인 경우 참고하는 범위
The quick brown fox jumps over
The quick brown fox jumps over the
LLM 생성 옵션
Temparature(온도)
출력할 토큰 후보 중 얼마나 높은 확률의 토큰을 사용할지 선택하는 옵션
텍스트 생성 시 모델이 얼마나 창의적인 결과를 생성할지 결정짓는 요소 중 하나
- 0.8과 같이 높은 값은 최종적으로 선택할 단어의 범위를 넓혀 다양한 답변을 생성하게 함(창의적, 환각)
- 0.2와 같이 낮은 값은 다음 단어를 출현 확률이 높은 단어에 집중시키도록 함(일관성)
Top P, Top K
출력할 토큰의 후보를 선택하는 옵션
- Top P는 확률이 상위 P%인 토큰을 출력 후보로 선택(누적 합산)
- Top K는 확률이 상위 K개인 토큰의 결과를 출력 후보로 선택(온도 낮으면 가장 높은 확률, 높으면 K개 중 랜덤으로 하나 출력)
보통 Temparature을 매우 높게 했을 시 환각을 방지하기 위해 추가로 사용
Maximum Length
생성할 최대 토큰 수 설정
입력 가능한 프롬프트 토큰 수 = 모델의 최대 토큰 수 - Maximum Length(출력 가능한 토큰 수)
Frequency Penalty
출력에서 같은 토큰이 반복되면 패널티를 부여하는 파라미터
파라미터의 값이 높을수록 모델은 같은 단어나 표현을 반복해서 사용하는 것을 지양
Presence Penalty
특정 토큰이 이미 한 번 이상 출력된 상황에서 토큰을 다시 사용하려 할 때 부여되는 패널티
Stop Sequence
특정 문구를 설정한 다음 해당 문구가 나오면 답변 생성을 중지하는 옵션
Injection Start
생성을 시작하기 전 특정한 문구를 먼저 삽입하는 것
프롬프트 작성 도움받기
1) 프롬프트 초안 생성
2) 프롬프트 평가 및 개선
3) 프롬프트 다듬기
4) 프롬프트 번역하기
환각 줄이기
- 적합한 컨텍스트를 충분히 잘 넣어주기
- 제공된 정보를 바탕으로 답변하도록 명시적으로 지시
- 주어진 문서에서 질문의 답과 관련된 내용을 인용하도록 지시. 이 때 문서 요약과 함께 제공하면 조금 더 정확한 결과를 얻을 수 있음
- 모른다는 답을 허용하도록 명시
- 프롬프트를 출력할 때 사고와 답변을 분리하여 스스로 생각하게 만듦
- 각각 다른 방법으로 여러 개의 출력을 생성한 후 각각의 답변이 일관성이 있는지 답변하도록 지시(Self-Consistency)
RAG(Retrieval-Augmented Generation, 검색 증강 생성)
정보를 검색한 결과를 기반으로 텍스트를 생성하는 방법
벡터 DB
벡터 서치를 통해 가장 가까운 벡터를 찾은 다음 그것이 어떤 문서의 벡터인지를 알 수 있도록 메타데이터를 함께 반환
- 키워드 필터링 등을 이용한 하이브리드 검색
- 실시간 인덱싱을 통한 대규모 벡터 정보 검색
- 다양한 인덱싱 방법 및 검색 알고리즘 제공
- 높은 확장성 및 개발자 편의 기능 등
리랭크
벡터 서치나 키워드 서치를 통해 가져운 문서를 벡터 서치에 사용한 모델이 아닌 다른 임베딩 모델이나 프롬프트를 사용해 순서를 재정렬하는 방식
청킹
텍스트를 적절한 길이로 자르는 방법
- 오버랩: 각 청크가 일부 공통된 데이터를 포함하도록 하는 기법
- 슬라이딩: 텍스트를 일정한 길이의 작은 단어 조각으로 순차적으로 이동하며 데이터의 청크를 캡처하는 방법
프롬프트 명세
1) Context
2) User Input
3) Output
다양한 샘플 데이터 활용할 것(약 100개 정도)
생성 결과 평가
- 질문한 대로 정확하게 값을 출력하는지 여부
- 예시 데이터와 생성 결과의 임베딩 유사도 평가
- 인간 평가
- 생성 모델로 평가
실제로는 인간 평가와 생성 모델 평가를 함께 사용
평가 자동화
1. 구글 스프레드시트를 사용한 평가 시트 구성
1) 프롬프트 버전(메이저/마이너 버전 구분)
2) 생성 프롬프트
3) 생성 결과
4) 인간 결과
5) 인간 평가
6) LLM 평가 점수
7) 평가 결과(LLM 생성)
2. LLM의 평가와 사람의 평가 점수 차이가 유의미한 수준으로 작아질 때까지 프롬프트 개선
3. LLM의 평가 점수와 사람의 평가 점수가 유사해지면 이때부터는 나머지 데이터에 대한 평가를 자동으로 수행하면서 프롬프트를 개선
4. 생성 결과와 프롬프트를 컨텍스트로 하여 결과가 의도에 맞게 잘 생성되었는지에 대해 평가
생성 결과를 평가하는 프롬프트 예시
— CONTEXT —
PROMPT:
{prompt}
GENERATED SAMPLE:
{generated_result}
— INSTRUCTION —
Evaluate how well the generated sample fulfilled the requirements of the prompt. (1)
Score from 1 to 10, 1 being that the prompt’s requirements were not met at all, and 10 being that the requirements were perfectly met. (2)
First, describe how well the generated sample fulfilled the requirements of the prompt. (3)
And then print the score number in the below format.
— Result format —
Critique: {description of the results in Korean}
Score: {score}
(1) 요구 사항을 잘 충족시켰는지에 대해
(2) 1부터 10까지 점수를 매기라고 지시
(3) 평가 내용을 함께 작성하라고 지시
5. 더 상세한 평가를 원한다면 다음 네 가지 분류로 평가
- Faithfulment(신뢰성)
- Relevance(관련성)
- Correctness(정확성)
- Guideline(지침)
프롬프트 인젝션(Prompt Injection)
정교하게 제작된 프롬프트를 사용해서 필터를 우회하거나 LLM을 조작해 이전 지시 사항을 무시하거나 의도치 않은 행동을 수행하는 것
프롬프트 인젝션 방어 방법
1. 구분자를 사용해 사용자의 입력값 이전과 이후로 나누기
대개 ```(백틱)이나 ''''''(3개의 큰따옴표)를 사용
이렇게 설정한 후 사용자 입력 이전의 프롬프트 내용에 대해서는 답변하지 말라고 지시
```구분자 안의 내용을 번역하세요.
번역할 내용:
```
사용자 입력
```
2. 프롬프트를 실행하기 전 인젝션 프롬프트가 존재하는지를 다른 LLM으로 먼저 확인 후 실행
3. 사용자 입력과 프롬프트를 분석한 다음 각 작업을 민감도에 따라 분기 처리