Terraform을 활용한 Azure AI Search 고급 RAG: Hybrid Search, Semantic Ranking, 그리고 Agentic Retrieval 🧠
I’m happy to translate the article for you, but I’ll need the full text you’d like translated. Could you please paste the content (or the portion you want translated) here? I’ll keep the source line unchanged and preserve all formatting, code blocks, URLs, and technical terms as requested.
Source: …
Azure AI Search에서 하이브리드 검색 및 에이전시 검색
벡터 검색만으로는 관련성을 충분히 확보하지 못합니다.
시맨틱 랭킹, 청크 전략, 메타데이터 필터링, 엄격도 튜닝, 그리고 새로운 에이전시 검색 파이프라인을 결합한 하이브리드 검색은 Azure AI Search를 프로덕션 RAG 시스템으로 전환시킵니다 – 모든 것이 Terraform을 통해 연결됩니다.
요약 (RAG 포스트 1)
- 기본 인덱스로 Azure AI Search를 배포하고 Azure OpenAI와 연결했습니다.
- 검색 품질이 평균 수준이었으며, 사용자는 미묘한 질문을 했을 때 불완전하거나 관련 없는 답변을 받았습니다.
해결책: 더 나은 생성 모델이 아니라 더 나은 검색입니다.
Azure AI Search는 세 주요 클라우드 중 가장 정교한 내장 검색 파이프라인을 제공합니다:
- 하이브리드 검색 – BM25 키워드 매칭 + Reciprocal Rank Fusion (RRF)을 통한 벡터 유사도.
- Transformer 기반 시맨틱 랭커 – 상위 결과에 대한 깊은 재점수화.
- 메타데이터 필터링 및 엄격도 제어.
- 에이전시 검색 – 복잡한 쿼리를 자동으로 분해합니다.
⚠️ 중요: Azure OpenAI “On‑Your‑Data”는 더 이상 지원되지 않습니다. Microsoft는 Foundry Agent Service와 Foundry IQ로 마이그레이션할 것을 권장합니다. 아래 패턴은 현재와 미래 아키텍처 모두와 호환되는 직접 Azure AI Search 통합을 사용합니다.
청크 전략
Azure AI Search는 인덱서 파이프라인을 통해 두 가지 청크 방식을 지원합니다:
| 접근 방식 | 작동 방식 | 장점 | 단점 |
|---|---|---|---|
| 고정 크기 청크 (Text Split skill) | 토큰 또는 문자 수에 따라 분할하며, 겹침을 설정할 수 있습니다. | 단순하고 예측 가능하며 비용 효율적입니다. | 문서 구조를 무시합니다. |
| 구조 인식 청크 (Document Layout skill) | Azure Document Intelligence를 사용하여 헤더, 섹션 및 레이아웃 요소를 인식합니다. | 문서 계층 구조를 보존합니다. | 페이지당 처리 비용이 추가됩니다. |
권장 청크 크기 (Microsoft 벤치마크)
| 청크 크기 | 겹침 | 최적 용도 | 트레이드오프 |
|---|---|---|---|
| 256 토큰 | 25 % | 짧은 FAQ 및 Q&A 쌍 | 높은 정밀도, 적은 컨텍스트 |
| 512 토큰 | 25 % | 일반 문서 (기본값) | 정밀도와 컨텍스트의 최적 균형 |
| 1024 토큰 | 10‑15 % | 긴 기술/법률 문서 | 더 많은 컨텍스트, 잡음 위험 |
핵심 인사이트: 청크를 만들 때 문장 경계를 유지하세요. 문장 중간에서 분할하면 임베딩 품질과 검색 정확도가 저하됩니다.
계층형 검색 아키텍처
1️⃣ 하이브리드 검색 (BM25 + 벡터) + RRF 퓨전
from azure.search.documents import SearchClient
from azure.search.documents.models import VectorizableTextQuery
search_client = SearchClient(
endpoint=search_endpoint,
index_name="company-docs",
credential=credential,
)
vector_query = VectorizableTextQuery(
text="What are the penalties for late delivery?",
k_nearest_neighbors=50,
fields="contentVector",
)
results = search_client.search(
search_text="penalties late delivery", # BM25 키워드 쿼리
vector_queries=[vector_query], # 벡터 쿼리
select=["title", "content", "source"],
top=50,
)
- 왜 두 가지를 모두 쓰나요?
- 벡터는 동의어와 패러프레이징을 처리합니다.
- 키워드는 제품 코드, 정책 번호, 정확한 용어를 잡아냅니다.
- RRF는 두 결과 집합을 병합해 두 접근법의 장점을 모두 제공합니다.
2️⃣ 의미론적 랭커 (Transformer 재‑스코어링)
results = search_client.search(
search_text="penalties late delivery",
vector_queries=[vector_query],
query_type="semantic",
semantic_configuration_name="default",
top=50,
)
for result in results:
print(f"Score: {result['@search.reranker_score']:.2f} - {result['title']}")
- 랭커는 쿼리와 문서 텍스트 사이에 교차‑어텐션을 적용해 0 → 4 (불관련 → 우수) 범위의 보정된 점수를 생성합니다.
3️⃣ 의미론적 랭킹을 위한 Terraform 구성
resource "azurerm_search_service" "this" {
name = "${var.environment}-${var.project}-search"
resource_group_name = azurerm_resource_group.this.name
location = var.location
sku = var.search_sku
semantic_search_sku = var.semantic_search_sku
identity {
type = "SystemAssigned"
}
}
환경 변수
# environments/dev.tfvars
search_sku = "basic"
semantic_search_sku = "free" # 월별 쿼리 제한
# environments/prod.tfvars
search_sku = "standard"
semantic_search_sku = "standard" # 의미론적 쿼리 무제한
벤치마크 요약: 하이브리드 + 의미론적 랭킹은 모든 결과 집합 크기에서 일관되게 최적의 콘텐츠를 찾아냅니다. 순수 벡터 검색은 하이브리드가 잡아내는 많은 관련 히트를 놓치며, 의미론적 랭킹이 없을 경우 가장 관련성 높은 결과가 종종 7‑8위에 머물고 1위가 되지 않습니다.
에이전틱 검색 (2025‑11‑01‑preview API)
에이전틱 검색은 복잡한 쿼리를 자동으로 분해하여 하위 쿼리로 만들고, 각각을 하이브리드 + 시맨틱 파이프라인에 실행한 뒤 결과를 병합합니다.
예시
User: "Compare our 2024 and 2025 refund policies and highlight what changed"
분해
- 하위 쿼리 1: “2024 환불 정책 약관”
- 하위 쿼리 2: “2025 환불 정책 약관”
- 하위 쿼리 3: “변경된 환불 정책 업데이트”
각 하위 쿼리는 다음 과정을 따릅니다:
Hybrid search → Semantic rerank top 50 → Merge
오케스트레이션은 Knowledge Base 객체에 존재하며, 기본 서비스, 인덱스 및 시맨틱 구성은 변경되지 않습니다.
에이전틱 검색을 사용해야 할 때
- 다중 의도가 포함된 복잡한 질문.
- 비교 쿼리(예: 버전 간 분석).
- 여러 문서 카테고리에 걸친 쿼리.
영향: 지연 시간이 증가하지만 복잡한 쿼리에서 답변 품질이 최대 40 % 향상됩니다 (Microsoft 벤치마크).
TL;DR 체크리스트
- ✅ 512‑토큰 청크를 25 % 겹침으로 사용하고 문장 경계를 유지합니다.
- ✅ Hybrid search (BM25 + vector)를 RRF 융합과 함께 활성화합니다.
- ✅ Semantic ranking (Standard tier,
semantic_search_sku = "standard")을 켭니다. - ✅ 다중 의도 또는 비교 질문의 경우 Knowledge Base API를 통해 Agentic retrieval 로 전환합니다.
- ✅ 개발/프로덕션 환경 전반에 걸쳐 재현성을 위해 Terraform 으로 모든 것을 관리합니다.
이러한 패턴을 사용하면 Azure AI Search는 프로덕션 급 RAG 엔진이 되어 대규모로 정확하고 컨텍스트가 풍부한 답변을 제공합니다. 🚀
필터 가능한 필드를 사용한 범위 검색
Filters run before vector search, narrowing the candidate set:
results = search_client.search(
search_text="refund policy changes",
vector_queries=[vector_query],
query_type="semantic",
semantic_configuration_name="default",
filter="department eq 'legal' and year ge 2024",
top=20
)
Terraform 참고:
Filterable fields must be defined with filterable: true in the index schema. The schema is usually managed via the Portal, SDK, or REST API (not Terraform), while the search service and its SKU/capabilities are Terraform‑managed.
Azure OpenAI 데이터 소스 통합
검색 품질을 제어하는 두 가지 매개변수:
| 매개변수 | 범위 | 설명 |
|---|---|---|
| strictness | 1‑5 | 관련 없는 청크를 얼마나 적극적으로 필터링할지. 값이 높을수록 필터링이 더 엄격해집니다. |
| top_n_documents | 1‑20 | 필터링 및 재순위 지정 후 LLM 프롬프트에 포함할 청크 수. 청크가 많을수록 더 많은 컨텍스트(토큰 비용 증가)를 제공합니다. |
엄격도 수준
| 엄격도 | 동작 | 일반적인 사용 사례 |
|---|---|---|
| 1‑2 | 관대함 – 경계선 결과를 포함 | 탐색 질문, 광범위한 주제 |
| 3 | 균형(기본값) | 일반 목적 |
| 4‑5 | 엄격함 – 매우 관련성 높은 결과만 | 정확한 사실 조회, 규정 준수 |
예시 호출
completion = client.chat.completions.create(
model=deployment,
messages=[{"role": "user", "content": "What changed in the refund policy?"}],
extra_body={
"data_sources": [{
"type": "azure_search",
"parameters": {
"endpoint": search_endpoint,
"index_name": "company-docs",
"query_type": "vector_semantic_hybrid",
"semantic_configuration": "default",
"strictness": 4,
"top_n_documents": 5,
"authentication": {
"type": "system_assigned_managed_identity"
}
}
}]
}
)
튜닝 가이드
- 모델이 “정보가 충분하지 않다”고 말할 때 →
strictness를 낮추거나top_n_documents를 늘리세요. - 답변에 관련 없는 컨텍스트가 포함될 경우 →
strictness를 높이거나top_n_documents를 낮추세요.
Terraform 예시 (rag/main.tf)
resource "azurerm_search_service" "this" {
name = "${var.environment}-${var.project}-search"
resource_group_name = azurerm_resource_group.this.name
location = var.location
sku = var.search_sku
semantic_search_sku = var.semantic_search_sku
replica_count = var.search_replicas
partition_count = var.search_partitions
identity {
type = "SystemAssigned"
}
tags = var.tags
}
# Embedding model deployment
resource "azurerm_cognitive_deployment" "embedding" {
name = "text-embedding-3-small"
cognitive_account_id = azurerm_cognitive_account.openai.id
model {
format = "OpenAI"
name = "text-embedding-3-small"
version = "1"
}
sku {
name = "Standard"
capacity = var.embedding_capacity
}
}
변수 파일
environments/dev.tfvars
search_sku = "basic"
semantic_search_sku = "free"
search_replicas = 1
search_partitions = 1
embedding_capacity = 30
strictness = 3
top_n_documents = 5
environments/prod.tfvars
search_sku = "standard"
semantic_search_sku = "standard"
search_replicas = 2
search_partitions = 1
embedding_capacity = 120
strictness = 4
top_n_documents = 5
기능 비교
| 기능 | Azure AI Search | AWS Bedrock KB | GCP RAG Engine |
|---|---|---|---|
| Chunking | Fixed‑size + Document Layout skill | Fixed, hierarchical, semantic, Lambda | Fixed‑size only |
| Hybrid search | BM25 + vector via RRF (built‑in) | OpenSearch에서 지원 | Alpha‑weighted dense/sparse |
| Semantic reranking | Built‑in transformer ranker (L2) | Cohere Rerank | Rank Service + LLM Ranker |
| Query decomposition | Agentic retrieval (native) | 네이티브 API 매개변수 | Not built‑in |
| Metadata filtering | Filterable index fields + OData | JSON metadata files in S3 | Filter string at query time |
| Strictness control | 1‑5 scale on data source | Not built‑in | Vector distance threshold |
| Reranker score range | 0‑4 (calibrated, cross‑query consistent) | Model‑dependent | Model‑dependent |
Azure의 장점은 가장 성숙한 검색 파이프라인으로, 하이브리드, 시맨틱 랭킹, 에이전트형(Agentic)이라는 세 레이어가 함께 구성됩니다. 시맨틱 랭커의 보정된 점수는 다양한 인덱스와 쿼리 패턴 전반에 걸쳐 일관된 품질 임계값을 가능하게 합니다.
Suggested Configurations
| Situation | Query Type | Semantic Ranker | Strictness | top_n_documents |
|---|---|---|---|---|
| 시작하기 | vector_simple_hybrid | 무료 티어 | 3 | 5 |
| 프로덕션 (일반) | vector_semantic_hybrid | 표준 | 3 | 5 |
| 정확한 사실 조회 | vector_semantic_hybrid | 표준 | 4‑5 | 3 |
| 광범위한 연구 질의 | vector_semantic_hybrid | 표준 | 2 | 10 |
| 복잡한 다중 파트 질문 | Agentic retrieval | 표준 | 3 | 5 |
추천: Microsoft가 기본 벤치마크한 표준 티어에서 vector_semantic_hybrid를 시작하십시오. 특히 복잡한 쿼리 패턴에 대해서는 에이전시 검색을 추가하세요.
Series Context
- Post 1: Azure AI Search RAG – Basic Setup 🔍
- Post 2: Advanced RAG – Hybrid Search, Semantic Ranking, Agentic Retrieval (you’re here) 🧠
Your RAG pipeline now leverages the full Azure AI Search arsenal: hybrid search for recall, semantic ranking for precision, agentic retrieval for complex queries, metadata filtering for scope, and strictness tuning for noise control – all driven by Terraform variables per environment.
Found this helpful? Follow for the full RAG Pipeline with Terraform series! 💬