Obsługa pól wielowektorowych w Wyszukiwanie AI platformy Azure (wersja zapoznawcza)

Uwaga

Wyszukiwanie AI platformy Azure jest dostępna za pośrednictwem portalu Azure, interfejsów API REST i Azure SDKs. Jest także podstawą Foundry IQ — zarządzanej warstwy wiedzy, która przekształca treści przedsiębiorstwa w bazy wiedzy wielokrotnego użytku z uwzględnieniem uprawnień dla agentów w portalu Microsoft Foundry.

Ważna

Funkcje, możliwości lub właściwości oznaczone (wersja zapoznawcza) nie są objęte umową dotyczącą poziomu usług, nie są zalecane w przypadku obciążeń produkcyjnych i mogą ulec zmianie lub ograniczeniu, zanim staną się one ogólnie dostępne. Warunki Wyszukiwanie AI platformy Azure wersji zapoznawczej mają zastosowanie do wszystkich funkcji w wersji zapoznawczej, niezależnie od tego, czy jest ona autonomiczna, czy częścią ogólnie dostępnej funkcji.

Funkcja obsługi pól wielowektorowych (wersja zapoznawcza) w Wyszukiwanie AI platformy Azure umożliwia indeksowanie wielu wektorów podrzędnych w jednym polu dokumentu. Ta funkcja jest cenna w przypadku przypadków użycia, takich jak dane wielomodalne lub dokumenty długie, w których reprezentowanie zawartości za pomocą pojedynczego wektora doprowadziłoby do utraty ważnych szczegółów.

Ograniczenia

  • Klasyfikator semantyczny nie jest obsługiwany w przypadku zagnieżdżonych fragmentów w złożonym polu. W związku z tym semantyczny ranker nie obsługuje zagnieżdżonych wektorów w polach wielowektorowych.

Omówienie obsługi pól wielowektorowych

Tradycyjnie typy wektorów, na przykład Collection(Edm.Single) mogą być używane tylko w polach najwyższego poziomu. Dzięki wprowadzeniu obsługi pól wielowektorowych można teraz używać typów wektorów w zagnieżdżonych polach złożonych kolekcji, co pozwala na skojarzenie wielu wektorów z jednym dokumentem.

Pojedynczy dokument może łącznie zawierać maksymalnie 100 wektorów we wszystkich złożonych polach kolekcji. Pola wektorowe mogą być zagnieżdżone tylko na jednym poziomie głębokości.

Definicja indeksu z polem wielowektorowym

Dla tej funkcji nie są potrzebne żadne nowe właściwości indeksu. Oto przykładowa definicja indeksu:

{
  "name": "multivector-index",
  "fields": [
    {
      "name": "id",
      "type": "Edm.String",
      "key": true,
      "searchable": true
    },
    {
      "name": "title",
      "type": "Edm.String",
      "searchable": true
    },
    {
      "name": "description",
      "type": "Edm.String",
      "searchable": true
    },
    {
      "name": "descriptionEmbedding",
      "type": "Collection(Edm.Single)",
      "dimensions": 3,
      "searchable": true,
      "retrievable": true,
      "vectorSearchProfile": "hnsw"
    },
    {
      "name": "scenes",
      "type": "Collection(Edm.ComplexType)",
      "fields": [
        {
          "name": "embedding",
          "type": "Collection(Edm.Single)",
          "dimensions": 3,
          "searchable": true,
          "retrievable": true,
          "vectorSearchProfile": "hnsw"
        },
        {
          "name": "timestamp",
          "type": "Edm.Int32",
          "retrievable": true
        },
        {
          "name": "description",
          "type": "Edm.String",
          "searchable": true,
          "retrievable": true
        },
        {
          "name": "framePath",
          "type": "Edm.String",
          "retrievable": true
        }
      ]
    }
  ]
}

Przykładowy dokument wczytywania

Oto przykładowy dokument ilustrujący sposób użycia pól wielowektorowych w praktyce:

{
  "id": "123",
  "title": "Non-Existent Movie",
  "description": "A fictional movie for demonstration purposes.",
  "descriptionEmbedding": [1, 2, 3],
  "releaseDate": "2025-08-01",
  "scenes": [
    {
      "embedding": [4, 5, 6],
      "timestamp": 120,
      "description": "A character is introduced.",
      "framePath": "nonexistentmovie\\scenes\\scene120.png"
    },
    {
      "embedding": [7, 8, 9],
      "timestamp": 2400,
      "description": "The climax of the movie.",
      "framePath": "nonexistentmovie\\scenes\\scene2400.png"
    }
  ]
}

W tym przykładzie pole scen jest złożoną kolekcją zawierającą wiele wektorów (pól osadzania) wraz z innymi skojarzonymi danymi. Każdy wektor reprezentuje scenę z filmu i może służyć do znajdowania podobnych scen w innych filmach, między innymi potencjalnych przypadków użycia.

Wykonywanie zapytań z obsługą pól wielowektorowych

Funkcja obsługi pól wielowektorowych wprowadza pewne zmiany w mechanizmie zapytań w Wyszukiwanie AI platformy Azure. Jednak główny proces wykonywania zapytań pozostaje w dużej mierze taki sam. Wcześniej vectorQueries mogło być używane wyłącznie do docelowania wektorowych pól zdefiniowanych jako główne pola indeksu. Dzięki tej funkcji łagodzimy to ograniczenie i umożliwiamy vectorQueries celowanie w pola, które są zagnieżdżone wewnątrz kolekcji złożonych typów (do jednego poziomu). Ponadto dostępny jest nowy parametr czasu zapytania: perDocumentVectorLimit.

  • Ustawienie perDocumentVectorLimit na 1 zapewnia, że co najwyżej jeden wektor jest dopasowany na dokument, co gwarantuje, że wyniki pochodzą z odrębnych dokumentów.
  • Ustawienie perDocumentVectorLimit na 0 (nieograniczone) umożliwia dopasowanie wielu odpowiednich wektorów z tego samego dokumentu.
{
  "vectorQueries": [
    {
      "kind": "text",
      "text": "whales swimming",
      "K": 50,
      "fields": "scenes/embedding",
      "perDocumentVectorLimit": 0
    }
  ],
  "select": "title, scenes/timestamp, scenes/framePath"
}

Ranga między wieloma wektorami w jednym polu

Gdy wiele wektorów jest skojarzonych z jednym dokumentem, Wyszukiwanie AI platformy Azure używa maksymalnego wyniku wśród nich do klasyfikacji. System używa najbardziej odpowiedniego wektora do oceny każdego dokumentu, co zapobiega rozcieńczeniu przez mniej istotne.

Pobieranie odpowiednich elementów w kolekcji

Gdy kolekcja typów złożonych jest uwzględniona w parametrze $select , zwracane są tylko elementy pasujące do zapytania wektorowego. Jest to przydatne w przypadku pobierania skojarzonych metadanych, takich jak znaczniki czasu, opisy tekstu lub ścieżki obrazów.

Uwaga

Aby zmniejszyć rozmiar ładunku, należy unikać dołączania samych wartości wektorów w parametrze $select . Rozważ całkowite pominięcie magazynu wektorów, jeśli nie jest to konieczne.

Debugowanie zapytań wielowektorowych (wersja zapoznawcza)

Gdy dokument zawiera wiele osadzonych wektorów, takich jak osadzanie tekstu i obrazu w różnych polach podrzędnych, system używa najwyższego wyniku wektora we wszystkich elementach do klasyfikacji dokumentu.

Aby debugować, w jaki sposób każdy wektor przyczynił się, użyj trybu debugowania innerHits (dostępnego w najnowszej wersji zapoznawczej interfejsu API REST).

POST /indexes/my-index/docs/search?api-version=2026-08-01-preview
{
  "vectorQueries": [
    {
      "kind": "vector",
      "field": "keyframes.imageEmbedding",
      "kNearestNeighborsCount": 5,
      "vector": [ /* query vector */ ]
    }
  ],
  "debug": "innerHits"
}

Przykładowy kształt odpowiedzi

"@search.documentDebugInfo": {
  "innerHits": {
    "keyframes": [
      {
        "ordinal": 0,
        "vectors": [
          {
            "imageEmbedding": {
              "searchScore": 0.958,
              "vectorSimilarity": 0.956
            },
            "textEmbedding": {
              "searchScore": 0.958,
              "vectorSimilarity": 0.956
            }
          }
        ]
      },
      {
        "ordinal": 1,
        "vectors": [
          {
            "imageEmbedding": null,
            "textEmbedding": {
              "searchScore": 0.872,
              "vectorSimilarity": 0.869
            }
          }
        ]
      }
    ]
  }
}

Opisy pól

Pole Opis
ordinal Indeks zerowy elementu wewnątrz kolekcji.
vectors Jeden wpis na przeszukiwalne pole wektora zawarte w elemencie.
searchScore Końcowy wynik dla tego pola, po każdym ponownym ocenianiu i zwiększeniach.
vectorSimilarity Nieprzetworzone podobieństwo zwracane przez funkcję distance.

Uwaga

innerHits obecnie raportuje tylko pola wektorowe.

Relacja z debug=vector

Oto kilka faktów dotyczących tej właściwości:

  • Istniejący debug=vector przełącznik pozostaje niezmieniony.

  • W przypadku użycia z polami @search.documentDebugInfo.vector.subscore wielowektorowymi pokazuje maksymalny wynik używany do klasyfikacji dokumentu nadrzędnego, ale nie szczegółów poszczególnych elementów.

  • Służy innerHits do uzyskiwania wglądu w sposób, w jaki poszczególne elementy przyczyniły się do wyniku.