들어가며

랭체인과 랭그래프로 구현하는 RAG·AI 에이전트 실전 입문Prompt Engineering Guide 을 읽고 요약한 글입니다.


프롬프트 엔지니어링이란?

LLM으로부터 원하는 출력을 얻기 위해 입력하는 프롬프트를 설계하거나 최적화하는 것

프롬프트 엔지니어링 vs 파인튜닝

  • 프롬프트 엔지니어링은 모델의 가중치를 변경하지 않고 입력(프롬프트)을 조정하여 출력을 제어하는 반면, 파인튜닝은 특정 데이터셋으로 모델을 추가 학습시켜 모델의 가중치 자체를 미세 조정하는 과정입니다. 파인튜닝은 더 많은 비용과 데이터가 필요하지만 특정 작업에 고도로 전문화된 모델을 만들 수 있습니다.

프롬프트의 구성 요소

  • 지시(Instruction): 모델이 수행해야 할 작업에 대한 구체적인 설명
  • 맥락(Context): 모델이 더 나은 응답을 생성하는 데 도움이 되는 배경 정보 또는 추가 정보
  • 입력 데이터(Input Data): 모델이 처리해야 할 정보 또는 질문
  • 출력 지시어(Output Indicator): 생성할 출력의 유형이나 형식을 지정

프롬프트 엔지니어링 기법

Zero-shot

  • 예제나 데이터를 모델에게 미리 학습시키지 않고, 모델의 사전 학습 지식만을 활용해 새로운 작업을 수행하는 방법
  • 모델이 특정 도메인이나 작업에 대해 특별히 훈련되지 않았을 때 사용되며, 다양한 작업에 모델의 일반화 능력을 테스트하는 데 유용함.

프롬프트 예시

주어진 텍스트를 긍정, 부정, 중립 중 하나로 분류하세요.
텍스트: 휴가는 괜찮을 것 같아요.
감정:

출력 예시

중립

Few-shot

  • 모델이 더 나은 성능을 내도록 프롬프트에 몇 가지 시연(demonstration) 또는 예시를 포함하는 기법.
  • 예시를 통해 모델은 작업의 맥락, 형식, 요구사항을 학습하여 더 복잡하고 새로운 작업에 빠르게 적응할 수 있음.

프롬프트 예시

Task: Correct the grammar of the following sentences.

Example 1:
Incorrect: She go to the store.
Correct: She goes to the store.

Example 2:
Incorrect: They is happy.
Correct: They are happy.

Now, correct the following sentence:
Incorrect: We was playing soccer.
Correct:

출력 예시

We were playing soccer.

Self-Consistency

  • 하나의 프롬프트에 대해 여러 개의 다양한 추론 경로를 생성하게 한 후, 그중 가장 일관된(가장 많이 나온) 답변을 최종 결과로 선택하는 기법.
  • 단순한 탐욕적 디코딩(greedy decoding)을 대체하여, 산술이나 상식 추론 문제의 성능을 향상시킴.

프롬프트 예시

Q: 제가 6살 때 제 여동생은 제 나이의 절반이었습니다. 지금 저는 70살입니다. 제 여동생은 몇 살일까요?
A:

출력 예시

*생성 1:* 제가 6살 때 여동생은 제 나이의 절반이었으므로 3살이었습니다. 지금 제가 70살이니, 여동생은 70 - 3 = 67살입니다. 답은 67입니다.

*생성 2:* 화자가 6살일 때 그의 여동생은 그의 나이의 절반인 3살이었습니다. 이제 화자가 70살이므로, 그의 여동생은 70 - 3 = 67세가 될 것입니다. 답은 67입니다.

*생성 3:* 제가 6살 때 여동생은 제 나이의 절반이었으므로 3살이었습니다. 지금 저는 70살이니, 여동생은 70/2 = 35살입니다. 답은 35입니다.

-> 최종 답변: 여러 추론 과정 중 다수를 차지한 67이 최종 답변으로 선택됩니다[14].

Generate Knowledge Prompting

  • 모델에게 먼저 과업과 관련된 유용한 지식을 생성하도록 요청한 다음, 이 지식을 활용하여 원래의 질문에 답하게 하는 2단계 기법.
  • 복잡한 질문에 대해 모델이 더 깊이 있는 맥락을 이해하고 정확한 답변을 생성하도록 유도함.

프롬프트 예시

# 1단계: 지식 생성
Question: 뉴욕에서 런던으로 가는 항공편이 취소된 경우 재예약 옵션은 무엇인가요?
Knowledge: 뉴욕에서 출발하는 승객에 대한 현재 영국 여행 제한 사항과 뉴욕에서 런던으로 가는 다음 항공편의 이용 가능 여부를 확인하세요.

# 2단계: 지식 통합 및 답변 생성
Knowledge: "현재 영국 여행 제한으로 인해 일부 항공편만 운항이 허용됩니다. 뉴욕에서 런던으로 가는 다음 이용 가능한 항공편은 [날짜]입니다."
User Query: 항공편이 취소된 승객을 위한 재예약 옵션은 무엇인가요?

출력 예시

현재 영국 여행 제한으로 인해 항공편 운항이 제한적입니다. 이용 가능한 다음 항공편은 [날짜]이며, 해당 항공편으로 재예약하시거나 전액 환불을 받으실 수 있습니다. 자세한 사항은 항공사 고객 서비스 센터로 문의해 주시기 바랍니다.

Prompt Chaining

  • 복잡한 작업을 여러 개의 논리적인 하위 작업으로 분해하고, 각 단계를 순차적으로 처리하는 기법.
  • 한 프롬프트의 출력이 다음 프롬프트의 입력으로 사용되어, 전체적인 작업의 신뢰성과 투명성을 높임.

프롬프트 예시

# 프롬프트 1: 고객 리뷰에서 핵심 제품과 감정 추출
고객 리뷰: "새로 산 XYZ 스마트폰 카메라는 정말 놀랍지만, 배터리가 너무 빨리 닳아서 실망스러워요."
이 리뷰에서 언급된 제품 기능과 각각에 대한 긍정/부정 감정을 추출해줘.

# 프롬프트 2: 추출된 정보를 바탕으로 요약문 생성
(프롬프트 1의 출력) 제품 기능: 카메라(긍정), 배터리(부정)
위 정보를 바탕으로 고객 피드백을 한 문장으로 요약해줘.

출력 예시

XYZ 스마트폰은 카메라 성능에 대해서는 긍정적인 평가를 받았지만, 배터리 수명에 대해서는 부정적인 피드백이 있습니다.

Tree of Thoughts

  • '사고의 연쇄(CoT)'를 일반화하여, 문제 해결 과정에서 단일 경로가 아닌 여러 추론 경로를 트리 형태로 탐색하는 기법.
  • 모델은 각 단계에서 여러 가능한 '생각(thoughts)'을 생성하고 평가하여 최적의 해결책을 찾아 나감.

프롬프트 예시

문제: 숫자 4, 9, 10, 13을 사용하여 정확히 24를 만드는 수식을 찾아라. 각 숫자는 한 번씩만 사용해야 한다.
생각 생성: 이 문제를 해결하기 위한 첫 단계로 가능한 연산들을 떠올려보자.
- 10 - 4 = 6. 남은 숫자 9, 13. 6, 9, 13으로 24를 만들 수 있을까?
- 13 - 9 = 4. 남은 숫자 4, 10. 4, 4, 10으로 24를 만들 수 있을까?
- ...

출력 예시

(10 - 4) * (13 - 9) = 6 * 4 = 24. 답은 (10-4)*(13-9)입니다.

Retrieval Augmented Generation (RAG)

  • LLM의 학습 데이터 외부의 신뢰할 수 있는 지식 베이스(예: 데이터베이스, 문서)에서 관련 정보를 검색(Retrieve)하고, 이 정보를 프롬프트에 추가하여 답변을 생성(Generate)하는 기법.
  • 모델이 최신 정보나 특정 도메인 지식을 참조하여 더 정확하고 신뢰성 있는 답변을 생성하게 함.

프롬프트 예시

# 1단계: 정보 검색
사용자 질문: "연차 휴가가 얼마나 남았나요?"
시스템: (인사 데이터베이스에서 '홍길동'의 연차 정책 문서와 과거 휴가 기록을 검색)

# 2단계: 프롬프트 증강 및 답변 생성
증강된 프롬프트:
- 검색된 정보: "홍길동의 연간 연차는 15일이며, 올해 5일을 사용했습니다."
- 사용자 질문: "연차 휴가가 얼마나 남았나요?"
LLM, 위 정보를 바탕으로 질문에 답하세요.

출력 예시

귀하의 연차 휴가는 총 15일 중 5일을 사용하셨으며, 현재 10일이 남아있습니다.

Automatic Reasoning and Tool-use (ART)

  • 새로운 작업에 대해 LLM이 스스로 추론 단계를 나누고, 각 단계에 필요한 외부 도구(예: 검색 엔진, 코드 실행기)를 자동으로 선택하고 사용하는 프레임워크.
  • 작업 라이브러리에서 유사한 작업 예시를 참조하여 few-shot 방식으로 문제 분해 및 도구 사용법을 학습함.

프롬프트 예시

질문: 에펠탑이 있는 나라의 현재 대통령은 누구이며, 그 나라 인구의 제곱근은 얼마인가?

# ART 시스템의 자동 생성 계획:
1. "에펠탑이 있는 나라"가 어디인지 검색 도구를 사용해 찾아라.
2. 1번 결과로 나온 나라의 "현재 대통령"이 누구인지 검색 도구를 사용해 찾아라.
3. 1번 결과로 나온 나라의 "현재 인구"를 검색 도구를 사용해 찾아라.
4. 3번 결과로 나온 인구 수에 대해 "제곱근"을 계산기 도구를 사용해 계산하라.
5. 2번과 4번의 결과를 조합하여 최종 답변을 생성하라.

출력 예시

에펠탑이 있는 나라인 프랑스의 현재 대통령은 에마뉘엘 마크롱이며, 프랑스 인구(약 6,500만 명)의 제곱근은 약 8062입니다.

Automatic Prompt Engineer (APE)

  • 효과적인 프롬프트를 사람이 직접 설계하는 대신, LLM을 사용하여 주어진 작업에 대한 최적의 프롬프트를 자동으로 생성하고 선택하는 기법.
  • 초기 지침을 바탕으로 다양한 후보 프롬프트를 생성하고, 점수를 매겨 가장 성능이 좋은 프롬프트를 최종적으로 채택함.

프롬프트 예시

# 초기 목표
주어진 문장의 감정을 분석하는 프롬프트를 만들어라.

# APE가 생성한 후보 프롬프트들
1. 이 문장은 긍정적인가, 부정적인가, 중립적인가?
2. 다음 텍스트의 감정 톤을 평가하라.
3. 주어진 텍스트를 [긍정, 부정, 중립] 중 하나로 분류하세요.
...

# APE의 선택
(내부 평가 후) 3번 프롬프트가 가장 명확하고 높은 성능을 보이므로 최종 프롬프트로 선택.

출력 예시

"주어진 텍스트를 [긍정, 부정, 중립] 중 하나로 분류하세요."

Active-Prompt

  • 어떤 예시가 모델에게 가장 유용한지(가장 불확실한지)를 식별하여 해당 예시에 대해서만 사람의 주석(annotation)을 요청하는 기법.
  • 이렇게 수집된 소수의 중요한 예시들을 활용하여 few-shot 프롬프트를 구성함으로써, 최소한의 비용으로 모델 성능을 극대화함.

프롬프트 예시

# 1단계: 불확실한 질문 식별
모델에게 여러 질문을 제시하고, 어떤 질문이 가장 답변하기 어려운지(불확실성이 높은지) 스스로 평가하게 함.

# 2단계: 주석 요청 및 프롬프트 구성
가장 불확실하다고 판단된 질문에 대해 사람에게 정답을 요청하고, 이 (질문, 정답) 쌍을 few-shot 예시로 프롬프트에 추가함.

출력 예시

(Active-Prompt로 구성된 예시가 포함된 프롬프트를 통해 더 정확하고 일관된 답변을 생성)

Directional Stimulus Prompting

  • 모델이 원하는 결과물을 생성하도록 유도하기 위해, 프롬프트에 특정 키워드, 힌트, 단서와 같은 '방향성 자극'을 포함시키는 기법.
  • 결과물의 주제, 스타일, 포함될 내용 등을 명시적으로 지정하여 모델의 창의성을 특정 방향으로 이끌어 줌.

프롬프트 예시

미래 도시의 외로운 탐정에 대한 짧은 이야기를 써줘. 이야기에 '네온', '비', '사이보그', '음모'라는 단어를 반드시 포함해줘.

출력 예시

자정의 비가 거리를 적시자, 도시의 네온 불빛이 젖은 아스팔트 위에서 번져나갔다. 탐정 잭은 낡은 트렌치코트 깃을 올렸다. 이번 사건은 단순한 실종이 아니었다. 거대 기업의 음모가 숨 쉬고 있었고, 그 중심에는 기억을 잃은 사이보그 증인이 있었다.

Program-Aided Language Models (PAL)

  • 자연어(LLM)와 프로그래밍 언어(Python 등)를 함께 사용하여 문제를 해결하는 기법.
  • LLM이 문제 해결을 위한 논리적 단계를 자연어로 생각하고, 실제 계산이나 실행은 코드로 작성하여 인터프리터를 통해 수행함.

프롬프트 예시

문제: 카페에서 5달러짜리 커피 3잔과 3달러짜리 베이글 2개를 샀다. 총 얼마를 내야 하는가? 파이썬 코드로 풀어줘.

# LLM의 생각과 코드 생성
# 커피 가격을 계산한다.
coffee_price = 5 * 3
# 베이글 가격을 계산한다.
bagel_price = 3 * 2
# 총액을 계산한다.
total_price = coffee_price + bagel_price

출력 예시

def solution():
    coffee_price = 5 * 3
    bagel_price = 3 * 2
    total_price = coffee_price + bagel_price
    return total_price

# 실행 결과: 21

ReAct

  • 추론(Reason)과 행동(Act)을 번갈아 수행하며 상호작용적으로 작업을 해결하는 프레임워크.
  • 모델은 현재 상태를 기반으로 '생각(Thought)'을 통해 다음 행동 계획을 세우고, 외부 도구(API, 검색 등)를 사용하는 '행동(Action)'을 실행하며, 그 '관찰(Observation)' 결과를 바탕으로 다시 생각함.

프롬프트 예시

질문: '백년의 고독'을 쓴 작가가 태어난 나라의 가장 높은 산은 무엇인가?

Thought 1: 먼저 '백년의 고독'의 작가를 찾아야 한다.
Action 1: Search("author of One Hundred Years of Solitude")
Observation 1: 가브리엘 가르시아 마르케스

Thought 2: 가브리엘 가르시아 마르케스가 태어난 나라를 찾아야 한다.
Action 2: Search("where was Gabriel Garcia Marquez born")
Observation 2: 콜롬비아

Thought 3: 이제 콜롬비아에서 가장 높은 산을 찾아야 한다.
Action 3: Search("highest mountain in Colombia")
Observation 3: 피코 크리스토발 콜론

Thought 4: 답을 찾았으니 종합하여 답변한다.

출력 예시

'백년의 고독'의 작가 가브리엘 가르시아 마르케스가 태어난 나라인 콜롬비아에서 가장 높은 산은 피코 크리스토발 콜론입니다.

Reflexion

  • 잘못된 답변을 생성했을 때, 실패 경험으로부터 스스로 배우고 수정하는 에이전트 프레임워크.
  • 시도(Trial)가 실패하면, '성찰(Reflexion)' 모델이 실패 원인을 분석하고 다음 시도를 위한 구체적인 피드백을 생성하여 에이전트의 기억에 추가함.

프롬프트 예시

# 작업
주어진 파이썬 함수에서 버그를 찾아 수정하라.

# 1차 시도 (실패)
(코드를 잘못 수정하여 테스트 케이스 통과 실패)

# 성찰 과정
"코드를 분석해보니, 인덱스 범위를 잘못 계산하여 'list index out of range' 오류가 발생했다. 반복문의 범위를 n-1이 아닌 n으로 수정해야 한다."

# 2차 시도
(성찰 내용을 바탕으로 코드를 성공적으로 수정)

출력 예시

(버그가 수정된 최종 코드)

Multimodal CoT

  • 텍스트뿐만 아니라 이미지, 오디오 등 여러 양식(modality)의 정보를 통합하여 단계적인 추론(CoT)을 수행하는 기법.
  • 시각적 정보와 텍스트 지시를 함께 이해하고 연관 지어 복잡한 질문에 답할 수 있음.

프롬프트 예시

(이미지로 레스토랑 메뉴판이 주어짐)
질문: 치즈버거와 콜라를 하나씩 주문하면 총 얼마인가요?

# 추론 과정
1. 이미지에서 '치즈버거' 항목을 찾는다. 가격은 8달러이다.
2. 이미지에서 '콜라' 항목을 찾는다. 가격은 2달러이다.
3. 두 가격을 더한다. 8 + 2 = 10.

출력 예시

총 10달러입니다.

Graph Prompting

  • 노드, 엣지 등으로 구성된 그래프 구조의 데이터를 LLM이 이해하고 처리할 수 있도록 프롬프트 형식으로 변환하는 기법.
  • 그래프의 토폴로지(연결 구조)나 속성을 텍스트로 설명하여, 노드 분류, 링크 예측 등 그래프 관련 과업을 수행하게 함.

프롬프트 예시

그래프 정보:
- 노드: Alice, Bob, Charlie
- 엣지: (Alice, Bob), (Bob, Charlie)
이 소셜 네트워크에서 누가 가장 많은 친구를 가지고 있는가?

# 추론 과정
Alice는 Bob과 연결되어 있다 (친구 1명).
Bob은 Alice와 Charlie와 연결되어 있다 (친구 2명).
Charlie는 Bob과 연결되어 있다 (친구 1명).
따라서 Bob이 가장 많은 친구를 가지고 있다.

출력 예시

Bob

출처

profile
NLP 일짱이 되겠다.

0개의 댓글