Azure Yapay Zeka Arama'te içeri aktarma ve dizin oluşturma için ilişkisel SQL verilerini modelleme

Not

Azure Yapay Zeka Arama Azure portalı, REST API'leri ve Azure SDK’ları aracılığıyla kullanılabilir. Ayrıca kuruluş içeriğini Microsoft Foundry portalındaki aracılar için yeniden kullanılabilir, izin kullanan bilgi bankalarına dönüştüren yönetilen bilgi katmanı Foundry IQ'yu temel alır.

Azure Yapay Zeka Arama, dizin oluşturma işlem hattına giriş olarak düz bir satır kümesi kabul eder. Kaynak verileriniz SQL Server ilişkisel veritabanındaki birleştirilmiş tablolardan geliyorsa, bu makalede satır kümesinin nasıl derleneceği ve Azure Yapay Zeka Arama dizininde üst-alt ilişkisinin nasıl modelleneceği açıklanmaktadır.

Bir çizim olarak, demo verilerine dayalı varsayımsal bir oteller veritabanına atıfta bulunuruz. Veritabanının 50 otel içeren bir Hotels$ tablodan ve Rooms$ toplam 750 oda için farklı türlerden, fiyatlardan ve olanaklardan oluşan bir tablodan oluştuğu varsayılır. Tablolar arasında bire çok ilişki vardır. Yaklaşımımızda bir görünüm, her satıra ilişkilendirilmiş oda ayrıntılarının ekli olduğu, otel başına bir satır olmak üzere 50 satır döndüren sorguyu sağlar.

Oteller veritabanındaki tablolar ve görünüm

Normal dışı veri sorunu

Bire çok ilişkilerle çalışmanın zorluklarından biri, birleştirilmiş tablolarda oluşturulan standart sorguların normalleştirilmiş verileri döndürmesi ve bu da Azure Yapay Zeka Arama senaryosunda iyi sonuç vermemesidir. Otel ve odaları birleştiren aşağıdaki örneği göz önünde bulundurun.

SELECT * FROM Hotels$
INNER JOIN Rooms$
ON Rooms$.HotelID = Hotels$.HotelID

Bu sorgudan elde edilen sonuçlar, tüm Otel alanlarını ve ardından tüm Oda alanlarını döndürür ve her oda değeri için ön otel bilgileri yinelenir.

Normalleştirilmemiş veriler, oda alanları eklendiğinde gereksiz otel verileri

Bu sorgu yüzeyde başarılı olsa da (tüm verileri düz bir satır kümesinde sağlayarak), beklenen arama deneyimi için doğru belge yapısını teslim etmede başarısız olur. Dizin oluşturma sırasında Azure Yapay Zeka Arama, alınan her satır için bir arama belgesi oluşturur. Arama belgeleriniz yukarıdaki sonuçlar gibi görünseydi, yinelenenleri algılamış olursunuz - yalnızca Eski Century Hotel için yedi ayrı belge. "Florida'daki oteller" sorgusu, yalnızca Old Century Hotel için yedi sonuç döndürerek diğer ilgili otelleri arama sonuçlarının derinliklerine iter.

Otel başına bir belgenin beklenen deneyimini elde etmek için doğru ayrıntı düzeyinde tam bilgi içeren bir satır kümesi sağlamanız gerekir. Bu makalede nasıl olduğu açıklanmaktadır.

Eklenmiş JSON döndüren bir sorgu tanımlama

Beklenen arama deneyimini sunmak için veri kümeniz Azure Yapay Zeka Arama'teki her arama belgesi için bir satırdan oluşmalıdır. Örneğimizde, her otel için bir satır istiyoruz, ancak kullanıcılarımızın gece fiyatı, boyutu ve yatak sayısı gibi önem verdikleri odayla ilgili diğer alanları veya tümü oda ayrıntılarının bir parçası olan plaj görünümünü de arayabilmelerini istiyoruz.

Çözüm, oda ayrıntılarını iç içe JSON olarak yakalamak ve ardından JSON yapısını ikinci adımda gösterildiği gibi görünümdeki bir alana eklemektir.

  1. Hotels$ ve Rooms$ adlı iki tablonun, HotelID alanında birleştirilmiş ve 50 otele ait 750 oda detaylarını içerdiğini varsayalım. Ayrı ayrı, bu tablolar 50 otel ve 750 ilgili oda içerir.

    CREATE TABLE [dbo].[Hotels$](
      [HotelID] [nchar](10) NOT NULL,
      [HotelName] [nvarchar](255) NULL,
      [Description] [nvarchar](max) NULL,
      [Description_fr] [nvarchar](max) NULL,
      [Category] [nvarchar](255) NULL,
      [Tags] [nvarchar](255) NULL,
      [ParkingIncluded] [float] NULL,
      [SmokingAllowed] [float] NULL,
      [LastRenovationDate] [smalldatetime] NULL,
      [Rating] [float] NULL,
      [StreetAddress] [nvarchar](255) NULL,
      [City] [nvarchar](255) NULL,
      [State] [nvarchar](255) NULL,
      [ZipCode] [nvarchar](255) NULL,
      [GeoCoordinates] [nvarchar](255) NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    
    CREATE TABLE [dbo].[Rooms$](
      [HotelID] [nchar](10) NULL,
      [Description] [nvarchar](255) NULL,
      [Description_fr] [nvarchar](255) NULL,
      [Type] [nvarchar](255) NULL,
      [BaseRate] [float] NULL,
      [BedOptions] [nvarchar](255) NULL,
      [SleepsCount] [float] NULL,
      [SmokingAllowed] [float] NULL,
      [Tags] [nvarchar](255) NULL
    ) ON [PRIMARY]
    GO
    
  2. Üst tablodaki SELECT * from dbo.Hotels$'daki tüm alanlardan oluşan ve iç içe sorgunun çıkışını içeren yeni bir Rooms alanı eklenmiş bir görünüm oluşturun. JSON AUTO için bir yan tümce, SELECT * from dbo.Rooms$ çıktı yapısını JSON olarak düzenler.

    CREATE VIEW [dbo].[HotelRooms]
    AS
    SELECT *, (SELECT *
             FROM dbo.Rooms$
             WHERE dbo.Rooms$.HotelID = dbo.Hotels$.HotelID FOR JSON AUTO) AS Rooms
    FROM dbo.Hotels$
    GO
    

    Aşağıdaki ekran görüntüsünde, en altta Rooms nvarchar alanı bulunan sonuç görünümü gösterilmektedir. Odalar alanı yalnızca HotelRooms görünümünde bulunur.

    HotelRooms görünümü

  3. Satır kümesini almak için komutunu çalıştırın SELECT * FROM dbo.HotelRooms . Bu sorgu, bir JSON koleksiyonu olarak ilişkili oda bilgileriyle birlikte otel başına bir tane olmak üzere 50 satır döndürür.

    HotelRooms görünümünden satır kümesi

Bu satır kümesi artık Azure Yapay Zeka Arama'e içeri aktarmaya hazırdır.

Not

Bu yaklaşım, katıştırılmış JSON'un SQL Server'ın sütun boyutu üst sınırı altında olduğunu varsayar.

Bire çok ilişkisinin "çok" tarafı için karmaşık bir koleksiyon kullanma

Azure AI Arama tarafında, iç içe JSON kullanarak bire çok ilişkisini modelleyen bir dizin şeması oluşturun. Önceki bölümde oluşturduğunuz sonuç kümesi genellikle sonraki bölümde sağlanan dizin şemasına karşılık gelir (bazı alanları kısa olması için kesiyoruz).

Aşağıdaki örnek, Karmaşık veri türlerini modelleme'deki örneğe benzer. Bu makalenin odak noktası olan Rooms yapısı, hotels adlı bir dizinin alanlar koleksiyonunda yer almaktadır. Bu örnek, bir koleksiyonda izin verilen birden çok, rastgele sayıda öğenin aksine sabit bir öğe kümesinden oluşmasının Rooms’tan farkı olan Address için karmaşık bir türü de göstermektedir.

{
  "name": "hotels",
  "fields": [
    { "name": "HotelId", "type": "Edm.String", "key": true, "filterable": true },
    { "name": "HotelName", "type": "Edm.String", "searchable": true, "filterable": false },
    { "name": "Description", "type": "Edm.String", "searchable": true, "analyzer": "en.lucene" },
    { "name": "Description_fr", "type": "Edm.String", "searchable": true, "analyzer": "fr.lucene" },
    { "name": "Category", "type": "Edm.String", "searchable": true, "filterable": true, "facetable": true },
    { "name": "ParkingIncluded", "type": "Edm.Boolean", "filterable": true, "facetable": true },
    { "name": "Tags", "type": "Collection(Edm.String)", "searchable": true, "filterable": true, "facetable": true },
    { "name": "Address", "type": "Edm.ComplexType",
      "fields": [
        { "name": "StreetAddress", "type": "Edm.String", "filterable": false, "sortable": false, "facetable": false, "searchable": true },
        { "name": "City", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true },
        { "name": "StateProvince", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": true }
      ]
    },
    { "name": "Rooms", "type": "Collection(Edm.ComplexType)",
      "fields": [
        { "name": "Description", "type": "Edm.String", "searchable": true, "analyzer": "en.lucene" },
        { "name": "Description_fr", "type": "Edm.String", "searchable": true, "analyzer": "fr.lucene" },
        { "name": "Type", "type": "Edm.String", "searchable": true },
        { "name": "BaseRate", "type": "Edm.Double", "filterable": true, "facetable": true },
        { "name": "BedOptions", "type": "Edm.String", "searchable": true, "filterable": true, "facetable": false },
        { "name": "SleepsCount", "type": "Edm.Int32", "filterable": true, "facetable": true },
        { "name": "SmokingAllowed", "type": "Edm.Boolean", "filterable": true, "facetable": false},
        { "name": "Tags", "type": "Edm.Collection", "searchable": true }
      ]
    }
  ]
}

Önceki sonuç kümesi ve yukarıdaki dizin şeması göz önünde bulundurulduğunda, başarılı bir dizin oluşturma işlemi için gerekli tüm bileşenlere sahipsiniz. Düzleştirilmiş veri kümesi dizin oluşturma gereksinimlerini karşılar ancak ayrıntı bilgilerini korur. Azure Yapay Zeka Arama dizininde, arama sonuçları tek tek odaların bağlamını ve özniteliklerini koruyarak otel tabanlı varlıklara kolayca ayrılır.

Karmaşık türün alt alanlarında öznitelik davranışı

Adres ve Odalar altındaki alanlar gibi üst öğeye sahip alanlar alt alanlar olarak adlandırılır. Bir alt alan için "fasetlenebilir" bir öznitelik atayabilirsiniz, ancak faset sayısı her zaman ana belge içindir.

Belgede yalnızca bir "Adres/Şehir" veya "Adres/Eyalet/Bölge" bulunan Adres gibi karmaşık türler için, özellik davranışı beklendiği gibi çalışır. Ancak, her ana belge için birden çok alt belgenin bulunduğu Oda'lar söz konusu olduğunda, küme sayıları yanıltıcı olabilir.

Model karmaşık türleri bölümünde belirtildiği gibi: "Faset sonuçlarında döndürülen belge sayıları, karmaşık bir koleksiyondaki (odalar) alt belgeler için değil, üst belge (otel) için hesaplanır. Örneğin, bir otelin "suite" türünde 20 odası olduğunu varsayalım. Faset parametresi faset=Rooms/Type göz önüne alındığında, faset sayısı odalar için 20 değil, otel için bir tanedir.

Sonraki adımlar

Kendi veri kümenizi kullanarak verileri içeri aktarma sihirbazını kullanarak dizini oluşturabilir ve yükleyebilirsiniz. Sihirbaz, Katıştırılmış JSON koleksiyonunu (Rooms'ta bulunan koleksiyon gibi) algılar ve karmaşık bir tür koleksiyonu içeren bir dizin şeması çıkartır.

Verileri içeri aktarma sihirbazı tarafından çıkarsanan dizin

Verileri içeri aktarma sihirbazının temel adımlarını öğrenmek için aşağıdaki hızlı başlangıcı deneyin.