9차시. 임베딩 이해
4. 실습 ① — 벡터를 직접 눈으로 보기
출처: 원본 PDF 09차시_임베딩이해.pdf 9쪽 · 쪽 그림 9쪽
개념만으로는 와닿지 않습니다. 실제 숫자를 봅시다.
📝 src/embed_look.py
from langchain_openai import OpenAIEmbeddings
from dotenv import load_dotenv
load_dotenv()
emb = OpenAIEmbeddings(model="text-embedding-3-small")
vec = emb.embed_query("환불 규정이 궁금합니다")
print("차원 수 :", len(vec))
print("앞 10개 :", [round(v, 4) for v in vec[:10]])
print("최댓값 :", round(max(vec), 4))
print("최솟값 :", round(min(vec), 4))
실행 결과
────────────────────────────────
차원 수 : 1536
앞 10개 : [0.0212, -0.0341, 0.0087, 0.0455, -0.0129,
0.0203, -0.0518, 0.0091, 0.0362, -0.0247]
최댓값 : 0.1183
최솟값 : -0.0994💡 이 숫자들의 의미는?
솔직히 말씀드리면, 사람은 알 수 없습니다.
0.0212가 무엇을 뜻하는지,
3번째 숫자가 어떤 의미 축인지
아무도 해석할 수 없습니다.
하지만 괜찮습니다.
우리에게 필요한 건 "두 벡터가 가까운가"뿐이고,
그건 계산으로 알 수 있으니까요.
실습 코드 · 09/embed_look.py
실습 코드: 실습/src/09/embed_look.py · 위의 원본 PDF 9차시 9쪽 「4️⃣ 실습 ① — 벡터를 직접 눈으로 보기」과 이어집니다.
# ============================================================
# 9차시 | PPT: 09차시_임베딩이해.pptx
# 역할: 질문 한 문장을 embedding(벡터)으로 바꾸고 앞부분만 출력
# 입력: 문장 "환불 규정이 궁금해요"
# 출력: 차원 수, 앞 10개 숫자를 소수 4자리로 반올림한 목록
# 흐름:
# 문장 -> OpenAIEmbeddings.embed_query() -> 숫자 리스트 -> print
# ============================================================
# embedding: 문장을 숫자 목록으로 바꾼 값. 비슷한 뜻은 비슷한 숫자가 됩니다.
# vector: 그 숫자 목록 자체. 길이를 차원수라고 부릅니다.
from dotenv import load_dotenv
from langchain_openai import OpenAIEmbeddings
# .env의 OPENAI_API_KEY를 읽은 뒤, 8차시와 같은 임베딩 모델을 준비합니다.
load_dotenv()
emb = OpenAIEmbeddings(model="text-embedding-3-small")
# embed_query는 네트워크로 문장을 보내 숫자 리스트를 받아 옵니다.
vec = emb.embed_query("환불 규정이 궁금해요")
# text-embedding-3-small은 어떤 문장을 넣어도 길이가 1536입니다.
print(f"차원수 : {len(vec)}")
# 1536개를 다 찍으면 화면이 넘치므로 아래 줄은 꺼 두었습니다.
# print(f"임베딩 결과 : {vec}")
first_10 = []
# 앞 10개만 소수 넷째 자리로 줄여서 봅니다. 숫자 하나하나의 뜻은 사람이 해석할 수 없습니다.
for value in vec[:10]:
first_10.append(round(value, 4))
print(f"임베딩 결과(앞 10개) : {first_10}")실행 결과 샘플 (교안 기록. API 키가 필요한 코드는 키 없이 맞춘 예시이고, 모델의 답은 실행할 때마다 달라집니다)
===== 실행 결과 샘플 =====
실행: cd 실습/src/09
python embed_look.py
예시 출력 (API 키 필요, 실행하지 않음)
차원수 : 1536
임베딩 결과(앞 10개) : (앞 10개 숫자는 기록되지 않아 적지 않음)
(1536은 text-embedding-3-small의 벡터 길이입니다. 유사도 점수는 이 파일에 없습니다.)코드 해설
질문 한 문장을 embedding(벡터)으로 바꾸고 앞부분만 출력입니다. 입력은 문장 "환불 규정이 궁금해요"이고, 출력은 차원 수, 앞 10개 숫자를 소수 4자리로 반올림한 목록입니다.
주석에 적힌 흐름입니다.
문장 -> OpenAIEmbeddings.embed_query() -> 숫자 리스트 -> print코드 앞에서 고정해 두는 말입니다.
- embedding: 문장을 숫자 목록으로 바꾼 값. 비슷한 뜻은 비슷한 숫자가 됩니다.
- vector: 그 숫자 목록 자체. 길이를 차원수라고 부릅니다.
함수로 나누지 않고 위에서 아래로 실행됩니다.
vec = emb.embed_query("환불 규정이 궁금해요")— embed_query는 네트워크로 문장을 보내 숫자 리스트를 받아 옵니다.first_10 = []— print(f"임베딩 결과 : {vec}")
파일 맨 아래 실행 결과 샘플 주석은 실행되지 않습니다. 화면 출력은 다음 절에 다시 적어 두었습니다.