Abstract:
- Few-shot Prompt 와 CoT 로 복잡하거나 추론 단계가 많은 작업에는 어려움을 겪었다고 함.
- 이를 해결하기 위해서 논문에서는 Decomposed Prompting 을 제안한다. 이는 복잡한 작업을 하위 작업으로 분해하고, 이런 하위 작업을 개별적인 LLM 을 통해서 처리함. 그리고 하위 작업을 처리하기 위한 적합한 프롬프트를 공유 라이브러리에 저장해둬서 처리한다고 한다.
- 특정 하위 작업에 맞게끔 준비해둔다는게 특징임. 하위 작업에 최적화 해두는 것. 그리고 필요하면 해당 처리 모듈을 추가하면 됨.
- 이렇게 처리했을 때 높은 성능을 달성했다고 함.
Introduction:
- 작업이 복잡해질수록 또는 개별 추론 단계가 복잡할수록, 몇 개의 예시만으로는 모델이 모든 필요한 추론 단계를 학습하기에 충분하지 않았다고 함. 그 중 대표적인 예시로 문자열에서 각 단어의 k번째 글자를 연결하는 작업이 있음.
- 이를 해결하기 위해서 Decomposed Prompting(DECOMP) 기법을 제안함:
- 복잡한 작업을 간단한 하위 작업으로 분해하고, 각 하위 작업을 특정한 프롬프트를 가진 LLM(하위 작업 처리기) 에 위임. (Agent 로도 충분히 확장 가능할듯)
- 분해자(Decomposer): 복잡한 작업을 수행하기 위해 필요한 하위 작업들의 순서를 정의함.
- 하위 작업 처리기(Sub-task Handlers): 각 하위 작업을 처리하기 위한 별도의 프롬프트를 가진 LLM
- 아래 이미지는 Decomposed Prompting(DECOMP) 의 기법을 나타냄.
- DECOMP 기법을 소프트웨어 개발에 비유:
- 분해자는 복잡한 작업을 해결하기 위한 상위 수준의 프로그램을 정의하고, 간단한 하위 작업 함수에 대한 인터페이스를 제공함.
- 하위 작업 처리기는 이러한 간단한 함수들의 구현체로 보면됨. 모듈화될 수 있고, 디버깅 될 수 있고, 업그레이드도 될 수 있음.
- 이 기법을 다양한 작업에서 실행함:
- k번째 글자 연결 작업
- 리스트 역순 배치 작업 (주어진 리스트(순서가 있는 요소들의 집합)의 요소들을 역순으로 배치하는 작업을 말함)
- 긴 문맥의 질의응답(Long-context QA)
- 오픈 도메인 멀티홉 QA
- 수학적 질의응답(Math QA)
Decomposed Prompt:
- 분해자(Decomposer) LLM 의 역할:
- 복잡한 작업을 해결하기 위해 프롬프트 프로그램 P를 생성하는 역할을 한다.
- 프로그램 P 는 내부적인 하위 작업을 수행하는 함수 집합으로 구성되어 있다.
- 프로그램 P 의 구조:
- 질의 Q 와 그것에 대한 답변 A 가 주어졌을 때 P 는 다음 함수들을 순서대로 실행하는 시퀀스임.
- P = ⟨(f1, Q1, A1), …, (fk, Qk, Ak)⟩
- fi는 하위 작업 함수로, F에 속합니다
- Qi는 fi에게 전달되는 하위 질의
- Ai는 해당 하위 질의에 대한 답변
- Ak는 최종 답변으로, P가 예측한 A와 동일.
- 프로그램 P 는 제어자 (Controller) 에서 실행된다:
- 제어자는 P 를 받아서 실행한다.
- 각 하위 함수 즉 하위 작업은 하위 작업 처리기가 실행되고, 하위 작업이 끝나면 다음 하위 작업을 실행해서 최종적인 결과를 얻어낸다.
- 분해자는 In-Context Learning 을 통해서 학습한다.
- 예시는 이 구조로 이뤄져있음: Ej = ⟨(Qj, ⟨(fj,1, Qj,1, Aj,1), …, (fj,kj, Qj,kj, Aj,kj)⟩)⟩
- Qj 는 전체 질의를 말함.
- Aj 는 답변을 말함.
- Aj,kj 는 최종 답변을 말함.
- 하위 작업 함수 f 구현:
- 각 하위 작업 함수 f는 하위 작업 처리기(Sub-task Handler) 를 통해 실행됨.
- 하위 작업 처리기는 별도의 프롬프트나, CoT 프롬프트나, 특정한 미세 조정된 모델일 수 있고, Agent 일수도 있음.
- 예시:
- 예시 질의 Q: “오늘의 날짜와 날씨를 확인하고, 이를 기반으로 내일의 일정을 계획하라.”
- 분해자의 역할:
- 질의를 다음과 같이 분해함.
- 하위 작업 1(f1): “오늘의 날짜는 무엇인가?”
- 하위 작업 2(f2): “오늘의 날씨는 어떤가?”
- 하위 작업 3(f3): “내일의 일정을 어떻게 계획해야 하는가?”
- 분해자가 만든 프로그램 P:
- P = ⟨(f1, Q1, A1), (f2, Q2, A2), (f3, Q3, A3)⟩
- Q1: “오늘의 날짜는 무엇인가?”
- A1: “2023년 10월 21일”
- Q2: “2023년 10월 21일의 날씨는 어떤가?”
- A2: “맑음”
- Q3: “날짜가 2023년 10월 21일이고 날씨가 맑을 때, 내일의 일정을 어떻게 계획해야 하는가?”
- A3: “야외 활동을 계획할 수 있습니다.”
- 상위 제어자는 하위 작업의 입출력을 제어하며, 최종 답변 A3 를 제공하는 역할을 함.
Decomposed Prompts 예시:
- Decomposed Prompting의 구체적인 예시를 통해 이 방법이 어떻게 작동하는지 알아보자.
- 여기서 소개하는 작업: "문자열이 주어질 때 각 단어의 첫 번째 글자를 공백으로 구분하여 연결하라."
- 분해자는 이 작업을 세가지 간단한 하위 작업으로 분해하는 것으로 만들 수 있음:
- f1: split: 입력 문자열을 단어들로 분할
- f2: str_pos: 문자열에서 특정 위치의 글자를 찾음.
- f3: merge: 문자들을 연결
- 각 하위 작업은 별도의 In-Context learning 을 위한 프롬프트로 구성할 수 있음. (아래 이미지 참고)
- 추가적으로 특정 위치에서 글자를 찾는 'str_pos' 함수의 경우에는 LLM 을 통해서 처리하는 것보다는 파이썬과 가틍ㄴ 함수를 만들어서 처리하는 게 더 나을수도 있ㅇ므. 이러한 보조 함수를 사용하게 되면 오류가 줄어들거니까. (Agent 를 사용해도 문제없다.)
DECOMP 의 확장성:
- 계층적 분해를 통해 어려운 하위 작업을 더 단순한 작업으로 추가 분해하는 것이 가능
- 재귀적 분해를 통해 동일한 형태의 작은 문제로 반복적으로 분해하여 큰 문제를 해결하는 것도 가능
- Least-to-most 프롬프트는 모든 하위 문제를 한 번에 식별하는 반면에 DECOMP 는 반복적인 상향식 분해 (iterative top-down decomposition) 를 사용하는게 가능함.
- 외부 API 호출을 통해 LLM이 어려워하는 작업을 전문 시스템으로 대체하여 처리하는 것도 가능