벡터 셋 문제 해결
벡터 셋 문제 해결 (Troubleshooting)
Redis 벡터 셋(vector sets)을 쓰다 보면 "원하는 결과가 안 나와" 하는 상황이 생겨요. 벡터 셋은 설계상 근사(approximate) 방식이라, 정확 일치 질의보다 디버깅이 까다롭거든요. 이 페이지에서는 재현율(recall), 필터링, 그래프 구조와 관련된 문제를 어떻게 진단하고 해결하는지 정리해 드릴게요.
흔한 문제들 (Common challenges)
벡터 셋은 설계상 근사 방식이에요. 그래서 정확 일치 질의보다 디버깅이 더 까다로워요. 이 섹션은 재현율, 필터링, 그래프 구조 문제를 이해하는 데 도움을 줄 거예요.
낮은 재현율 또는 누락된 결과 (Low recall or missing results)
VSIM이 기대한 항목을 반환하지 않는다면 다음을 시도해 보세요.
EF파라미터 늘리기:
VSIM myset VALUES 3 ... COUNT 10 EF 1000
- 양자화 모드 확인: 이진 양자화(
BIN)는 정확도를 희생하고 속도를 얻는 방식이에요. TRUTH사용해 비교: 선형 스캔과 결과를 비교하려면:
VSIM myset VALUES 3 ... COUNT 10 TRUTH
TRUTH는 검증용으로 가장 정확한 결과를 주지만 느려요.
필터링 문제 (Filtering issues)
필터는 다음의 경우 조용히(결과 없이) 항목을 제외해요.
- 요소의 attributes에 필드가 없는 경우
- JSON이 유효하지 않은 경우
- 타입이 표현식과 일치하지 않는 경우 (예:
.rating이 문자열인데.rating > 8처럼 비교)
VGETATTR로 attributes를 꺼내 확인해 보세요.
VGETATTR myset myelement
필드 이름, JSON 유효성, 값 타입을 다시 확인해 보세요.
예상치 못한 메모리 사용 (Unexpected memory usage)
메모리 문제는 다음에서 비롯될 수 있어요.
- 큰 벡터 (
REDUCE로 차원을 줄여 해결) - 높은
M값으로 인해 링크 그래프가 부풀어 오름 - 크거나 깊게 중첩된 JSON attributes
- 원본
FP32벡터 저장 (NOQUANT)
기본 Q8 양자화를 사용하고 컴팩트한 attributes를 유지하면 공간을 아낄 수 있어요.
그래프 검사 (Inspecting the graph)
VLINKS로 노드의 연결을 살펴볼 수 있어요.
VLINKS myset myelement WITHSCORES
- 고립되었거나 약하게 연결된 노드가 있는지 확인하는 데 도움돼요.
- 재현율이 낮은 이유를 설명할 때 유용해요.
삭제 시 스파이크 (Deletion spikes)
DEL 명령으로 큰 셋을 삭제하면 Redis가 메모리를 회수하고 HNSW 링크를 재구축하면서 잠깐 지연시간이 튈 수 있어요.
복제 특이점 (Replication quirks)
REDUCE를 사용한VADD는 랜덤 프로젝션 행렬을 복제하지 않아요.- 복제본(replica)들은 같은 입력에 대해 다른 프로젝션 벡터를 만들 수 있어요.
- 이는 유사도 검색에는 영향을 주지 않지만,
VEMB출력에는 영향을 줘요.
요약 (Summary)
| 증상 | 시도해 볼 것 |
|---|---|
| 재현율 낮음 | 더 높은 EF, 양자화 확인, TRUTH 사용 |
| 필터가 너무 많이 제외 | VGETATTR로 attributes 검증, 표현식 단순화 |
| 메모리 스파이크 | REDUCE, Q8, 더 작은 M, 컴팩트한 JSON |
| REDUCE와의 복제 불일치 | 복제본의 프로젝션 벡터에 의존하지 않기 |