AWS S3Vectors: 필터링에 따라 문서 누락이 발생할 수 있는 이유
요약
AWS S3Vectors를 이용한 RAG 시스템 구축 시 메타데이터 필터링 사용에 주의해야 합니다. S3Vectors의 검색은 근사 최근접 이웃(ANN) 방식으로 이루어지기 때문에, 의미가 가까운 문서라도 필터를 거치면 누락될 수 있습니다. 이는 버그가 아닌 ANN 방식의 특성입니다.
핵심 포인트
- S3Vectors는 벡터를 숫자로 저장하고 유사도를 검색하는 서비스이다.
- 검색은 근사 최근접 이웃(ANN) 방식으로, 100% 정확도는 아니다.
- 평균 Recall이 90% 이상이지만, 실제 성능은 사용 사례에 따라 달라진다.
- 필터링을 사용할 경우 의미가 가까운 문서도 누락될 수 있음을 인지해야 한다.
- S3Vectors로 벡터 검색이나 RAG를 시작했거나 앞으로 시작할 분
- '검색하면 의미가 비슷한 순서대로 문서가 반드시 반환될 것'이라고 생각하는 분
- 메타데이터 필터로 테넌트 ID 등으로 검색을 좁히고 싶은 분
S3Vectors는 문장을 숫자의 나열(벡터)로 저장하고, 의미가 비슷한 것을 찾을 수 있는 서비스입니다. 이 S3Vectors에서 필터를 걸어 검색하면, 의미가 가까운 문서가 있음에도 불구하고 검색 결과에 포함되지 않을 때가 있습니다.
이런 일이 생길 리가 없잖아요! 이건 버그 아닌가요?
라고 생각하는 분도 계시겠지만, 진정하세요
우선 전제부터 말씀드리자면 S3Vectors의 검색은 애초에 근사치(approximate)입니다. 거기서부터 순차적으로 설명하겠습니다.
S3Vectors에서 검색에 사용하는 QueryVectors API 레퍼런스에는 맨 처음에 다음과 같은 설명이 있습니다.
Performs an approximate nearest neighbor search query in a vector index using a query vector. (질문의 벡터를 사용해 벡터 인덱스에 근사 최근접 이웃 검색을 수행한다)
즉, S3Vectors의 검색은 ANN(Approximate Nearest Neighbor Search)으로 이루어지고 있습니다.
'근사치'이기 때문에 정확도는 100%가 아닙니다. 어느 정도의 정확도인지는 Amazon S3 FAQ에 나와 있습니다.
S3 Vectors delivers over 90% average recall for most datasets. Average recall measures the quality of query results—90% means the response contains 90% of the ground truth closest vectors, that are stored in the index, to the query vector. However, because actual performance may vary depending on your specific use case, we recommend conducting your own tests with representative data and queries to validate that S3 vector indexes meet your recall requirements
요약하자면 다음과 같습니다.
- 대부분의 데이터에서 평균 recall(실제로 가까운 것을 얼마나 많이 찾았는지 비율)은 90%가 넘는다.
- 90%란 실제로 가장 가까운 벡터 중 90%가 검색 결과에 포함된다는 의미이다.
- 실제 성능은 사용하는 경우에 따라 달라지므로, S3 vector 인덱스가 필요한 recall 요구 사항을 충족하는지 검증하기 위해 대표적인 데이터와 질문으로 직접 테스트할 것을 권장한다.
다시 말해
ANN 방식에는 대표적으로 두 가지가 있습니다. 계단형(IVF)은 지금의 책장 비유와 같습니다. 벡터를 구획으로 나누어 두고 질문과 가까운 구획부터 정해진 개수만큼 열어서 그 안을 비교합니다.
그래프형(HNSW)은 비슷한 벡터끼리 화살표로 연결하고 질문에 가까운 쪽으로 화살표를 따라가 나가는 방식입니다. 따라가는 경로에 따라 정말 가까운 것 바로 앞에서 멈춰버릴 수 있습니다.
둘 다 속도를 얻는 대신 약간의 누락을 감수하는 방식입니다.
실제로 S3Vectors가 어떤 방식을 채택하고 있는지는 공식적으로 명시되어 있지 않습니다.
다음 조건으로 검색하여 전체를 대상으로 한 정답과 비교했습니다.
| 항목 | 내용 |
|---|---|
| 데이터 | livedoor 뉴스 코퍼스를 약 500자씩 잘라낸 1만 청크 |
| ... | |
| 해당 100개 태그로 필터링하여 검색한 결과입니다. '응집된'은 태그가 붙은 청크의 벡터가 가까이 모여 있다는 의미이고, '분산된'은 전체에 흩어져 있다는 의미입니다. |
| 필터 | 설정 방법 | 정답 상위 100개 중 반환된 건수(평균) |
|---|---|
| 필터 없음 | 1만 청크 전부가 대상 | 95.6건 |
| ... |
벡터 값이 분산되어 있는 태그일수록 누락하기 쉬운 경향이 있었습니다. 분산된 100개는 공식의 '90% 초과'를 밑돌았습니다.
한 번 검색할 때 보는 범위는 거의 정해져 있는 것 같습니다. 분산된 태그로 필터링하여 검색했을 때는 topK를 100에서 1000으로 늘려도 반환되는 결과는 같았고, 보는 범위가 넓어지지 않았습니다.
탐색 방법 상세에 대해서는 공식적으로 명시되어 있지 않기 때문에 여기는 추측입니다.
필터 없음의 경우, 정답 상위 100개는 질문 바로 근처에 모여 있기 때문에 정해진 탐색 범위 안에서 거의 모두 나옵니다. 태그로 필터링하면 정답 100개가 멀리 떨어진 선반에도 흩어져 있어서 탐색 범위 밖에 있는 것은 도달할 수 없습니다. 봐야 할 범위는 넓은데 보는 범위는 같은 상태라 누락이 늘어난다고 추측했습니다.
카테고리처럼 화제가 모이는 태그라면, 분산된 태그보다 누락은 적었습니다. 테넌트 ID나 작성자처럼 벡터 값이 분산될 수 있는 태그에서의 필터링은 주의가 필요합니다.
테넌트 ID처럼 데이터의 벡터가 분산되기 쉬운 태그로 필터링할 경우에는, 테넌트별로 인덱스를 나누어 필터 없음으로 검색할 수 있는 형태로 만드는 것도 방법일 수 있습니다.
실제 운영 전에 대표적인 질문들로 전체를 대상으로 한 정답과 검색 결과를 비교하여 추출 누락이 없는지 확인해 봅시다. 이번 누락도 이 방식으로 발견했습니다.
SQL에서 '결과가 10% 정도 누락됩니다'라고 한다면 엄청난 일이죠? 하지만 S3Vectors는 그런 경우입니다. 정확히 말하면 S3Vectors가 나쁜 것이 아니라 ANN 자체가 그런 것입니다. 게다가 필터 설정 방식에 따라서는 10%가 아니라 훨씬 많이 누락될 수 있습니다(분산된 100개에서는 평균 77.9건밖에 반환되지 않았습니다). 사전에 누락이 있다는 것을 파악한 후에 워크로드가 적합한지 설계 단계에서 확인하는 것이 중요합니다
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기