클러스터 의 텍스트 데이터에 대한 벡터 임베딩을 자동으로 생성하고 관리 MongoDB Vector Search를 구성할 수 있습니다. 클러스터 에서 원클릭 AI 시맨틱 검색 인덱스 생성하고Voyage AI 임베딩 모델을 사용하여 벡터를 사용한 인덱싱, 업데이트 및 쿼리를 간소화할 수 있습니다.
자동 임베딩을 활성화 하면 MongoDB Vector Search는 컬렉션 의 지정된 텍스트 필드 에 대한 인덱스 타임과 자동화된 임베딩을 위해 인덱싱된 필드 에 대한 쿼리 의 텍스트 문자열 쿼리 타임에 지정된 임베딩 모델을 사용하여 임베딩을 자동으로 생성합니다.
초기 동기화
자동 임베딩을 위한 MongoDB Vector Search 인덱스 생성하는 경우, MongoDB 초기 동기화를 수행하여 컬렉션 의 모든 기존 문서에 대한 임베딩을 생성합니다.
문서를 스캔합니다.
MongoDB Vector Search는 인덱스된 텍스트 필드 포함하는 컬렉션 의 모든 문서를 스캔합니다.
임베딩을 생성합니다.
각 문서 에 대해 MongoDB Vector Search는 인덱싱된 필드 의 텍스트를 Voyage AI 임베딩 모델로 전송하여 벡터 임베딩을 생성합니다.
임베딩을 저장합니다.
MongoDB Vector Search는 생성된 임베딩을 동일한 클러스터 별도의 내부 시스템 컬렉션 (
__mdb_internal_search)에 저장하여 데이터 지역성을 유지하면서 임베딩을 애플리케이션 데이터와 격리된 상태로 유지합니다.인덱스 빌드합니다.
임베딩이 생성된 후 MongoDB Vector Search는 생성된 임베딩을 사용하여 인덱스 를 빌드하여 벡터 검색 활성화 합니다.
초기 동기화 중에 MongoDB 문서를 배치로 처리하고 특수 Flex 추론 처리 계층 사용하여 처리량 최적화합니다.
참고
초기 동기화 기간은 문서 수, 인덱스된 필드 의 텍스트 길이, 사용 가능한 속도 제한 할당량에 따라 달라집니다. 대규모 컬렉션의 경우 초기 동기화 완료하는 데 몇 시간이 걸릴 수 있습니다.
지속적인 업데이트
초기 동기화 후 MongoDB Vector Search는 임베딩이 변경될 때 데이터와 자동으로 동기화된 상태를 유지합니다.
문서 삽입
인덱스된 텍스트 필드 가 있는 새 문서 삽입하면 MongoDB Vector Search는 자동으로 다음을 수행합니다.
변경 스트림을 통해 새 문서 감지합니다.
구성된 모델을 사용하여 텍스트 필드 에 대한 임베딩을 생성합니다.
시스템 컬렉션 에 임베딩을 저장합니다.
새로운 임베딩을 포함하도록 MongoDB Vector Search 인덱스 업데이트합니다.
Document Updates
문서 업데이트 인덱싱된 텍스트 필드 변경되면 MongoDB Vector Search는 자동으로 다음을 수행합니다.
변경 스트림을 통해 필드 변경을 감지합니다.
업데이트된 텍스트에 대한 새 임베딩을 생성합니다.
시스템 컬렉션 의 이전 임베딩을 대체합니다.
새로운 임베딩으로 MongoDB Vector Search 인덱스 업데이트합니다.
참고
MongoDB Vector Search는 자동 임베딩을 위해 인덱싱되지 않은 필드에 대한 업데이트에 대해 임베딩 재생성을 트리거하다 하지 않습니다.
문서 삭제
문서 삭제 하면 MongoDB Vector Search는 시스템 컬렉션 에서 해당 임베딩을 자동으로 제거하고 인덱스 를 업데이트합니다.
모델 호스팅 및 멀티 테넌시
자동 임베딩은 멀티 테넌트 환경에서 MongoDB 가 호스팅하고 managed Voyage AI의 임베딩 모델을 사용합니다.
모델 인프라
호스팅 서비스: 모든 임베딩 모델은 MongoDB 에서 호스팅하고 유지 관리합니다. 모델 추론 플랫폼은 미국 리전 의 Google Cloud cloud 에 있는 MongoDB 인프라에서 실행됩니다. 모델 인프라를 배포, 구성 또는 관리 필요가 없습니다.
API 기반 액세스:Voyage AI API 키를 사용하도록 구성된 자체 관리 배포서버의 경우, MongoDB Voyage AI의 API 엔드포인트에 텍스트를 전송하여 임베딩을 생성합니다. 임베딩은 MongoDB 로 반환되어 클러스터 에 저장됩니다.
멀티 테넌트 아키텍처: 임베딩 서비스는 여러 사용자가 공유합니다. 이 멀티테넌트 모델은 다음을 제공합니다.
공유 인프라를 통한 비용 효율성
자동 모델 업데이트 및 개선
고가용성 및 확장성
데이터 개인 정보 보호
자동 임베딩 서비스로 전송된 텍스트는 임베딩을 생성하는 데만 사용되며 모델 교육 에 저장되거나 사용되지 않습니다.
임베딩은 MongoDB cluster 로 반환되어 자체 데이터베이스 내에 저장됩니다.
자동 임베딩 서비스와의 모든 통신은 암호화됨 연결을 통해 이루어집니다.
속도 제한
임베딩 서비스는 멀티 테넌트입니다. 따라서 MongoDB 모든 고객이 공정하게 사용할 수 있도록 요금 제한을 적용합니다. 속도 제한과 이 제한이 자동 임베딩 작업에 미치는 영향에 대해 자세히 학습 속도 제한을 참조하세요.
쿼리 처리
자동 임베딩을 사용하여 벡터 검색 쿼리 실행 MongoDB 쿼리 텍스트에 대한 임베딩 생성을 자동으로 처리합니다.
쿼리 텍스트 제출:
query미리 생성된 벡터$vectorSearch대신 단계의 필드 에 텍스트 문자열을 제공합니다.임베딩 생성: MongoDB 쿼리 텍스트를 자동 임베딩 서비스로 전송하여 인덱스 에 지정된 동일한 모델(또는 옵션으로 재정의하는 경우 호환되는
model모델)을 사용하여 임베딩을 생성합니다.벡터 검색: 생성된 쿼리 임베딩은 구성된 유사성 함수(코사인, dotProduct 또는 유클리드)를 사용하여 인덱싱된 임베딩을 검색 데 사용됩니다.
반환된 결과: MongoDB 쿼리 와의 유사성을 기준으로 순위가 매겨진 문서를 반환합니다.
쿼리 속도 제한
자동 임베딩을 사용하는 각 쿼리 임베딩을 생성하기 위해 API 호출이 필요하므로 자동 임베딩 속도 제한에 포함됩니다. 쿼리 처리량 및 비용 관리에 대해 자세히 학습 속도 제한을 참조하세요.
운영에 미치는 영향
초기 동기화
대규모 컬렉션은 속도 제한에 도달하면 초기 동기화 완료하는 데 상당한 시간이 걸릴 수 있습니다.
MongoDB 실패한 임베딩 요청을 자동으로 재시도하고 지수 백오프를 구현합니다.
Atlas Search 모니터링통해 동기화 진행 상황을 모니터 할 수 있습니다.
지속적인 업데이트
문서 업데이트는 속도 제한이 적용되는 대로 처리됩니다.
업데이트가 속도 제한을 초과하는 경우 용량 사용할 수 있게 되면 대기열에 추가되어 처리됩니다.
애플리케이션 계속 정상적으로 작동합니다. 임베딩 생성만 지연될 수 있습니다.
쿼리
쿼리 속도 제한은 수행할 수 있는 동시 검색 수에 영향을 줍니다.
쿼리 속도 제한을 초과하는 경우 쿼리는 속도 제한을 초과했음을 나타내는 오류를 반환합니다.
자주 사용하는 쿼리 결과를 캐싱하거나 처리량 높이려면 유료 계층 으로 업그레이드하는 것이 좋습니다.
생성된 임베딩 컬렉션
자동 임베딩은 별도의 예비 데이터베이스 사용하여 벡터 임베딩을 저장 .인덱스 에 대해 생성된 임베딩 컬렉션 찾고 생성된 임베딩 컬렉션 에서 임베딩을 조회 할 수 있습니다.
- 임베딩 스토리지
MongoDB 생성된 임베딩을 비동기적으로 저장하고 내부에서 생성된 임베딩 컬렉션 에 유지합니다. 이 생성된 임베딩 컬렉션 동일한 클러스터 의 이라는 전용 내부 데이터베이스 에
__mdb_internal_search존재합니다. 클러스터 의 모든 자동 임베딩 인덱스 이 데이터베이스 내에 해당하는 생성된 임베딩 컬렉션 정확히 하나만 있습니다. 자세한 학습 은 생성된 임베딩 컬렉션을 참조하세요.경고
__mdb_internal_search데이터베이스 는 MongoDB 에서 만들고 managed 예약된 내부 네임스페이스 입니다. 이 데이터베이스 또는 해당 컬렉션을 조작하지 마세요. 이 예약된 네임스페이스 수정하면 인덱스 실패 및 일관되지 않은 검색 결과가 발생할 수 있습니다.- 생성된 임베딩 컬렉션의 구조
생성된 임베딩 컬렉션 소스 컬렉션 문서 당 하나의 문서 포함되어 있습니다. 생성된 각 임베딩 컬렉션 문서 소스와 동일한
_id, 소스의 필터하다 필드 사본, 각 자동 임베딩 필드 에 대해 생성된 임베딩 벡터가 있습니다.다음 필드를 볼 수 있습니다.
필드유형설명_idObjectId
소스 문서 와 동일한
_id입니다.<filter-field>Any
소스 문서 에서 필터하다 필드 의 복사본입니다.
_autoEmbed객체
각 자동 임베딩 필드 에 대한 임베딩 벡터를 포함합니다.
_autoEmbed.<fieldPath>부동 소수점 또는 양자화된 벡터의 배열
자동화된 임베딩 필드 에 대해 생성된 임베딩 벡터를 포함합니다.
생성된 임베딩 컬렉션 찾기
경고
__mdb_internal_search 데이터베이스 는 MongoDB 에서 만들고 managed 예약된 내부 네임스페이스 입니다. 이 데이터베이스 또는 해당 컬렉션을 조작하지 마세요. 이 예약된 네임스페이스 수정하면 인덱스 실패 및 일관되지 않은 검색 결과가 발생할 수 있습니다.
을(를) 사용하여 MongoDB mongoshdeployment 에 연결합니다.
인덱스 의 ID 가져옵니다.
다음 자리 표시자를 바꾼 후 다음 쿼리 실행합니다.
<database_name>- 자동 임베딩 인덱스 포함된 데이터베이스 의 이름입니다.<collection_name>- 자동 임베딩 인덱스 포함된 컬렉션 의 이름입니다.<index_name>- 자동 임베딩 인덱스 의 이름입니다.
1 use <database_name> 2 db.<collection_name>.aggregate( [ { $listSearchIndexes: { name: "<index_name>" } } ] )
1 [ 2 { 3 id: '69f382ecd6fa583100184fe7', 4 name: 'auto-embed-index', 5 type: 'vectorSearch', 6 status: 'READY', 7 numDocs: 0, 8 latestDefinition: { ... }, 9 statusDetail: [ ... ] 10 } 11 ]
을(를) 사용하여 MongoDB mongoshdeployment 에 연결합니다.
생성된 임베딩 컬렉션의 스토리지 크기 확인
생성된 임베딩 컬렉션의 저장 크기를 확인하여 생성된 임베딩에서 디스크 및 인덱스 공간 사용량을 파악할 수 있습니다. 이는 용량 계획, 예기치 않은 증가 디버깅, 인덱스 삭제 또는 재정의 후 정리 유효성 검사에 유용합니다.
중요
저장 크기를 확인하기 전에 생성된 임베딩 컬렉션 이름을 찾습니다.자세한 학습 은 생성된 임베딩 컬렉션 찾기를 참조하세요.
Atlas 에 로그인하여 로 Data Explorer 이동합니다.
아직 표시되지 않은 경우 다음 목록에서 원하는 조직 을 선택하세요. 탐색 표시줄의 Organizations 메뉴.
아직 표시되지 않은 경우 탐색 표시줄의 Projects 메뉴에서 원하는 프로젝트를 선택합니다.
사이드바에서 Database 섹션 아래의 Data Explorer 을 클릭합니다.
Data Explorer 페이지에서 __mdb_internal_search 데이터베이스 다른 데이터베이스와 함께 표시됩니다. 이 데이터베이스 보기에는 다음이 표시됩니다.
Storage size - 데이터베이스 에서 사용하는 총 디스크 공간입니다.
Data size - 데이터베이스 에 있는 모든 문서의 총 크기입니다.
Collections - 데이터베이스 에 있는 컬렉션의 수입니다.
Indexes - 데이터베이스 의 인덱스 수입니다.
Storage size 기준으로 정렬하여 자동 임베딩에서 사용하는 클러스터 디스크 공간의 양을 확인합니다.
개별 컬렉션 지표 확인합니다.
__mdb_internal_search 을(를) 클릭하면 다음과 함께 생성된 각 임베딩 컬렉션 볼 수 있습니다.
Storage size - 컬렉션 에서 사용한 총 디스크 공간입니다.
Data size - 컬렉션 에 있는 모든 문서의 총 크기입니다.
Documents - 컬렉션 의 문서 수입니다.
Avg. document size - 컬렉션 에 있는 문서 의 평균 크기입니다.
Indexes - 컬렉션 의 인덱스 수입니다.
Total index size - 컬렉션 에 있는 모든 인덱스의 총 크기입니다.
참고
auto_embedding_leases 컬렉션 은 리더 투표 에 사용되며 일반적으로 킬로바이트의 저장 만 사용합니다.
을(를) 사용하여 MongoDB mongoshdeployment 에 연결합니다.
생성된 임베딩 컬렉션 의 저장 크기를 확인합니다.
<generated_embeddings_collection_name> 를 생성된 임베딩 컬렉션 의 이름으로 바꾼 후 다음 쿼리 실행합니다.
1 use __mdb_internal_search 2 const mvColl = "<generated_embeddings_collection_name>" 3 db.getCollection(mvColl).stats()
collStats 명령은 생성된 임베딩 컬렉션에 대한 자세한 저장 지표 제공합니다. 스크립트 액세스, 샤드 클러스터 집계 또는 예약된 모니터링 필요한 경우 이 접근 방식을 사용합니다.
다음 collStats 필드는 저장 정보를 제공합니다.
필드 | 설명 |
|---|---|
| 생성된 임베딩 컬렉션 의 문서 수입니다. 생성된 임베딩이 있는 각 소스 문서 당 하나의 문서 존재합니다. |
| 모든 문서의 압축되지 않은 논리적 크기(바이트)입니다. |
| WiredTiger 압축 후 컬렉션 데이터 파일의 디스크 크기(바이트)입니다. |
| 생성된 임베딩 컬렉션 에 있는 모든 MongoDB 인덱스의 디스크 크기(바이트)입니다. |
|
|
| 압축되지 않은 평균 문서 크기입니다. 문서별 임베딩 크기를 검증하는 데 유용합니다. |
참고
storageSize및totalIndexSize은 실제 디스크 사용량을 반영합니다.size는 압축되지 않은 논리적 뷰이며 일반적으로 더 큽니다.이 지표 MongoDB cluster 의 저장 만 표시합니다. 여기에는
mongot호스팅하다 의 루센 벡터 인덱스 에 사용되는 디스크가 포함되지 않습니다.
__mdb_internal_search 데이터베이스 대해 다음 명령을 실행합니다.
1 use __mdb_internal_search 2 3 const mvColl = "<generated_embeddings_collection_name>"; 4 5 db.runCommand({ collStats: mvColl }).count 6 db.runCommand({ collStats: mvColl, scale: 1024 * 1024 })
1 { 2 ns: '__mdb_internal_search.69f382ecd6fa583100184fe7-96dad03b0a735a19fd9f1a22f9694efc-1-0', 3 size: 5142, 4 count: 1250000, 5 avgObjSize: 4312, 6 numOrphanDocs: 0, 7 storageSize: 1830, 8 freeStorageSize: 7, 9 capped: false, 10 wiredTiger: { ... }, 11 nindexes: 1, 12 indexDetails: { ... }, 13 indexBuilds: [], 14 totalIndexSize: 42, 15 indexSizes: { _id_: 0 }, 16 totalSize: 1872, 17 scaleFactor: 1048576, 18 ok: 1, 19 '$clusterTime': { 20 clusterTime: Timestamp({ t: 1777646199, i: 1 }), 21 signature: { 22 hash: Binary.createFromBase64('pomqluUIpiZzLro3VWhO4dt2LKE=', 0), 23 keyId: Long('7634583163557117960') 24 } 25 }, 26 operationTime: Timestamp({ t: 1777646199, i: 1 }) 27 }
형식이 지정된 요약을 보려면 실행.
1 const s = db.runCommand({ collStats: mvColl, scale: 1024 * 1024 }); 2 ({ 3 count: s.count, 4 avgObjSizeKB: (s.avgObjSize / 1024).toFixed(2), 5 dataMB: s.size, 6 storageMB: s.storageSize, 7 indexesMB: s.totalIndexSize, 8 totalMB: s.totalSize, 9 })
1 { 2 "count": 1250000, 3 "avgObjSizeKB": "4.21", 4 "dataMB": 5142, 5 "storageMB": 1830, 6 "indexesMB": 42, 7 "totalMB": 1872 8 }
1 from pymongo import MongoClient 2 3 MV_DATABASE = "__mdb_internal_search" 4 MB = 1024 * 1024 5 6 def get_mv_storage_stats(client, mv_collection_name): 7 """Return storage metrics for a generated embeddings collection.""" 8 db = client[MV_DATABASE] 9 stats = db.command("collStats", mv_collection_name, scale=MB) 10 return { 11 "count": stats["count"], 12 "avg_obj_kb": round(stats["avgObjSize"] / 1024, 2), 13 "data_mb": stats["size"], 14 "storage_mb": stats["storageSize"], 15 "indexes_mb": stats["totalIndexSize"], 16 "total_mb": stats["totalSize"], 17 } 18 19 client = MongoClient("mongodb+srv://<user>:<pwd>@<cluster>/") 20 print(get_mv_storage_stats(client, "<generated_embeddings_collection_name>"))
샘플 출력:
{'count': 1250000, 'avg_obj_kb': 4.21, 'data_mb': 5142, 'storage_mb': 1830, 'indexes_mb': 42, 'total_mb': 1872}
샤딩된 소스 컬렉션에서 각 샤드 __mdb_internal_search 데이터베이스 에 자체 생성된 임베딩 컬렉션 있습니다. mongos 는 이러한 컬렉션을 볼 수 없으므로 각 샤드의 mongod 를 직접 쿼리 하고 결과를 합산해야 합니다.
다음 스크립트 각 샤드 에 연결하고, 생성된 임베딩 컬렉션 쿼리하고, 샤드별 및 총 지표 반환합니다.
1 from pymongo import MongoClient 2 3 MV_DATABASE = "__mdb_internal_search" 4 MB = 1024 * 1024 5 6 def _resolve_mv_name(client, source_db, source_collection, index_name): 7 """Find the generated embeddings collection name for an index.""" 8 src = client[source_db][source_collection] 9 indexes = list(src.aggregate([{"$listSearchIndexes": {"name": index_name}}])) 10 if not indexes: 11 raise LookupError(f"No search index named {index_name!r}") 12 index_id = indexes[0]["id"] 13 matches = [n for n in client[MV_DATABASE].list_collection_names() 14 if n.startswith(index_id)] 15 if not matches: 16 return None 17 matches.sort(reverse=True) 18 return matches[0] 19 20 def get_mv_storage_per_shard(shard_uris, source_db, source_collection, index_name): 21 """Get per-shard and total storage for a sharded cluster.""" 22 per_shard = {} 23 totals = {"count": 0, "data_mb": 0, "storage_mb": 0, 24 "indexes_mb": 0, "total_mb": 0} 25 26 for shard_name, uri in shard_uris.items(): 27 client = MongoClient(uri) 28 mv_name = _resolve_mv_name(client, source_db, source_collection, index_name) 29 30 if mv_name is None: 31 per_shard[shard_name] = {"note": "no MV found (still building?)"} 32 continue 33 34 s = client[MV_DATABASE].command("collStats", mv_name, scale=MB) 35 row = { 36 "mv": mv_name, 37 "count": s["count"], 38 "data_mb": s["size"], 39 "storage_mb": s["storageSize"], 40 "indexes_mb": s["totalIndexSize"], 41 "total_mb": s["totalSize"], 42 } 43 per_shard[shard_name] = row 44 45 for k in totals: 46 totals[k] += row[k] 47 48 return {"per_shard": per_shard, "totals": totals} 49 50 # Usage 51 shard_uris = { 52 "shard-00": "mongodb://<user>:<pwd>@shard-00.example.net:27017/?replicaSet=shard-00", 53 "shard-01": "mongodb://<user>:<pwd>@shard-01.example.net:27017/?replicaSet=shard-01", 54 "shard-02": "mongodb://<user>:<pwd>@shard-02.example.net:27017/?replicaSet=shard-02", 55 } 56 57 result = get_mv_storage_per_shard( 58 shard_uris, 59 source_db="<source_db>", 60 source_collection="<source_collection>", 61 index_name="<index_name>", 62 ) 63 64 for shard, row in result["per_shard"].items(): 65 print(shard, row) 66 print("TOTAL:", result["totals"])
shard-00 {'mv': '69e183...-1-3', 'count': 416000, 'data_mb': 1714, 'storage_mb': 612, 'indexes_mb': 14, 'total_mb': 626} shard-01 {'mv': '69e183...-1-3', 'count': 418200, 'data_mb': 1721, 'storage_mb': 615, 'indexes_mb': 14, 'total_mb': 629} shard-02 {'mv': '69e183...-1-3', 'count': 415800, 'data_mb': 1707, 'storage_mb': 603, 'indexes_mb': 14, 'total_mb': 617} TOTAL: {'count': 1250000, 'data_mb': 5142, 'storage_mb': 1830, 'indexes_mb': 42, 'total_mb': 1872}
클러스터 의 모든 자동 임베딩 인덱스에 대한 저장 확인하려면 __mdb_internal_search의 모든 컬렉션 에 대해 collStats 을 합산합니다. 이는 용량 검토 및 분리된 생성 임베딩 컬렉션을 식별하는 데 유용합니다.
mongosh 에서 단일 복제본 세트 또는 샤딩된 클러스터의 각 샤드 에서 다음을 실행합니다.
1 use __mdb_internal_search 2 3 const MB = 1024 * 1024; 4 const rows = db.getCollectionNames().map(name => { 5 const s = db.runCommand({ collStats: name, scale: MB }); 6 return { 7 collection: name, 8 count: s.count, 9 storageMB: s.storageSize, 10 indexesMB: s.totalIndexSize, 11 totalMB: s.totalSize, 12 }; 13 }); 14 15 const total = rows.reduce((a, r) => ({ 16 storageMB: a.storageMB + r.storageMB, 17 indexesMB: a.indexesMB + r.indexesMB, 18 totalMB: a.totalMB + r.totalMB, 19 }), { storageMB: 0, indexesMB: 0, totalMB: 0 }); 20 21 print("Per-collection:"); 22 printjson(rows); 23 print("Cluster total:"); 24 printjson(total);
1 Per-collection: 2 [ 3 { "collection": "69e183...-1-3", "count": 1250000, "storageMB": 1830, "indexesMB": 42, "totalMB": 1872 }, 4 { "collection": "71fa42...-1-1", "count": 84000, "storageMB": 121, "indexesMB": 3, "totalMB": 124 } 5 ] 6 Cluster total: 7 { "storageMB": 1951, "indexesMB": 45, "totalMB": 1996 } 8 }
참고
샤딩된 클러스터에서 각 샤드 에서 이 명령을 실행 하고 결과를 합산합니다.
생성된 임베딩 컬렉션에서 임베딩 검색
을(를) 사용하여 MongoDB mongoshdeployment 에 연결합니다.
문서 의 임베딩을 조회합니다.
다음 자리 표시자를 바꾼 후 다음 쿼리 실행합니다.
<generated_embeddings_collection_name>- 생성된 임베딩 컬렉션 의 이름입니다.<document_id>- 소스 컬렉션 에 있는 문서 의_id입니다.<auto_embed_field>- 자동 임베딩을 위해 인덱싱된 필드 의 이름입니다.
1 use __mdb_internal_search 2 const mvColl = "<generated_embeddings_collection_name>" 3 db.getCollection(mvColl).findOne( 4 { _id: "<document_id>" }, 5 { _id: 1, "_autoEmbed.<auto_embed_field>": 1 } 6 )
1 [ 2 { _autoEmbed: {}, _id: "ObjectId('573a1390f29313caabcd5c0f')" }, 3 { _autoEmbed: {}, _id: "ObjectId('573a1390f29313caabcd5c0f')" }, 4 { 5 _autoEmbed: { 6 fullplot: Binary.fromInt8Array(new Int8Array([ 7 5, -30, 16, 4, -57, -8, -17, -13, 16, 11, -22, 15, 8 -7, 13, 8, -2, -1, -14, 27, 10, -9, 20, 14, -2, 9 3, -56, -21, 10, -24, 12, 10, 9, 12, 7, 4, 14, 10 -7, -24, -15, 16, 13, 21, -4, -16, -12, -15, 3, -33, 11 5, -21, 2, -1, 0, 16, 7, 13, 19, 4, 5, -14, 12 -34, 7, -16, 38, 4, 4, 7, -22, 8, 14, 15, -14, 13 -4, 6, 22, -17, 8, 27, 8, 13, 46, -12, -7, -9, 14 -20, 13, 10, 4, -14, -11, 31, -7, 0, -3, 1, 16, 15 9, 5, 6, -2, 16 ... 924 more items 17 ])) 18 }, 19 _id: "ObjectId('573a1390f29313caabcd5c0f')" 20 }, 21 { 22 _autoEmbed: { 23 fullplot: Binary.fromInt8Array(new Int8Array([ 24 -5, -22, 22, -6, -43, -13, -5, 4, 5, 2, 4, 13, 25 0, -3, -3, -50, -5, -2, -2, 27, -5, 36, 27, 12, 26 -12, -6, -1, 9, -7, 25, 4, -28, 3, 9, 3, 23, 27 8, 11, 11, 25, -19, 27, 17, 18, -1, 0, 5, -12, 28 13, -5, -3, 3, -17, 16, -15, 43, -1, 1, 1, -6, 29 -26, 16, -11, 13, 14, 0, -9, -23, 25, -16, 11, -25, 30 7, 9, -1, 0, 33, -8, -3, -18, 3, 4, -20, -14, 31 17, -2, -2, -10, 17, -25, -11, 9, 1, 2, -8, 7, 32 20, 18, 17, -2, 33 ... 924 more items 34 ])) 35 }, 36 _id: "ObjectId('573a1390f29313caabcd5c0f')" 37 }, 38 { 39 _autoEmbed: { 40 fullplot: Binary.fromInt8Array(new Int8Array([ 41 0, -1, 47, 6, -20, -14, 29, -2, 13, -1, 20, 11, 42 -18, -7, 12, -10, -25, 10, 7, -15, 11, 9, -14, 12, 43 -9, -22, 16, 0, 18, 5, 9, -26, 14, -27, 6, 20, 44 -19, -8, 1, -5, 21, 13, -37, -7, 0, -21, -51, 1, 45 -38, -14, 4, 6, -23, 15, 19, 33, 8, 0, -7, -3, 46 -25, 8, -29, 25, -1, 12, 4, -21, -1, 0, -14, -3, 47 -6, -3, 7, 30, 8, -8, 34, -19, -12, -29, -15, -14, 48 1, -4, 6, -2, -36, -18, -2, 4, 23, 17, -13, 1, 49 0, 7, 25, -19, 50 ... 924 more items 51 ])) 52 }, 53 _id: "ObjectId('573a1390f29313caabcd5c0f')" 54 } 55 ]
을(를) 사용하여 MongoDB mongoshdeployment 에 연결합니다.
여러 문서에 대한 임베딩을 조회합니다.
다음 자리 표시자를 바꾼 후 다음 쿼리 실행합니다.
<generated_embeddings_collection_name>- 생성된 임베딩 컬렉션 의 이름입니다.<document_id>- 소스 컬렉션 에 있는 문서 의_id입니다.<auto_embed_field>- 자동 임베딩을 위해 인덱싱된 필드 의 이름입니다.<number_of_documents>- 반환할 문서 수입니다.
1 use __mdb_internal_search 2 const mvColl = "<generated_embeddings_collection_name>" 3 db.getCollection(mvColl).find( 4 {}, 5 { _id: "<document_id>", "_autoEmbed.<auto_embed_field>": { $slice: 5 } } 6 ).limit(<number_of_documents>)
1 [ 2 { _autoEmbed: {}, _id: "ObjectId('573a1390f29313caabcd5c0f')" }, 3 { _autoEmbed: {}, _id: "ObjectId('573a1390f29313caabcd5c0f')" }, 4 { 5 _autoEmbed: { 6 fullplot: Binary.fromInt8Array(new Int8Array([ 7 5, -30, 16, 4, -57, -8, -17, -13, 16, 11, -22, 15, 8 -7, 13, 8, -2, -1, -14, 27, 10, -9, 20, 14, -2, 9 3, -56, -21, 10, -24, 12, 10, 9, 12, 7, 4, 14, 10 -7, -24, -15, 16, 13, 21, -4, -16, -12, -15, 3, -33, 11 5, -21, 2, -1, 0, 16, 7, 13, 19, 4, 5, -14, 12 -34, 7, -16, 38, 4, 4, 7, -22, 8, 14, 15, -14, 13 -4, 6, 22, -17, 8, 27, 8, 13, 46, -12, -7, -9, 14 -20, 13, 10, 4, -14, -11, 31, -7, 0, -3, 1, 16, 15 9, 5, 6, -2, 16 ... 924 more items 17 ])) 18 }, 19 _id: "ObjectId('573a1390f29313caabcd5c0f')" 20 }, 21 { 22 _autoEmbed: { 23 fullplot: Binary.fromInt8Array(new Int8Array([ 24 -5, -22, 22, -6, -43, -13, -5, 4, 5, 2, 4, 13, 25 0, -3, -3, -50, -5, -2, -2, 27, -5, 36, 27, 12, 26 -12, -6, -1, 9, -7, 25, 4, -28, 3, 9, 3, 23, 27 8, 11, 11, 25, -19, 27, 17, 18, -1, 0, 5, -12, 28 13, -5, -3, 3, -17, 16, -15, 43, -1, 1, 1, -6, 29 -26, 16, -11, 13, 14, 0, -9, -23, 25, -16, 11, -25, 30 7, 9, -1, 0, 33, -8, -3, -18, 3, 4, -20, -14, 31 17, -2, -2, -10, 17, -25, -11, 9, 1, 2, -8, 7, 32 20, 18, 17, -2, 33 ... 924 more items 34 ])) 35 }, 36 _id: "ObjectId('573a1390f29313caabcd5c0f')" 37 }, 38 { 39 _autoEmbed: { 40 fullplot: Binary.fromInt8Array(new Int8Array([ 41 0, -1, 47, 6, -20, -14, 29, -2, 13, -1, 20, 11, 42 -18, -7, 12, -10, -25, 10, 7, -15, 11, 9, -14, 12, 43 -9, -22, 16, 0, 18, 5, 9, -26, 14, -27, 6, 20, 44 -19, -8, 1, -5, 21, 13, -37, -7, 0, -21, -51, 1, 45 -38, -14, 4, 6, -23, 15, 19, 33, 8, 0, -7, -3, 46 -25, 8, -29, 25, -1, 12, 4, -21, -1, 0, -14, -3, 47 -6, -3, 7, 30, 8, -8, 34, -19, -12, -29, -15, -14, 48 1, -4, 6, -2, -36, -18, -2, 4, 23, 17, -13, 1, 49 0, 7, 25, -19, 50 ... 924 more items 51 ])) 52 }, 53 _id: "ObjectId('573a1390f29313caabcd5c0f')" 54 } 55 ]
생성된 임베딩 컬렉션 에서 임베딩을 조회 하려면 다음 Python 스크립트 사용할 수 있습니다. 스크립트 실행 하려면 PyMongo 드라이버 설치합니다.
다음 코드를 복사하여 get_embedding.py 파일 에 붙여넣습니다.
1 from pymongo import MongoClient 2 3 MV_DATABASE = "__mdb_internal_search" 4 5 def get_mv_collection(client, source_db, source_collection, index_name): 6 """Resolve the MV collection for an auto-embedding index.""" 7 # 1. Look up the index ID via $listSearchIndexes on the source collection. 8 src = client[source_db][source_collection] 9 indexes = list(src.aggregate([{"$listSearchIndexes": {"name": index_name}}])) 10 if not indexes: 11 raise LookupError(f"No search index named {index_name!r} on {source_db}.{source_collection}") 12 index_id = indexes[0]["id"] 13 14 # 2. Find the MV collection in __mdb_internal_search whose name starts with the index ID. 15 mv_db = client[MV_DATABASE] 16 matches = [n for n in mv_db.list_collection_names() if n.startswith(index_id)] 17 if not matches: 18 raise LookupError(f"No MV collection found for index {index_id} (index may still be building)") 19 if len(matches) > 1: 20 # Possible briefly during an auto-embed field update; pick the newest. 21 matches.sort(reverse=True) 22 return mv_db[matches[0]] 23 24 def get_embedding(client, source_db, source_collection, index_name, embed_path, source_id): 25 """Fetch the embedding for a single source document.""" 26 mv = get_mv_collection(client, source_db, source_collection, index_name) 27 doc = mv.find_one( 28 {"_id": source_id}, 29 {"_id": 1, f"_autoEmbed.{embed_path}": 1}, 30 ) 31 if doc is None: 32 return None 33 return doc["_autoEmbed"][embed_path] 34 35 # --- Usage --- 36 client = MongoClient("mongodb+srv://<user>:<pwd>@<cluster>/") 37 38 embedding = get_embedding( 39 client, 40 source_db="<source_db>", 41 source_collection="<source_collection>", 42 index_name="<auto_embed_index_name>", 43 embed_path="<auto_embed_field>", 44 source_id="<document_id>", 45 ) 46 47 print(f"dims: {len(embedding)}") 48 print(f"first 5: {embedding[:5]}")
파일 에서 다음 자리 get_embedding.py 표시자를 바꿉니다.
자리 표시자 | 설명 |
|---|---|
| MongoDB deployment 위한 사용자 이름 . |
| MongoDB deployment 위한 비밀번호입니다. |
| MongoDB deployment 위한 클러스터 연결 문자열 . |
| 소스 컬렉션 이 포함된 데이터베이스 의 이름입니다. |
| 소스 컬렉션 의 이름입니다. |
| 자동 임베딩 인덱스 의 이름입니다. |
|
|
| 자동 임베딩을 위해 인덱싱된 필드 의 이름입니다. |
| 반환할 문서 수입니다. |
생성된 임베딩 컬렉션 에서 임베딩을 스트림 하려면 다음 Python 스크립트 사용할 수 있습니다.
다음 코드를 복사하여 stream_embedding.py 파일 에 붙여넣습니다.
1 from pymongo import MongoClient 2 3 # --- Usage --- 4 client = MongoClient("mongodb+srv://<user>:<pwd>@<cluster>/") 5 6 mv = get_mv_collection(client, "<source_db>", "<source_collection>", "<auto_embed_index_name>") 7 8 cursor = mv.find( 9 {}, 10 {"_id": 1, "_autoEmbed.<auto_embed_field>": 1}, 11 batch_size=500, 12 ) 13 14 for doc in cursor: 15 src_id = doc["_id"] 16 vec = doc["_autoEmbed"]["<auto_embed_field>"]
파일 에서 다음 자리 stream_embedding.py 표시자를 바꿉니다.
자리 표시자 | 설명 |
|---|---|
| MongoDB deployment 위한 사용자 이름 . |
| MongoDB deployment 위한 비밀번호입니다. |
| MongoDB deployment 위한 클러스터 연결 문자열 . |
| 소스 컬렉션 이 포함된 데이터베이스 의 이름입니다. |
| 소스 컬렉션 의 이름입니다. |
| 자동 임베딩 인덱스 의 이름입니다. |
| 자동 임베딩을 위해 인덱싱된 필드 의 이름입니다. |
문제 해결
다음 섹션에서는 자동 임베딩의 일반적인 문제를 해결하기 위한 지침 제공합니다.
- 인덱스 ID 와 일치하는 생성된 임베딩 컬렉션 없습니다.
- 인덱스 가 여전히 :guialbel`Building` 또는 Pending 상태 수 있습니다. 생성된 임베딩 컬렉션 첫 번째 쓰기 (write) 시 느리게 생성됩니다.
$listSearchIndexes을(를) 사용하여 상태를 확인합니다. - 출처에 대한 문서 누락
_id - 지정된 문서 에 대한 임베딩이 아직 생성되지 않았거나 문서 인덱스의 필터하다 표현식 에 의해 필터링되었습니다.
- 인덱스 ID 와 일치하는 컬렉션 두 개 이상 있습니다.
- 자동 포함 필드 구성이 업데이트되었습니다. 새로 생성된 임베딩 컬렉션 생성되었지만 이전 임베딩 컬렉션은 정리될 때까지 잠시 남아 있을 수 있습니다.