brunch

You can make anything
by writing

C.S.Lewis

by AI러 이채문 Dec 09. 2024

자연어 문제 해결을 위한 프로그래밍 접근법

PAL (Programaided Language Models)

PAL(Programaided Language Models)은 Gao et al. (2022)이 제안한 접근법으로, LLM이 자연어로 된 문제를 읽고, 문제 해결 과정을 단계적으로 프로그램으로 변환해 실행하는 방식입니다. 기존의 ChainofThought(CoT) 방식이 중간 추론 단계를 텍스트로 표현했다면, PAL은 이 단계를 코드로 표현해 Python 인터프리터와 같은 실행 환경에서 결과를 도출합니다.     




PAL의 특징은 다음과 같습니다:

1. 코드 기반 추론: 중간 단계를 코드로 변환하여 문제 해결의 명확성과 정확성을 높입니다.

2. 런타임 실행: 생성된 코드를 실행하여 답변을 얻음으로써 LLM의 계산 오류를 최소화합니다.

3. 확장성: 수학, 날짜 계산, 데이터 변환 등 다양한 작업에 활용 가능합니다.               




PAL의 작동 방식     

PAL은 문제 해결을 위해 다음과 같은 단계를 수행합니다:   

  

 (1) 자연어 문제 입력

 사용자는 LLM에 자연어로 된 문제를 입력합니다.

 예: "Roger는 5개의 테니스 공을 가지고 있습니다. 그는 각각 3개의 테니스 공이 들어 있는 2개의 캔을 샀습니다. 총 테니스 공의 개수는 몇 개인가요?"     


 (2) 코드 생성

 LLM은 문제를 코드로 변환합니다. 코드에는 변수 정의와 계산 논리가 포함됩니다.

 예:


  python

  tennis_balls = 5

  bought_balls = 2  3

  answer = tennis_balls + bought_balls



 (3) 코드 실행

 Python 인터프리터와 같은 런타임 환경에서 코드를 실행하여 결과를 도출합니다.

 출력: 11     


 (4) 출력 제공

 실행 결과를 사용자에게 반환합니다.

 예: "Roger는 총 11개의 테니스 공을 가지고 있습니다."         

      



PAL의 장점과 CoT와의 차이점   

  

 장점

1. 계산 정확도: 코드 실행을 통해 LLM의 계산 실수를 방지.

2. 가독성: 복잡한 문제 해결 과정을 명시적으로 표현.

3. 다양한 도메인 지원: 수학적 문제, 날짜 계산, 데이터 변환 등에서 높은 성능.    

 

 CoT와의 차이점



더 자세히 알아보기


이 이미지는 Chain-of-Thought(CoT)와 Program-aided Language models의 문제 해결 방식을 비교하고 있습니다. 두 접근 방식의 차이점을 분석해보겠습니다:


1. Chain-of-Thought 접근 방식 (왼쪽):

- 자연어로 단계별 풀이를 설명

- 더 서술적이고 일반적인 영어 문장 사용

- 첫 번째 예제는 정확하게 해결했으나

- 두 번째 예제에서 계산 오류 발생 (X 표시)

- 중간 계산 과정이 덜 구조화되어 있음


2. Program-aided 접근 방식 (오른쪽):

- 프로그래밍 변수와 유사한 명명 규칙 사용

- 각 단계를 명확한 변수에 할당

- 수식을 명시적으로 표현

- 계산 과정이 더 구조화되고 추적 가능

- 두 문제 모두 정확하게 해결 (✓ 표시)


주요 장점들:

1. 구조화된 변수 사용:

   - tennis_balls = 5

   - bought_balls = 2 * 3

   - loaves_baked = 200

   - loaves_sold_morning = 93


2. 명확한 수식 표현:

   - answer = tennis_balls + bought_balls

   - answer = loaves_baked - loaves_sold_morning - loaves_sold_afternoon + loaves_returned


3. 추적 가능성:

- 각 단계가 변수로 저장되어 검증이 용이

- 오류 발생 시 어느 단계에서 문제가 있는지 파악하기 쉬움


이 비교는 프로그래밍적 접근 방식이 복잡한 수학 문제 해결에 있어 더 정확하고 신뢰할 수 있는 결과를 제공할 수 있음을 보여줍니다.




 PAL의 활용 사례  

   


 1) 수학 문제 해결

 복잡한 계산 문제를 코드로 변환해 정확한 결과를 도출.  

   

2) 날짜 및 시간 계산

 예: "오늘은 2023년 2월 27일이다. 25년 전에 태어난 날짜를 MM/DD/YYYY 형식으로 알려줘."

 

코드 생성 및 실행:


  python

  today = datetime(2023, 2, 27)

  born = today  relativedelta(years=25)

  answer = born.strftime('%m/%d/%Y')



 3) 데이터 변환

 사용자 요청에 따라 데이터를 원하는 형식으로 변환.   

  

 4) 프로그래밍 교육

 코드를 자동으로 생성하고 실행 결과를 제공하여 프로그래밍 학습 지원. 

             

 



PAL을 학습하려면?     


 학습 자료

 논문: [Gao et al., 2022 논문]( https://arxiv.org/abs/2201.00000 )

 Python 프로그래밍 기초 및 데이터 처리 개념.  

   

 실습 환경

 LangChain: PAL 구현을 위한 Python 기반 프레임워크.

 OpenAI API: LLM과 Python 코드를 통합하는 데 유용.

 Jupyter Notebook: 코드 작성 및 실행 환경.    

 

 필요 기술

 Python 및 datetime 모듈에 대한 이해.

 PyTorch나 TensorFlow를 활용한 LLM 학습 및 응용. 

       


       


코드 예시     

아래는 날짜 계산 문제를 해결하기 위한 PAL 코드 예시입니다:     



from datetime import datetime

from dateutil.relativedelta import relativedelta     

 문제: 오늘은 2023년 2월 27일이다. 25년 전에 태어난 날짜를 구하시오.

today = datetime(2023, 2, 27)

born = today  relativedelta(years=25)

answer = born.strftime('%m/%d/%Y')     

print(f"태어난 날짜는 {answer}입니다.")  


    

출력:  

태어난 날짜는 02/27/1998입니다.        

       

PAL은 LLM의 계산 능력과 Python 코드 실행 환경을 결합하여 더욱 강력하고 정확한 문제 해결 도구를 제공합니다. 이 접근법은 특히 수학적 계산, 시간 처리, 데이터 변환 등에서 큰 잠재력을 가지고 있습니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari