Azure-AI_Foundry

Lesson 2: Azure AI Search Integration

Overview

Azure AI Search is the backbone of most RAG implementations in Azure. It provides full-text search, vector search, hybrid search, and semantic reranking β€” all in a managed service. This lesson covers index design, hybrid search configuration, and integrated vectorization.

πŸ“– Reference: What is Azure AI Search?


Setting Up Azure AI Search for RAG

Creating a Search Resource

# Create an Azure AI Search resource
az search service create \
    --name my-search-service \
    --resource-group my-rg \
    --sku standard \
    --location eastus2

Connecting to AI Foundry

In Azure AI Foundry portal:

  1. Go to Management β†’ Connected resources.
  2. Click + New connection β†’ Azure AI Search.
  3. Select your search resource and authenticate.
from azure.search.documents.indexes import SearchIndexClient
from azure.identity import DefaultAzureCredential

# Connect to Azure AI Search
search_client = SearchIndexClient(
    endpoint="https://my-search-service.search.windows.net",
    credential=DefaultAzureCredential()
)

πŸ“– Reference: Create a search service


Index Design

A well-designed index is critical for RAG quality. Each index contains fields that define what data is stored and how it’s searched.

Field Types for RAG

from azure.search.documents.indexes.models import (
    SearchIndex,
    SearchField,
    SearchFieldDataType,
    VectorSearch,
    HnswAlgorithmConfiguration,
    VectorSearchProfile,
    SemanticConfiguration,
    SemanticSearch,
    SemanticPrioritizedFields,
    SemanticField,
    SearchableField,
    SimpleField,
)

# Define index fields
fields = [
    SimpleField(name="id", type=SearchFieldDataType.String, key=True,
                filterable=True),
    SearchableField(name="content", type=SearchFieldDataType.String,
                    analyzer_name="en.microsoft"),
    SearchableField(name="title", type=SearchFieldDataType.String),
    SimpleField(name="source_file", type=SearchFieldDataType.String,
                filterable=True, facetable=True),
    SimpleField(name="page_number", type=SearchFieldDataType.Int32,
                filterable=True),
    SimpleField(name="category", type=SearchFieldDataType.String,
                filterable=True, facetable=True),
    SearchField(
        name="content_vector",
        type=SearchFieldDataType.Collection(SearchFieldDataType.Single),
        searchable=True,
        vector_search_dimensions=1536,
        vector_search_profile_name="my-vector-profile"
    ),
]

Vector Search Configuration

# Configure vector search with HNSW algorithm
vector_search = VectorSearch(
    algorithms=[
        HnswAlgorithmConfiguration(name="my-hnsw", parameters={
            "m": 4,
            "efConstruction": 400,
            "efSearch": 500,
            "metric": "cosine"
        })
    ],
    profiles=[
        VectorSearchProfile(
            name="my-vector-profile",
            algorithm_configuration_name="my-hnsw"
        )
    ]
)

Semantic Configuration

# Configure semantic reranking
semantic_config = SemanticConfiguration(
    name="my-semantic-config",
    prioritized_fields=SemanticPrioritizedFields(
        content_fields=[SemanticField(field_name="content")],
        title_field=SemanticField(field_name="title")
    )
)

semantic_search = SemanticSearch(configurations=[semantic_config])

Creating the Index

index = SearchIndex(
    name="rag-index",
    fields=fields,
    vector_search=vector_search,
    semantic_search=semantic_search
)

result = search_client.create_or_update_index(index)
print(f"Index '{result.name}' created successfully")

πŸ“– Reference: Create a search index


Hybrid Search: Keyword + Vector + Semantic Reranking

Hybrid search combines multiple retrieval methods for the best results. This is the recommended approach for production RAG.

User Query
    β”‚
    β”œβ”€β”€β–Ά Keyword Search (BM25)     ──┐
    β”‚                                 β”œβ”€β”€β–Ά Reciprocal Rank Fusion ──▢ Semantic Reranking ──▢ Results
    └──▢ Vector Search (cosine)    β”€β”€β”˜
from azure.search.documents import SearchClient
from azure.search.documents.models import VectorizableTextQuery

search_client = SearchClient(
    endpoint="https://my-search-service.search.windows.net",
    index_name="rag-index",
    credential=DefaultAzureCredential()
)

# Hybrid search: keyword + vector + semantic reranking
results = search_client.search(
    search_text="How do I configure networking for my AI model?",
    vector_queries=[
        VectorizableTextQuery(
            text="How do I configure networking for my AI model?",
            k_nearest_neighbors=5,
            fields="content_vector"
        )
    ],
    query_type="semantic",
    semantic_configuration_name="my-semantic-config",
    top=5,
    select=["id", "title", "content", "source_file"]
)

for result in results:
    print(f"Score: {result['@search.score']:.4f} | {result['title']}")
    print(f"  Reranker: {result['@search.reranker_score']:.4f}")
    print(f"  Source:   {result['source_file']}")
    print()

πŸ’‘ Tip: Always enable semantic reranking for production RAG. It significantly improves relevance by using a deep learning model to reorder results based on semantic understanding, not just keyword or vector similarity.

πŸ“– Reference: Hybrid search in Azure AI Search


Integrated Vectorization

Integrated vectorization automates the chunking and embedding steps β€” Azure AI Search calls an embedding model during both indexing and querying.

from azure.search.documents.indexes.models import (
    AzureOpenAIVectorizer,
    AzureOpenAIVectorizerParameters,
)

# Configure integrated vectorization
vectorizer = AzureOpenAIVectorizer(
    vectorizer_name="my-vectorizer",
    parameters=AzureOpenAIVectorizerParameters(
        resource_url="https://my-openai.openai.azure.com",
        deployment_name="text-embedding-3-small",
        model_name="text-embedding-3-small"
    )
)

Benefits of integrated vectorization:

πŸ“– Reference: Integrated vectorization


Custom Skillsets for Data Enrichment

Skillsets run AI transformations during indexing β€” OCR, entity extraction, translation, and more.

from azure.search.documents.indexes.models import (
    SearchIndexerSkillset,
    OcrSkill,
    MergeSkill,
    InputFieldMappingEntry,
    OutputFieldMappingEntry,
)

# OCR skill to extract text from images in documents
ocr_skill = OcrSkill(
    name="ocr-skill",
    description="Extract text from images",
    context="/document/normalized_images/*",
    inputs=[InputFieldMappingEntry(name="image", source="/document/normalized_images/*")],
    outputs=[OutputFieldMappingEntry(name="text", target_name="text")]
)

πŸ“– Reference: Skillset concepts


Search Index Projections

Projections let you shape indexed data into different structures β€” useful for creating chunk-level indexes from document-level data.

Projection Type Use Case
Table projections Structured data for analytics
Object projections JSON documents in blob storage
File projections Binary files (images, PDFs)

πŸ“– Reference: Search index projections


Best Practices

  1. Use hybrid search β€” combining keyword and vector search outperforms either alone.
  2. Enable semantic reranking β€” it’s the single biggest quality improvement for RAG.
  3. Design for filtering β€” add filterable metadata fields (category, date, source) from the start.
  4. Monitor search metrics β€” track query latency, result counts, and user feedback.
  5. Use managed identity β€” connect AI Search to other Azure services securely.

Summary


Additional Resources


← Lesson 1 Next: Lesson 3 β€” Advanced RAG Patterns β†’