LLM 엔지니어링6장 · RAG 의 원리와 로컬 모델로 옮기기8 / 23← 이전목차다음 →MetaContents

6장. RAG 의 원리와 로컬 모델로 옮기기

근거를 붙인 프롬프트

새 상담원에게 손님 응대를 맡기면서 규정 메모를 쥐여 준다고 해 봅시다. "이 메모에 적힌 대로만 답하고, 메모에 없으면 지어내지 말고 확인해 드리겠다고 하세요"라고 일러 둡니다. 근거를 붙인 프롬프트가 이 메모와 당부입니다.

시스템 지시, 문서 조각, 질문의 세 부분으로 짠 RAG 프롬프트의 생김새

1번 시스템 지시에서 역할과 규칙(문서만 보고 답하기, 없으면 모른다고 하기)을 정합니다. 2번에 검색한 문서 조각을 [문서] 아래 붙이고, 3번에 손님의 질문을 [질문] 아래 둡니다. 점선 상자 둘(문서 조각과 질문)은 질문마다 바뀌는 부분이고, 시스템 지시는 늘 같습니다. 여기서 메모가 문서 조각, 당부가 시스템 지시입니다.

프롬프트의 부분

부분넣는 것빠지면
역할"당신은 쇼핑몰 상담원입니다"말투와 답의 범위가 흔들린다
근거 규칙"[문서]에 적힌 내용만 근거로"모델이 아는 척 지어낸다
모를 때의 말"없으면 '문서에서 찾지 못했습니다.'"없는 내용도 답해 버린다
문서 조각검색한 조항 k 개RAG 가 아니다
질문손님의 질문 그대로

메시지로 만들기

3장부터 쓴 채팅 메시지 목록에 그대로 담습니다.

Python
SYSTEM = ("당신은 쇼핑몰 상담원입니다. 아래 [문서]에 적힌 내용만 근거로 짧게 답하세요. "
          "문서에 답이 없으면 '문서에서 찾지 못했습니다.'라고만 답하세요.")

def build_messages(question, found):
    """found: 검색한 문서 조각 목록. 시스템 지시 + [문서] + [질문] 꼴의 메시지를 만든다."""
    context = "\n".join(found)
    user = f"[문서]\n{context}\n\n[질문]\n{question}"
    return [{"role": "system", "content": SYSTEM}, {"role": "user", "content": user}]

msgs = build_messages("쿠폰을 두 장 쓸 수 있나요?", ["제16조(쿠폰) 주문 하나에 쿠폰은 한 장만 쓸 수 있습니다."])
print(msgs[1]["content"])

user 메시지가 [문서], 조항 한 줄, 빈 줄, [질문], 질문 순서로 만들어집니다. 실습 4부터 이 함수를 그대로 씁니다.

코드에 나오는 함수

코드쉬운 뜻
SYSTEM = (...)늘 같은 시스템 지시다. 괄호 안에 글자 두 덩어리를 나란히 쓰면 파이썬이 하나로 이어 붙인다
"\n".join(found)찾은 조각 여러 개를 줄바꿈으로 이어 한 글로 만든다
{"role": "system", "content": ...}채팅 메시지 하나다. role(역할)은 누가 한 말인지, content(내용)는 그 말이다
msgs[1]["content"]두 번째 메시지(user)의 내용만 꺼낸다

이 코드가 뜻하는 것

새 상담원에게 건네는 쪽지 두 장을 만드는 일입니다. 한 장에는 늘 같은 당부(시스템 지시)를, 다른 한 장에는 이번 손님에 맞는 규정 메모와 손님의 질문을 적습니다.

줄하는 일쉽게 말하면
context = "\n".join(found)찾은 조항들을 한 덩어리 글로 만든다규정 메모를 한 장에 모아 적는다
user = f"[문서]\n...[질문]\n..."[문서] 아래 조항, [질문] 아래 질문을 둔다메모 아래에 손님 질문을 적는다
return [...]system 메시지와 user 메시지 두 개로 된 목록을 돌려준다당부 쪽지와 메모 쪽지를 함께 건넨다
msgs = build_messages(...)쿠폰 질문과 쿠폰 조항으로 메시지를 만든다이번 손님용 쪽지를 만든다
print(msgs[1]["content"])user 메시지의 내용을 찍는다메모 쪽지를 읽어 본다

결과에는 [문서] 아래 쿠폰 조항 한 줄, [질문] 아래 "쿠폰을 두 장 쓸 수 있나요?"가 나옵니다. 모델은 이 글과 시스템 지시를 함께 받아, 조항에 적힌 "한 장만"을 보고 답하게 됩니다.

주의할 점

  • "모를 때의 말"을 너무 세게 적으면, 답이 문서에 있는데도 "찾지 못했습니다"로 피하는 지나친 거절이 늘어납니다. 반대로 약하게 적으면 지어냅니다. 프로젝트에서 두 문구를 견줍니다.
  • 문서 조각 안에 "앞의 지시를 무시하라" 같은 글이 섞여 있으면 모델이 그 말을 따를 수 있습니다(프롬프트 주입). 믿을 수 있는 문서만 넣고, 20장의 안전 장치에서 다시 다룹니다.
← 이전 절6장 · 키워드 검색다음 절 →6장 · 외부 API 로 만드는 RAG