벡터 셋 문제 해결

벡터 셋 문제 해결 (Troubleshooting)

Redis 벡터 셋(vector sets)을 쓰다 보면 "원하는 결과가 안 나와" 하는 상황이 생겨요. 벡터 셋은 설계상 근사(approximate) 방식이라, 정확 일치 질의보다 디버깅이 까다롭거든요. 이 페이지에서는 재현율(recall), 필터링, 그래프 구조와 관련된 문제를 어떻게 진단하고 해결하는지 정리해 드릴게요.

출처: Redis 공식 문서 — Troubleshooting

흔한 문제들 (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와의 복제 불일치 복제본의 프로젝션 벡터에 의존하지 않기

더 알아보기 (Learn more)