RAG2026-5일9차시 · 임베딩 이해15 / 19← 이전목차다음 →MetaContents

9차시. 임베딩 이해

실습 1 — 임베딩 이해 실습 따라 하기

관련 수업 자료: 9차시 「4. 실습 ① — 벡터를 직접 눈으로 보기」(9쪽), 9차시 「5. 실습 ② — 유사도 직접 재보기」(10쪽), 9차시 「6. 실습 ③ — 내 기준선 찾기」(12~13쪽) · 실습 코드 09/embed_look.py, 09/similarity.py, 09/find_threshold.py

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

수업 자료와 이어지는 곳

실습 코드원본 PDF이어지는 내용
09/embed_look.py9쪽9차시 「4. 실습 ① — 벡터를 직접 눈으로 보기」 아래에 실었습니다
09/similarity.py10쪽9차시 「5. 실습 ② — 유사도 직접 재보기」 아래에 실었습니다
09/find_threshold.py12~13쪽9차시 「6. 실습 ③ — 내 기준선 찾기」 아래에 실었습니다

실행 흐름

출력
문장 A → 임베딩 모델
문장 B → 임베딩 모델
임베딩 모델 → 벡터 A
임베딩 모델 → 벡터 B
벡터 A → 코사인 유사도
벡터 B → 코사인 유사도
코사인 유사도 → 임계값 이상

실습 순서

실습/src/09에서 키가 있을 때 embed_look.py, similarity.py, find_threshold.py 순서로 실행합니다. 관련 질문 5개와 무관 질문 5개의 점수 사이를 임계값 후보로 적습니다.

스스로 확인

  • 임베딩을 좌표로 설명할 수 있는가?
  • 코사인 유사도가 각도를 본다는 점을 말할 수 있는가?
  • 모델을 바꾸면 인덱스를 왜 다시 만드는가?

코드 설명

  • emb.embed_query(문장) 은 문장 하나를 숫자 1536개짜리 리스트로 바꿉니다. 부를 때마다 OpenAI 서버에 요청이 가므로, similarity.py는 쌍 다섯 개에 열 번 요청합니다.
  • np.dot(vector1, vector2) / (length1 * length2) 가 코사인 유사도의 정의 그대로입니다. np.linalg.norm 은 벡터의 길이를 구합니다. 길이로 나누기 때문에 문장이 길든 짧든 방향만 남습니다.
  • return float(similarity) 는 numpy 숫자를 보통 파이썬 숫자로 바꿉니다. 그래야 {score:.4f} 같은 형식 지정이나 min, max 를 편하게 씁니다.
  • find_threshold.py의 (min_related + max_unrelated) / 2 는 관련 질문 중 가장 낮은 점수와 무관 질문 중 가장 높은 점수의 한가운데입니다. 두 값이 뒤집혀 있으면 질문 목록이나 문서를 다시 살펴봐야 합니다.
  • 실행 결과 샘플에 숫자가 없는 것은 API 키 없이 기록했기 때문입니다. 유사도 숫자는 모델과 시점에 따라 달라지니, 수업 자료의 0.782 같은 값과 똑같지 않아도 정상입니다. 여기서 많이들 걱정하십니다.
← 이전 절9차시 · 체크리스트와 과제다음 절 →9차시 · 퀴즈 1 — 임계값으로 관련 여부 판단하기