본문 바로가기
AI/Contents

프롬프트 엔지니어링의 새로운 방법 : PAL(Program-Aided Language Models) 의 원리와 실제 적용 사례

by AI미남홀란드 2024. 1. 17.
728x90

안녕하세요 Simon 입니다

오늘은 또 재미있는 새로운 프롬프팅 기법을 소개해드릴려고 합니다.

PAL (프로그램지원언어모델) 입니다.

 

어떤 Application 을 구축함에 있어서 내가 원하는 형식의 Output 을 얻기 위해 LLM으로 부터 다양한 프롬프팅 방법과 프레임워크 등을 사용 하곤 하는데 이것도 Few-Shot 프롬프트의 종류로 원하는 숫자값, Date 값, 특정 값을 뽑아 낼 수 있도록 코드 인터프리터 프로그래밍 방식을 함께 런타임을 단계적으로 수행해서 해결해 나가는 기법입니다.  정답을 얻기 위해서 자유로운 텍스트 형식을 쓰기 때문에 CoT 와는 조금 차이가 있습니다.

 

 

 

https://arxiv.org/abs/2211.10435

 

PAL: Program-aided Language Models

Large language models (LLMs) have recently demonstrated an impressive ability to perform arithmetic and symbolic reasoning tasks, when provided with a few examples at test time ("few-shot prompting"). Much of this success can be attributed to prompting met

arxiv.org


위 논문의 Abstrack 의 요약입니다.


이 논문에서는 Large Language Models (LLMs)가 최근 적은 수의 예시를 통해 ("few-shot prompting") 산술 및 기호적 추론 작업을 수행하는 데 있어 인상적인 능력을 보여주었다고 언급합니다. 이러한 성공의 대부분은 '체인-오브-솟트'와 같은 프롬프팅 방법에 기인하는데, 이는 LLM을 사용하여 문제를 단계별로 분해하고 각 단계를 해결하는 데 사용됩니다. LLM이 이러한 단계별 분해에 능숙하지만, 문제가 올바르게 분해되었음에도 불구하고 해결 부분에서 논리적이고 산술적인 실수를 자주 합니다.
이 논문에서 제시된 Program-Aided Language models (PAL)은 LLM을 사용하여 자연어 문제를 읽고 중간 추론 단계로 프로그램을 생성하는 새로운 접근 방식입니다. 하지만 해결 단계는 파이썬 인터프리터와 같은 런타임으로 이관됩니다. PAL을 사용하면 자연어 문제를 실행 가능한 단계로 분해하는 것이 LLM의 유일한 학습 과제가 되고, 해결은 인터프리터에 위임됩니다. 연구팀은 BIG-Bench Hard 및 기타 벤치마크에서 13개의 수학적, 기호적, 알고리즘적 추론 과제에 대해 LLM과 기호적 인터프리터 간의 이러한 시너지를 입증합니다. 자연어 추론 과제에서 LLM을 사용하여 코드를 생성하고 파이썬 인터프리터를 사용하여 추론하는 것은 훨씬 더 큰 모델보다 더 정확한 결과를 가져옵니다. 예를 들어, PAL은 CODEX를 사용하여 수학적 단어 문제의 GSM8K 벤치마크에서 체인-오브-솟트를 사용하는 PaLM-540B를 15% 절대적인 탑 1로 능가하는 최고의 few-shot 정확도를 달성합니다. 관련 코드와 데이터는 공개적으로 제공됩니다.

 

한 예제로 설명을 들어보겠습니다.

# 질문 설정
question = "오늘은 2024년 1월 17일입니다. 내가 30년 전에 태어났어요. 제 생일은 언제인가요? MM/DD/YYYY 형식으로 답해주세요."

# 날짜 이해를 위한 프롬프트
DATE_UNDERSTANDING_PROMPT = """
# Q: 오늘은 2020년 12월 25일이에요. 3일 후는 언제인가요? MM/DD/YYYY 형식으로 알려주세요.
# 오늘이 2020년 12월 25일이라면, 3일 후는
today = datetime(2020, 12, 25)
three_days_later = today + relativedelta(days=3)
# 답을 %m/%d/%Y 형식으로 하면
three_days_later.strftime('%m/%d/%Y')
# Q: 지금은 2022년 7월 4일이에요. 2주 전은 언제였죠? MM/DD/YYYY 형식으로 알려주세요.
# 오늘이 2022년 7월 4일이라면, 2주 전은
today = datetime(2022, 7, 4)
two_weeks_ago = today - relativedelta(weeks=2)
# 답을 %m/%d/%Y 형식으로 하면
two_weeks_ago.strftime('%m/%d/%Y')
# Q: 2019년 5월 1일은 수요일이었어요. 그 달의 마지막 일요일은 언제였나요? MM/DD/YYYY 형식으로 알려주세요.
# 2019년 5월 1일이 수요일이라면, 그 달의 마지막 일요일은
today = datetime(2019, 5, 1)
last_sunday = today + relativedelta(weekday=SU(-1))
# 답을 %m/%d/%Y 형식으로 하면
last_sunday.strftime('%m/%d/%Y')
# Q: {question}
""".strip() + '\n'

# LLM 출력
llm_out = llm(DATE_UNDERSTANDING_PROMPT.format(question=question))
print(llm_out)

# 이 코드는 다음과 같은 출력을 할 것입니다:
# "2024년 1월 17일이고 내가 30년 전에 태어났다면, 나의 생일은 30년 전이다.
# today = datetime(2024, 1, 17)
# born = today - relativedelta(years=30)
# 답을 %m/%d/%Y 형식으로 하면
# born.strftime('%m/%d/%Y')"

# Python 코드 실행
exec(llm_out)
print(born)

 

예제에서는 다양한 날짜 관련 질문에 대한 답변을 생성하기 위한 Python 코드가 포함되어 있습니다. 질문에 대한 답변은 날짜 계산을 수행하고 결과를 MM/DD/YYYY 형식으로 출력하는 코드로 구성됩니다. 이러한 방식으로 LLM 복잡한 날짜 관련 문제를 해결할 있습니다.

 

이렇게 특정한 exe 프로그램을 만들거나, 특정한 값을 뽑아야하는 경우 위 처럼 프로그래밍을 하는 것처럼 예시 프롬프팅을 해주어서 프롬프트와 같이 성능을 높히는 기법에 대해 알아보았습니다. 사실 많이 쓸 것 같진 않지만 알아두면 언젠간 한번 쯤은 쓸 것 같네요.

 

 

728x90