임베딩 저장 & 유사도 검색 — L2 · Cosine · Inner Product 비교
📋 실습 안내
✏️ CODE EDITOR (JSX)
▶ 실행 버튼을 눌러 코드를 테스트하세요.
👁️ 내 미리보기
내 코드 실행 결과
🎯 완성 미리보기
목표
위 에디터 코드를 수정해서 이 결과물과 똑같이 만들어보세요!
💡 TODO 주석을 채워서 위 결과물처럼 동작하게 만들어보세요
🤖 AI 선생님에게 질문하기
이번 강의 전용
▼
선생님이 답변 중이에요...
⚠️ 학습 관련 질문만 답변합니다. 관련 없는 질문은 자동으로 학습으로 유도됩니다.
Q1. 코사인 유사도(Cosine Similarity)가 다른 방법 대비 텍스트 검색에 적합한 이유는?
💡 코사인 유사도는 두 벡터의 방향(각도)만 비교하므로, 같은 내용을 담은 짧은 문장과 긴 문장이 동일한 유사도를 가질 수 있습니다. 텍스트에서 문서 길이는 의미와 무관하기 때문에 방향 기반 측정이 더 적합합니다.
Q2. pgvector에서 코사인 거리를 코사인 유사도로 변환하는 올바른 표현은?
💡 pgvector의 <=> 연산자는 코사인 거리(0~2 범위)를 반환합니다. 코사인 유사도(-1~1)로 변환하려면 1에서 빼면 됩니다: 코사인유사도 = 1 - 코사인거리. 값이 1에 가까울수록 유사합니다.
Q3. OpenAI의 text-embedding-3-small 모델이 생성하는 벡터의 특징으로 올바른 것은?
💡 OpenAI의 text-embedding-3-small은 1536차원 벡터를 생성하며, L2 노름이 1.0인 단위 벡터로 정규화되어 있습니다. 따라서 이 모델의 임베딩에서는 코사인 유사도와 내적이 동일한 결과를 낼 수 있습니다.
Q4. 다음 SQL에서 문제가 있는 부분은?\n`SELECT * FROM docs ORDER BY embedding <=> $1::vector DESC LIMIT 5;`
💡 <=> 연산자는 코사인 거리를 반환하므로 값이 작을수록 유사합니다. DESC로 정렬하면 오히려 가장 먼(유사하지 않은) 문서가 상위에 옵니다. 유사한 문서를 찾으려면 ORDER BY ASC를 사용하거나, 1-(embedding<=>$1)을 DESC로 정렬해야 합니다.
Q5. 내적(Inner Product, <#>)이 코사인 유사도와 동일한 결과를 내는 조건은?
💡 코사인 유사도는 A·B / (|A|×|B|)이고, 내적은 A·B입니다. |A|=|B|=1이면 둘이 동일해집니다. OpenAI 등 많은 임베딩 모델이 단위 벡터를 반환하므로, 정규화된 경우 내적이 코사인과 같은 결과를 내며 계산도 더 빠릅니다.
😅
아쉽네요!
점수: 0점 — 70점 이상이 되어야 통과합니다.