day2_practice/rag_chain.pymetadata.pyvectorstore.pyretriever.pyverify_sources.py

RAG 파이프라인: 색인은 한 번, 질의는 질문마다

문서를 잘라 벡터로 바꿔 Chroma에 넣는 색인 단계와, 질문 하나가 검색 | 프롬프트 | 모델 | 파서 를 지나며 답이 되는 질의 단계를 한 단계씩 따라갑니다. 질문 "연차 이월은 며칠까지 가능한가요?" 가 문자열에서 dict, 메시지, 답 문자열로 모양을 바꾸는 과정을 실제 코드 줄과 함께 봅니다.

한눈에 보는 구조

단계를 넘기면 지금 일하는 부품이 파란 테두리로 표시됩니다
색인 단계 · 문서가 바뀔 때만 한 번 (vectorstore.py) 원본 문서docs/*.md 3편 로드TextLoader 메타데이터 + 청킹load_chunks() → 6개 임베딩embed_documents 벡터 DB · Chromasds_policies · ./chroma_db 청크 + 벡터 + 메타데이터가 디스크에 남습니다. 색인과 질의가 만나는 곳은 여기 하나뿐입니다. 질의 단계 · 질문마다 RunnableParallel ← 45행의 dict retriever"context" · k=3 format_docslist → str RunnablePassthrough()"question" · 받은 그대로 질문str embed_query → 가까운 청크 3개 prompt메시지 2개 llmClaude 파서StrOutputParser 답str 검증: verify.py (RAG 유무 비교) · verify_sources.py (답 + 근거 목록)

이 시점의 데이터

질의 단계에서 값의 모양이 바뀌는 순서

str 질문→ dict {"context": str, "question": str}→ ChatPromptValue (메시지 2개)→ AIMessage→ str 답

가운데의 dict를 만드는 45행만 RAG에서 새로 등장하는 부분이고, 그 뒤의 prompt | llm | StrOutputParser() 는 1일차의 체인과 같습니다. dict의 context 칸은 검색기와 format_docs 를 거친 문자열, question 칸은 질문 원문입니다.

함정과 주의

관련 파일

파일단계하는 일
loaders.py색인TextLoader 로 파일 하나, DirectoryLoader 로 폴더 전체를 Document 리스트로 읽어 보는 확인용 스크립트
metadata.py색인부서·개정일을 붙이고 300자/겹침 50으로 자르는 load_chunks() 정의
vectorstore.py색인청크를 임베딩해 Chroma 컬렉션 sds_policies 에 저장하고 거리 점수와 필터 검색을 확인 (load_db.py 는 사본)
retriever.py질의저장된 DB를 열어 검색기로 만들고 k 값과 MMR에 따른 차이를 관찰
rag_chain.py질의검색기, 프롬프트, 모델, 파서를 이은 RAG 체인. 다른 파일들이 import 해서 재사용
verify.py검증같은 질문을 RAG 없이, RAG로 던져 비교. 문서에 없는 질문 포함
verify_sources.py검증RunnableParallel 로 답과 검색된 근거 문서 목록을 함께 반환
docs/*.md재료연차·재택근무·출장 규정 세 편 (교육용 더미 데이터)