딱 한 줄 바꿨을 뿐인데, 답변의 퀄리티가 이렇게 차이난다고? 맞습니다. 똑같은 돈을 내고 AI 모델을 사용하더라도, 어떻게 질문을 하느냐에 따라 얻을 수 있는 결과는 천차만별입니다. 어떻게 하면 AI의 성능을 최대로 끌어내어 정확하고 의미있는 답변을 출력하게 할 수 있을까요? 구글에서 발간한 화제의 백서, “Lee Boonstra의 프롬프트 엔지니어링 백서”를 보면 알 수 있습니다. 원문은 모두 영어로 되어 있는데요. 이번 백서의 내용을 꼼꼼히 공부하고, 직접 실험해보면서 중요한 개념들을 해설하는 시리즈를 기획했습니다. 총 8편에 걸쳐 진행될 예정이며, 구글 백서 원문은 이곳(링크)에서 확인할 수 있습니다.
[구글 프롬프트 엔지니어링 백서 파헤치기 시리즈]
1편 - LLM의 작동 방식과 config 조정하기 (현재글)
2편 - 일반 프롬프트, 제로샷, 원샷, 퓨샷
3편 - 시스템, 컨텍스트, 역할 프롬프트
4편 - 스텝백 프롬프트
5편 - CoT, 자기 일관성(4월 28일 발행 예정)
6편 - ToT, ReAct(4월 30일 발행 예정)
7편 - 자동 프롬프트 엔지니어링, 코드, 멀티모달(5월 2일 발행 예정)
8편(완) - 실제 사례 살펴보기(5월 7일 발행 예정)
반복과 실험의 연속, 프롬프트 엔지니어링
개떡같이 말해도 찰떡같이 알아 듣는 AI가 있으면 얼마나 좋을까요. (물론 AI의 성능이 많이 좋아지기는 했지만) “아니, 근데, 진짜, 있잖아, 대충 그거 뭐지?” 이런 질문에 정확히 제 마음을 읽고 답변할 수 있는 그런 AI는, 아니 그런 능력을 가진 사람은 없을 겁니다.
AI가 내놓는 답변에는 엄청나게 많은 변수들이 작동합니다. 사용된 모델, 모델의 훈련 데이터, 모델 구성, 단어 선택, 스타일, 톤, 구조 및 컨텍스트 등이 모두 중요하게 작용하죠. 즉 의미있는 출력 결과를 얻기 위해서는 이 많은 것들을 고려해서 질문, 정확히는 프롬프트를 작성해야 한다는 뜻입니다.
구글의 프롬프트 엔지니어링 백서를 해설하는 시리즈의 첫 번째 글에서는 프롬프트 엔지니어링을 이해하기 위해 알아야 할 가장 기초사항을 다룹니다. 바로 LLM의 작동 방식과 모델 선택, 그리고 LLM의 다양한 구성 옵션에 대한 내용입니다.
LLM의 원리, next token prediction
LLM은 순차적인 텍스트를 입력으로 받아 훈련 데이터에 기반하여 다음에 올 토큰을 예측하는 ‘예측 엔진’입니다. 토큰은 텍스트를 잘게 쪼갠 조각으로, AI가 텍스트를 소화하기 좋은 크기로 자른 것이라고 생각하면 쉽습니다. (텍스트를 처리하는 기본 단위) AI 모델마다 텍스트를 자르는 방식이 다른데, “나는”이라는 단어를 “나”와 “는”으로 2개의 토큰으로 자를 수도 있고, “나는”이 하나의 토큰으로 처리될 수도 있습니다.
토큰을 예측한다는 것은 간단히 말해 다음 단어를 예측하는 것과 같습니다. LLM은 텍스트를 인풋으로 받으면, 아웃풋으로 다음 단어를 예측하는데 한 번에 하나의 단어를 예측합니다. 하나의 토큰이 예측이 되면, 그 토큰을 기존 텍스트에 추가한 뒤 다음 토큰을 다시 예측합니다. 이 과정을 반복해서 전체 아웃풋을 출력하죠.
예를 들면, LLM이 “오늘 날씨가”라는 텍스트를 받았을 때 다음 토큰으로 ‘맑아요’를 예측했다고 가정해보겠습니다. “맑아요” 토큰을 업데이트 하여 “오늘 날씨가 맑아요”라는 전체 토큰들을 고려하여 다음 단어, “산책하기”를 선택합니다. 이후에 또 “오늘 날씨가 맑아요 산책하기”를 가지고 다음 토큰을 예측하는 과정을 반복하는 것이죠.
이처럼 LLM이 다음 단어를 예측할 때에는 현재까지 생성된 모든 토큰들(문맥)과, 학습 과정에서 접한 패턴과 정보(학습 데이터)를 고려합니다. 이 과정을 반복하며 텍스트가 순차적으로 구성되고, 각 예측은 이전 예측의 결과를 고려해 이루어지죠. 따라서 프롬프트는 LLM이 원하는 방향으로 토큰을 예측할 수 있도록 유도해야 합니다. 즉 모델이 특정한 방식으로 응답하도록 안내하는 역할을 합니다.
LLM의 작동 방식을 고려하여 프롬프트 엔지니어링을 정의한다면, 프롬프트 엔지니어링은 LLM이 사용자가 원하는 출력을 생성할 수 있도록 최적의 프롬프트를 찾기 위한 과정입니다.
그런데 엔지니어링이라는 글자는 왜 붙었을까요? 문제를 분석하고, 해결책을 설계하며 주어진 제약 조건 안에서 최상의 결과를 도출하는 일을 ‘엔지니어링’이라고 하죠. 프롬프트를 다룰 때에도 단순히 질문을 던지는 것이 아닌, 최적의 결과를 얻기 위해 프롬프트를 정교하게 설계하고 최적화하는 과정을 거치기 때문입니다. 그 과정 안에는 수많은 시행착오, 길이 최적화, 특정 작업에 적합한 스타일과 구조를 개발하는 일이 포함됩니다.
그렇다면 지금부터 프롬프트 엔지니어링을 위해 필요한 요소들에 대해 자세히 살펴보겠습니다.
첫 번째 단계, 모델 선택
프롬프트 엔지니어링은 어떤 언어 모델을 사용할 것인지 선택하는 것부터 시작합니다. 최근에는 엄청나게 많은 LLM이 쏟아지며 경쟁하고 있습니다. Vertex AI의 Gemini 언어 모델, GPT, Claude, 또는 Gemma나 LLaMA와 같은 오픈 소스 모델도 있죠. 각 모델들은 서로 다른 특성과 반응 패턴을 가지고 있습니다. 그러므로 어떤 모델을 사용하느냐에 따라 해당 모델의 특성에 맞춰 프롬프트를 조정하고 최적화해야 합니다.
심지어 하나의 모델을 사용한다고 하더라도, 그 모델 안에서도 여러 버전이 존재합니다. 사람들이 가장 많이 사용하는 ChatGPT를 예로 들어보겠습니다. 예를 들어 gpt-4o와 gpt-3.5-turbo 모델을 비교해보면 같은 프롬프트를 사용했을 때에도 답변에 현격한 차이가 있는 것을 볼 수 있습니다.
“한국인만이 가지고 있는 특징적인 말투를 예시 3개를 들어서 알려줘.”
클로드를 비교했을 때에도 마찬가지로 답변에 차이점이 보입니다. (그나저나 챗gpt는 말을 왜 이렇게 길게 하죠?)
두 번째 단계, 구성 옵션(configurations)
모델을 선택했다면 그 뒤에는 모델 구성 옵션을 변경할 수 있습니다. 대부분의 LLM은 출력을 제어하는 다양한 구성 옵션을 제공합니다. 구성 옵션으로는 크게 출력 길이(Output length)와 샘플링 제어(Sampling controls)이 있습니다.
다만 일반적으로 사용하는 웹 챗봇 인터페이스에서는 LLM의 구성 옵션을 제어하기 어렵습니다. 대신 API를 통해 접근하면 많은 구성 매개변수들을 제어할 수 있습니다.
# OpenAI API 예시
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[{"role": "user", "content": "프롬프트 엔지니어링에 대해 설명해주세요"}],
max_tokens=500, # 출력 길이 제한
temperature=0.7, # 창의성 조절 (0=결정적, 1=창의적)
top_p=0.9, # 핵심 샘플링 확률
frequency_penalty=0.5 # 반복 방지
)
API를 사용하지 않고 제어할 수 있는 방법이 하나 더 있는데, Playground라는 웹 인터페이스를 활용하는 방법입니다. OpenAI, Anthropic, Google에서는 Playground라는 웹 인터페이스를 제공하는데, 이는 일반 챗봇과 API 사이의 중간 형태라고 볼 수 있습니다. 이곳에서 상세한 매개변수를 조절하며, 다양한 설정을 실시간으로 테스트하고 비교할 수 있습니다. 때문에 프롬프트 엔지니어링을 연습하거나 API 사용 전에 설정을 테스트하는 용도로 사용하면 좋습니다.
출력의 길이(Output length)
중요한 configurations 설정 중 하나는 출력 길이를 제한하는 것입니다. 출력 길이는 말 그대로 LLM이 내뱉은 답변의 길이라고 이해할 수 있겠지만, 더 엄밀하게는 LLM이 응답에서 생성할 토큰 수로 정의됩니다. 출력 길이를 짧게 만들었다고 해서, LLM이 생성하는 텍스트가 짧고 간결해진다는 것이 아닙니다. 설정된 토큰 제한에 도달하면 토큰 예측을 중단합니다. 그렇다면 왜 출력 길이를 조절해야 할까요?
LLM이 더 많은 토큰을 생성하려면 더 많은 계산이 필요할 것입니다. 자연스럽게 계산 비용이 올라가고, 응답하는 데 걸리는 시간도 길어집니다. 즉 출력 길이를 제한하는 것은 불필요한 컴퓨팅 자원을 사용하지 않도록 하여 비용을 절감할 수 있게 합니다. 비용 효율성을 추구하는 엔지니어링의 측면에서 토큰 길이를 제한하는 것은 당연한 설정입니다.
하지만 꼭 경제적인 이유때문에 출력 길이를 조절하는 것만은 아닙니다. 나중에 소개드릴 ReAct와 같은 프롬프트 기술에서는 원하는 응답 후에 LLM이 불필요한 토큰을 생성하는 것을 막기 위해 출력 길이 제한을 합니다. 또한 출력 길이를 제한함으로써 원하는 정보에 집중된 응답을 얻을 수도 있습니다. 너무 높은 출력 토큰 수를 가지고 생성을 한다면 LLM은 관련성이 적은 텍스트를 생성할 수 있기 때문입니다. 이 외에도 부적절한 토큰 제한 설정은 LLM이 동일한 단어나 구문을 반복해서 생성하는 ‘버그’를 일으킬 수 있습니다.
출력 길이를 직접적으로 조절하는 변수 이름은 Token limit이며, 구성 옵션 내에서 최대 토큰 수 제한(max token limit)을 설정하거나 프롬프트에서 특정 길이 이내로 작성해달라고 명시적으로 요청할 수도 있습니다.
Sampling controls
다음으로 중요한 configurations 설정으로는 샘플링 컨트롤이 있습니다. 샘플링 컨트롤을 직관적으로 이해한다면, 샘플링은 다음 단어를 예측할 때 후보 단어를 뽑고 그중에서 최종적으로 하나의 토큰을 뽑는 과정이라고 생각할 수 있습니다. 샘플링 컨트롤을 정확히 이해하기 위해 LLM의 작동 방식으로 잠시 돌아가보겠습니다.
LLM은 다음 토큰을 어떻게 예측할까요? 바로 ‘확률’을 사용합니다. LLM은 다음 토큰으로 가능한 각 토큰에 대한 확률을 예측합니다.
LLM이 “원숭이 엉덩이는 빨개” 그 다음에 올 말을 예측하고 있다고 가정해보겠습니다. LLM은 자신이 가지고 있는 어휘 목록에 있는 모든 토큰에 대해 확률값을 계산하여 확률 분포를 만듭니다. 어휘 전체는 엄청나게 많은 단어들이 있을텐데, 각 단어가 다음에 올 확률을 계산합니다. 이 확률 분포에서 실제로 하나의 단어를 선택하는 과정이 샘플링입니다.
샘플링은 실제 출력할 토큰에 영향을 미칩니다. 즉 샘플링을 제어하면 어떤 토큰을 예측하게 할지를 바꿔줄 수 있습니다. 샘플링 방식에는 여러 가지가 있는데, 이를 조절하는 파라미터들이 Temperature(온도), Top-K, Top-P입니다. 이 파라미터들이 토큰 확률을 처리해 하나의 출력 토큰을 선택하는 방법을 결정합니다.
온도 샘플링(temperature 조절):
온도 파라미터는 토큰 선택의 무작위성을 조절합니다. 무작위성이 높다는 것은 낮은 확률의 단어도 후보에 들어갈 수 있다는 말과 같습니다.
예를 들어 “원숭이 엉덩이는” 다음 단어를 예측하는데 가장 높은 확률을 가진 단어가 “빨개(80%)”이고, 낮은 확률의 단어로 “동그래(20%)”가 있다고 해보겠습니다. 온도 파라미터는 이 원래 확률분포를 수학적으로 변형시켜 새로운 확률 분포를 만듭니다. 확률 분포를 더 평평하게 만들면 단어들의 확률 분포의 확률 차이가 줄어들게 됩니다. 빨개의 확률이 80%에서 60%로 줄어들고, 동그래의 확률은 20%에서 40%가 되어 확률 분포가 평평해지는 것을 상상하시면 좋습니다. 반대로 확률 분포를 뾰족하게 만들면 높은 확률을 가졌던 단어는 더 높은 확률을 갖고(빨개는 90%가 되고), 낮은 확률을 가졌던 단어는 더 낮은 확률(동그래는 10%가 됩니다)을 가지게 됩니다. 즉 높은 확률을 가졌던 단어가 선택될 확률을 더욱 높이는 셈입니다.
온도 파라미터를 높이면 확률 분포가 평평해지고, 온도를 낮추면 뾰죡해집니다. 다시 말해 온도가 낮을수록 가장 높은 확률의 토큰이 선택될 가능성이 높아지고, 낮을수록 그다지 높지 않은 확률의 토큰도 선택될 가능성이 생깁니다. 온도라고 해서 굉장히 헷갈리는데, 뜨거우면 다양하고 무작위적인 결과가, 차가우면 누구나 예상했던 당연한 결과가 나온다고 생각하시면 좋습니다. 보통 정답이 있는 문제에 대해서는 온도를 낮추고, 창의적인 답변이 필요할 때에는 온도를 높이게 됩니다.
온도를 아예 0으로 설정하는 경우를 그리디 샘플링 또는, greedy decoding이라고 따로 부릅니다. 이 경우에는 항상 가장 높은 확률의 토큰이 선택됩니다. 반대로 만약 온도를 너무 높이게 된다면 모든 토큰이 다음 토큰으로 올 수 있는 후보가 되기 때문에 온도의 영향력은 거의 사라지고, Top-K와 Top-P에 따라 토큰이 무작위로 선택됩니다.
Top-K와 Top-P는 다음 토큰 예측을 상위 확률을 가진 토큰으로 제한하는 샘플링 설정입니다. top-k나 top-p로 후보 토큰들이 선발되면 온도 설정이 적용되어 최종적으로 다음 토큰을 결정합니다.
Top-k 샘플링:
모델이 예측한 확률 분포에서 가장 높은 확률을 가진 상위 k개의 토큰을 선택합니다. 이렇게 후보로 뽑힌 k개 토큰 중에서 다음 토큰이 결정이 되며, 확률이 낮은 토큰들은 후보에서 제외됩니다.
Top-K 값을 높게 설정하면, 모델이 더 많은 후보를 뽑게 되니 출력의 다양성과 창의성이 늘어납니다. 반대로 낮게 설정하면, 선택의 폭이 좁아져 더 제한적이고 사실적인 경향을 보입니다. Top-K를 1로 설정하는 것은 Greedy decoding과 동일하며, 항상 가장 높은 확률의 토큰이 선택됩니다.
Top-P 샘플링:
누적 확률이 특정 임계값(P)를 넘지 않는 가장 확률이 높은 토큰들의 집합을 선택합니다. nucleus sampling 이라고 부르기도 합니다. 누적 임계값을 넘지 않는다는 말이 바로 와닿지 않기 때문에 또 다른 예시를 들어보겠습니다.
“오늘 날씨는” 뒤에 올 토큰에 대한 확률이 다음과 같다고 해보겠습니다.
토큰 | 확률 (%) |
좋다 | 30 |
맑다 | 25 |
흐리다 | 20 |
덥다 | 15 |
춥다 | 5 |
여기서 Top-P 샘플링을 적용하고, 임계값 p를 0.8(80%)로 설정하겠습니다. 이제 토큰을 하나씩 추가하면서 확률을 누적해서 더해보고, 임계값이 넘기지 않는 선까지 토큰을 추가합니다.
가장 확률이 높은 토큰부터 시작해서 확률을 누적해보면,
처음에는 좋다 토큰 하나로 30%입니다.
다음 확률이 높은 토큰인 맑다를 합하면 30+25=55%
그 다음 토큰 흐리다까지 합치면 55+20=75%이죠.
그 다음 토큰입 덥다까지 합치면 90%가 되어 임계값을 넘습니다. 그래서 임계값 80% 안에 해당하는 좋다, 맑다, 흐리다 이 3개의 토큰이 후보로 선택되고 나머지 덥다, 춥다는 버려집니다. 만약 p 값을 더 낮게 설정하면 선택되는 토큰의 수는 줄어들 것입니다. 반대로 p 값을 1로 설정을 한다면 사실상 모든 토큰이 선택 대상이 될 수 있습니다.
Top-P 샘플링은 Top-K 샘플링과 마찬가지로 생성되는 텍스트의 무작위성과 다양성을 조절하는 데 사용됩니다. Top-K가 단순히 확률 순위에서 상위 K개의 토큰을 선택한다면, Top-P는 확률의 누적 분포를 고려하여 다음 토큰을 선택할 후보를 결정한다는 차이점이 있습니다. 따라서 Top-P는 확률이 높은 토큰 몇 개가 전체 확률의 대부분을 차지하는 경우 Top-K보다 더 적은 수의 토큰을 선택할 수 있으며, 반대로 확률 분포가 비교적 완만하다면 더 많은 수의 토큰을 선택할 수도 있습니다. 이와 같이 샘플링을 제어하는 것은 출력할 텍스트의 무작위성과 다양성을 조절합니다.
샘플링 파라미터 3가지 최종 정리
온도가 높을수록, Top-K 또는 Top-P 값이 높을수록 LLM은 더 많은 자유도를 가지게 되며, 이는 덜 관련성이 높은 텍스트를 생성할 가능성을 높입니다.
반대로 부적절한 온도 및 Top-K/Top-P 설정은 "반복 루프 버그"를 유발하여 모델이 동일한 단어나 구문을 반복 생성하는 문제를 일으킬 수 있습니다.
어떤 방법이 더 나은 결과를 가져오는지는 작업의 특성에 따라 다르므로, 직접 실험해 보고 원하는 결과를 얻는 방법을 확인하는 것이 가장 좋습니다.
재밌게 읽으셨나요?
이 글이 흥미로웠다면 제가 직접 쓰고 만드는
AI 안테나 뉴스레터도도 재밌을 거예요!
매주 수요일마다 주요 AI 소식과 인사이트를
메일함에 넣어드립니다.
AI 안테나에서 또 만나요.
https://eddienewsletter.stibee.com/
AI안테나
인공지능과 함께 만드는 AI 뉴스
eddienewsletter.stibee.com
'AI랑 상관 있는 이야기들' 카테고리의 다른 글
GPT-4.1 프롬프트 잘 쓰는 팁 13가지 (0) | 2025.04.22 |
---|---|
프롬프트 엔지니어링 2편 | 일반 프롬프트, 제로샷, 원샷, 퓨샷 (1) | 2025.04.21 |
AI 생성 글 vs 사람이 쓴 글, 정확히 구별할 수 있을까? (1) | 2025.04.17 |
침착맨 인간이 되고 싶은 AI 영상을 보고 든 생각들 끄적끄적 (0) | 2025.04.15 |
대학생들은 클로드 AI를 어떻게 활용하고 있을까? (0) | 2025.04.15 |