RAG2026-5일8차시 · 첫 번째 RAG 실습15 / 19← 이전목차다음 →MetaContents

8차시. 첫 번째 RAG 실습

실습 1 — 첫 번째 RAG 실습 실습 따라 하기

관련 수업 자료: 8차시 「7. 실습 ③ — 답변 생성 붙이기」(13~14쪽) · 실습 코드 08/first_rag.py, 08/test_rag.py

이 실습은 교안 해설(08_첫번째RAG실습.md)의 실습 순서를 옮긴 것입니다. OpenAI 임베딩이나 채팅 모델을 부르는 파일은 .env 에 API 키가 있어야 돌아갑니다. 키가 없으면 실행 결과 샘플로 출력 모양을 확인합니다.

수업 자료와 이어지는 곳

실습 코드원본 PDF이어지는 내용
08/first_rag.py13~14쪽8차시 「7. 실습 ③ — 답변 생성 붙이기」 아래에 실었습니다
08/test_rag.py13~14쪽8차시 「7. 실습 ③ — 답변 생성 붙이기」 아래에 실었습니다

실행 흐름

출력
읽기 분할 저장 한번 → 질문
질문 → FAISS 검색
FAISS 검색 → 근거 프롬프트
근거 프롬프트 → ChatOpenAI
ChatOpenAI → 답과 출처

실습 순서

키가 있으면 실습/src/08에서 python first_rag.py 다음 python test_rag.py를 실행합니다. 질문 네 종류를 준비합니다. 문서에 있는 질문, 표현만 바꾼 질문, 문서에 없는 질문, 환불과 교환을 함께 묻는 질문.

키가 없으면 파일 하단 예시를 읽고, 인덱싱이 질문 함수 밖에 있는지 코드에서 확인합니다.

스스로 확인

  • 인덱싱과 질의를 코드에서 가리킬 수 있는가?
  • 없으면 없다고 말하라는 문장이 어디에 있는가?
  • 검색 결과 없이 답을 쓰면 어떤 일이 생기는가?

코드 설명

  • FAISS.from_documents(chunks, emb) 는 조각마다 임베딩을 구해 색인에 넣는 한 줄입니다. 비용과 시간이 드는 곳이 여기라서 ask 밖에 둡니다. ask 안으로 옮기면 질문마다 이 작업이 되풀이됩니다.
  • store.similarity_search(question, k=k) 는 질문도 같은 모델로 임베딩한 뒤, 가까운 조각 k개를 Document 목록으로 돌려줍니다. 결과에 점수는 없습니다.
  • llm.invoke(prompt) 는 문자열이 아니라 응답 객체를 돌려줍니다. 답의 글자는 .content 로 꺼냅니다.
  • ChatOpenAI(..., temperature=0) 은 답을 되도록 일정하게 만듭니다. 값이 높으면 자료에 없는 내용을 지어낼 가능성이 커집니다.
  • 출력의 <function basename at 0x...>2 는 6차시 ingest.py가 os.path.basename 을 괄호 없이 넣은 탓에 파일명 대신 함수가 찍힌 것입니다. 같은 쪽이 세 번 나오는 것은 한 쪽이 여러 조각으로 나뉘었기 때문이고, 정상입니다.
  • test_rag.py의 ask 는 출력하지 않고 return answer, found 로 두 값을 돌려줍니다. 검색 결과가 없으면 값 없이 return 하므로 answer, found = ask(question) 에서 오류가 납니다. 여기서 많이들 헷갈리십니다.
← 이전 절8차시 · 체크리스트와 과제다음 절 →8차시 · 퀴즈 1 — 자료가 없을 때 거절 문장 돌려주기