샘플 MVP는 내장 배열로 검색하지만, 실제 코엑스 전체 지도에서는 Worker 코드 안에 모든 임베딩을 넣을 수 없습니다. 운영 구조에서는 Cloudflare Vectorize에 이미지 임베딩을 저장하고, Worker는 query 임베딩으로 top-K 후보를 검색합니다.
현재 샘플 ONNX 모델은 64차원 임베딩을 생성합니다. 샘플 인덱스는 다음 설정을 사용합니다.
npx wrangler vectorize create path-finder-sample-embeddings \
--dimensions 64 \
--metric cosine \
--binding VECTORIZE \
--update-config현재 공개 배포는 다음 인덱스를 사용합니다.
index_name: path-finder-sample-embeddings
binding: VECTORIZE 또는 VECTORIZE_SAMPLE
dimensions: 64
metric: cosine
stored vectors: 8
샘플 갤러리 임베딩은 다음 명령으로 NDJSON 파일로 내보냅니다.
npm run vectorize:sample업로드는 다음 명령을 사용합니다.
npx wrangler vectorize upsert path-finder-sample-embeddings \
--file data/vectorize/sample-gallery.ndjsonDINOv2-small CLS 임베딩은 384차원입니다. 현재 샘플 8장에 대해 별도 인덱스를 만들고 업서트했습니다.
index_name: path-finder-dinov2-small
binding: VECTORIZE_DINOV2
dimensions: 384
metric: cosine
stored vectors: 8
생성 명령은 다음과 같습니다.
npx wrangler vectorize create path-finder-dinov2-small \
--dimensions 384 \
--metric cosine업서트 명령은 다음과 같습니다.
npx wrangler vectorize upsert path-finder-dinov2-small \
--file data/manifests/dinov2-gallery-manifest.ndjson \
--jsonMobileCLIP2-S0 ONNX vision 모델은 512차원 임베딩을 반환합니다. 브라우저 WASM은 현재 느려 UI 자동 실행에서 제외했지만, 서버/네이티브 후보 비교를 위해 별도 인덱스를 만들었습니다.
index_name: path-finder-mobileclip2-s0
binding: VECTORIZE_MOBILECLIP2
dimensions: 512
metric: cosine
stored vectors: 8
생성 및 업서트 명령은 다음과 같습니다.
npx wrangler vectorize create path-finder-mobileclip2-s0 \
--dimensions 512 \
--metric cosine
npx wrangler vectorize upsert path-finder-mobileclip2-s0 \
--file data/manifests/mobileclip2-s0-gallery-manifest.ndjson \
--jsonVECTORIZE_SAMPLE또는VECTORIZE바인딩이 있으면 tiny 샘플 검색에 Vectorize를 사용합니다.VECTORIZE_DINOV2바인딩이 있으면modelId: "dinov2-small-v1"검색에 384차원 Vectorize를 사용합니다.VECTORIZE_MOBILECLIP2바인딩이 있으면modelId: "mobileclip2-s0-onnx-v1"검색에 512차원 Vectorize를 사용합니다.- 바인딩이 없으면
src/generated/sample-gallery.ts에 내장된 샘플 배열을 사용합니다. /api/search응답에는backend필드가 포함되어 현재 사용한 검색 백엔드를 확인할 수 있습니다.
배포된 API 검증 예시는 다음과 같습니다.
{
"backend": "vectorize",
"topK": 2,
"first": {
"id": "coex-sample-01",
"label": "별마당도서관 북측",
"floor": "B1",
"zone": "ZONE-01",
"score": 0.9999987,
"rank": 1
}
}샘플 모델은 64차원이고 DINOv2-small CLS 임베딩은 384차원입니다. 두 인덱스는 서로 호환되지 않습니다. 모델을 바꾸면 갤러리 임베딩과 query 임베딩을 같은 모델로 다시 생성해야 합니다.
브라우저 DINOv2-small WASM 추론은 복구 실험 경로로 다시 활성화했고, 샘플 query에서 결과 반환까지 확인했습니다. 다만 정확도 검증과 운영 판단은 미리 생성한 384차원 벡터, 서버 추론, 네이티브 추론 결과를 함께 기준으로 합니다.