Aracılığıyla paylaş


Azure AI Search'te karma sorgu oluşturma

Karma arama , bir veya daha fazla metin (anahtar sözcük) sorgularını tek bir arama isteğinde bir veya daha fazla vektör sorgusuyla birleştirir. Sorgular paralel olarak yürütülür. Sonuçlar birleştirilmiş bir sonuç kümesi döndürmek için Reciprocal Rank Fusion (RRF) kullanılarak yeni arama puanlarına göre birleştirilir ve yeniden sıralanır.

Çoğu durumda karşılaştırma testlerine göre anlamsal derecelendirmeye sahip karma sorgular en uygun sonuçları döndürür.

İlgiyi geliştirmek için:

  • MaxTextRecallSize ve countAndFacetMode(önizleme) yeni parametreleri, karma sorguya metin girişleri üzerinde daha fazla denetim sağlar.

  • Yeni vektör ağırlığı, vektör sorgusunun göreli kalınlığını ayarlamanıza olanak tanır. Bu özellik, karma aramada olduğu gibi iki veya daha fazla farklı sonuç kümesinin birleştirilmesi gereken karmaşık sorgularda özellikle yararlıdır.

Önkoşullar

API veya araç seçme

  • 2023-11-01 kararlı sürümü
  • 2023-10-01-preview, karma sorgunun vektör tarafına tümleşik vektörleştirme ekler
  • 2024-03-01-preview, karma sorgunun vektör tarafına dar veri türleri ve skaler niceleme ekler
  • 2024-05-01-preview karma arama için ekler maxTextRecallSize ve countAndFacetMode belirtik olarak
  • Azure portalında Arama Gezgini (2024-05-01-önizleme davranışlarını hedefler)
  • Azure SDK'larının daha yeni kararlı veya beta paketleri (bkz. SDK özellik desteği için değişiklik günlükleri)

Arama Gezgini'nde karma sorgu çalıştırma

  1. Arama Gezgini'nde API sürümünün 2023-10-01-preview veya üzeri olduğundan emin olun.

  2. Görünüm altında JSON görünümü'nü seçin.

  3. Varsayılan sorgu şablonunu, vektör hızlı başlangıç örneği için 539. satırda başlayan sorgu gibi bir karma sorguyla değiştirin. Kısalık için, vektör bu makalede kesilir.

    Karma sorgu, içinde searchbelirtilen bir metin sorgusuna ve altında vectorQueries.vectorbelirtilen vektör sorgusuna sahiptir.

    Metin sorgusu ve vektör sorgusu eşdeğer olmalıdır veya en azından çakışmamalıdır. Sorgular farklıysa karma avantajından yararlanamazsınız.

    {
        "count": true,
        "search": "historic hotel walk to restaurants and shopping",
        "select": "HotelId, HotelName, Category, Tags, Description",
        "top": 7,
        "vectorQueries": [
            {
                "vector": [0.01944167, 0.0040178085, -0.007816401 ... <remaining values omitted> ], 
                "k": 7,
                "fields": "DescriptionVector",
                "kind": "vector",
                "exhaustive": true
            }
        ]
    }
    
  4. Ara'yı seçin.

Karma sorgu isteği (REST API)

Karma sorgu, parametrenin bir sorgu dizesi alıp vektör sorgusunu search aldığı metin araması ile vectorQueries.vector vektör aramasını birleştirir. Arama altyapısı tam metin ve vektör sorgularını paralel olarak çalıştırır. Tüm eşleşmelerin birleşimi Reciprocal Rank Fusion (RRF) kullanılarak ilgi açısından değerlendirilir ve yanıtta tek bir sonuç kümesi döndürülür.

Sonuçlar, olarak işaretlenmiş alanlardaki vektörler de dahil olmak üzere düz metin olarak retrievabledöndürülür. Sayısal vektörler arama sonuçlarında kullanışlı olmadığından, vektör eşleşmesi için ara sunucu olarak dizindeki diğer alanları seçin. Örneğin, bir dizinde "descriptionVector" ve "descriptionText" alanları varsa, sorgu "descriptionVector" ile eşleşebilir, ancak arama sonucunda "descriptionText" gösterilebilir. Sonuçlarda select yalnızca insan tarafından okunabilir alanlar belirtmek için parametresini kullanın.

Aşağıdaki örnekte karma sorgu yapılandırması gösterilmektedir.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "exhaustive": true,
            "k": 10
        },
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "exhaustive": true,
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Address/City",
    "top": 10
}

Önemli noktalar:

  • Vektör sorgu dizesi özelliği aracılığıyla vectorQueries.vector belirtilir. Sorgu "DescriptionVector" alanında yürütülür. Sorgu türünü belirtmek için "vektör" olarak ayarlayın kind . İsteğe bağlı olarak, vektör alanının tüm içeriğini sorgulamak için true olarak ayarlayın exhaustive .

  • Anahtar sözcük araması özelliği aracılığıyla search belirtilir. Vektör sorgusuyla paralel olarak yürütülür.

  • k vektör sorgusundan en yakın kaç komşu eşleşmesinin döndürüleceğini ve RRF derecesine sağlandığını belirler.

  • top yanıtta kaç eşleşme döndürüleceğini belirler. Bu örnekte, birleştirilmiş sonuçlarda en az 10 eşleşme olduğu varsayılarak yanıt 10 sonuç içerir.

Filtre ile karma arama

Bu örnek, arama dizininin filterable nonvector alanlarına uygulanan bir filtre ekler.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "vectorFilterMode": "postFilter",
    "filter": "ParkingIncluded",
    "top": "10"
}

Önemli noktalar:

  • Filtreler filtrelenebilir alanların içeriğine uygulanır. Bu örnekte ParkingIncluded alanı bir boole değeridir ve dizin şemasında olarak filterable işaretlenmiştir.

  • Karma sorgularda, sorgu yüzeyini azaltmak için sorgu yürütmeden önce veya sonuçları kırpmak için sorgu yürütmeden sonra filtreler uygulanabilir. "preFilter" varsayılan değerdir. kullanmak postFilteriçin, bu örnekte gösterildiği gibi filtre işleme modunu ayarlayın.

  • Postfilter sorgu sonuçlarını gönderdiğinizde, sonuç sayısı ilk n'den az olabilir.

Semantik derecelendirmeyi etkinleştirdiğiniz ve dizin tanımınızın semantik bir yapılandırma içerdiğini varsayarsak, vektör araması ve anahtar sözcük araması içeren bir sorguyu, birleştirilmiş sonuç kümesi üzerinde anlamsal derecelendirmeyle formüle edebilirsiniz. İsteğe bağlı olarak resim yazıları ve yanıtlar ekleyebilirsiniz.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 50
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Tags",
    "queryType": "semantic",
    "semanticConfiguration": "my-semantic-config",
    "captions": "extractive",
    "answers": "extractive",
    "top": "50"
}

Önemli noktalar:

  • Anlam derecelendirmesi, birleştirilmiş yanıttan en fazla 50 sonuç kabul eder.

  • "queryType" ve "semanticConfiguration" gereklidir.

  • "açıklamalı alt yazılar" ve "yanıtlar" isteğe bağlıdır. Sonuçlardaki tam metinden değerler ayıklanır. Yanıt yalnızca sonuçlarda sorgu yanıtının özelliklerine sahip içerik varsa döndürülür.

Filtre ile anlamsal karma arama

Koleksiyondaki son sorgu aşağıdadır. Önceki örnekle aynı anlamsal karma sorgu, ancak bir filtre ile.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2023-11-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 50
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Tags",
    "queryType": "semantic",
    "semanticConfiguration": "my-semantic-config",
    "captions": "extractive",
    "answers": "extractive",
    "filter": "ParkingIsIncluded'",
    "vectorFilterMode": "postFilter",
    "top": "50"
}

Önemli noktalar:

  • Filtre modu, anlamsal reranker için kullanılabilir sonuç sayısını etkileyebilir. En iyi uygulama olarak, semantik dereceye belge sayısı üst sınırını (50) vermek akıllıcadır. Ön filtreler veya postfilter'lar çok seçiciyse, üzerinde çalışılması gereken 50'den az belge vererek anlam derecesini az kullanıyor olabilirsiniz.

  • Sorgu yürütmeden önce ön filtreleme uygulanır. Ön filtre arama alanını 100 belgeye düşürüyorsa, vektör sorgusu bu 100 belge için "DescriptionVector" alanı üzerinden yürütülür ve k=50 en iyi eşleşme döndürülür. Bu 50 eşleşen belge, birleştirilmiş sonuçlar için RRF'ye ve ardından anlam derecesine geçer.

  • Postfilter sorgu yürütmeden sonra uygulanır. k=50 vektör sorgu tarafında 50 eşleşme döndürürse, filtre sonrası 50 eşleşmeye uygulanır ve filtre ölçütlerine uyan sonuçlar azaltılır ve semantik dereceye geçirilmenizi sağlayan 50'den az belge olur.

maxTextRecallSize ve countAndFacetMode ayarlama (önizleme)

Bu bölümde, karma derecelendirme modeline akan BM25 dereceli sonuçların miktarını denetleyerek karma sorguya yönelik girişlerin nasıl ayarlandığı açıklanmaktadır. BM25 dereceli girişi denetlemek, karma senaryolarda ilgi ayarı için daha fazla seçenek sunar.

İpucu

Dikkate alınması gereken bir diğer seçenek de ek veya değiştirme tekniğidir ; bu da istekteki vektör sorgularının önemini artıran vektör ağırlığıdır.

  1. Bu parametreleri belirtmek için Arama - POST veya Arama - 2024-05-01-preview sürümünde GET kullanın.

  2. Karma sorgunun hybridSearch BM25 dereceli sonuçları aracılığıyla geri çağrılmış en fazla belge sayısını ayarlamak için bir sorgu parametresi nesnesi ekleyin. İki özelliği vardır:

    • maxTextRecallSize karma sorgularda kullanılan Karşılıklı Rank Fusion (RRF) derecelendiricisine sağlanması gereken BM25 dereceli sonuçların sayısını belirtir. Varsayılan değer 1.000'dir. Maksimum değer 10.000'dir.

    • countAndFacetMode BM25 dereceli sonuçların (ve kullanıyorsanız modeller için) sayımlarını bildirir. Varsayılan değer, sorguyla eşleşen tüm belgelerdir. İsteğe bağlı olarak, "count" öğesinin maxTextRecallSizekapsamını olarak ayarlayabilirsiniz.

  3. Vektör benzerliği araması genellikle karma sorgunun metin tarafında daha iyi performans gösterirse azaltın maxTextRecallSize .

  4. Büyük bir dizininiz varsa ve varsayılan değer yeterli sayıda sonuç yakalamıyorsa yükseltin maxTextRecallSize . Daha büyük bir BM25 dereceli sonuç kümesiyle, bu sonuçların bölümlerini almak için , skipve next de ayarlayabilirsiniztop.

Aşağıdaki REST örneklerde ayarı maxTextRecallSizeiçin iki kullanım örneği gösterilmektedir.

İlk örnek 100'e indirgenerek maxTextRecallSize karma sorgunun metin tarafını yalnızca 100 belgeyle sınırlandırıyor. Ayrıca yalnızca içinden gelen maxTextRecallSizesonuçları içerecek şekilde de ayarlarcountAndFacetMode.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-Preview 

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_vector_field", 
          "k": 10 
        } 
      ], 
      "search": "hello world", 
      "hybridSearch": { 
        "maxTextRecallSize": 100, 
        "countAndFacetMode": "countRetrievableResults" 
      } 
    } 

İkinci örnek 5.000'e yükseltir maxTextRecallSize . Ayrıca büyük sonuç kümelerinden sonuçları çekmek için üst, atlama ve yanında da kullanılır. Bu durumda istek, RRF bileşik sonuç kümesine metin sorgusu katkısı olarak 1.500 ile 2.000 arasında bir konumdan başlayarak BM25 dereceli sonuçları çeker.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-Preview 

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_vector_field", 
          "k": 10 
        } 
      ], 
      "search": "hello world",
      "top": 500,
      "skip": 1500,
      "next": 500,
      "hybridSearch": { 
        "maxTextRecallSize": 5000, 
        "countAndFacetMode": "countRetrievableResults" 
      } 
    } 

Sorgu yanıtı yapılandırma

Karma sorguyu ayarlarken yanıt yapısını düşünün. Yanıt düzleştirilmiş bir satır kümesidir. Sorgudaki parametreler, her satırda hangi alanların olduğunu ve yanıtta kaç satır olduğunu belirler. Arama altyapısı eşleşen belgeleri sıralar ve en uygun sonuçları döndürür.

Yanıttaki alanlar

Arama sonuçları, arama dizininizdeki alanlardan retrievable oluşur. Sonuç aşağıdakilerden biri:

  • Tüm retrievable alanlar (bir REST API varsayılanı).
  • Sorgudaki "select" parametresinde açıkça listelenen alanlar.

Bu makaledeki örneklerde yanıttaki metin (seçici olmayan) alanları belirtmek için "select" deyimi kullanılmıştır.

Not

Vektörler insan tarafından okunabilen metinlere ters mühendislik uygulamaz, bu nedenle bunları yanıtta döndürmekten kaçının. Bunun yerine, arama belgesini temsil eden seçici olmayan alanları seçin. Örneğin, sorgu bir "DescriptionVector" alanını hedeflerse, yanıtta bir ("Açıklama") varsa eşdeğer bir metin alanı döndürür.

Sonuç sayısı

Bir sorgu, arama ölçütleri zayıfsa (örneğin, null sorgu için "search=*" gibi) tüm belgelerle eşleşebilir. İlişkisiz sonuçları döndürmek nadiren pratik olduğundan, genel yanıt için bir üst sınır belirtmeniz gerekir:

  • "top": n yalnızca anahtar sözcük sorguları için sonuçlar (vektör yok)
  • "k": n yalnızca vektör sorguları için sonuçlar
  • "top": n "search" parametresi içeren karma sorguların sonuçları (semantik ile veya semantik olmadan)

Hem "k" hem de "top" isteğe bağlıdır. Belirtilmemişse, yanıttaki varsayılan sonuç sayısı 50'dir. "top" ve "skip" değerlerini daha fazla sonuçla sayfaya ayarlayabilir veya varsayılanı değiştirebilirsiniz.

Not

2024-05-01-preview API'sinde karma arama kullanıyorsanız maxTextRecallSize kullanarak anahtar sözcük sorgusundaki sonuç sayısını denetleyebilirsiniz. Her arama alt sisteminden (anahtar sözcük ve vektör) temsili denetlemek için bunu bir "k" ayarıyla birleştirin.

Anlam dereceleyici sonuçları

Not

Semantik dereceleyici 50'ye kadar sonuç alabilir.

2024-05-01-preview API'sinde anlam derecelendirmesi kullanıyorsanız, "k" ve "maxTextRecallSize" değerlerini toplam en az 50'ye ayarlamak en iyi yöntemdir. Daha sonra kullanıcıya döndürülen sonuçları "top" parametresiyle kısıtlayabilirsiniz.

Önceki API'lerde anlam derecelendirmesi kullanıyorsanız aşağıdakileri yapın:

  • yalnızca anahtar sözcük araması yapıyorsanız (vektör yok) "top" değerini 50 olarak ayarlayın
  • karma arama yapıyorsanız, semantik dereceleyicinin en az 50 sonuç aldığından emin olmak için "k" değerini 50 olarak ayarlayın.

Derecelendirme

İsteğe bağlı semantik yeniden boyutlandırma ile veya olmadan karma sorgular için birden çok küme oluşturulur. Sonuçların derecelendirmesi Reciprocal Rank Fusion (RRF) tarafından hesaplanır.

Bu bölümde, en yüksek sonuç için tek vektör araması ile basit karma arama arasındaki yanıtları karşılaştırın. Farklı derecelendirme algoritmaları, HNSW'nin benzerlik ölçümü ve RRF bu durumdur ve farklı büyüklüklere sahip puanlar üretir. Bu davranış, tasarım gereğidir. RRF puanları, yüksek benzerlik eşleşmesi olsa bile oldukça düşük görünebilir. Düşük puanlar, RRF algoritmasının bir özelliğidir. RRF içeren karma sorguda, saf vektör aramasının aksine RRF dereceli belgelerin nispeten daha küçük puanı göz önüne alındığında, dereceli belgelerin daha fazla karşılıklı sonucu sonuçlara eklenir.

Tek Vektör Arama: @search.score kosinüs benzerliğine göre sıralanmış sonuçlar için (varsayılan vektör benzerliği uzaklık işlevi).

{
    "@search.score": 0.8399121,
    "HotelId": "49",
    "HotelName": "Old Carrabelle Hotel",
    "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
    "Category": "Luxury",
    "Address": {
    "City": "Arlington"
    }
}

Karma Arama: @search.score Karşılıklı Rank Fusion kullanılarak sıralanan karma sonuçlar için.

{
    "@search.score": 0.032786883413791656,
    "HotelId": "49",
    "HotelName": "Old Carrabelle Hotel",
    "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
    "Category": "Luxury",
    "Address": {
    "City": "Arlington"
    }
}

Sonraki adımlar

Sonraki adım olarak Python, C# veya JavaScript tanıtım kodunu gözden geçirmenizi öneririz.