ID를 기준으로 upsert해
다시 수집할 때는 collection.upsert()를 써. ID가 있으면 갱신하고 없으면 새로 넣어. 이 원칙이 여러 번 실행해도 결과가 같은 수집 파이프라인과 두 번째 실행에서 망가지는 파이프라인을 가르는 차이야.
논리 삭제는 표시로, 물리 삭제는 ID로
변경 이력을 중시하는 시스템에서는 삭제한 청크의 메타데이터에 {'deleted': True}를 표시하고 검색할 때 제외해. 실제 저장 공간에서도 지워야 한다면 collection.delete(ids=[...])로 물리적으로 제거해.
재임베딩 전략
임베딩 모델을 바꾸면 모든 벡터를 다시 만들어야 해. 방법은 두 가지야.
- 컬렉션을 나란히 만들기.
docs-bge-m3-v1옆에docs-bge-m3-v2를 구축하고, 준비되면 읽기 포인터를 전환해. 일주일 뒤 v1을 삭제하면 돼. - 기존 컬렉션에서 다시 만들기. ID를 순회하며 재임베딩하고 upsert해. 작은 컬렉션에서는 쓸 수 있지만, 큰 컬렉션은 작업 도중 벡터가 섞여 검색의 일관성을 잃으므로 위험해.
가능하면 컬렉션을 나란히 만들어. 문제가 생겼을 때 읽기 포인터를 v1으로 되돌리기만 하면 돼.