Een index maken voor agentisch ophalen in Azure AI Zoeken

Opmerking

Azure AI Zoeken is beschikbaar via de Azure-portal, REST API's en Azure-SDK's. Het vormt ook een basis voor Foundry IQ, de beheerde kennislaag die bedrijfsinhoud transformeert in herbruikbare, machtigingsbewuste knowledge bases voor agents in de Microsoft Foundry-portal.

In dit artikel worden de vereiste indexvelden en configuraties voor agentische retrieval uitgelegd. Geen van deze vereisten is nieuw. U kunt een bestaande index gebruiken die voldoet aan de criteria, zelfs als deze is gemaakt met een eerdere API-versie.

Elke geïndexeerde kennisbron is afhankelijk van een onderliggende index. Afhankelijk van hoe u uw pijplijn instelt, kan de index een van de volgende zijn:

  • Bestaande: Een zelfstandige index die beschikbaar wordt gesteld via een zoekindexkennisbron. De index moet voldoen aan de criteria in dit artikel.

  • Gegenereerd: Een index die automatisch wordt gemaakt door een geïndexeerde kennisbron. Gegenereerde indexen voldoen standaard aan alle criteria.

Criteria voor agentisch ophalen

De volgende tabel ordent de indexelementen die van invloed zijn op agentisch ophalen op vereisteniveau.

Indexelement Requirement Aantekeningen
searchable en retrievable tekenreeksvelden Verplicht Wordt gebruikt voor het ophalen van query's en resultaten.
Semantische configuratie Verplicht Gebruik defaultSemanticConfiguration of overschrijf de semantische configuratie in de kennisbron.
Bronvermeldingsvelden Aanbevolen Door de gebruiker gedefinieerde velden die antwoorden toewijzen aan broninhoud, zoals documentnaam, paginanummer of segment-id.
Vectorvelden en een vectorizer Aanbevolen Hiermee schakelt u de conversie van tekst-naar-vector tijdens het uitvoeren van query's in.
Scoreprofiel Optional Verhoogt de relevantie voor specifieke velden. Stel defaultScoringProfile in zodat dit automatisch wordt toegepast.
Analyzer Optional Hiermee bepaalt u hoe tekst wordt getokeniseerd, zoals het verwerken van witruimte of speciale tekens.
Synoniemenkaarten Optional Breidt zoekopdrachten uit met terminologie of jargon.

Voorbeeld van indexdefinitie

In het volgende voorbeeld ziet u een index die geschikt is voor agentisch ophalen. Het voldoet aan de criteria voor vereiste elementen en bevat vectorvelden als best practice.

{
  "name": "earth_at_night",
  "description": "Contains images and descriptions of our planet in darkness as captured from space by Earth-observing satellites and astronauts on the International Space Station over the past 25 years.",
  "fields": [
    {
      "name": "id", "type": "Edm.String",
      "searchable": true, "retrievable": true, "filterable": true, "sortable": true, "facetable": true,
      "key": true,
      "stored": true,
      "synonymMaps": []
    },
    {
      "name": "page_chunk", "type": "Edm.String",
      "searchable": true, "retrievable": true, "filterable": false, "sortable": false, "facetable": false,
      "analyzer": "en.microsoft",
      "stored": true,
      "synonymMaps": []
    },
    {
      "name": "page_chunk_vector_text_3_large", "type": "Collection(Edm.Single)",
      "searchable": true, "retrievable": false, "filterable": false, "sortable": false, "facetable": false,
      "dimensions": 3072,
      "vectorSearchProfile": "hnsw_text_3_large",
      "stored": false,
      "synonymMaps": []
    },
    {
      "name": "page_number", "type": "Edm.Int32",
      "searchable": false, "retrievable": true, "filterable": true, "sortable": true, "facetable": true,
      "stored": true,
      "synonymMaps": []
    },
    {
      "name": "chapter_number", "type": "Edm.Int32",
      "searchable": false, "retrievable": true, "filterable": true, "sortable": true, "facetable": true,
      "stored": true,
      "synonymMaps": []
    }
  ],
  "semantic": {
    "defaultConfiguration": "semantic_config",
    "configurations": [
      {
        "name": "semantic_config",
        "flightingOptIn": false,
        "prioritizedFields": {
          "prioritizedContentFields": [
            {
              "fieldName": "page_chunk"
            }
          ],
          "prioritizedKeywordsFields": []
        }
      }
    ]
  },
  "vectorSearch": {
    "algorithms": [
      {
        "name": "alg",
        "kind": "hnsw",
        "hnswParameters": {
          "metric": "cosine",
          "m": 4,
          "efConstruction": 400,
          "efSearch": 500
        }
      }
    ],
    "profiles": [
      {
        "name": "hnsw_text_3_large",
        "algorithm": "alg",
        "vectorizer": "azure_openai_text_3_large"
      }
    ],
    "vectorizers": [
      {
        "name": "azure_openai_text_3_large",
        "kind": "azureOpenAI",
        "azureOpenAIParameters": {
          "resourceUri": "https://YOUR-AOAI-RESOURCE.openai.azure.com",
          "deploymentId": "text-embedding-3-large",
          "modelName": "text-embedding-3-large"
        }
      }
    ],
    "compressions": []
  }
}

Een goed ontworpen index voor generatieve AI of retrieval-augmented generation (RAG) heeft de volgende componenten:

  • Een beschrijving die een LLM of agent kan gebruiken om te bepalen of een index moet worden gebruikt of overgeslagen.

  • Segmenten van door mensen leesbare tekst die u als invoertokens kunt doorgeven aan een LLM voor antwoordformulering.

  • Een semantische classificatieconfiguratie omdat agentisch ophalen gebruikmaakt van Semantische rangschikking op niveau 2 (L2) om de meest relevante segmenten te identificeren.

  • (Optioneel) Vector-equivalente versies van de door mensen leesbare stukken tekst voor complementaire vectorzoekopdrachten.

Opgedeelde tekst is belangrijk omdat LLM's getokeniseerde tekenreeksen van voor mensen leesbare plattetekstinhoud verwerken en genereren. Daarom wilt u searchable velden die platte teksttekenreeksen bevatten en retrievable in het antwoord staan. In Azure AI Zoeken kunt u gesegmenteerde tekst maken met behulp van built-in- of oplossingen van derden.

Een ingebouwde aanname voor chunked content is dat de originele brondocumenten grote hoeveelheden overmatige inhoud hebben. Als uw broninhoud gestructureerde gegevens is, zoals een productdatabase, moet uw index vooraf gaan aan segmentering en in plaats daarvan velden opnemen die zijn toegewezen aan de oorspronkelijke gegevensbron, zoals een productnaam, categorie of beschrijving. Toeschrijving van searchable en retrievable is ook van toepassing op gestructureerde gegevens. searchable maakt de inhoud binnen het bereik van query's en retrievable voegt deze toe aan de zoekresultaten (grondgegevens).

Vectorinhoud kan nuttig zijn omdat het overeenkomstzoekfunctionaliteit toevoegt aan het ophalen van gegevens. Wanneer vectorvelden aanwezig zijn in de index, voert de agentische ophaalengine een vectorquery parallel uit met de tekstquery. Omdat vectorquery's zoeken naar vergelijkbare inhoud in plaats van overeenkomende woorden, kan een vectorquery een zeer relevant resultaat vinden dat een tekstquery mogelijk mist. Het toevoegen van vectoren kan uw groundinggegevens verrijken en de kwaliteit ervan verbeteren, maar is niet strikt noodzakelijk. Azure AI Zoeken heeft een ingebouwde benadering voor vectorisatie.

Vectorvelden worden alleen gebruikt voor het uitvoeren van query's op Azure AI Zoeken. U hebt de vector niet nodig in resultaten omdat deze niet door mensen of LLM kan worden gelezen. Als u de ruimtevereisten wilt minimaliseren, raden we u aan om retrievable en stored op onwaar in te stellen. Zie Vectoropslag en -verwerking optimaliseren voor meer informatie.

Als u vectoren gebruikt, is het essentieel dat een vectorizer is gedefinieerd in de configuratie van vectorzoekopdrachten. Het bepaalt of uw vectorveld wordt gebruikt tijdens het uitvoeren van de query. De vectorizer codeert tekenreekssubquery's in vectoren tijdens het uitvoeren van query's voor het zoeken naar gelijkenissen tussen de vectoren. De vectorizer moet hetzelfde insluitingsmodel zijn dat wordt gebruikt om de vectoren in de index te maken.

Standaard worden alle searchable velden opgenomen in de uitvoering van query's en worden alle retrievable velden geretourneerd in resultaten. U kunt kiezen welke velden u wilt gebruiken voor elke actie in de definitie van de zoekindexkennisbron.

Een beschrijving toevoegen

Een indexveld description is een door de gebruiker gedefinieerde tekenreeks die u kunt gebruiken om richtlijnen te bieden voor LLM's en MCP-servers (Model Context Protocol) wanneer u besluit een specifieke index voor een query te gebruiken. Deze door mensen leesbare tekst is waardevol wanneer een systeem toegang moet hebben tot verschillende indexen en een beslissing moet nemen op basis van de beschrijving.

Een indexbeschrijving is een schema-update en u kunt deze toevoegen zonder dat u de hele index opnieuw hoeft op te bouwen.

  • Tekenreekslengte is maximaal 4000 tekens.

  • Inhoud moet door mensen leesbaar zijn, in Unicode. Uw use-case moet bepalen welke taal moet worden gebruikt (bijvoorbeeld Engels of een andere taal).

Een semantische configuratie toevoegen

De index moet ten minste één semantische configuratie hebben. De semantische configuratie moet het volgende hebben:

  • Een benoemde configuratie.
  • Een prioritizedContentFields dat is ingesteld op ten minste één tekenreeksveld dat zowel searchable als retrievable is.

Er zijn twee manieren om een semantische configuratie op naam op te geven. Als de index is defaultSemanticConfiguration ingesteld op een benoemde configuratie, gebruikt het ophalen deze. U kunt ook de semantische configuratie in de kennisbron van de zoekindex opgeven.

Binnen de configuratie is prioritizedContentFields vereist. Titel en trefwoorden zijn optioneel. Voor gesegmenteerde inhoud hebt u mogelijk geen van beide. Als u echter entiteitsherkenning of sleuteltermextractie toevoegt, hebt u mogelijk enkele trefwoorden gekoppeld aan elk segment dat nuttig kan zijn in zoekscenario's, mogelijk in een scoreprofiel.

In het volgende voorbeeld ziet u een semantische configuratie die geschikt is voor agentisch ophalen.

"semantic":{
   "defaultConfiguration":"semantic_config",
   "configurations":[
      {
         "name":"semantic_config",
         "flightingOptIn":false,
         "prioritizedFields":{
            "titleField":{
               "fieldName":""
            },
            "prioritizedContentFields":[
               {
                  "fieldName":"page_chunk"
               }
            ],
            "prioritizedKeywordsFields":[
               {
                  "fieldName":"Category"
               },
               {
                  "fieldName":"Tags"
               },
               {
                  "fieldName":"Location"
               }
            ]
         }
      }
   ]
}

Opmerking

Het antwoord bevat title, termsen content, die worden toegewezen aan de velden met prioriteit in deze configuratie.

Een vectorizer toevoegen

Als uw index vectorvelden bevat, bevat het queryplan deze velden als ze een searchable toewijzing hebbenvectorizer.

Een vectorizer geeft een insluitmodel op dat tekst-naar-vector-conversies biedt tijdens het uitvoeren van query's. Het moet verwijzen naar hetzelfde insluitingsmodel dat wordt gebruikt om de vectorinhoud in uw index te coderen. U kunt elk insluitmodel gebruiken dat wordt ondersteund door Azure AI Zoeken. U geeft vectorizers op vectorvelden op door middel van een vectorprofiel.

De definitie van het vectorveld in het indexvoorbeeld toont de sleutelveldkenmerken: dimensions, dat is het aantal insluitingen dat door het model wordt gegenereerd, en vectorSearchProfile.

  {
    "name": "page_chunk_text_3_large", "type": "Collection(Edm.Single)",
    "searchable": true, "retrievable": false, "filterable": false, "sortable": false, "facetable": false,
    "dimensions": 3072,
    "vectorSearchProfile": "hnsw_text_3_large",
    "stored": false,
    "synonymMaps": []
  }

Vectorprofielen zijn configuraties van vectorizers, algoritmen en compressietechnieken. Elk vectorveld kan slechts één profiel gebruiken, maar uw index kan veel hebben voor het geval u unieke profielen wilt voor elk vectorveld.

Query's uitvoeren op vectoren en het aanroepen van een vectorizer voegt latentie toe aan de algemene aanvraag, maar als u overeenkomsten zoekt, is het misschien de moeite waard.

In het volgende voorbeeld ziet u een vectorizer die geschikt is voor agentisch ophalen, zoals deze wordt weergegeven in een vectorSearch-configuratie. Er is niets in de vectorizerdefinitie die moet worden gewijzigd om te kunnen werken met agentisch ophalen.

"vectorSearch": {
  "algorithms": [
    {
      "name": "alg",
      "kind": "hnsw",
      "hnswParameters": {
        "metric": "cosine",
        "m": 4,
        "efConstruction": 400,
        "efSearch": 500
      }
    }
  ],
  "profiles": [
    {
      "name": "hnsw_text_3_large",
      "algorithm": "alg",
      "vectorizer": "azure_openai_text_3_large"
    }
  ],
  "vectorizers": [
    {
      "name": "azure_openai_text_3_large",
      "kind": "azureOpenAI",
      "azureOpenAIParameters": {
        "resourceUri": "https://YOUR-AOAI-RESOURCE.openai.azure.com",
        "deploymentId": "text-embedding-3-large",
        "modelName": "text-embedding-3-large"
      }
    }
  ],
  "compressions": []
}

Een scoreprofiel toevoegen

Scoreprofielen zijn criteria voor het verhogen van relevantie. Ze worden toegepast op niet-vectorvelden (tekst en getallen) en worden geëvalueerd tijdens het uitvoeren van query's, hoewel het precieze gedrag afhankelijk is van de API-versie die wordt gebruikt om de index te maken.

Een scoreprofiel voegt waarschijnlijk waarde toe aan uw oplossing als uw index is gebaseerd op gestructureerde gegevens. Gestructureerde gegevens worden geïndexeerd in meerdere afzonderlijke velden, wat betekent dat uw scoreprofiel criteria kan hebben die gericht zijn op de inhoud of kenmerken van een specifiek veld.

Als u de index maakt met 2025-05-01-preview of hoger, wordt het scoreprofiel als laatste uitgevoerd. Als de index wordt gemaakt met een eerdere API-versie, worden scoreprofielen geëvalueerd voordat semantische herrankering wordt uitgevoerd. De werkelijke volgorde van semantisch gerangschikte resultaten wordt bepaald door de eigenschap rankingOrder in de index, die is ingesteld op boostedRerankerScore (een scoreprofiel is toegepast) of rerankerScore (geen scoreprofiel).

U kunt elk scoreprofiel gebruiken dat zinvol is voor uw index. In het volgende voorbeeld ziet u een scoreprofiel waarmee de zoekscore van een overeenkomst wordt verhoogd als de overeenkomst in een specifiek veld wordt gevonden. Velden worden gewogen met behulp van versterkende vermenigvuldigers. Als er bijvoorbeeld een overeenkomst wordt gevonden in het veld 'Categorie', wordt de verhoogde score vermenigvuldigd met 5.

"scoringProfiles": [
    {
      "name": "boostSearchTerms",
      "text": {
        "weights": {
          "Location": 2,
          "Category": 5
        }
      }
    }
]

Een analyse toevoegen

Analysefuncties zijn van toepassing op tekstvelden en kunnen taalanalyses of aangepaste analysefuncties zijn die tokenisatie in de index regelen, zoals het behouden van speciale tekens of witruimte.

Analysefuncties worden gedefinieerd in een zoekindex en toegewezen aan velden. Het voorbeeld van de veldenverzameling bevat een analysereferentie voor de tekstfragmenten. In dit voorbeeld wordt de standaardanalyse (standaard Lucene) vervangen door een Microsoft taalanalyse voor de Engelse taal.

{
  "name": "page_chunk", "type": "Edm.String",
  "searchable": true, "retrievable": true, "filterable": false, "sortable": false, "facetable": false,
  "analyzer": "en.microsoft",
  "stored": true,
  "synonymMaps": []
}

Een synoniemenkaart toevoegen

Synoniemenkaarten breiden query's uit door synoniemen van benoemde termen toe te voegen. U hebt bijvoorbeeld wetenschappelijke of medische termen voor algemene termen.

Synoniemenkaarten worden gedefinieerd als een resource op het hoogste niveau in een zoekindex en toegewezen aan velden. Het voorbeeld van de verzameling velden bevat geen synoniemenkaart, maar in het volgende voorbeeld ziet u hoe een synoniemenkaart met variantspelling van land-/regionamen kan worden toegewezen aan een hypothetisch 'locaties'-veld.

{
    "name":"locations",
    "type":"Edm.String",
    "searchable":true,
    "synonymMaps":[ "country-region-synonyms" ]
}

Uw index toevoegen aan een kennisbron

Als u een zelfstandige index hebt die al bestaat en niet wordt gegenereerd door een kennisbron, maakt u de volgende objecten:

  • Een zoekindexkennisbron voor het inkapselen van uw geïndexeerde inhoud.
  • Een kennisbank die een of meer kennisbronnen en andere instructies voor agentgestuurde informatieophaling omvat.