04-02-03 — Azure AI Search como vector store

⏱ 12 minFontes validadas em: 2026-04-29

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

flowchart LR subgraph INGEST["Ingestão"] BLOB[Azure Blob\nStorage] --> IDX[Indexer] IDX --> SKILL[Skillset\nOCR + Chunk + Embed] SKILL --> SEARCH[(Azure AI Search\nÍndice Híbrido)] end subgraph QUERY["Query"] USER[Usuário] --> APP[Aplicação] APP --> |"1. embed query"| AOAI_E[Azure OpenAI\nEmbeddings] AOAI_E --> |"2. hybrid search"| SEARCH SEARCH --> |"3. top-k chunks"| APP APP --> |"4. prompt + contexto"| AOAI_G[Azure OpenAI\nGPT-4o] AOAI_G --> USER end

Criando um índice vetorial

🏢 Como configurar na Foundry (Azure AI Foundry)

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

TierDocumentosÍndicesSemantic rankerCusto/mês
Free10.0003Não$0
Basic1M51.000 queries/dia grátis~$73
Standard S124M50Ilimitado~$245
Standard S296M200Ilimitado~$490
⚠️ Semantic Ranker tem custo

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

Fontes

  1. Microsoft. Azure AI Search documentation. learn.microsoft.com/azure/search
  2. Microsoft. Vector search in Azure AI Search. learn.microsoft.com
  3. Microsoft. Semantic ranking in Azure AI Search. learn.microsoft.com
  4. Microsoft. Azure AI Search pricing. azure.microsoft.com/pricing/details/search