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.py | 13~14쪽 | 8차시 「7. 실습 ③ — 답변 생성 붙이기」 아래에 실었습니다 |
08/test_rag.py | 13~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)에서 오류가 납니다. 여기서 많이들 헷갈리십니다.