[Langchain] 프롬프트 엔지니어링 (2) CoT (Chain of Thought)

Hunie_07·2025년 4월 9일
0

Langchain

목록 보기
22/35

📌 Prompt Engineering

1️⃣ Chain of Thought (CoT)

  • Chain of Thought는 AI 모델이 복잡한 문제를 해결할 때 각 단계별 사고 과정을 명시적으로 보여주도록 하는 프롬프팅 기법으로, 이를 통해 모델의 추론 과정을 투명하게 확인할 수 있고 더 정확한 결과를 도출할 수 있습니다.

  • 이 방식은 특히 수학 문제 풀이, 논리적 추론이 필요한 과제, 복잡한 의사결정 과정에서 매우 효과적이며, 모델이 중간 단계에서 발생할 수 있는 오류를 스스로 발견하고 수정할 수 있게 합니다.

  • CoT의 주요 장점은 문제 해결 과정의 투명성을 높이고 최종 답변의 신뢰성을 향상시킬 수 있다는 것이지만, 출력이 길어지고 계산 비용이 증가할 수 있다는 단점도 존재합니다.


LLM 모델 설정

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,
)

1. Zero-Shot 프롬프팅

  • 가장 단순한 형태의 프롬프팅
  • 예시나 단계별 설명 없이 직접 답을 출력
  • 속도가 빠르고 메모리 사용량이 적은 편
  • 단순한 문제에 적합
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%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
과학 동아리에는 몇 명의 학생이 있나요?


답안:

답변 생성 (GPT)

# 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)

# 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명이다.

2. One-Shot / Few-Shot 프롬프팅

  • 하나 이상의 예시를 통해 문제 해결 방식을 제시

  • 유사한 예시를 통해 학습 효과를 기대

  • Zero-shot보다 더 정확한 결과를 얻을 수 있음

  • 중간 복잡도의 문제에 적합

  • 논문: https://arxiv.org/abs/2005.14165


One-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%는 수학 동아리에 있고, 나머지는 과학 동아리에 있습니다.
과학 동아리에는 몇 명의 학생이 있나요?

답안:

답변 생성 (GPT)

# 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 = 604) **6학년 학생 중 수학 동아리와 과학 동아리 학생 수를 계산합니다:**
   - 6학년 학생 중 70%가 수학 동아리에 있습니다.
   - 수학 동아리 학생 수 = 100 x 0.7 = 70- 과학 동아리 학생 수 = 6학년 학생 수 - 수학 동아리 학생 수 = 100 - 70 = 305) **과학 동아리의 총 학생 수를 계산합니다:**
   - 5학년 과학 동아리 학생 수 + 6학년 과학 동아리 학생 수 = 60 + 30 = 90명

따라서 과학 동아리에는 총 90명의 학생이 있습니다.

답변 생성 (Ollama)

# 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명의 학생이 있습니다.

3. Chain of Thought (CoT) 프롬프팅

  • 가장 체계적인 문제 해결 방식을 제공

  • 명시적인 단계별 추론 과정을 포함

  • 복잡한 문제 해결에 가장 적합

  • 논문: https://arxiv.org/abs/2201.11903


CoT 프롬프트

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단계: 검토
- 답안 확인
- 다른 방법 가능성 검토

답안:

답변 생성 (GPT)

# 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)

# 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. 전제적인 학생 수: 5002. 5학년 학생의 수 (Math Club): 70%500 = 3503. 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명의 학생이 있습니다.

2️⃣ Self-Consistency

  • 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. 전체 학생 수: 5002. 5학년 학생 수: 500명 × 0.3 = 1503. 6학년 학생 수: 500명 × 0.2 = 1004. 5학년 학생 중 수학 동아리 수: 150명 × 0.6 = 905. 5학년 학생 중 과학 동아리 수: 150- 90= 606. 6학년 학생 중 수학 동아리 수: 100명 × 0.7 = 707. 6학년 학생 중 과학 동아리 수: 100- 70= 308. 총 과학 동아리 학생 수: 60+ 30= 90### 결과 확인:
모든 방법을 통해 계산한 결과, 과학 동아리에는 총 90명의 학생이 있습니다. 각 방법의 결과가 일치함을 확인했습니다. 

**정답: 과학 동아리에는 90명의 학생이 있습니다.**

3️⃣ Program-Aided Language (PAL)

  • 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}명의 학생이 있습니다.")

이 코드를 실행하면 과학 동아리에 속한 학생 수를 계산하여 출력합니다. 각 단계에서 필요한 계산을 수행하고, 최종 결과를 반환하는 구조로 되어 있습니다.

4️⃣ Reflexion

  • 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 = 1506학년 학생 수:
- 20%500= 0.20 × 500 = 1005학년 학생들 중 수학 동아리에 있는 학생 수:
- 60%150= 0.60 × 150 = 90- 과학 동아리에 있는 학생 수 = 150 - 90 = 606학년 학생들 중 수학 동아리에 있는 학생 수:
- 70%100= 0.70 × 100 = 70- 과학 동아리에 있는 학생 수 = 100 - 70 = 30명

과학 동아리에 있는 총 학생 수:
- 5학년 과학 동아리 학생 수 + 6학년 과학 동아리 학생 수 = 60 + 30 = 90명

따라서, 과학 동아리에는 총 90명의 학생이 있습니다.

2단계: 자체 평가
---
- 정확성 검토: 계산이 올바르며, 각 단계와 결과가 정확하게 연결되어 있다.
- 논리적 오류 확인: 각 학년의 비율과 동아리 구성에 대한 이해가 명확하다.
- 설명의 명확성 평가: 잘 설명되어 있지만, 각 단계의 흐름이 좀 더 명확히 드러날 수 있다.
- 개선이 필요한 부분 식별: 최종 학생 수 계산 과정에서 각 항목별 세부사항을 더 명확히 설명할 수 있다.

3단계: 개선된 답안
---
학교에 총 500명의 학생이 있습니다. 이 중 30%5학년 학생이며, 이는 다음과 같이 계산할 수 있습니다:
- 5학년 학생 수 = 0.30 × 500 = 15020%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명의 학생이 있습니다.

0개의 댓글