6장. 문서 기반 챗봇
정리
- RAG 는 질문과 관련된 문서 조각을 먼저 찾아 프롬프트에 넣고 그 조각으로 답하게 하는 방법입니다. 모델을 다시 가르치지 않고, 문서만 바꿔 다시 색인하면 새 규정을 반영합니다.
- 파이프라인은 문서가 바뀔 때 한 번 하는 색인 단계(읽기 → 나누기 → 임베딩 → 저장)와 질문마다 하는 질문 단계(질문 임베딩 → 검색 → 프롬프트에 넣기 → 답)로 나뉩니다.
PyPDFLoader는 PDF 를 쪽마다Document로 읽고metadata에 쪽 번호를 남깁니다. 실습 1에서 약관 4쪽(모두 1,818자, 조항 16개)의 모든 쪽 첫 줄이 같은 머리글이었습니다.- 글자 수로 자르면 작을수록 뜻이 잘리고 클수록 조항이 섞입니다. 실습 2에서 크기 200 의 조각 12개 가운데 8개에 조항이 둘 이상 섞였고, 머리글을 지우고 조항 단위로 나누자 16개 조각 모두 조항 하나씩이 되었습니다.
- 임베딩은 글을 숫자 목록(화살표)으로 바꾸고, FAISS 는 질문의 화살표와 거리가 가까운 조각 k 개를 찾습니다. 점수는 거리라서 작을수록 가깝고, 길이가 1 인 화살표에서는 거리의 제곱 = 2 - 2 × 방향 닮음입니다.
- 연습용
BigramEmbeddings로는 전처리만으로 1위 적중이 6 에서 8 로(12개 가운데) 올랐지만, 강아지·아이 요금처럼 낱말이 다른 질문 넷은 놓쳤습니다. 실습 5의 예상 출력에서 진짜 임베딩은 이 넷을 찾았습니다. - 찾아서 답하는 체인은 옛 방식
RetrievalQA(langchain_classic)와 지금 방식 LCEL 로 짤 수 있습니다. 출처는 코드가metadata에서 붙이고, 약관에 없는 질문은 프롬프트 규칙과 거리 문턱으로 "찾지 못했습니다"라고 답하게 합니다.