LLM 엔지니어링10장 · MCP 와 Prompt·Context Engineering7 / 22← 이전목차다음 →MetaContents

10장. MCP 와 Prompt·Context Engineering

프롬프트 엔지니어링

식당에서 "맛있는 것 주세요"라고 하면 무엇이 나올지 모릅니다. "맵지 않게, 1인분, 10분 안에 되는 국수"라고 하면 원하는 것이 나옵니다. 같은 요리사(모델)라도 주문(프롬프트)을 또렷하게 하면 더 맞는 결과가 나옵니다.

역할, 할 일, 고를 수 있는 답, 출력 꼴의 네 부분으로 짠 프롬프트를 카드로 놓은 그림

네 카드가 또렷한 프롬프트의 부분입니다. 누구로서 답할지(역할), 무엇을 할지(할 일), 답이 될 수 있는 것의 목록(고를 답), 어떤 꼴로 쓸지(출력 꼴)입니다. 여기서 "맵지 않게, 1인분"이 조건과 출력 꼴입니다.

다듬는 차례

판프롬프트기대
1"이 문의를 분류하세요"모델이 분류 이름을 지어낸다
2+ 고를 수 있는 분류 다섯 개, "이름 하나만 쓰세요"답이 정해진 이름으로 모인다
3+ 분류마다 짧은 설명헷갈리는 문의를 덜 틀린다
4+ 문제와 정답의 예시(퓨샷)예시와 닮은 문의를 잘 맞힌다

프롬프트를 함수로 만들기

Python
LABELS = {"배송": "도착, 송장, 배송지, 해외 배송", "교환반품": "불량, 파손, 다른 상품, 교환과 반품 신청",
          "결제": "카드, 할부, 쿠폰 할인, 환불 금액, 영수증", "회원": "비밀번호, 등급, 적립금, 탈퇴, 수신 설정",
          "기타": "위에 없는 것"}

def build(question, with_desc=True):
    rule = "고객 문의를 " + ", ".join(LABELS) + " 가운데 하나로 분류하세요. 분류 이름 하나만 쓰세요."
    if with_desc:
        rule += "\n" + "\n".join(f"- {k}: {v}" for k, v in LABELS.items())
    return [{"role": "system", "content": rule}, {"role": "user", "content": question}]

print(build("쿠폰을 썼는데 할인이 안 됐어요.")[0]["content"])

시스템 지시에 분류 다섯 개와 분류마다의 설명이 한 줄씩 붙습니다. "쿠폰 할인"을 결제의 설명에 적어 두면, 모델이 "쿠폰"이라는 낱말만 보고 회원으로 보내는 일을 줄일 수 있습니다.

코드에 나오는 함수

코드쉬운 뜻
LABELS = {...}분류 이름 → 그 분류에 드는 것의 설명이다
", ".join(LABELS)사전을 이으면 키만 쓰인다. 분류 이름 다섯 개를 쉼표로 이어 한 줄로 만든다
with_desc=True인자의 기본값이다. 따로 주지 않으면 분류 설명을 붙인다
"\n".join(f"- {k}: {v}" for …)분류마다 "- 이름: 설명" 한 줄을 만들어 줄바꿈(\n)으로 잇는다
{"role": "system", "content": rule}시스템 메시지다. role(역할)이 system 이면 모델이 따를 지시, user 면 사용자의 말이다
build(...)[0]["content"]돌려받은 메시지 목록의 첫째(시스템 메시지)에서 글만 꺼낸다

이 코드가 뜻하는 것

식당에서 주문서를 쓰는 일로 읽어 봅니다. 주문서 위쪽에는 "이 가운데에서 고르세요"라는 메뉴판이 인쇄돼 있고, 메뉴마다 짧은 설명이 붙어 있습니다. 손님의 말은 아래 칸에 적습니다. 여기서 인쇄된 메뉴판과 설명이 시스템 메시지, 손님의 말이 user 메시지, 주문서 양식을 찍어 내는 틀이 build() 함수입니다.

줄하는 일쉽게 말하면
LABELS = {...}분류 다섯 개와 설명을 정한다메뉴판
rule = "고객 문의를 …"고를 수 있는 분류와 "이름 하나만"을 적는다"이 가운데 하나만 고르세요"
if with_desc: rule += ...설명을 원하면 분류마다 한 줄씩 붙인다메뉴마다 짧은 설명
return [system, user]지시와 질문을 메시지 두 개로 돌려준다메뉴판 칸과 손님 말 칸을 채운 주문서

결과는 지시 한 줄과 분류 설명 다섯 줄입니다. with_desc=False 로 부르면 첫 줄만 남으므로, 설명이 있을 때와 없을 때를 같은 함수로 견줄 수 있습니다. 실습 4는 같은 일을 판마다 RULE, DESC 글로 나눠 적어 견줍니다. 프롬프트를 함수로 만들어 두면 판을 바꿔도 질문 묶음 전체에 똑같이 적용됩니다.

주의할 점

  • 프롬프트를 고칠 때마다 같은 시험 묶음으로 잽니다(실습 4). 몇 개 예에서 좋아 보이는 것으로 고르지 않습니다.
  • 퓨샷 예시는 시험 문제와 겹치지 않게 고릅니다. 시험 문제를 예시로 보여 주면 점수가 부풀려집니다.
← 이전 절10장 · MCP 를 쓸 때의 보안다음 절 →10장 · 퓨샷과 출력 꼴 고정