프롬프트 엔지니어링의 중요성
인공지능 언어 모델(LLM)을 사용하는 동안 종종 느끼는 점이 있습니다. 간단한 질문에는 매우 만족스러운 답변을 얻을 수 있지만, 복잡한 문제에 대해서는 자주 부족하거나 틀린 답변을 제공한다는 점입니다. 이런 이유로 프롬프트 엔지니어링은 복잡한 문제 해결을 위해 매우 중요한 역할을 하게 됩니다. 좋은 프롬프트는 모델의 성능을 극대화할 수 있는 열쇠이며, 프롬프트의 작성 방식에 따라 모델의 답변 품질이 달라질 수 있습니다.
생각의 사슬(CoT, Chain-of-Thought) 프롬프트 기법이란?
복잡한 문제를 해결하기 위해 처음 사용된 접근 방식 중 하나는 '생각의 사슬(Chain-of-Thought, CoT)' 프롬프트 기법입니다. 이 기법은 모델이 문제를 단계별로 풀어가도록 유도하여, 논리적 사고 과정을 거쳐 더 나은 답변을 도출할 수 있도록 돕는 방식입니다. CoT 방식은 특히 수학 문제나 복잡한 추론 문제에서 그 효용성이 입증되었는데, 각 단계의 생각을 설명하도록 요구하여 모델이 실수를 줄이고 정확한 결론을 도출할 수 있도록 합니다.
Panel-of-Experts (PoE) 기법이란?
하지만 여기서 더 나아가, 복잡한 문제 해결에서 한계를 극복하기 위해 **Panel-of-Experts(PoE)**라는 새로운 프롬프트 기법이 등장했습니다. PoE는 기존의 생각의 사슬(CoT) 기법을 발전시킨 개념으로, 문제를 해결할 때 다양한 관점을 제공하는 가상의 '전문가 패널'들이 함께 논의하고 해결책을 찾아가는 과정을 활용합니다.
PoE 방식에서는 모델 내부에 여러 가상의 전문가들이 있는 것처럼 설정하여, 각 전문가가 자신만의 관점에서 문제를 분석하고 의견을 제시합니다. 각 전문가들은 서로의 의견을 비판하거나 지지하면서 문제를 점진적으로 해결해 나가며, 최종적으로는 다양한 의견을 종합하여 최적의 해결책을 도출합니다. 이렇게 여러 전문가의 다양한 시각을 통해 문제에 접근하게 되면, 하나의 경로만을 따라가다가 잘못된 결론에 이르는 위험을 줄일 수 있습니다.
PoE와 CoT의 차이점
- CoT: 한 가지 사고의 흐름을 따라 문제를 단계별로 해결하도록 유도하는 방식입니다. 모델이 처음부터 끝까지 논리적 추론 과정을 보여줌으로써 더 정확한 답변을 얻을 수 있게 합니다.
- PoE: 서로 다른 관점을 가진 여러 전문가들이 문제를 해결하기 위해 협력하는 방식입니다. 각 전문가가 단계별로 의견을 제시하고 다른 전문가들이 이를 비판하거나 보완하여 최종 결론을 도출합니다. 이 과정에서 다양한 시각이 반영되기 때문에 더 깊이 있고 폭넓은 해결책을 얻을 수 있습니다.
PoE 적용 예시
Panel-of-Experts Prompt Template
Panel-of-Experts Prompt Template
Context: You are a panel of three experts on [specific topic].
Roles:
Expert 1: [Name], an authority in [specific area].
Expert 2: [Name], a specialist in [specific area].
Expert 3: [Name], a well-regarded [specific area] expert.
Task: Given the problem [insert specific problem], your goal is to collaboratively discuss and solve it step-by-step, ensuring that the solution is accurate and well-reasoned.
Discussion Flow:
Each expert will present one step of their thinking.
After each step, the other experts will critique and provide feedback.
If an expert realizes a mistake in their reasoning, they should correct it or step back.
Final Output: Once the discussion is complete, collate the final solution and present it in a clear and structured format.
Example Start:
Expert 1: [Initial thought or step].
Expert 2: [Critique or support of Expert 1's point].
Expert 3: [Additional insight or alternative view].
Goal: The objective is to leverage diverse perspectives to arrive at the most robust and accurate solution to the problem.
<김씨, 이씨, 박씨의 세명의 전문가를 설정하고, 템플릿을 약간 구체화(AI/ML 도메인 및 한국어 사용 등)한 뒤, 위 질문 글의 내용을 입력하여 프롬프트를 실행>
Discussion on the Issue with DataLoader and Custom Dataset
Step 1: Initial Analysis and Hypothesis by Expert 1 (김씨)
김씨: "코드와 에러 메시지를 보면, DataLoader에서 num_workers를 2로 설정했을 때 발생하는 문제로 보입니다. 이 문제는 다중 프로세싱에서 발생할 수 있는 오류일 가능성이 높습니다. 특히, Dataset 클래스 내부에서 데이터를 torch.Tensor로 변환할 때 GPU 메모리에 직접 올리는 부분에서 문제가 발생할 수 있습니다."
Step 2: Critique and Additional Insight by Expert 2 (이씨)
이씨: "김씨의 지적에 동의합니다. GPU 메모리에 데이터를 올리는 작업이 여러 프로세스에서 동시에 수행되면서 충돌이 발생할 수 있습니다. 이 문제를 해결하기 위해서는 getitem 메서드 내에서 데이터를 GPU로 옮기는 작업을 지양하고, 대신 DataLoader로부터 데이터를 받아 모델에 입력하기 직전에 GPU로 옮기는 방식으로 수정해야 합니다."
Step 3: Further Analysis and Alternative Solution by Expert 3 (박씨)
박씨: "두 분의 의견에 공감합니다. 추가적으로, Dataset 클래스의 init 메서드와 len, getitem 메서드에서 몇 가지 수정이 필요해 보입니다. 특히, 클래스 초기화 부분과 변수명이 일관되지 않은 부분을 정리하고, __getitem__에서 잘못된 변수명을 수정해야 합니다."
Final Solution Collation
김씨, 이씨, 박씨: "우리는 데이터 로딩 중 발생하는 문제를 해결하기 위해 다음과 같이 코드를 수정해야 합니다."
__getitem__ 메서드에서 GPU로 데이터를 옮기는 부분을 제거합니다.
__init__ 메서드와 변수명을 일관성 있게 수정합니다.
__getitem__ 메서드에서 잘못된 변수명을 수정합니다.
수정된 코드:
import torch
from torch.utils.data import Dataset, DataLoader
class CustomDatasetData(Dataset):
def __init__(self):
self.x_in, self.X_in = x_in.copy(), X_in.copy()
self.xin_initi= x_in_initi.copy()
self.yin_initi = y_in_initi.copy()
self.xin_data = x_in_data.copy()
self.yin_data = y_in_data.copy()
self.xin_random, self.Xin_random = x_in_collocation.copy(), X_in_collocation.copy()
def __len__(self):
return self.xin_random.shape[0]
def __getitem__(self, idx):
xin = torch.tensor(self.x_in[idx % self.x_in.shape[0]], dtype=torch.float)
Xin = torch.tensor(self.X_in[idx % self.X_in.shape[0]], dtype=torch.float)
xin_initi = torch.tensor(self.xin_initi[idx % self.xin_initi.shape[0]], dtype=torch.float)
yin_initi = torch.tensor(self.yin_initi[idx % self.yin_initi.shape[0]], dtype=torch.float)
xin_data = torch.tensor(self.xin_data[idx % self.xin_data.shape[0]], dtype=torch.float)
yin_data = torch.tensor(self.yin_data[idx % self.yin_data.shape[0]], dtype=torch.float)
xin_random = torch.tensor(self.xin_random[idx % self.xin_random.shape[0]], dtype=torch.float)
Xin_random = torch.tensor(self.Xin_random[idx % self.Xin_random.shape[0]], dtype=torch.float)
xin_random_data = (xin_random, Xin_random)
xin_data = (xin_data, yin_data)
xint_data = (xin, Xin)
xin_initial_data = (xin_initi, yin_initi)
return xin_data, xin_initial_data, xint_data, xin_random_data
# GPU로 데이터를 옮기는 작업은 DataLoader에서 데이터를 받을 때 수행합니다.
dataloader_data = DataLoader(CustomDatasetData(), batch_size=1000, shuffle=True, num_workers=2)
for batch in dataloader_data:
xin_data, xin_initial_data, xint_data, xin_random_data = batch
xin_data = (xin_data[0].cuda(), xin_data[1].cuda())
xin_initial_data = (xin_initial_data[0].cuda(), xin_initial_data[1].cuda())
xint_data = (xint_data[0].cuda(), xint_data[1].cuda())
xin_random_data = (xin_random_data[0].cuda(), xin_random_data[1].cuda())
# 모델 훈련 또는 추론 코드
이 수정된 코드로 DataLoader가 올바르게 작동하고, 여러 개의 worker를 사용하여 성능을 최적화할 수 있을 것입니다.
출처 : https://discuss.pytorch.kr/t/poe-panel-of-experts/4451
결론
Panel-of-Experts(PoE) 기법은 복잡한 문제를 해결할 때 모델의 성능을 크게 향상시킬 수 있는 효과적인 방법입니다. 특히, 단순한 논리 흐름을 넘어 다양한 관점을 활용해 문제를 분석하고 해결책을 찾는 방식은 기존의 생각의 사슬(CoT) 방식보다 훨씬 깊이 있는 해결책을 제공할 수 있습니다. Sourcery와 같은 여러 회사들이 이 접근 방식을 활용해 실제로 LLM의 성능을 크게 향상시킨 사례도 있습니다.
프롬프트 엔지니어링은 복잡한 문제 해결에서 매우 중요한 역할을 하며, PoE와 같은 새로운 접근 방식들은 LLM을 보다 강력한 도구로 발전시키는 데 큰 기여를 하고 있습니다. 여러분도 다양한 프롬프트 기법을 활용해 LLM의 성능을 극대화해 보시기 바랍니다.
'인공지능' 카테고리의 다른 글
Tree of Thoughts: 인공지능의 새로운 문제 해결 패러다임 (0) | 2024.12.05 |
---|---|
RAGCache: 대형 언어 모델(LLM) 시대의 성능 최적화를 위한 지식 캐싱의 혁신적 접근 (0) | 2024.12.04 |
차세대 AI 에이전트의 시작, OpenAI의 Operator가 온다! (0) | 2024.12.04 |
Cosmopedia: 대규모 사전 훈련 데이터셋 구축 방법론 (0) | 2024.12.02 |
LLM-as-a-Judge: AI를 이용한 AI 평가 (0) | 2024.12.02 |