04-02-03 — Azure AI Search como vector store
TL;DR
Azure AI Search é o vector store enterprise da Microsoft. Suporta busca vetorial (HNSW), keyword (BM25), hybrid e semantic reranker numa mesma plataforma. Integra com Azure OpenAI sem código extra. Se você já é cliente Azure, é o caminho óbvio — menos componentes, menos custo operacional, compliance incluído.
O que é Azure AI Search?
Azure AI Search (antigo "Azure Cognitive Search") é um serviço de search-as-a-service da Microsoft que evoluiu muito além de busca textual. Desde 2023 ganhou capacidades vetoriais de primeira classe e virou o vector store padrão do ecossistema Azure AI.
Capacidades relevantes para RAG:
- Vector search: HNSW com métrica cosine, dotProduct ou euclidean
- Full-text search: BM25 nativo, analisadores de linguagem para português
- Hybrid search: vetorial + BM25 com Reciprocal Rank Fusion automático
- Semantic ranker: reranking baseado em modelo de linguagem da Microsoft
- Integrated vectorization: chama Azure OpenAI Embeddings automaticamente na indexação
- Skillsets: pipeline de enriquecimento (OCR, extração de entidades, chunking) via Azure AI Services
Arquitetura com Azure AI Search
Criando um índice vetorial
No Azure AI Foundry Portal: Build → Indexes → New index. Selecione a fonte (Blob Storage, SharePoint, Upload), conecte ao Azure OpenAI para embeddings. O Foundry cria o índice no AI Search automaticamente com configurações otimizadas. Ideal para começar sem escrever código.
Para configuração programática com o SDK Python:
from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents.indexes.models import (
SearchIndex, SearchField, SearchFieldDataType,
VectorSearch, HnswAlgorithmConfiguration,
VectorSearchProfile, SemanticConfiguration,
SemanticSearch, SemanticPrioritizedFields, SemanticField
)
from azure.core.credentials import AzureKeyCredential
index_client = SearchIndexClient(
endpoint="https://seu-servico.search.windows.net",
credential=AzureKeyCredential("SUA_ADMIN_KEY")
)
fields = [
SearchField(name="id", type=SearchFieldDataType.String, key=True),
SearchField(name="content", type=SearchFieldDataType.String, searchable=True),
SearchField(name="source", type=SearchFieldDataType.String, filterable=True),
SearchField(
name="content_vector",
type=SearchFieldDataType.Collection(SearchFieldDataType.Single),
searchable=True,
vector_search_dimensions=1536,
vector_search_profile_name="hnsw-profile"
)
]
vector_search = VectorSearch(
algorithms=[HnswAlgorithmConfiguration(name="hnsw-config", parameters={"m": 4, "efConstruction": 400})],
profiles=[VectorSearchProfile(name="hnsw-profile", algorithm_configuration_name="hnsw-config")]
)
semantic_config = SemanticConfiguration(
name="my-semantic-config",
prioritized_fields=SemanticPrioritizedFields(content_fields=[SemanticField(field_name="content")])
)
index = SearchIndex(
name="rag-index",
fields=fields,
vector_search=vector_search,
semantic_search=SemanticSearch(configurations=[semantic_config])
)
index_client.create_or_update_index(index)
print("Índice criado!")
Indexando documentos
from azure.search.documents import SearchClient
search_client = SearchClient(
endpoint="https://seu-servico.search.windows.net",
index_name="rag-index",
credential=AzureKeyCredential("SUA_ADMIN_KEY")
)
documents = []
for i, chunk in enumerate(chunks):
embedding = embed(chunk) # sua função de embedding
documents.append({
"id": f"chunk-{i}",
"content": chunk,
"source": "contrato.pdf",
"content_vector": embedding
})
search_client.upload_documents(documents)
print(f"{len(documents)} chunks indexados")
Buscando com hybrid + semantic reranker
from azure.search.documents.models import VectorizedQuery
def search_hybrid(question: str, k: int = 5) -> list[dict]:
query_vector = embed(question)
results = search_client.search(
search_text=question, # keyword search (BM25)
vector_queries=[VectorizedQuery(
vector=query_vector,
k_nearest_neighbors=50, # busca 50 candidatos vetoriais
fields="content_vector"
)],
query_type="semantic", # ativa semantic reranker
semantic_configuration_name="my-semantic-config",
top=k
)
return [{"content": r["content"], "source": r["source"], "score": r["@search.score"]}
for r in results]
Tiers e custos
| Tier | Documentos | Índices | Semantic ranker | Custo/mês |
|---|---|---|---|---|
| Free | 10.000 | 3 | Não | $0 |
| Basic | 1M | 5 | 1.000 queries/dia grátis | ~$73 |
| Standard S1 | 24M | 50 | Ilimitado | ~$245 |
| Standard S2 | 96M | 200 | Ilimitado | ~$490 |
O semantic ranker cobra por query acima do free tier (1.000/dia no Basic). Para projetos com alto volume de queries, calcule o custo antes de habilitar. Em muitos casos, hybrid search sem semantic reranker já entrega 90% da qualidade com zero custo adicional.
Como isso se conecta
- 04-03-03 — Hybrid search — como RRF combina os scores vetorial e BM25
- 04-04-01 — Re-ranking — o semantic reranker em mais detalhes
- 04-06-01 — Azure AI Search + OpenAI: On Your Data — pipeline completo end-to-end
Fontes
- Microsoft. Azure AI Search documentation. learn.microsoft.com/azure/search
- Microsoft. Vector search in Azure AI Search. learn.microsoft.com
- Microsoft. Semantic ranking in Azure AI Search. learn.microsoft.com
- Microsoft. Azure AI Search pricing. azure.microsoft.com/pricing/details/search