LLM에게 일 잘 시키는 방법을 LLM이 스스로 찾게 만든다면?
들어가며: 프롬프트의 고민
ChatGPT나 Claude를 써본 분이라면 한 번쯤 이런 경험이 있을 것이다. 똑같은 질문인데 말을 어떻게 하느냐에 따라 답변 품질이 천차만별로 달라진다. "요약해줘"라고 하면 너무 짧고, "자세히 요약해줘"라고 하면 너무 길고, "핵심만 3줄로 요약해줘"라고 하니 그제야 원하는 답이 나온다.
이렇게 AI에게 원하는 결과를 얻기 위해 질문을 다듬는 작업을 "프롬프트 엔지니어링"이라고 부른다. 문제는 이 작업이 상당히 노가다라는 점이다. 이것저것 시도해보고, 결과를 보고, 다시 수정하고... 체계적인 방법론 없이 감에 의존하는 경우가 많다.
그렇다면 이런 생각이 자연스럽게 든다. "AI가 스스로 좋은 프롬프트를 찾게 할 수는 없을까?"
오늘 소개할 DLPO 논문이 바로 이 질문에 답하는 연구다. 그것도 꽤 영리한 방식으로.
1. 프롬프트 자동 최적화, 이미 있는 거 아닌가요?
사실 프롬프트를 자동으로 개선하려는 시도는 이전에도 있었다. 대표적인 것이 TextGrad나 APO 같은 프레임워크다.
기본 아이디어는 이렇다.
먼저 AI에게 어떤 프롬프트로 문제를 풀게 한다. 그 다음 결과가 좋으면 "잘했어, 이 방향 유지해"라고 피드백을 주고, 결과가 나쁘면 "이 부분이 문제야, 이렇게 고쳐봐"라고 피드백을 준다. 이 피드백을 바탕으로 AI가 프롬프트를 수정한다. 이 과정을 반복하면서 프롬프트가 점점 좋아진다.
딥러닝을 아는 분이라면 눈치챘겠지만, 이건 신경망 학습과 비슷한 구조다.
프롬프트가 신경망의 "가중치"에 해당하고, 결과의 좋고 나쁨이 "손실(loss)"에 해당하고, 피드백이 "그래디언트"에 해당한다.
그런데 DLPO 연구팀이 기존 방법들을 실험해보니 세 가지 심각한 문제가 있었다.
첫째, 너무 불안정하다. 같은 설정인데도 실행할 때마다 결과가 들쭉날쭉했다.
어떤 때는 잘 되고 어떤 때는 엉망이 되는 식이다.
마치 요리 레시피를 따라 했는데 어떤 날은 맛있고 어떤 날은 망하는 것과 비슷하다.
둘째, 너무 느리다. 쓸만한 프롬프트를 얻으려면 20번 넘게 반복해야 했다. 매번 AI를 호출해야 하니 시간과 비용이 만만치 않다.
셋째, 배운 데서만 잘한다. 학습에 사용한 문제들은 잘 푸는데, 비슷하지만 조금 다른 문제를 주면 성능이 뚝 떨어졌다.
시험 문제만 달달 외운 학생 같은 상황이다.
2. DLPO의 핵심 아이디어: 프롬프트를 "신경망"처럼 바라보기
DLPO 연구팀의 통찰은 여기서 시작한다. 기존 방법들은 프롬프트를 "하나의 덩어리"로 취급했다.
전체를 한꺼번에 수정하거나, 전체를 한꺼번에 평가하거나.
그런데 생각해보면, 프롬프트는 여러 문장으로 이루어져 있다.
예를 들어 "너는 수학 선생님이야. 문제를 단계별로 풀어줘. 중간 과정을 꼭 보여줘. 최종 답은 박스로 표시해줘."
이런 프롬프트는 네 개의 문장, 네 개의 "지시사항"으로 구성되어 있다.
DLPO는 이 각각의 문장을 신경망의 "뉴런"처럼 취급하자고 제안한다.
신경망에서 각 뉴런이 연결되어 전체 동작을 만들어내듯,
프롬프트의 각 문장이 서로 영향을 주며 전체 성능을 결정한다는 관점이다.
이 관점 전환이 왜 중요할까? 신경망 학습에는 수십 년간 쌓여온 온갖 노하우가 있기 때문이다.
학습을 안정시키는 방법, 빠르게 수렴시키는 방법, 과적합을 막는 방법 등등.
DLPO는 이런 검증된 기법들을 프롬프트 최적화에 가져오자는 것이다.
구체적으로 DLPO는 7가지 기법을 제안한다. 하나씩 살펴보자.
3. 안정성을 높이는 3가지 기법
3.1 Textual Learning Rate: "한 번에 너무 많이 바꾸지 마"
신경망 학습에서 "학습률(learning rate)"은 한 번의 업데이트에서 가중치를 얼마나 바꿀지 조절하는 값이다.
학습률이 너무 크면 최적점을 지나쳐버리고, 너무 작으면 수렴이 느려진다.
DLPO는 이걸 프롬프트에 적용한다. 한 번의 업데이트에서 몇 개의 문장까지 수정할 수 있는지 상한선을 둔다.
예를 들어 "한 번에 최대 3문장만 바꿔"라고 제한하는 식이다.
기존 방법들은 이런 제한 없이 AI에게 "알아서 개선해봐"라고 했더니, 한 번에 프롬프트 전체가 완전히 바뀌어버리는 일이 잦았다.
마치 요리사에게 "맛을 개선해봐"라고 했더니 레시피를 통째로 갈아엎는 것과 비슷하다. 소금을 조금 더 넣으면 될 것을 말이다.
3.2 Textual Dropout: "일부러 몇 개는 그대로 둬"
신경망의 Dropout은 학습 중에 일부 뉴런을 무작위로 "꺼버리는" 기법이다.
이상하게 들리겠지만, 이렇게 하면 모델이 특정 뉴런에 과도하게 의존하지 않아서 더 견고해진다.
DLPO도 비슷한 전략을 쓴다. 매 업데이트마다 프롬프트의 일부 문장은 아예 수정 대상에서 제외한다.
"이번에는 1번, 3번 문장은 건드리지 말고 나머지만 개선해봐" 같은 식이다.
이 방법의 장점은, 혹시 잘 작동하는 문장이 있다면 그게 불필요하게 바뀌는 걸 막아준다는 것이다. 운 좋게 좋은 표현을 찾았는데 다음 업데이트에서 없어져버리면 억울하지 않겠는가.
3.3 Textual Simulated Annealing: "가끔은 나빠져도 받아들여"
"시뮬레이티드 어닐링(담금질 기법)"은 금속을 뜨겁게 달궜다가 천천히 식히면 더 단단해지는 현상에서 따온 최적화 기법이다.
핵심 아이디어는 초반에는 나쁜 결과도 어느 정도 받아들이다가, 점점 까다로워지는 것이다.
왜 나쁜 결과를 받아들일까? 산을 오르다가 작은 언덕에서 멈춰버리는 상황을 피하기 위해서다.
당장은 조금 내려가더라도, 결국 더 높은 봉우리로 갈 수 있다면 그게 낫다.
DLPO에서는 프롬프트를 업데이트했는데 성능이 오히려 떨어졌더라도, 초반에는 일정 확률로 그 변경을 받아들인다.
시간이 지나면서 이 확률이 점점 낮아져서, 후반에는 개선되는 변경만 받아들이게 된다.
4. 속도를 높이는 3가지 기법
4.1 Textual Learning Rate Decay: "처음엔 과감하게, 나중엔 섬세하게"
집을 정리할 때를 생각해보자. 처음에는 큰 가구 배치부터 확 바꾸고, 어느 정도 정리가 되면 소품 위치를 미세 조정한다.
처음부터 소품 배치에 집착하면 큰 그림을 못 보고, 끝까지 가구만 옮기면 완성도가 떨어진다.
DLPO는 이 원리를 적용한다.
초반에는 학습률을 높게 해서 프롬프트를 과감하게 바꾸고, 후반에는 학습률을 낮춰서 미세 조정에 집중한다.
실험 결과, 고정된 학습률보다 이 방식이 더 빨리 좋은 프롬프트에 도달했다.
4.2 Textual Momentum: "이전 피드백도 기억해"
등산할 때 바람 방향을 참고한다고 치자. 지금 이 순간의 바람만 보면 순간적인 돌풍에 속을 수 있다.
지난 몇 분간의 바람 패턴을 함께 고려하면 더 정확한 판단이 가능하다.
기존 방법들은 매번 새로운 샘플로 피드백을 받고, 이전 피드백은 잊어버렸다.
DLPO의 Momentum 기법은 최근 2~3번의 피드백을 함께 참고한다.
"지난번엔 이런 방향으로 개선하라고 했고, 그 전에는 저런 방향이었어.
이 흐름을 고려해서 이번 업데이트 방향을 정해봐"라고 AI에게 알려주는 것이다.
이렇게 하면 한 번의 피드백에서 우연히 발생한 노이즈에 휘둘리지 않고, 더 일관된 방향으로 개선이 진행된다.
4.3 Textual Contrastive Learning: "좋은 예와 나쁜 예를 비교해서 배워"
아이에게 "예쁜 그림 그려봐"라고만 하는 것보다, "이건 잘 그린 그림이고, 이건 덜 잘 그린 그림이야. 차이점을 보고 배워봐"라고 하면 더 빨리 배운다. 대조를 통한 학습이다.
DLPO는 지금까지 시도했던 프롬프트들 중에서 성능이 좋았던 것(좋은 예)과 안 좋았던 것(나쁜 예)을 뽑아서 AI에게 보여준다.
"좋은 프롬프트는 이런 특징이 있고, 나쁜 프롬프트는 이런 특징이 있어. 좋은 특징은 살리고 나쁜 특징은 버려"라고 명시적으로 알려주는 것이다.
이 방법은 AI가 "뭐가 좋은 건지" 스스로 발견하게 두는 것보다 훨씬 효율적이다.
5. 일반화 성능을 높이는 기법
5.1 Textual Regularization: "단순하게 유지해"
공부 잘하는 학생의 노트는 의외로 간결하다. 핵심만 담겨 있다.
반면 내용을 잘 이해하지 못한 학생의 노트는 온갖 것이 빼곡하다. 뭐가 중요한지 모르니 다 적어놓는 것이다.
프롬프트도 마찬가지다. 학습 데이터에 과하게 맞춰진 프롬프트는 온갖 세부사항이 덕지덕지 붙어 있다.
이런 프롬프트는 학습 데이터에서는 잘 작동하지만, 조금이라도 다른 상황에서는 무너진다.
DLPO의 Regularization은 두 가지를 한다.
첫째, 각 문장을 단순하게 다듬는다 (복잡한 표현을 간결하게).
둘째, 불필요한 문장은 아예 제거한다 (핵심만 남기기).
이렇게 하면 특정 데이터에 과적합되는 걸 막고, 새로운 상황에도 적용 가능한 프롬프트가 된다.
5.2 학습 데이터를 늘려라
너무 당연한 이야기지만, 학습에 사용하는 예제가 많을수록 일반화가 잘 된다.
50개의 문제로 학습한 것보다 100개의 문제로 학습한 프롬프트가 새로운 문제도 더 잘 풀었다.
6. 실험 결과: 정말 효과가 있을까?
DLPO 연구팀은 수학 추론 문제 데이터셋들(GSM8K, BigGSM, MATH, BBH, MGSM)에서 실험을 진행했다.
비교 대상은 기존의 대표적인 방법인 TextGrad와 APO, 그리고 사람이 직접 설계한 프롬프트였다.
결과를 보면, DLPO가 기존 방법들을 일관되게 앞섰다.
특히 인상적인 건 사람이 만든 프롬프트보다도 DLPO가 만든 프롬프트 성능이 더 좋았다는 점이다.
BigGSM 데이터셋에서 사람 프롬프트는 54.4% 정확도를 보인 반면, DLPO 프롬프트는 60.2%를 달성했다.
또 다른 흥미로운 실험은 "다른 AI 모델로의 전이"였다.
GPT-4o-mini용으로 최적화한 프롬프트를 GPT-4o나 Gemini에 적용해도 여전히 좋은 성능을 보였다.
특정 모델에만 최적화된 게 아니라는 의미다.
7. 마무리: 우리에게 주는 시사점
DLPO 논문에서 얻을 수 있는 교훈을 정리해보자.
첫째, 관점의 전환이 중요하다.
"프롬프트 = 신경망의 파라미터"라는 비유는 이전에도 있었다.
DLPO는 이 비유를 "프롬프트의 문장 = 뉴런"까지 확장해서, 딥러닝의 다양한 기법들을 가져올 수 있는 길을 열었다.
때로는 문제를 다르게 바라보는 것만으로 해결책이 보인다.
둘째, 검증된 기법은 다른 분야에서도 통한다.
Learning Rate, Dropout, Momentum 같은 개념들은 신경망 학습에서 수십 년간 다듬어진 것들이다.
이런 개념들이 텍스트 최적화라는 전혀 다른 맥락에서도 유효했다. 좋은 아이디어는 분야를 넘어 적용 가능하다.
셋째, 아직 갈 길이 멀다.
DLPO도 한계가 있다. 실험이 주로 수학 문제에 집중되어 있어서, 코드 생성이나 창작 같은 다른 태스크에서 어떨지는 더 검증이 필요하다. 또 7가지 기법 중 어떤 조합이 어떤 상황에서 최적인지에 대한 깊은 분석도 부족하다.
그래도 방향성은 명확해 보인다. 프롬프트 엔지니어링은 점점 더 자동화될 것이고,
그 과정에서 딥러닝의 노하우가 계속 차용될 것이다.
직접 손으로 프롬프트를 다듬던 시대가 끝나가고 있는지도 모른다.
참고 자료
원 논문은 arXiv에서 무료로 읽을 수 있고, 코드도 GitHub에 공개되어 있다. 관심 있는 분들은 직접 실험해볼 수 있다.
'Library' 카테고리의 다른 글
| dataTables - 서버에서 데이터를 만들어서 보내기 (0) | 2024.11.01 |
|---|