Azure Search — Semantic Search 및 Hybrid Search 개요

의미 기반 검색, Semantic Answers 및 Azure 구현 가이드

Semantic Search의 원리와 Azure에서의 구성(semantic configuration, answers, captions), 비용·성능 특성을 정리한다. 임베딩·reranker·hybrid 패턴 및 실전 튜닝 팁을 제공한다.

AI
Cloud
Azure
Search
저자

Kwangmin Kim

공개

2025년 12월 22일

1 Full text serach

  • Azure Search 쿼리 아키텍처 및 고급 검색 기능 분석

1.1 검색 알고리즘 유형 간단 정리

  • BM25: 역색인과 용어 통계(TF/IDF 계열)를 사용해 키워드 매칭 기반으로 점수를 매긴다. 빠르고 해석 가능하며 후보 검색(initial retrieval)에 적합하다.
  • Vector Search: 문서와 쿼리를 고차원 벡터로 임베딩한 뒤 벡터 유사도(예: 코사인, L2)로 근접 이웃을 찾는다. 의미적 유사성(동의어, 패러프레이즈)을 잘 잡아낸다.
  • Semantic Search: Vector Search 또는 Transformer 기반 reranker를 포함하는 상위 개념으로, 의미적 이해를 활용해 결과를 재정렬하거나 직접 답변을 생성한다.
  • 실무적 조합: 보통은 BM25로 넓게 후보를 뽑고(cheap), 그 중에서 vector/semantic로 정밀 평가한다 — 성능/비용 균형을 맞추는 표준 패턴.
  • 장단점 비교: BM25는 저비용·저지연·해석 가능, vector는 의미성↑·비용↑·지연↑(특히 reranker 사용 시).

1.2 Semantic Search 및 Semantic Answers

1.2.1 Semantic Search 아키텍처

기존 검색 vs Semantic Search

Traditional (BM25):
Query → Token matching → TF-IDF/BM25 → Ranking

Semantic (Deep Learning):
Query → L2 Semantic Reranking → Top-K → Semantic Ranking
  ↓
Pretrained Transformer (BERT-based)
  ↓
Contextual understanding

처리 플로우

1. Initial Retrieval (BM25): Top 50 results
   ↓
2. Semantic Reranking (ML model): Rescore top 50
   ↓
3. Final Ranking: Return top 10-50 (user requested)
   ↓
4. Semantic Captions: Extract relevant snippets
   ↓
5. Semantic Answers: Generate direct answers (optional)

1.2.2 Semantic Configuration

쿼리 요청

{
  "search": "how to optimize azure search performance",
  "queryType": "semantic",
  "semanticConfiguration": "my-semantic-config",
  "answers": "extractive|count-3",
  "captions": "extractive|highlight-true",
  "top": 10
}

Semantic Configuration 정의 (인덱스 스키마)

{
  "semantic": {
    "configurations": [
      {
        "name": "my-semantic-config",
        "prioritizedFields": {
          "titleField": {
            "fieldName": "title"
          },
          "prioritizedContentFields": [
            {"fieldName": "content"},
            {"fieldName": "description"}
          ],
          "prioritizedKeywordsFields": [
            {"fieldName": "tags"}
          ]
        }
      }
    ]
  }
}

필드 우선순위
- Title Field: 가장 높은 가중치 (문서 제목)
- Content Fields: 주요 콘텐츠 (최대 5개)
- Keywords Fields: 메타데이터, 태그 (최대 5개)

1.2.3 Semantic Answers (추출적 답변)

Answers 생성 메커니즘
1. 쿼리와 문서 간 의미론적 유사도 계산
2. 고밀도 답변 후보 구간 식별 (span detection)
3. 답변 품질 스코어링 (0.0-1.0)
4. 상위 N개 답변 추출

Answers vs Captions

특성 Answers Captions
목적 직접 답변 (QA) 관련 컨텍스트
길이 짧음 (1-3 문장) 중간 (단락 수준)
개수 쿼리당 1-5개 문서당 1-5개
점수 Answer score (0-1) Relevance score

1.2.4 성능 및 비용

처리 시간 (Microsoft 벤치마크)
- BM25 only: 평균 50ms
- Semantic reranking: 평균 200-400ms (+4-8배)
- Answers 생성: 추가 +50-100ms

비용 구조 (2024년 기준)
- Semantic Search: Standard 티어 필수
- 월 고정 비용: $500-$1,000 (쿼리 볼륨 무관)
- 쿼리당 과금: 추가 비용 없음 (월 할당량 소진 후 제한)

할당량 (Standard S1)
- 월 1,000개 쿼리 포함
- 초과 시: 월 단위 패키지 구매 필요

사용 권장 시나리오
- 자연어 질문 (QA 스타일)
- 긴 문서 검색 (논문, 기술 문서)
- 낮은-중간 쿼리 볼륨 (<10K/month)

비권장 시나리오
- 키워드 정합 검색 (제품명, ID)
- 고처리량 시스템 (>100K queries/month)
- 실시간 오토컴플리트

1.2.5 Semantic Ranking 정확도

실증 평가 (MS MARCO 데이터셋)
- BM25 baseline: MRR@10 = 0.18
- Semantic Search: MRR@10 = 0.31 (+72% 향상)
- NDCG@10: 0.42 → 0.58 (+38% 향상)

도메인별 성능
- Technical Q&A: +60-80% (의미론적 이해 중요)
- E-commerce: +20-40% (키워드 매칭 여전히 중요)
- News/Media: +40-60% (컨텍스트 이해 필요)

제약사항
- 언어 지원: 영어, 프랑스어, 스페인어, 독일어, 이탈리아어, 포르투갈어, 중국어, 일본어, 한국어 (2024년 기준)
- 쿼리 길이 제한: 최대 1,000 characters
- 문서 크기: 최대 256KB per document

1.3 하이브리드 쿼리 패턴

1.3.1 Filter + Search + Vector

완전한 하이브리드 쿼리

{
  "search": "azure ai",
  "filter": "category eq 'Technology' and publishDate ge 2023-01-01",
  "vectorQueries": [
    {
      "vector": [0.1, 0.2, ..., 0.8],
      "k": 50,
      "fields": "contentVector"
    }
  ],
  "queryType": "semantic",
  "semanticConfiguration": "default",
  "top": 10
}

실행 순서

1. Filter: Reduce candidate set (bitset operation)
   ↓
2. Text Search (BM25): Score candidates
   ↓
3. Vector Search (HNSW): Score candidates
   ↓
4. RRF Fusion: Combine text + vector scores
   ↓
5. Semantic Reranking: Refine top 50 (optional)
   ↓
6. Final Top-K: Return results

RRF (Reciprocal Rank Fusion) 공식

\[\text{RRF}_{\text{combined}}(d) = \sum_{r \in \{r_{\text{text}}, r_{\text{vector}}\}} \frac{1}{k + \text{rank}_r(d)}\]

  • \(k\): 상수 (Azure Search 기본값: 60)
  • \(\text{rank}_r(d)\): 랭킹 \(r\)에서 문서 \(d\)의 순위

1.3.2 성능 최적화 체크리스트

쿼리 레벨
1. Filter first: 선택도 높은 필터 우선 적용
2. Top-K 최소화: 필요한 만큼만 요청 (기본값: 50)
3. Select 사용: 불필요한 필드 제외
4. Count 조건부 사용: 페이지네이션에만 필요 시 활성화

인덱스 레벨
1. Scoring Profile 최적화: 불필요한 가중치 제거
2. Analyzer 선택: 언어별 최적 analyzer 사용
3. Filterable/Sortable: 필요한 필드만 활성화 (인덱스 크기 영향)

벤치마크 (1M 문서, 최적화 전후)
- 최적화 전: 평균 500ms (filter + search + semantic)
- 최적화 후: 평균 150ms (-70% 개선)
- Filter optimization: -200ms
- Select fields: -100ms
- Top-K reduction: -50ms

1.4 실무 쿼리 패턴 예시

1.4.1 E-commerce 제품 검색

시나리오: 사용자가 “wireless headphones under $100”를 검색

{
  "search": "wireless headphones",
  "filter": "price le 100 and category eq 'Electronics' and inStock eq true",
  "orderby": "rating desc, price asc",
  "facets": ["brand", "price,interval:25", "rating"],
  "select": "name,brand,price,rating,imageUrl",
  "highlight": "name,description",
  "top": 20
}

1.4.2 기술 문서 QA 시스템

시나리오: “How to configure Azure Search security?”

{
  "search": "configure security azure search",
  "queryType": "semantic",
  "semanticConfiguration": "docs-semantic",
  "answers": "extractive|count-3",
  "captions": "extractive|highlight-true",
  "filter": "documentType eq 'Tutorial' or documentType eq 'Guide'",
  "vectorQueries": [
    {
      "vector": [...],
      "k": 50,
      "fields": "contentVector"
    }
  ],
  "top": 5
}

1.4.3 멀티 테넌트 필터링

시나리오: 테넌트별 데이터 격리

{
  "search": "project status",
  "filter": "tenantId eq 'tenant-abc-123' and security.viewPermissions/any(p: p eq 'user-xyz')",
  "select": "title,status,assignee,tenantId",
  "orderby": "lastModified desc"
}

보안 고려사항
- 클라이언트에서 tenantId 검증 필수
- API key 대신 Managed Identity 권장
- Row-level security (필터 기반) vs Index-level security

1.5 증거의 강도 및 한계

1.5.1 증거 출처

  • Microsoft Learn 공식 문서: Lucene 쿼리 구문, API 명세
  • Apache Lucene 공식 문서: BM25 알고리즘 상세
  • MS MARCO 벤치마크: Semantic Search 정확도 평가 (Microsoft Research, 2023)
  • 성능 수치: Azure Search 공식 벤치마크 및 커뮤니티 테스트

1.5.2 한계점

  • 성능 수치 변동성: 인덱스 크기, 하드웨어 티어, 동시 쿼리 수에 따라 ±50% 변동
  • Semantic Search 정확도: 데이터셋마다 다름 (MS MARCO 기준이 모든 도메인에 일반화되지 않음)
  • 비용 예측: Semantic Search 할당량 소진 속도는 쿼리 복잡도에 의존
  • Filter 성능: Collection 필터 (any/all)는 컬렉션 크기에 선형 비례 (공식 문서에 구체적 제약 미명시)

1.5.3 대안 기술

Elasticsearch
- 더 유연한 쿼리 DSL
- 플러그인 생태계 풍부
- Self-managed 인프라 필요

Solr
- 강력한 Faceting 기능
- Enterprise Search 기능
- 설정 복잡도 높음

Azure 통합 장점
- Managed service (운영 오버헤드 제거)
- Azure OpenAI, Cognitive Services 네이티브 통합
- Semantic Search (BERT 기반) 기본 제공

1.6 불확실성 영역

  • Deep Pagination 성능: skip > 100K 시나리오는 공식적으로 차단되어 실제 성능 미측정
  • Semantic Search 내부 모델: 정확한 모델 아키텍처 (BERT variant, 파라미터 수) 비공개
  • Filter 캐시 정책: 캐시 eviction 전략 및 메모리 할당 세부사항 불명확
  • Collection 필터 최적화: Azure가 내부적으로 인덱스를 어떻게 최적화하는지 불명확 (bitmap index 사용 여부 등)

1.7 권장 아키텍처 의사결정 트리

1.7.1 쿼리 전략 선택

쿼리 유형?
├─ 키워드 정합 (제품 ID, 정확한 매칭)
│  └─ Filter only (no search)
│
├─ 자연어 질문 (QA 스타일)
│  └─ Semantic Search + Answers
│     └─ 쿼리 볼륨?
│        ├─ 낮음 (<10K/month) → Semantic enabled
│        └─ 높음 (>10K/month) → Hybrid (BM25 + Vector)
│
└─ 일반 검색 (e-commerce, 문서)
   └─ 사용자 유형?
      ├─ 일반 사용자 → Simple query + Facets
      └─ 고급 사용자 → Full Lucene syntax

1.8 참고 링크

1.8.1 Azure Search 쿼리 아키텍처 및 고급 검색 기능

  • https://learn.microsoft.com/en-us/azure/search/search-lucene-query-architecture
  • https://learn.microsoft.com/en-us/azure/search/search-filters
  • https://learn.microsoft.com/en-us/azure/search/search-query-understand-collection-filters
  • https://learn.microsoft.com/en-us/azure/search/search-pagination-page-layout
  • https://learn.microsoft.com/en-us/azure/search/semantic-answers

Subscribe

Enjoy this blog? Get notified of new posts by email: