30차시. 질의 재작성 및 재검색
4. 실습 ① — Rewrite 프롬프트
출처: 원본 PDF 30차시_재작성노드실습.pdf 8쪽 · 쪽 그림 8쪽
📝 prompts.py에 추가
REWRITE_PROMPT = ChatPromptTemplate.from_template(
"당신은 문서 검색을 돕는 질의 재작성 전문가입니다.\n"
"아래 질문으로 문서를 검색했지만 관련 자료를 찾지 못했습니다.\n"
"검색이 더 잘 되도록 질의를 다시 작성하십시오.\n\n"
"[원본 질문]\n{question}\n\n"
"[이미 시도한 질의 - 반복하지 마십시오]\n{tried}\n\n"
"[실패 이유]\n{reason}\n\n"
"[재작성 규칙]\n"
"1. 일상적 표현을 문서에서 쓸 법한 공식 용어로 바꾸십시오.\n"
" 예) 반품 -> 환불 / 택배비 -> 배송비 / 비번 -> 비밀번호\n"
"2. 구어체를 문어체로 바꾸십시오.\n"
"3. 군더더기를 빼고 핵심 명사 위주로 3~8단어로 압축하십시오.\n"
"4. 원본의 의미를 바꾸지 마십시오.\n"
"5. 이미 시도한 질의와 다르게 작성하십시오.\n\n"
"[출력 - 재작성된 질의만 한 줄로. 다른 말 금지]"
)⚠️ 규칙 4번이 가장 중요합니다
"원본의 의미를 바꾸지 마십시오"
이게 없으면 LLM이 질문을 확대 해석합니다.
"반품 언제까지?" → "환불 및 교환 규정 전반"
→ 엉뚱한 문서가 검색됩니다
재작성은 표현만 바꾸는 것이지
질문의 범위를 넓히는 것이 아닙니다.
4-1) tried 목록이 필요한 이유
🔁 같은 재작성이 반복되는 문제
1회차 재작성: "환불 신청 기한" → 실패
2회차 재작성: "환불 신청 기한" → 똑같음!
LLM은 같은 입력에 같은 출력을 냅니다(temperature=0).
그래서 이미 시도한 질의를 알려주고
"다르게 써라"고 지시해야 합니다.
이를 위해 State에 tried_queries를 누적합니다.
18차시에서 배운 Reducer가 여기서 쓰입니다.