- Turing Post Korea
- Posts
- Topic #25: '프롬프트 최적화'의 핵심
Topic #25: '프롬프트 최적화'의 핵심
거대 언어모델을 다룰 때 기억해야 할 원칙, 그리고 실용적인 인사이트

글을 시작하며
오픈AI의 챗GPT, 앤쓰로픽의 끌로드 등 LLM이나 생성형 도구를 쓰시는 분들 많으실 텐데요. 그 외에도 기업 환경에서 생성형 AI 기술을 사용하시는 분들도 계실 테구요. 이렇게 거대 언어모델 (LLM)을 사용하는 환경에서, LLM이 높은 성능을 발휘하도록 하는데 ‘프롬프트 최적화’는 필수적이라고 할 수 있을 겁니다.
질문을 더 명확하게 하거나, 복잡한 질문을 나눠서 - 분해해서 - 하거나, 검색한 정보의 관련성 (Relevance)을 더 높이려고 할 때 생각해 볼 만한 이런 프롬프팅 전략을 잘 알고 있다면, LLM을 사용하실 때의 효율성을 더 높일 수 있을 거라고 생각합니다.
이 글에서는, NTT Data의 AI 엔지니어인 Isabel Gonzalez가 최근의 연구, 그리고 실용적인 기법을 정리해서 ‘프롬프트 최적화’의 핵심 요소들을 살펴봅니다. Isabel은 혁신적인 기술 연구 및 개발에 열정을 가진 AI 엔지니어입니다. 머신러닝, 자연어 처리, 컴퓨터 비전 영역에서 탄탄한 배경과 경험을 가지고 있고, 다른 사람들과 지식, 경험을 열심히 나누는 분입니다.
오늘 에피소드에서는 아래와 같은 내용을 다룹니다:
질의 최적화 (Query Optimization)를 하는 네 가지 전략
질의 최적화, 즉 질문을 최적화한다는 각기 상황에 따라서 4가지의 중요한 전략으로 나눌 수 있습니다: 확장 (Expansino), 분해 (Decomposition), 모호성 제거 (Disambiguation), 추상화 (Abstractino), 이렇게 네 가진데요. 이 각각을 예시와 함께 한 번 살펴보려고 합니다.
확장 (Expansion)
‘프롬프트 최적화’의 가장 기본적인 기법이라고 할 수 있죠? ‘확장’입니다. 말은 어렵지만, 그냥 원래의 질문이나 질의에 추가적인 관련 정보를 보완하는 겁니다. 특히 맥락 상의 공백을 채우거나, 숨겨진 연관성을 발견하거나, 초기 프롬프트가 지나치게 모호할 경우에 유용하죠.
‘질의 확장’의 구체적인 적용 사례를 바로 ‘RAG’ 시스템에서 찾아볼 수 있죠. RAG에서는 거대 언어모델이 텍스트를 생성하는데 사용되지만, 정확하고 포괄적인 응답을 제공하려고 외부의 지식 소스 - 문서나 데이터베이스 등 - 에 접근해야 하는 경우가 많죠. 이런 경우 ‘질의 확장’을 한다면 관련 문서를 더 효과적으로 검색한다거나 할 수 있는 거고, 자연스럽게 LLM의 응답이 더 나아지겠죠.
조금 더 나간다면, ‘확장 (Expansion)’을 ‘내부 확장 (Internal Expansion), ‘외부 확장 (External Expansion)’ 이 두 가지 유형으로 분류할 수도 있습니다.
내부 확장
‘내부 확장’은 사전 학습 과정에서 LLM에 이미 내장된 지식을 활용합니다. 원래의 쿼리를 분석하고 맥락적인 단서, 동의어, 또는 연관된 아이디어를 추가해서, 모델이 질의를 더 나은, ‘탄탄한’ 버전으로 재구성할 수 있게 하는 겁니다.
예를 들어서, "기후 변화의 영향은 무엇인가?"라는 프롬프트가 주어졌을 때, ‘내부 확장’은 "생태계에 대한 영향, 지구의 온도 상승, 경제적인 영향" 같은 구문을 포함해서 ‘모델이 더 포괄적인 응답을 하도록 유도’할 수 있다는 겁니다 - 이미 이런 식으로 하는 분들 많으시죠? ‘내부 확장’은, 특히 필요한 정보가 이미 모델의 지식 기반에 포함되어 있는, 시간이 지나도 변화가 별로 없는 답을 필요로 하는 그런 질문의 경우에 특히 효과적이겠죠.
외부 확장
반면에, ‘외부 확장’은 웹이나 구조화된 지식 베이스 등, ‘모델 외부의 출처’에서 보충할 데이터를 합치겠다는 겁니다. 이 방법은 특히 시간이 변하면 정보가 업데이트되거나 바뀌는 성격의 질의, 최신 정보가 필요한 주제의 경우에 유용합니다.
예를 들어서, "2024년 올림픽은 어디에서 개최될까요?" 같은 프롬프트는 정확한 답변을 보장하기 위해서 관련된 업데이트나 공식적인 발표를 검색하는 방식으로 ‘확장’할 수 있습니다. 외부 확장은 정적인 사전 학습 지식과 역동적으로 변화하는 실세계 정보 사이의 갭을 메워 줍니다.
분해 (Decomposition)
‘분해’는, 질의 구조를 단순하게 만들어서 모델이 질의를 가지고 인식해야 하는 내용의 부하 (Load)를 줄이고, 정확한 응답을 만들어 낼 가능성을 높여주는 접근 방법입니다. 질의의 각 구성 요소를 독립적으로 처리해서, 최종적인 출력값이 일관성이 있으면서도 포괄적인 답변이 될 수 있도록 합니다.
질의가 여러 단계의 추론을 포함하거나 다양한 정보들을 통합해야 할 때, 이걸 하나의 프롬프트로 처리하려고 하면 모델에 과부하를 줄 수 있고, 결국 모호하든 아니면 불완전한 답변으로 이어질 수가 있으니까요. ‘분해’ 전략이 가져다 줄 수 있는 장점으로는, 명확성이 높아지고, 이해해야 하는 맥락의 범위가 좁아서 집중할 수 있고, 그리고 확장성도 높여줍니다.
‘분해’의 하위 기법과 몇 가지 예시를 본다면:
순차적 분해 (Sequential Decomposition)
논리적인 진행을 따르면 되는 질의의 경우에는, 작업을 단계별로 나누는 게 필수적이겠죠.
원래의 질의: "2024 올림픽에서 중국은 탁구와 배드민턴 중 어느 종목에서 더 많은 메달을 획득했나요?"
질의를 분해한 결과:
Q1: "2024 올림픽에서 중국은 탁구에서 몇 개의 메달을 획득했나요?"
Q2: "2024 올림픽에서 중국은 배드민턴에서 몇 개의 메달을 획득했나요?"
이렇게, 분해된 하위 질의들에 대한 답변을 종합해서, 더 많은 메달을 획득한 종목을 파악할 수 있습니다.
병렬적 분해 (Parallel Decomposition)
여러 가지의 독립적인 사실이 필요한 질의의 경우에는, 이 구성 요소들을 동시에 다루는게 좋은 경우가 있습니다.
원래의 질의: "삼림 벌채가 환경과 경제에 미치는 영향은 무엇인가요?"
질의를 분해한 결과:
Q1: "삼림 벌채가 환경에 미치는 영향은 무엇인가요?"
Q2: "삼림 벌채가 경제에 미치는 영향은 무엇인가요?"
분해된 각각의 하위 질의는, 문제의 ‘서로 다른 측면’을 탐구해서 중요한 세부사항이 간과되지 않도록 합니다.
모호성 제거 (Disambiguation)
언어란 건 본질적으로 미묘한 뉘앙스의 차이가 있기 마련이죠. 그래서 비슷하게 들리는 질의라고 하더라도 아주 다르게 해석될 수가 있습니다. 예를 들자면, "2024 올림픽 탁구 챔피언은 누구예요?"라는 질의에서도, 남자부인지 여자부인지 맥락에 따라서 다르다고 할지 확실하지 않다고 해야 할지 그런 요소가 있습니다. 그래서 이런 ‘모호함’을 없애기 위해서 질의를 구체화하는게 좋은 경우가 많습니다 - 질의를 분석하거나 다시 표현하는 거죠.
모호성을 제거하는 실제 예시를 좀 보자면:
모호한 부분을 명확하게 표현하기 (Clarifying Ambiguities)
원래의 질의: "2024 올림픽 탁구 챔피언은 누구인가요?"
명확하게 표현된 질의:
Q1: "2024 올림픽 남자 단식 탁구 챔피언은 누구인가요?"
Q2: "2024 올림픽 여자 단식 탁구 챔피언은 누구인가요?"
위와 같이 물어보면 두 가지 카테고리에 대해서 정확한 답변이 나오겠죠?
멀티 턴 대화 (Multi-Turn Dialogue)
대화를 하는 상황에서는, 이전에 있었던 대화의 맥락을 반영해 가면서 질의를 다시 구성하는 방식으로 명확하게 할 수 있습니다.
대화의 맥락:
사용자: "금메달은 누가 땄나요?"
모델: "어떤 종목에서요?"
사용자: "탁구요."
멀티 턴을 통해서 명확하게 구성된 질의: "2024 올림픽 탁구 종목에서 누가 금메달을 획득했나요?"
질의의 범위가 넓을 때 구체화해서 재구성하기
원래의 질의: "기후 변화의 영향이 무엇인가요?"
구체화된 질의들:
Q1: "기후 변화가 환경에 미치는 영향은 무엇인가요?"
Q2: "기후 변화가 경제에 미치는 영향은 무엇인가요?"
이 방법 역시, 모델이 넓은 범위의 문제에 대해서 다양한 측면을 포괄적으로 탐구할 수 있게 해 줍니다.
추상화 (Abstraction)
개인적으로 ‘추상화’가 흥미로운 프롬프팅 전략이라고 생각하는데요. ‘추상화’는, 오히려 ‘세부적인 내용’에서 ‘전반적인 목표’로 초점을 이동해서, 모델이 더 포괄적인 정보를 종합해서, 추론을 더 유의미한 수준에서 할 수 있게 해 줍니다. 이 방법은 특히 - 분해 (Decomposition) 같은 상세한 단계적 분석이 오히려 과정을 더 복잡하게 만들거나 의미를 희석시킬 수도 있는 상황에서 유용합니다.
몇 가지 실제적인 예시들을 보면:
범위 (Scope)를 확장하기
원래의 질의: "중국은 올림픽을 몇 번 개최했나요?"
추상화된 질의: "중국의 올림픽 개최 역사는 어떠한가요?"
이 예시는, 질의를 추상화해서 재구성함으로써, 모델이 아주 지엽적인 단순한 질문이 아니라 더 넓은 관점에서 맥락과 추가적인 통찰력을 제공할 수 있도록 유도하게 됩니다.
핵심 개념의 식별
원래의 질의: "지난 10년간 브라질의 산림 벌채가 경제에 미친 주요 영향은 무엇인가요?"
추상화된 질의: "산림 벌채가 경제에 미치는 영향은 무엇인가요?"
시간적인 그리고 지리적인 제약을 ‘제거’해서, 모델이 맥락의 세부적인 사항을 추가하기 전에 기초적인 지식을 먼저 탐구할 수 있게 해서, 포괄적인 응답이 될 수 있도록 합니다.
프롬프팅 전략을 결합하기
특히 ‘추상화’의 경우 다른 프롬프팅 전략과 결합하기 좋습니다. 핵심적인 개념을 먼저 파악하기 위해서 추상적인 질의로 시작하고, 이후에 더 작은 하위의 질의로 나누기 위해서 ‘분해 (Decomposition)’ 전략을 사용하고, 관련된 세부사항이나 데이터 등으로 보강한다는 관점에서 ‘확장 (Expansion)’ 전략을 적용할 수 있습니다.
맺으며
‘프롬프트 최적화’는 모델이 어떻게 작동하느냐에 대한 이해, 그리고 질의를 개선하기 위한 구조화된 접근 방식을 결합한, ‘예술이자 과학’의 성격을 갖고 있습니다. 전통적인 ‘엔지니어링’이라고까지 할 수 있는지는 모르겠어요.
위에서 간단히 말씀드린 ‘확장’, ‘분해’, ‘모호성 제거’, ‘추상화’의 원칙을 유연하게 잘 활용하고 결합한다면, 개발자들이 다양한 어플리케이션에서 LLM의 잠재력을 최대한 끌어내고, 답변의 정확성, 완성도, 그리고 전반적인 품질을 향상시키는데 기여할 수 있습니다.
이 분야가 발전해 가면서, 프로프팅 기법들을 중요한 벤치마크 그리고 다양한 인프라 도구들과 통합하는 방향이 LLM 기반 시스템의 효과, 그리고 나아가 ROI를 높이는데 있어서 핵심이 될 겁니다. 조금 더 자세하고 기술적인 내용에 대해 관심이 있으시다면, Mingyang Song, 그리고 Mao Zheng의 연구 ‘A Survey of Query Optimization in Large Language Models’를 한 번 읽어보시기를 권합니다 - 이 연구에서 LLM 질의 최적화에 대한 포괄적이고도 기초적인 내용을 제공하고 있습니다.
보너스: 참고 자료
Exploring the Best Practices of Query Expansion with Large Language Models
Optimizing Query Generation for Enhanced Document Retrieval in RAG
Robust Prompt Optimization for Large Language Models Against Distribution Shifts
Multi-Aspect Reviewed-Item Retrieval via LLM Query Decomposition and Aspect Fusion
Decomposed Prompting: A Modular Approach for Solving Complex Tasks
Abstraction-of-Thought Makes Language Models Better Reasoners
읽어주셔서 감사합니다. 친구와 동료 분들에게도 뉴스레터 추천해 주세요!
Reply