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.py | 9쪽 | 9차시 「4. 실습 ① — 벡터를 직접 눈으로 보기」 아래에 실었습니다 |
09/similarity.py | 10쪽 | 9차시 「5. 실습 ② — 유사도 직접 재보기」 아래에 실었습니다 |
09/find_threshold.py | 12~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 같은 값과 똑같지 않아도 정상입니다. 여기서 많이들 걱정하십니다.