Chain of Thought는 AI 모델이 복잡한 문제를 해결할 때 각 단계별 사고 과정을 명시적으로 보여주도록 하는 프롬프팅 기법으로, 이를 통해 모델의 추론 과정을 투명하게 확인할 수 있고 더 정확한 결과를 도출할 수 있습니다.
이 방식은 특히 수학 문제 풀이, 논리적 추론이 필요한 과제, 복잡한 의사결정 과정에서 매우 효과적이며, 모델이 중간 단계에서 발생할 수 있는 오류를 스스로 발견하고 수정할 수 있게 합니다.
CoT의 주요 장점은 문제 해결 과정의 투명성을 높이고 최종 답변의 신뢰성을 향상시킬 수 있다는 것이지만, 출력이 길어지고 계산 비용이 증가할 수 있다는 단점도 존재합니다.
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model='gpt-4o-mini',
temperature=0.3,
top_p=0.9,
)
from langchain_ollama import ChatOllama
ollama = ChatOllama(
model='phi3:mini',
temperature=0.3,
top_p=0.9,
)
from langchain_core.prompts import PromptTemplate
# 프롬프트 템플릿 생성
zero_shot_template = """
다음 문제를 해결하시오:
문제: {question}
답안:
"""
zero_shot_prompt = PromptTemplate(
input_variables=["question"],
template=zero_shot_template
)
# 테스트용 문제
question = """
학교에서 500명의 학생이 있습니다. 이 중 30%는 5학년이고, 20%는 6학년 학생입니다.
5학년 학생들 중 60%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
6학년 학생들 중 70%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
과학 동아리에는 몇 명의 학생이 있나요?
"""
# 프롬프트 출력
print(zero_shot_prompt.format(question=question))
- 출력
다음 문제를 해결하시오:
문제:
학교에서 500명의 학생이 있습니다. 이 중 30%는 5학년이고, 20%는 6학년 학생입니다.
5학년 학생들 중 60%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
6학년 학생들 중 70%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
과학 동아리에는 몇 명의 학생이 있나요?
답안:
# OpenAI GPT-4o-mini 모델로 답안 생성
zero_shot_chain = zero_shot_prompt | llm
answer = zero_shot_chain.invoke({"question": question})
print(answer.content)
- 출력
문제를 해결하기 위해 단계별로 계산해 보겠습니다.
1. **학생 수 계산**:
- 전체 학생 수: 500명
- 5학년 학생 수: \( 500 \times 0.30 = 150 \)명
- 6학년 학생 수: \( 500 \times 0.20 = 100 \)명
2. **5학년 학생들의 동아리 분포**:
- 5학년 학생 중 수학 동아리에 있는 학생 수: \( 150 \times 0.60 = 90 \)명
- 5학년 학생 중 과학 동아리에 있는 학생 수: \( 150 - 90 = 60 \)명
3. **6학년 학생들의 동아리 분포**:
- 6학년 학생 중 수학 동아리에 있는 학생 수: \( 100 \times 0.70 = 70 \)명
- 6학년 학생 중 과학 동아리에 있는 학생 수: \( 100 - 70 = 30 \)명
4. **과학 동아리의 총 학생 수**:
- 5학년 과학 동아리 학생 수: 60명
- 6학년 과학 동아리 학생 수: 30명
- 총 과학 동아리 학생 수: \( 60 + 30 = 90 \)명
따라서, 과학 동아리에는 **90명**의 학생이 있습니다.
# Ollama Phi3:mini 모델로 답안 생성
zero_shot_chain = zero_shot_prompt | ollama
answer = zero_shot_chain.invoke({"question": question})
print(answer.content)
- 출력
5학년 학생들은 500 * 30% = 150명이고,
6학년 학생들은 500 * 20% = 100명이며,
5학년 학생의 수학 동아리는 150 * 60% = 90명이고,
그러나 과학 동아리는 150 - 90 = 60명이며,
6학년 학생의 수학 동아리는 100 * 70% = 70명이고,
그리고 과학 동아리는 100 - 70 = 30명이며,
마지막으로 수학 동아리와 과학 동아리의 학생들은 60명 + 30명 = 90명이므로,
90명이 되어 가지고 있는 학생들이 수학 동아리에 있는 학속적인 학생은 60명이다.
하나 이상의 예시를 통해 문제 해결 방식을 제시
유사한 예시를 통해 학습 효과를 기대
Zero-shot보다 더 정확한 결과를 얻을 수 있음
중간 복잡도의 문제에 적합
from langchain_core.prompts import PromptTemplate
# 프롬프트 템플릿 생성
one_shot_template = """
다음은 수학 문제를 해결하는 예시입니다:
예시 문제: 한 학급에 30명의 학생이 있습니다. 이 중 40%가 남학생이라면, 여학생은 몇 명인가요?
예시 풀이:
1) 먼저 남학생 수를 계산합니다:
- 전체 학생의 40% = 30 x 0.4 = 12명이 남학생
2) 여학생 수를 계산합니다:
- 전체 학생 수 - 남학생 수 = 30 - 12 = 18명이 여학생
따라서 여학생은 18명입니다.
이제 아래 문제를 같은 방식으로 해결하시오:
새로운 문제: {question}
답안:
"""
one_shot_prompt = PromptTemplate(
input_variables=["question"],
template=one_shot_template
)
# 테스트용 문제
question = """
학교에서 500명의 학생이 있습니다. 이 중 30%는 5학년이고, 20%는 6학년 학생입니다.
5학년 학생들 중 60%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
6학년 학생들 중 70%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
과학 동아리에는 몇 명의 학생이 있나요?
"""
# 프롬프트 출력
print(one_shot_prompt.format(question=question))
- 출력
다음은 수학 문제를 해결하는 예시입니다:
예시 문제: 한 학급에 30명의 학생이 있습니다. 이 중 40%가 남학생이라면, 여학생은 몇 명인가요?
예시 풀이:
1) 먼저 남학생 수를 계산합니다:
- 전체 학생의 40% = 30 x 0.4 = 12명이 남학생
2) 여학생 수를 계산합니다:
- 전체 학생 수 - 남학생 수 = 30 - 12 = 18명이 여학생
따라서 여학생은 18명입니다.
이제 아래 문제를 같은 방식으로 해결하시오:
새로운 문제:
학교에서 500명의 학생이 있습니다. 이 중 30%는 5학년이고, 20%는 6학년 학생입니다.
5학년 학생들 중 60%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
6학년 학생들 중 70%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
과학 동아리에는 몇 명의 학생이 있나요?
답안:
# OpenAI GPT-4o-mini 모델로 답안 생성
one_shot_chain = one_shot_prompt | llm
answer = one_shot_chain.invoke({"question": question})
print(answer.content)
- 출력
문제 해결을 위해 단계별로 계산해보겠습니다.
1) **5학년 학생 수를 계산합니다:**
- 전체 학생의 30% = 500 x 0.3 = 150명이 5학년입니다.
2) **6학년 학생 수를 계산합니다:**
- 전체 학생의 20% = 500 x 0.2 = 100명이 6학년입니다.
3) **5학년 학생 중 수학 동아리와 과학 동아리 학생 수를 계산합니다:**
- 5학년 학생 중 60%가 수학 동아리에 있습니다.
- 수학 동아리 학생 수 = 150 x 0.6 = 90명
- 과학 동아리 학생 수 = 5학년 학생 수 - 수학 동아리 학생 수 = 150 - 90 = 60명
4) **6학년 학생 중 수학 동아리와 과학 동아리 학생 수를 계산합니다:**
- 6학년 학생 중 70%가 수학 동아리에 있습니다.
- 수학 동아리 학생 수 = 100 x 0.7 = 70명
- 과학 동아리 학생 수 = 6학년 학생 수 - 수학 동아리 학생 수 = 100 - 70 = 30명
5) **과학 동아리의 총 학생 수를 계산합니다:**
- 5학년 과학 동아리 학생 수 + 6학년 과학 동아리 학생 수 = 60 + 30 = 90명
따라서 과학 동아리에는 총 90명의 학생이 있습니다.
# Ollama Phi3:mini 모델로 답안 생성
one_shot_chain = one_shot_prompt | ollama
answer = one_shot_chain.invoke({"question": question})
print(answer.content)
- 출력
1) 5학년 학생 수를 계산합니다:
- 전체 학생의 30% = 500 x 0 end of sql query; error in formatting, please reformat. I'm sorry for the confusion earlier. Let me provide you with a detailed solution to your new problem using LaTeX format as requested:
Given Problem Statement Revised and Formatted Correctly:
새로운 문제: 학교에서 500명의 학생이 있습니다. 이 중 30%는 5학년이고, 20%는 6학년 학생입니다.
5학년 학생들 중 60%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
6학년 학생들 중 70%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
과학 동아리에는 몇 명의 학생이 있나요?
해결:
1) 5학년 학생 수를 계산합니다:
- 전체 학생의 30% = 500 x 0.3 = 150명이 5학년
2) 5학년 학생들 중 60%가 수학 동아리에 있는 학생의 수를 계산합니다:
- 전체 5학년 학생 수 x 60% = 150 x 0.6 = 90명이 수학 동아리에 있는
3) 5학년 학생들 중 나머지가 과학 동아리에 있는 학생의 수를 계산합니다:
- 전체 5학년 학생 수 - 수학 동아리 학생 수 = 150 - 90 = 60명이 과학 동아리에 있는
4) 6학년 학생 수를 계산합니다:
- 전체 학생의 20% = 500 x 0.2 = 100명이 6학년
5) 6학년 학생들 중 70%가 수학 동아리에 있는 학생의 수를 계산합니다:
- 전체 6학년 학생 수 x 70% = 100 x 0.7 = 70명이 수학 동아리에 있는
6) 6학년 학생들 중 나머지가 과학 동아리에 있는 학생의 수를 계산합니다:
- 전체 6학년 학생 수 - 수학 동아리 학생 수 = 100 - 70 = 30명이 과학 동아리에 있는
7) 과학 동아리에서 5학년과 6학년 학생의 수를 합한 과학 동아리 전용 학생의 수를 계산합니다:
- 전체 과학 동아리 전용 학생 수 = 60 (5학년) + 30 (6학년) = 90명이 과학 동아리에 있는
따라서, 과학 동아리에는 90명의 학생이 있습니다.
가장 체계적인 문제 해결 방식을 제공
명시적인 단계별 추론 과정을 포함
복잡한 문제 해결에 가장 적합
from langchain_core.prompts import PromptTemplate
# 프롬프트 템플릿 생성
cot_template = """
다음 문제를 논리적 단계에 따라 해결하시오:
문제: {question}
해결 과정:
1단계: 문제 이해하기
- 주어진 정보 파악
- 구해야 할 것 정리
2단계: 해결 방법 계획
- 사용할 수 있는 전략 검토
- 최적의 방법 선택
3단계: 계획 실행
- 선택한 방법 적용
- 중간 결과 확인
4단계: 검토
- 답안 확인
- 다른 방법 가능성 검토
답안:
"""
cot_prompt = PromptTemplate(
input_variables=["question"],
template=cot_template
)
# 테스트용 문제
question = """
학교에서 500명의 학생이 있습니다. 이 중 30%는 5학년이고, 20%는 6학년 학생입니다.
5학년 학생들 중 60%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
6학년 학생들 중 70%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
과학 동아리에는 몇 명의 학생이 있나요?
"""
# 프롬프트 출력
print(cot_prompt.format(question=question))
- 출력
다음 문제를 논리적 단계에 따라 해결하시오:
문제:
학교에서 500명의 학생이 있습니다. 이 중 30%는 5학년이고, 20%는 6학년 학생입니다.
5학년 학생들 중 60%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
6학년 학생들 중 70%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
과학 동아리에는 몇 명의 학생이 있나요?
해결 과정:
1단계: 문제 이해하기
- 주어진 정보 파악
- 구해야 할 것 정리
2단계: 해결 방법 계획
- 사용할 수 있는 전략 검토
- 최적의 방법 선택
3단계: 계획 실행
- 선택한 방법 적용
- 중간 결과 확인
4단계: 검토
- 답안 확인
- 다른 방법 가능성 검토
답안:
# OpenAI GPT-4o-mini 모델로 답안 생성
cot_chain = cot_prompt | llm
answer = cot_chain.invoke({"question": question})
print(answer.content)
- 출력
### 1단계: 문제 이해하기
- 학교에는 총 500명의 학생이 있습니다.
- 5학년 학생: 30% → 500명 × 0.3 = 150명
- 6학년 학생: 20% → 500명 × 0.2 = 100명
- 5학년 학생 중 60%가 수학 동아리에 속함 → 150명 × 0.6 = 90명 (수학 동아리)
- 5학년 학생 중 나머지 40%는 과학 동아리에 속함 → 150명 × 0.4 = 60명 (과학 동아리)
- 6학년 학생 중 70%가 수학 동아리에 속함 → 100명 × 0.7 = 70명 (수학 동아리)
- 6학년 학생 중 나머지 30%는 과학 동아리에 속함 → 100명 × 0.3 = 30명 (과학 동아리)
### 2단계: 해결 방법 계획
- 5학년과 6학년 학생들의 과학 동아리 학생 수를 각각 계산한 후 합산하여 총 과학 동아리 학생 수를 구한다.
### 3단계: 계획 실행
- 5학년 과학 동아리 학생 수: 60명
- 6학년 과학 동아리 학생 수: 30명
- 총 과학 동아리 학생 수 = 60명 (5학년) + 30명 (6학년) = 90명
### 4단계: 검토
- 계산을 다시 확인해보면:
- 5학년: 150명 중 60명 (과학 동아리)
- 6학년: 100명 중 30명 (과학 동아리)
- 총 과학 동아리 학생 수는 90명으로 정확하다.
### 답안:
과학 동아리에는 총 90명의 학생이 있습니다.
# Ollama Phi3:mini 모델로 답안 생성
cot_chain = cot_prompt | ollama
answer = cot_chain.invoke({"question": question})
print(answer.content)
- 출력
해결 과정:
1. 문제 이해하기
- 총 학생 수: 500명
- 5학년 학생의 수: 30%의 500 = 150명 (Math Club)
- 6학년 학생의 수: 20%의 50 end = 100명 (Science Club)
- 그러나, 6학년 학생들중 70%는 수학 동아리에 있으며, 30%는 과학 동아리에 있음 (Math Club)
- Math Club: 70%의 100명 = 70명이 수학 동아리에 있음.
- Science Club: 30%의 100명 = 30명이 과학 동아리에 있음.
2. 해결 방법 계효
- Math Club: 70명 (수학 동아리) + 30명 (과학 동아리) = 100명이 Science Club에서는 없어진다.
- Science Club: 100명 (Science Club) - 30명 (Math Club) = 70명이 Math Club에서는 있는다.
따로 계산한 결과와 동일하다.
3. 결과 확인
- Science Club: 70명의 학생이 수학 동아리에 있음.
제12단계: 더졌다. 문제를 다시 보고 확인해보세요.
다시 한번 이해하고, 수학 동아리에 있는 학생의 수를 구해보세요. 500명의 학생중 70%가 수학 동아리에 있다고 하자.
해결 과정:
1. 전제적인 학생 수: 500명
2. 5학년 학생의 수 (Math Club): 70%의 500 = 350명
3. Math Club에서 Math Club이 아니라 Science Club에 있는 학생은 그보다 10% 더 많다. (Math Club: 350명, Science Club: 350명 + 10%의 350 = 385명)
4. Math Club에서는 초보자가 20%를 차지하고 남아진다. (Math Club: 350명 x 20% = 70명이 초보자)
5. Science Club에서는 수학 동아리에서 몇 명의 학생이 있을까요? (Science Club: 385명 - 70명 = 315명)
해결되면, Science Club에는 315명의 학생이 있습니다.
Self-Consistency는 AI 모델에게 하나의 문제에 대해 다양한 접근 방식으로 해결하도록 요청하는 기법으로, 여러 경로를 통해 도출된 결과들의 일관성을 확인함으로써 답변의 신뢰성을 높입니다.
이 방법은 특히 수학 문제나 논리적 추론이 필요한 과제에서 효과적이며, 서로 다른 방법으로 도출된 결과가 일치하는지 검증함으로써 오류 가능성을 최소화할 수 있습니다.
Self-Consistency의 장점은 답변의 정확성을 높일 수 있다는 것이지만, 여러 번의 계산과 추론이 필요하므로 처리 시간이 길어지고 컴퓨팅 리소스 사용량이 증가한다는 단점이 있습니다.
또한 이 기법은 Chain of Thought (CoT) 프롬프팅과 결합하여 사용할 경우 더욱 강력한 효과를 발휘할 수 있습니다.
from langchain_core.prompts import PromptTemplate
# 프롬프트 템플릿 생성
self_consistency_template = """
다음 문제를 세 가지 다른 방법으로 해결하시오:
문제: {question}
세 가지 풀이 방법:
1) 직접 계산 방법:
- 주어진 숫자를 직접 계산
2) 비율 활용 방법:
- 전체에 대한 비율로 계산
3) 단계별 분해 방법:
- 문제를 작은 부분으로 나누어 계산
각 방법의 답안을 제시하고, 결과가 일치하는지 확인하시오.
답안:
"""
self_consistency_prompt = PromptTemplate(
input_variables=["question"],
template=self_consistency_template
)
# 테스트용 문제
question = """
학교에서 500명의 학생이 있습니다. 이 중 30%는 5학년이고, 20%는 6학년 학생입니다.
5학년 학생들 중 60%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
6학년 학생들 중 70%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
과학 동아리에는 몇 명의 학생이 있나요?
"""
# OpenAI GPT-4o-mini 모델로 답안 생성
self_consistency_chain = self_consistency_prompt | llm
answer = self_consistency_chain.invoke({"question": question})
print(answer.content)
- 출력
문제를 해결하기 위해 세 가지 방법을 사용하여 과학 동아리에 있는 학생 수를 계산해보겠습니다.
### 1) 직접 계산 방법:
- 전체 학생 수: 500명
- 5학년 학생 수: 500명 × 30% = 150명
- 6학년 학생 수: 500명 × 20% = 100명
**5학년 동아리 분포:**
- 5학년 중 수학 동아리 학생 수: 150명 × 60% = 90명
- 5학년 중 과학 동아리 학생 수: 150명 - 90명 = 60명
**6학년 동아리 분포:**
- 6학년 중 수학 동아리 학생 수: 100명 × 70% = 70명
- 6학년 중 과학 동아리 학생 수: 100명 - 70명 = 30명
**총 과학 동아리 학생 수:**
- 5학년 과학 동아리 학생 수 + 6학년 과학 동아리 학생 수 = 60명 + 30명 = 90명
### 2) 비율 활용 방법:
- 전체 학생 수: 500명
- 5학년 학생 비율: 30% → 150명
- 6학년 학생 비율: 20% → 100명
**5학년 동아리 비율:**
- 수학 동아리 비율: 60% → 과학 동아리 비율: 40%
- 5학년 과학 동아리 학생 수: 150명 × 40% = 60명
**6학년 동아리 비율:**
- 수학 동아리 비율: 70% → 과학 동아리 비율: 30%
- 6학년 과학 동아리 학생 수: 100명 × 30% = 30명
**총 과학 동아리 학생 수:**
- 5학년 과학 동아리 학생 수 + 6학년 과학 동아리 학생 수 = 60명 + 30명 = 90명
### 3) 단계별 분해 방법:
1. 전체 학생 수: 500명
2. 5학년 학생 수: 500명 × 0.3 = 150명
3. 6학년 학생 수: 500명 × 0.2 = 100명
4. 5학년 학생 중 수학 동아리 수: 150명 × 0.6 = 90명
5. 5학년 학생 중 과학 동아리 수: 150명 - 90명 = 60명
6. 6학년 학생 중 수학 동아리 수: 100명 × 0.7 = 70명
7. 6학년 학생 중 과학 동아리 수: 100명 - 70명 = 30명
8. 총 과학 동아리 학생 수: 60명 + 30명 = 90명
### 결과 확인:
모든 방법을 통해 계산한 결과, 과학 동아리에는 총 90명의 학생이 있습니다. 각 방법의 결과가 일치함을 확인했습니다.
**정답: 과학 동아리에는 90명의 학생이 있습니다.**
PAL은 자연어 문제를 프로그래밍적 사고방식으로 접근하도록 하는 기법으로, 복잡한 문제를 코드나 의사코드 형태로 분해하여 해결하는 방식입니다. 이를 통해 문제 해결 과정을 더욱 구조화하고 체계적으로 만들 수 있습니다.
이 접근 방식의 큰 장점은 프로그래밍 언어의 정확성과 논리성을 활용하여 모호함을 줄이고, 각 단계를 명확하게 정의할 수 있다는 것입니다. 특히 수학적 계산, 데이터 처리, 알고리즘적 문제 해결에서 뛰어난 성능을 보입니다.
PAL의 특징적인 점은 실제 실행 가능한 코드를 생성할 수 있다는 것으로, 이는 결과의 검증이 용이하고 필요한 경우 수정이나 최적화가 가능하다는 장점이 있습니다.
from langchain_core.prompts import PromptTemplate
# 프롬프트 템플릿 생성
pal_template = """
다음 문제를 Python 프로그래밍 방식으로 해결하시오:
문제: {question}
# 문제 해결을 위한 Python 스타일 의사코드:
def solve_problem():
# 1. 변수 정의
# - 주어진 값들을 변수로 저장
# 2. 계산 과정
# - 필요한 계산을 단계별로 수행
# 3. 결과 반환
# - 최종 결과 계산 및 반환
답안:
"""
pal_prompt = PromptTemplate(
input_variables=["question"],
template=pal_template
)
# 테스트용 문제
question = """
학교에서 500명의 학생이 있습니다. 이 중 30%는 5학년이고, 20%는 6학년 학생입니다.
5학년 학생들 중 60%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
6학년 학생들 중 70%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
과학 동아리에는 몇 명의 학생이 있나요?
"""
# OpenAI GPT-4o-mini 모델로 답안 생성
pal_chain = pal_prompt | llm
answer = pal_chain.invoke({"question": question})
print(answer.content)
- 출력
아래는 주어진 문제를 해결하기 위한 Python 코드입니다. 이 코드는 학생 수와 동아리 비율을 기반으로 과학 동아리에 속한 학생 수를 계산합니다.
def solve_problem():
# 1. 변수 정의
total_students = 500 # 총 학생 수
fifth_grade_percentage = 0.3 # 5학년 비율
sixth_grade_percentage = 0.2 # 6학년 비율
# 2. 계산 과정
# 5학년 학생 수
fifth_grade_students = total_students * fifth_grade_percentage
# 6학년 학생 수
sixth_grade_students = total_students * sixth_grade_percentage
# 5학년 학생 중 수학 동아리 비율
fifth_grade_math_percentage = 0.6
# 6학년 학생 중 수학 동아리 비율
sixth_grade_math_percentage = 0.7
# 5학년 수학 동아리 학생 수
fifth_grade_math_club = fifth_grade_students * fifth_grade_math_percentage
# 5학년 과학 동아리 학생 수
fifth_grade_science_club = fifth_grade_students - fifth_grade_math_club
# 6학년 수학 동아리 학생 수
sixth_grade_math_club = sixth_grade_students * sixth_grade_math_percentage
# 6학년 과학 동아리 학생 수
sixth_grade_science_club = sixth_grade_students - sixth_grade_math_club
# 총 과학 동아리 학생 수
total_science_club_students = fifth_grade_science_club + sixth_grade_science_club
# 3. 결과 반환
return total_science_club_students
# 결과 출력
result = solve_problem()
print(f"과학 동아리에는 {result}명의 학생이 있습니다.")
이 코드를 실행하면 과학 동아리에 속한 학생 수를 계산하여 출력합니다. 각 단계에서 필요한 계산을 수행하고, 최종 결과를 반환하는 구조로 되어 있습니다.
Reflexion은 AI가 자신의 이전 답변을 스스로 검토하고 평가하여 개선하는 메타인지적 프롬프팅 기법으로, 이를 통해 응답의 질을 점진적으로 향상시킬 수 있습니다.
이 방법은 AI가 자신의 답변에서 부족한 점, 오류, 또는 개선이 필요한 부분을 스스로 찾아내고 수정하도록 함으로써, 더 정확하고 완성도 높은 답변을 도출할 수 있게 합니다. 특히 복잡한 분석이나 창의적인 작업에서 효과적입니다.
Reflexion의 강점은 AI가 자기 평가를 통해 지속적으로 개선된 결과물을 제공할 수 있다는 것이지만, 여러 번의 반복적인 검토와 수정 과정이 필요하므로 시간과 컴퓨팅 자원이 더 많이 소요될 수 있다는 제한점이 있습니다.
이 기법은 특히 글쓰기, 코드 리뷰, 분석 리포트 작성 등 높은 품질의 출력이 요구되는 작업에서 매우 유용하게 활용될 수 있습니다.
from langchain_core.prompts import PromptTemplate
# 프롬프트 템플릿 생성
reflexion_template = """
다음 문제에 대해 단계적으로 해결하여 초기 답안을 작성하고, 자체 평가 후 개선하시오:
문제: {question}
1단계: 초기 답안
---
[여기에 첫 번째 답안 작성]
2단계: 자체 평가
---
- 정확성 검토
- 논리적 오류 확인
- 설명의 명확성 평가
- 개선이 필요한 부분 식별
3단계: 개선된 답안
---
[평가를 바탕으로 개선된 답안 작성]
답안:
"""
reflexion_prompt = PromptTemplate(
input_variables=["question"],
template=reflexion_template
)
# 테스트용 문제
question = """
학교에서 500명의 학생이 있습니다. 이 중 30%는 5학년이고, 20%는 6학년 학생입니다.
5학년 학생들 중 60%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
6학년 학생들 중 70%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
과학 동아리에는 몇 명의 학생이 있나요?
"""
# OpenAI GPT-4o-mini 모델로 답안 생성
reflexion_chain = reflexion_prompt | ChatOpenAI(model='gpt-4o-mini')
answer = reflexion_chain.invoke({"question": question})
print(answer.content)
- 출력
1단계: 초기 답안
---
학교에 총 500명의 학생이 있습니다.
5학년 학생 수:
- 30%의 500명 = 0.30 × 500 = 150명
6학년 학생 수:
- 20%의 500명 = 0.20 × 500 = 100명
5학년 학생들 중 수학 동아리에 있는 학생 수:
- 60%의 150명 = 0.60 × 150 = 90명
- 과학 동아리에 있는 학생 수 = 150 - 90 = 60명
6학년 학생들 중 수학 동아리에 있는 학생 수:
- 70%의 100명 = 0.70 × 100 = 70명
- 과학 동아리에 있는 학생 수 = 100 - 70 = 30명
과학 동아리에 있는 총 학생 수:
- 5학년 과학 동아리 학생 수 + 6학년 과학 동아리 학생 수 = 60 + 30 = 90명
따라서, 과학 동아리에는 총 90명의 학생이 있습니다.
2단계: 자체 평가
---
- 정확성 검토: 계산이 올바르며, 각 단계와 결과가 정확하게 연결되어 있다.
- 논리적 오류 확인: 각 학년의 비율과 동아리 구성에 대한 이해가 명확하다.
- 설명의 명확성 평가: 잘 설명되어 있지만, 각 단계의 흐름이 좀 더 명확히 드러날 수 있다.
- 개선이 필요한 부분 식별: 최종 학생 수 계산 과정에서 각 항목별 세부사항을 더 명확히 설명할 수 있다.
3단계: 개선된 답안
---
학교에 총 500명의 학생이 있습니다. 이 중 30%는 5학년 학생이며, 이는 다음과 같이 계산할 수 있습니다:
- 5학년 학생 수 = 0.30 × 500 = 150명
20%는 6학년 학생으로, 다음과 같이 계산합니다:
- 6학년 학생 수 = 0.20 × 500 = 100명
이제 각 학년의 동아리 구성원을 계산하겠습니다.
**5학년 학생들:**
- 수학 동아리 학생 수 = 60% × 150명 = 90명
- 과학 동아리 학생 수 = 150명 - 90명 = 60명
**6학년 학생들:**
- 수학 동아리 학생 수 = 70% × 100명 = 70명
- 과학 동아리 학생 수 = 100명 - 70명 = 30명
이제 과학 동아리에 있는 학생들의 총수를 계산하겠습니다:
- 과학 동아리에 속한 총 학생 수 = 5학년 과학 동아리 학생 수 + 6학년 과학 동아리 학생 수 = 60 + 30 = 90명
결론적으로 과학 동아리에는 총 90명의 학생이 있습니다.