벡터 데이터베이스 — pgvector 와 Qdrant · 벡터 검색의 원리 · 퀴즈
퀴즈: 벡터 검색의 원리
문항 8개. 정답과 해설은 풀어 본 뒤에 보여 드립니다.
길이를 1 로 정규화한 벡터에서 `<->`·`<=>`·`<#>` 가 같은 순위를 주는 이유는?
- pgvector 가 세 연산자를 내부에서 같은 함수 하나로 계산하기 때문이다
- 세 연산자 모두 정렬하기 전에 벡터를 다시 정규화하기 때문이다
- 길이 1 이면 L2 거리의 제곱이 코사인 거리의 두 배이고 내적이 코사인 유사도가 되기 때문이다
- ORDER BY 가 연산자와 무관하게 동점을 id 순으로 처리하기 때문이다
`<#>` 연산자가 음수를 돌려주는 이유는?
- 내적은 클수록 가까우므로 부호를 뒤집어 ORDER BY 오름차순 한 줄로 kNN 을 적게 하려고
- 부동소수 오차로 음수가 나오는 것이라 abs() 를 씌워 써야 한다
- 코사인 거리에서 1 을 뺀 값이라 정규화된 벡터에서는 언제나 음수다
- 내적이 큰 쪽이 멀다는 뜻이라 음수가 나올수록 관련 없는 문서다
임베딩 모델을 새 버전으로 바꿨다. 가장 먼저 해야 하는 일은?
- 인덱스만 다시 만든다 — 벡터 값은 모델과 무관하게 유지된다
- 차원이 같으면 그대로 섞어 쓴다 — 코사인 거리는 척도에 무관하다
- 새 문서만 새 모델로 넣고 옛 문서는 둔다 — 시간이 지나면 자연히 갈린다
- 기존 벡터를 전부 새 모델로 다시 만든다 — 다른 모델의 좌표는 다른 공간이다
`embedding vector(64)` 대신 `embedding vector` 로 열을 선언하면 무슨 일이 생기나?
- 저장 공간이 두 배로 늘어나지만 검색 결과는 같다
- 길이가 다른 벡터가 조용히 섞여 들어가고 거리 계산이 실행 시점에 실패한다
- HNSW 인덱스를 만들 수 없어 정확 검색만 가능해진다
- COPY 가 거부되므로 INSERT 로만 적재할 수 있다
이 코스에서 '정확 검색(exact kNN)' 이 하는 역할은?
- 인덱스가 있을 때만 쓸 수 있는 검색으로 재현율 1.0 을 보장한다
- 모든 행의 거리를 재어 정렬한 결과라 근사 검색이 무엇을 놓쳤는지 재는 정답 기준이 된다
- 질의 벡터와 완전히 같은 벡터를 가진 행만 돌려주는 검색이다
- 표본 10% 만 읽어 빠르게 순위를 어림하는 검색이다
정확 검색에 `WHERE category = 'storage'` 를 붙이면?
- 필터 열에 B-tree 인덱스가 있어야 벡터 정렬이 가능하다
- 필터가 정렬 뒤에 걸리므로 LIMIT 보다 결과가 줄어든다
- 벡터 연산자와 WHERE 는 같은 쿼리에 쓸 수 없어 서브쿼리가 필요하다
- 조건에 맞는 행만 읽어 그 안에서 정렬하므로 결과가 줄어드는 함정이 없다
질의 벡터를 만들 때 반드시 지켜야 하는 것은?
- 문서와 같은 어휘표·같은 사영 행렬로 만들어 같은 공간에 놓는다
- 질의는 짧으니 차원을 줄인 별도 모델을 쓰는 편이 정확하다
- 질의 벡터는 정규화하지 않아야 거리 차이가 커져 순위가 뚜렷해진다
- SQL 안에서 to_tsvector 로 만든 값을 vector 로 형변환한다
범주마다 `avg(embedding)` 으로 구한 중심 벡터는 무엇에 쓸 수 있나?
- 평균은 길이가 1 이 아니라 pgvector 가 거부하므로 sum 을 써야 한다
- 중심 벡터끼리의 거리는 언제나 같아서 범주 구분에는 쓸 수 없다
- 범주의 대표 좌표라 질의가 어느 범주에 가까운지 문서를 훑지 않고 어림할 수 있다
- 범주의 문서 수가 다르면 평균을 낼 수 없어 표본 수를 맞춰야 한다