소개
언어 모델이 인간이 사용하는 것과 동일한 단계별 접근 방식으로 복잡한 문제를 해결할 수 있다면 어떨까요? 대규모 언어 모델(LLM) 영역에서 최소에서 최대로 프롬프팅(Least-to-Most Prompting) 전략은 유망한 해결책을 제공합니다. 이 블로그는 논문 “Least-To-Most Prompting Enables Complex Reasoning in Large Language Models”을 참조하여 이 혁신적인 방법이 LLM의 추론 능력을 어떻게 향상시키는지 탐구합니다. 복잡한 작업을 관리 가능한 하위 문제로 분해함으로써 최소에서 최대로 프롬프팅은 LLM을 단순함에서 복잡함으로 점진적인 순서로 안내합니다.
최소에서 최대로 프롬프팅이란 무엇인가?
최소에서 최대로 프롬프팅은 논문 “Least-To-Most Prompting Enables Complex Reasoning in Large Language Models”에서 대규모 언어 모델(LLM)의 추론 능력을 향상시키기 위해 도입된 혁신적인 전략입니다. 이 방법은 복잡한 문제를 더 간단하고 관리하기 쉬운 일련의 하위 문제로 분해하여 LLM이 문제를 해결하도록 돕기 위해 설계되었습니다. 이 프로세스는 두 가지 주요 단계로 구성됩니다:

- 분해(Decomposition): 복잡한 문제는 더 쉬운 하위 문제 목록으로 분해됩니다. 이 단계에서는 분해 과정을 보여주는 일정한 예제를 사용한 후, 분해해야 할 특정 질문을 제시합니다.
- 하위 문제 해결(Subproblem Solving): 모델은 이러한 하위 문제를 순차적으로 해결하도록 프롬프트됩니다. 각 하위 문제의 해결은 이전에 해결된 하위 문제의 답변에 의해 용이해집니다. 이 단계에는 하위 문제가 해결되는 방식의 예제, 이전에 답변된 하위 질문과 그 해결책 목록, 그리고 다음으로 다룰 질문이 포함됩니다.
프롬프트는 모델이 문제의 가장 단순한 측면에서 가장 복잡한 측면으로 점진적인 순서를 따르도록 구성되며, 따라서 “최소에서 최대로”라는 이름이 붙었습니다.
왜 최소에서 최대로 프롬프팅이 필요한가?
최소에서 최대로 프롬프팅이 필요한 이유는 기존 프롬프팅 기술, 특히 chain-of-thought 프롬프팅 에서 관찰된 한계에서 비롯됩니다.
Chain-of-thought 프롬프팅은 대규모 언어 모델이 인간이 문제를 생각하는 방식과 유사하게 추론 과정을 단계별로 명확히 표현하도록 장려하는 접근 방식입니다. 이 방법은 모델이 질문을 이해하는 것부터 최종 답변에 도달하기까지 거치는 각 논리적 단계를 명시적으로 서술하도록 합니다. 문제를 일련의 중간 추론 단계로 분해함으로써 모델은 투명하고 정당화 가능한 해결 경로를 제공합니다.
Chain-of-thought 프롬프팅은 다양한 자연어 추론 작업에서 상당한 성능 향상을 보여주었지만, 프롬프트에 제공된 예제보다 더 복잡한 문제를 해결하도록 일반화하는 데 어려움을 겪는 경향이 있습니다.
최소에서 최대로 프롬프팅이 LLM에서 복잡한 추론을 가능하게 하는 방법
논문 “Least-To-Most Prompting Enables Complex Reasoning in Large Language Models”의 실험 설계는 다음과 같은 단계별 프로세스로 설명할 수 있습니다:
연구 목표 식별
목표는 대규모 언어 모델이 훈련 예제에서 시연된 것보다 더 어려운 문제를 해결해야 하는 복잡한 추론 작업을 수행할 수 있도록 하는 것입니다.
작업 선택
연구자들은 상징 조작, 구성적 일반화, 수학적 추론 등 다양한 유형의 추론을 대표하는 작업을 선택했습니다.
작업 1: 상징 조작 (마지막 글자 연결 작업):
- 문제: 단어 목록이 주어지면 각 단어의 마지막 글자를 연결하여 출력합니다.
- 예: 입력 “think, machine, learning”에 대한 올바른 출력은 “keg”입니다.
- 최소에서 최대로 프롬프팅:
- 문제 분해: 목록을 순차적 하위 목록으로 분해합니다 (“think”, “think, machine”, “think, machine, learning”).
- 하위 문제 해결: 각 하위 목록에 있는 단어의 마지막 글자를 연결합니다 (“think” → “k”, “machine” → “e”, “learning” → “g”).
- 해결책 결합: 하위 문제의 해결책을 사용하여 최종 답변을 구성합니다 (“k” + “e” = “ke”, “ke” + “g” = “keg”).
작업 2: 구성적 일반화 (SCAN 벤치마크):
- 문제: 자연어 명령을 동작 시퀀스로 매핑합니다. 과제는 훈련 중에 보지 못한 더 긴 동작 시퀀스로 일반화하는 것입니다.
- 예: 명령 “look opposite right thrice after walk”는 동작 시퀀스 “TURN RIGHT, TURN RIGHT, LOOK, WALK”로 변환되어야 합니다.
- 최소에서 최대로 프롬프팅:
- 명령 분해: 복잡한 명령을 더 간단한 부분으로 분해합니다 (“look opposite right thrice” 및 “walk”).
- 동작 매핑: 각 부분을 동작으로 변환합니다 (“look opposite right thrice” → “TURN RIGHT, TURN RIGHT, LOOK” 세 번 반복, “walk” → “WALK”).
- 동작 결합: 동작을 순차적으로 실행하여 최종 시퀀스를 형성합니다.
작업 3: 수학적 추론 (GSM8K 및 DROP 데이터셋):
- 문제: 여러 단계의 추론이 필요할 수 있는 수학 단어 문제를 해결합니다.
- 예: “엘사는 사과 5개를 가지고 있습니다. 안나는 엘사보다 사과 2개를 더 가지고 있습니다. 둘이 함께 사과는 몇 개인가요?”
- 최소에서 최대로 프롬프팅:
- 문제 분해: 하위 문제를 식별합니다 (안나의 사과는 몇 개인가? 둘이 함께 사과는 몇 개인가?).
- 하위 문제 해결: 안나의 사과를 계산합니다 (5 + 2 = 7), 그 다음 총합을 계산합니다 (5 + 7 = 12).
- 최종 답변: 엘사와 안나는 함께 사과 12개를 가지고 있다고 결론을 내립니다.
프롬프팅 전략 설계
두 가지 주요 프롬프팅 전략이 비교됩니다:
- Chain-of-Thought 프롬프팅: 문제를 해결하기 위한 단계별 추론 과정을 보여주는 예제를 모델에 제공합니다.

- 최소에서 최대로 프롬프팅: 복잡한 문제를 더 간단한 하위 문제로 분해하고, 이전 하위 문제의 해결책을 사용하여 다음 문제를 순차적으로 해결하는 새로운 전략입니다.

프롬프트 예제 생성
각 프롬프팅 전략에 대해 연구자들은 작업에 접근하는 방법을 보여주는 예제를 만들었습니다. 최소에서 최대로 프롬프팅의 경우 문제 분해와 하위 문제 해결의 예제가 모두 포함됩니다.
모델에 프롬프팅 구현
언어 모델은 이러한 프롬프트를 입력으로 받습니다. 최소에서 최대로 프롬프팅의 경우 두 단계가 포함됩니다:
- 분해 단계: 모델은 원래 문제를 일련의 더 간단한 하위 문제로 분해하도록 요청받습니다.
- 하위 문제 해결 단계: 모델은 이러한 하위 문제를 순차적으로 해결하도록 요청받으며, 이전 하위 문제의 답변을 사용하여 다음 문제의 해결을 돕습니다.
테스트 세트 구성
각 작업에 대해 연구자들은 다양한 난이도의 테스트 세트를 생성했습니다.
작업 1: 상징 조작 (마지막 글자 연결 작업):
- 이 작업의 테스트 세트는 다양한 길이의 단어 목록을 생성하여 모델이 각 단어의 마지막 글자를 연결하는 능력을 테스트했습니다.
- 연구자들은 Wiktionary의 가장 흔한 영어 단어 10,000개 목록에서 욕설을 제외한 9,694개 단어 목록을 사용했습니다.
- 각 원하는 목록 크기(4~12단어)에 대해 500개의 무작위 단어 시퀀스를 생성했습니다. 각 시퀀스는 입력으로 사용되었고, 해당 출력은 단어의 마지막 글자 시퀀스였습니다.
작업 2: 구성적 일반화 (SCAN 벤치마크):
- SCAN 벤치마크는 동작 시퀀스로 매핑되어야 하는 자연어 명령으로 구성됩니다. 테스트 세트는 모델이 더 짧은 동작 시퀀스에서 더 긴 시퀀스로 일반화하는 능력을 평가합니다.
- 연구자들은 SCAN 데이터셋의 기존 분할, 특히 훈련 세트보다 긴 동작 시퀀스를 포함하는 길이 분할을 사용했습니다.
- 또한 테스트 세트가 다양한 유형의 구성적 일반화를 처리하는 모델의 능력을 평가하기 위해 다양한 명령을 포함하도록 했습니다.
작업 3: 수학적 추론 (GSM8K 및 DROP 데이터셋):
- 수학적 추론을 위해 연구자들은 GSM8K 데이터셋의 단어 문제와 DROP 데이터셋의 수치 추론 하위 집합을 사용했습니다.
- 테스트 세트에는 해결에 다양한 추론 단계가 필요한 문제가 포함되어 있어, 연구자들이 모델이 더 간단한 문제에서 더 복잡한 문제로 얼마나 잘 일반화하는지 평가할 수 있었습니다.
- 문제는 다양한 난이도를 대표하고 일부 문제가 프롬프트에 제시된 것보다 더 많은 단계를 필요로 하도록 선택되었습니다.
이러한 방식으로 테스트 세트를 구성함으로써 연구자들은 최소에서 최대로 프롬프팅 전략을 엄격하게 평가하고 다양한 추론 작업에서 표준 프롬프팅 기술과의 효과를 비교할 수 있었습니다.
실험 실행 및 결과 수집
연구자들은 GPT-3 모델(특히 code-davinci-002 버전)을 사용하여 두 프롬프팅 전략으로 실험을 실행했습니다. 테스트 세트에서 모델 응답의 정확도를 기록했습니다.
결과 분석
연구자들은 다양한 프롬프팅 전략을 사용한 모델의 성능을 비교했습니다. 전체 정확도를 살펴보고 문제 해결에 필요한 추론 단계 수에 따라 결과를 세분화했습니다.
오류 분석
최소에서 최대로 프롬프팅의 경우 연구자들은 문제의 잘못된 분해나 하위 문제의 잘못된 해결과 같은 일반적인 오류를 이해하기 위해 상세한 오류 분석을 수행했습니다.
최소에서 최대로 프롬프팅을 통해 LLM 성능이 얼마나 향상되는가?
논문 “Least-To-Most Prompting Enables Complex Reasoning in Large Language Models”은 다양한 작업에서 최소에서 최대로 프롬프팅의 효과를 입증하고 chain-of-thought 프롬프팅 및 표준 프롬프팅 방법과의 성능을 비교합니다. 다음은 논문에 설명된 각 작업의 성능 향상 요약입니다.
상징 조작 (마지막 글자 연결 작업):
최소에서 최대로 프롬프팅은 특히 단어 목록의 길이가 증가함에 따라 chain-of-thought 프롬프팅을 크게 능가했습니다.
길이가 4~12단어인 목록의 경우 GPT-3 code-davinci-002 모델을 사용한 최소에서 최대로 프롬프팅의 정확도는 74.0%에서 94.0% 범위였으며, 이는 31.8%에서 84.2% 범위의 chain-of-thought 프롬프팅 정확도보다 훨씬 높았습니다.

구성적 일반화 (SCAN 벤치마크):
최소에서 최대로 프롬프팅은 단 14개의 예제를 사용하여 길이 분할 조건에서 99.7%의 정확도를 달성했으며, 이는 전체 15,000개 이상의 예제 데이터셋에서 훈련된 특화된 신경-기호 모델도 이 작업에 어려움을 겪는 경우가 많다는 점을 고려할 때 놀라운 결과입니다.
대조적으로 chain-of-thought 프롬프팅은 동일한 모델로 길이 분할 조건에서 16.2%의 정확도만 달성했습니다.
수학적 추론 (GSM8K 및 DROP 데이터셋):
GSM8K 데이터셋에서 최소에서 최대로 프롬프팅은 chain-of-thought 프롬프팅보다 약간 향상되어 전체 정확도 62.39% 대비 60.87%를 기록했습니다.
그러나 최소 5단계가 필요한 문제의 경우 최소에서 최대로 프롬프팅이 45.23%의 정확도로 39.07%의 chain-of-thought 프롬프팅보다 현저한 향상을 보였습니다.
DROP 데이터셋에서 최소에서 최대로 프롬프팅은 chain-of-thought 프롬프팅을 큰 차이로 능가했으며, 비축구 및 축구 하위 집합에서 각각 82.45%와 74.77%의 정확도를 기록한 반면 chain-of-thought 프롬프팅은 58.78%와 59.56%였습니다.
이러한 결과는 최소에서 최대로 프롬프팅이 모델이 더 간단한 예제에서 더 복잡한 문제로 일반화해야 하는 작업에서 특히 효과적임을 나타냅니다. 복잡한 문제를 일련의 더 간단한 하위 문제로 분해하고 순차적으로 해결하는 전략을 통해 모델은 다양한 추론 작업에서 더 높은 정확도를 달성할 수 있습니다.
최소에서 최대로 프롬프팅을 내 LLM에 통합하는 방법
논문 “Least-To-Most Prompting Enables Complex Reasoning in Large Language Models”의 저자들이 제시한 접근 방식을 기반으로 다음과 같은 단계별 가이드를 제공합니다.
1단계: LLM API 획득
먼저 작업에 사용할 수 있는 LLM에 접근할 수 있어야 합니다. Novita AI LLM API는 개발자에게 Llama3–8b, Llama3–70b, Mythomax-13b 등 많은 비용 효율적인 LLM 옵션을 제공합니다.

다음은 Novita AI LLM API로 Chat Completion API 호출을 하는 예시입니다:
from openai import OpenAI
client = OpenAI(
base_url="https://api.novita.ai/v3/openai",
# Get the Novita AI API Key by referring: https://novita.ai/get-started/Quick_Start.html#_3-create-an-api-key
api_key="<YOUR Novita AI API Key>",
)
model = "Nous-Hermes-2-Mixtral-8x7B-DPO"
stream = True # or False
max_tokens = 512
chat_completion_res = client.chat.completions.create(
model=model,
messages=[
{
"role": "system",
"content": "Act like you are a helpful assistant.",
},
{
"role": "user",
"content": "Hi there!",
}
],
stream=stream,
max_tokens=max_tokens,
)
if stream:
for chunk in chat_completion_res:
print(chunk.choices[0].delta.content or "", end="")
else:
print(chat_completion_res.choices[0].message.content)
2단계: 분해를 위한 프롬프트 준비
복잡한 문제를 일련의 더 간단한 하위 문제로 분해하는 방법을 보여주는 예제 프롬프트 세트를 만듭니다. 예제는 분해의 구조를 보여주어야 하지만, 반드시 하위 문제의 구체적인 내용을 보여줄 필요는 없습니다.
3단계: 하위 문제 해결을 위한 프롬프트 준비
개별 하위 문제를 해결하는 방법을 보여주는 예제 프롬프트 세트를 만듭니다. 이러한 예제는 이전에 해결된 하위 문제의 결과를 사용하여 단계별로 해결책을 구축하는 과정을 보여주어야 합니다.
4단계: 최소에서 최대로 프롬프팅 알고리즘 구현
최소에서 최대로 프롬프팅 알고리즘의 주요 단계는 다음과 같습니다: a. 원래 문제를 분해 프롬프트에 전달하여 하위 문제 목록을 얻습니다. b. 각 하위 문제에 대해 이전 하위 문제 해결책(있는 경우)과 현재 하위 문제를 포함하는 프롬프트를 구성하고 LLM에 전달하여 해결책을 얻습니다. c. 하위 문제의 해결책을 결합하여 원래 문제의 최종 해결책을 얻습니다.
5단계: 애플리케이션과 통합
최소에서 최대로 프롬프팅 알고리즘을 애플리케이션의 워크플로우에 통합합니다. 여기에는 입력 전처리, 프롬프트 구성, LLM API 호출, 출력 후처리가 포함될 수 있습니다.
6단계: 평가 및 반복
다양한 작업과 문제 난이도에서 구현을 테스트합니다. 오류를 분석하고 필요에 따라 프롬프트 설계 또는 프롬프팅 알고리즘을 개선합니다.
다음은 LLM이 생성한 고급 예제이며, 특정 사용 사례와 LLM에 맞게 조정해야 할 수 있습니다.
import openai
# Set the Novita AI API key
openai.api_key = "<YOUR Novita AI API Key>"
openai.base_url = "https://api.novita.ai/v3/openai"
def decomp_prompt(original_problem):
"""
Generates a prompt to decompose the original problem into a series of subproblems.
Args:
original_problem (str): The original problem to be decomposed.
Returns:
str: The prompt for decomposing the problem.
"""
return f"""
Please decompose the following problem into a series of subproblems that can be solved step-by-step:
{original_problem}
Subproblems:
{{{decomp_steps}}}
"""
def solve_prompt(prev_solutions, subproblem):
"""
Generates a prompt to solve a specific subproblem, given the previously solved subproblems.
Args:
prev_solutions (str): The previously solved subproblems.
subproblem (str): The subproblem to be solved.
Returns:
str: The prompt for solving the subproblem.
"""
return f"""
Given the following previously solved subproblems:
{prev_solutions}
Please solve the following subproblem:
{subproblem}
"""
def solve_problem(original_problem):
"""
Solves the original problem using the Least-to-Most Prompting algorithm.
Args:
original_problem (str): The original problem to be solved.
Returns:
list: A list of solutions for the subproblems.
"""
# Decompose the original problem into subproblems
decomp_result = openai.Completion.create(
engine="text-davinci-002",
prompt=decomp_prompt(original_problem),
max_tokens=1024,
n=1,
stop=None,
temperature=0.7,
)
decomp_steps = decomp_result.choices[0].text.strip()
# Solve the subproblems one by one
solutions = []
for step in decomp_steps.split("\
"):
step = step.strip()
if step:
solve_result = openai.Completion.create(
engine="text-davinci-002",
prompt=solve_prompt("\
".join(solutions), step),
max_tokens=1024,
n=1,
stop=None,
temperature=0.7,
)
solutions.append(solve_result.choices[0].text.strip())
return solutions
# Example usage
original_problem = "Solve a complex math problem step-by-step."
solutions = solve_problem(original_problem)
print("\
".join(solutions))
최소에서 최대로 프롬프팅의 한계는 무엇인가?
도메인 특수성:
분해 프롬프트는 종종 특정 도메인에 맞춰져 있으며 다양한 유형의 문제에 잘 일반화되지 않을 수 있습니다. 수학 단어 문제에 잘 작동하는 프롬프트가 상식 추론 문제나 다른 도메인의 문제에는 효과적이지 않을 수 있습니다.
도메인 내 일반화의 어려움:
동일한 도메인 내에서도 분해 과정을 일반화하는 것은 어려울 수 있습니다. 프롬프트는 모델이 최적의 성능을 발휘할 수 있도록 올바른 분해를 보여주도록 신중하게 설계되어야 합니다.
분해의 복잡성:
일부 복잡한 문제는 이를 더 간단한 하위 문제로 분해하는 방법에 대한 정교한 이해가 필요할 수 있습니다. 모델을 이 과정으로 효과적으로 안내하는 프롬프트를 설계하는 것은 어려울 수 있습니다.
순차적 의존성:
최소에서 최대로 프롬프팅에서 생성된 하위 문제는 종종 의존적이며 특정 순서로 해결되어야 합니다. 이러한 순차적 요구 사항은 독립적인 하위 문제에 비해 프롬프팅 과정을 더 복잡하게 만들 수 있습니다.
오류 전파:
모델이 문제 분해나 하위 문제 해결의 초기 단계에서 오류를 범하면 이 오류가 후속 단계로 전파되어 최종 해결책이 올바르지 않게 될 수 있습니다.
모델별 성능:
최소에서 최대로 프롬프팅의 성능은 서로 다른 모델이나 동일한 모델의 버전에 따라 달라질 수 있습니다. 일부 모델은 작업의 반복적이고 재귀적인 특성을 더 잘 처리할 수 있습니다.
프롬프트 엔지니어링:
최소에서 최대로 프롬프팅의 효과는 프롬프트 엔지니어링의 품질에 크게 의존할 수 있습니다. 정확한 분해와 해결책 생성을 이끌어내는 효과적인 프롬프트를 만드는 것은 신중한 고려와 전문성을 필요로 합니다.
확장성:
최소에서 최대로 프롬프팅은 효과적일 수 있지만, 적절한 프롬프트를 설계하는 어려움과 오류 전파 가능성 때문에 매우 크거나 매우 복잡한 문제에는 잘 확장되지 않을 수 있습니다.
양방향 상호작용 부족:
저자들은 일반적으로 프롬프팅이 LLM에 추론 능력을 가르치는 최적의 방법이 아닐 수 있다고 제안합니다. 왜냐하면 프롬프팅은 단방향 의사소통 형태이기 때문입니다. 보다 자연스러운 발전은 프롬프팅을 즉각적인 피드백과 더 효율적인 학습을 가능하게 하는 완전한 양방향 대화로 진화시키는 것일 수 있습니다.
결론
복잡한 문제를 더 간단한 단계로 분해하고 순차적으로 해결함으로써 최소에서 최대로 프롬프팅을 적용한 LLM은 추론 능력을 향상시킬 뿐만 아니라 상징 조작, 구성적 일반화, 수학적 추론 등 다양한 작업에서 놀라운 성능을 보여줍니다.
그러나 이 방법에 수반되는 어려움을 인정하는 것도 중요합니다. 도메인 특수성, 도메인 내 일반화의 어려움, 분해의 복잡성은 장애물이 될 수 있습니다. 또한 하위 문제의 순차적 의존성과 잠재적인 오류 전파는 신중한 프롬프트 엔지니어링과 모델별 고려 사항의 필요성을 강조합니다.
AI 개발의 새로운 지평을 계속 탐구함에 따라 최소에서 최대로 프롬프팅은 LLM이 전례 없는 정확성과 효율성으로 복잡한 추론 작업의 문제를 해결할 수 있게 하는 중요한 전략으로 두드러지며, 동시에 다양한 문제 도메인에 걸쳐 적용을 최적화하기 위한 지속적인 연구를 촉진합니다.
참고문헌
Zhou, D., Schärli, N., Hou, L., Wei, J., Scales, N., Wang, X., Schuurmans, D., Cui, C., Bousquet, O., & Chi, E. (2023). Least-to-Most Prompting Enables Complex Reasoning in Large Language Models. In Proceedings of the International Conference on Learning Representations.
Novita AI는 AI 야망을 실현하는 올인원 클라우드 플랫폼입니다. 원활하게 통합된 API, 서버리스 컴퓨팅, GPU 가속을 통해 AI 기반 비즈니스를 빠르게 구축하고 확장하는 데 필요한 비용 효율적인 도구를 제공합니다. 인프라 관련 문제를 없애고 무료로 시작하세요 — Novita AI가 AI 꿈을 현실로 만듭니다.
