Aracılığıyla paylaş


Azure AI Search'te karma sorgu oluşturma

Karma arama , metin (anahtar sözcük) ve vektör sorgularını tek bir arama isteğinde birleştirir. İstekteki tüm alt 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.

Bu makalede şunların nasıl yapıldığını öğrenin:

  • Temel istek ayarlama
  • Daha fazla parametre ve filtreyle karma sorgular formüle edin
  • Anlamsal derecelendirme veya vektör ağırlıklarını kullanarak ilgi düzeyini geliştirme
  • Metin ve vektör girişlerini denetleyerek sorgu davranışlarını iyileştirme

Not

2024-09-01-preview sürümündeki yenilikler, filtreleri karma istekteki yalnızca vektör alt sorgularına hedefleyebilme özelliğidir. Bu, filtrelerin nasıl uygulandığına daha fazla duyarlık sağlar. Daha fazla bilgi için bu makaledeki vektör alt sorgularına filtre hedefleme bölümüne bakın.

Önkoşullar

API veya araç seçme

  • Azure portalında Arama Gezgini (hem kararlı hem de önizleme API'sinin arama söz dizimini destekler) karma bir istekte yapıştırmanızı sağlayan bir JSON görünümüne sahiptir.

  • maxTextRecallSize ve countAndFacetMode(önizleme) gibi önizleme özelliklerini kullanıyorsanız 2024-07-01 kararlı sürümü veya son önizleme API sürümü.

    Okunabilirlik için, API'lerin nasıl çalıştığını açıklamak için REST örneklerini kullanırız. Karma sorgular oluşturmak için REST uzantısıyla Visual Studio Code gibi bir REST istemcisi kullanabilirsiniz. Daha fazla bilgi için bkz . Hızlı Başlangıç: REST API'lerini kullanarak vektör araması.

  • 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 ayarlama

  1. Arama Gezgini'nde API sürümünün 2024-07-01 veya daha yeni bir önizleme API sürümü olduğundan emin olun.

  2. Görünüm altında JSON görünümü'nü seçerek vektör sorgusuna yapıştırabilirsiniz.

  3. Varsayılan sorgu şablonunu, vektör hızlı başlangıcının 539. satırından başlayarak "Karma sorgu çalıştırma" örneği gibi bir karma sorguyla değiştirin. Kısalık için, vektör bu makalede kesilir.

    Karma sorguda içinde searchbelirtilen bir metin sorgusu ve altında vectorQueries.vectorbelirtilen bir vektör sorgusu vardır.

    Metin sorgusu ve vektör sorgusu eşdeğer veya farklı olabilir, ancak aynı amacı paylaşmaları yaygındır.

    {
        "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.

İpucu

Vektörleri gizlerseniz arama sonuçlarını okumak daha kolaydır. Sorgu Seçenekleri'nde Arama sonuçlarında vektör değerlerini gizle'yi açın.

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=2024-07-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=2024-07-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.

Vektör alt sorgularını hedefleyen filtrelerle karma arama (önizleme)

2024-09-01-preview kullanarak, karma istekteki yalnızca vektör alt sorgularını hedefleyen ikincil bir filtre uygulayarak arama isteğindeki genel filtreyi geçersiz kılabilirsiniz.

Bu özellik, filtrelerin yalnızca vektör arama sonuçlarını etkileyerek anahtar sözcük tabanlı arama sonuçlarını etkilenmemesini sağlayarak ayrıntılı denetim sağlar.

Hedeflenen filtre, güvenlik kırpma veya jeo-uzamsal arama için kullanılan filtreler de dahil olmak üzere genel filtreyi tamamen geçersiz kılar. Güvenlik kırpması gibi genel filtrelerin gerekli olduğu durumlarda, güvenliğin ve diğer kısıtlamaların tutarlı bir şekilde uygulandığından emin olmak için bu filtreleri hem üst düzey filtreye hem de her vektör düzeyi filtreye açıkça eklemeniz gerekir.

Hedeflenen vektör filtrelerini uygulamak için:

Filtre geçersiz kılması ekleyen karma sorgu örneği aşağıda verilmiştır. "Derecelendirme gt 3" genel filtresi çalışma zamanında filterOvrride ile değiştirilir.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-09-01=preview

{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "exhaustive": true,
            "filterOverride": "Address/City eq 'Seattle'",
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Address/City, Rating",
    "filter": "Rating gt 3"
    "debug": "vector",
    "top": 10
}

Anlam derecesini etkinleştirdiğiniz ve dizin tanımınızın bir semantik 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.

Vektörlerle semantik derecelendirme kullandığınızda 50 olarak ayarlandığından emin olun k . Anlam dereceleyicisi giriş olarak en fazla 50 eşleşme kullanır. 50'den azını belirtmek, gerekli girişlerin semantik derecelendirme modellerini yok eder.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-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 dereceleyici, 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=2024-07-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 sorgusu tarafında 50 eşleşme döndürürse ve ardından 50 eşleşmeye uygulanan bir son filtre döndürürse, sonuçlarınız filtre ölçütlerini karşılayan belge sayısıyla azalır. Bu, semantik dereceye geçirmeniz için 50'den az belge bırakır. Anlam derecelendirmesi kullanıyorsanız bunu aklınızda bulundurun. Giriş olarak 50 belge varsa anlam dereceleyicisi en iyi şekilde çalışır.

maxTextRecallSize ve countAndFacetMode'ı ayarlama

Not

Bu özellik şu anda genel önizlemededir. Bu önizleme, hizmet düzeyi sözleşmesi olmadan sağlanır ve üretim iş yükleri için önerilmez. Bazı özellikler desteklenmiyor olabileceği gibi özellikleri sınırlandırılmış da olabilir. Daha fazla bilgi için bkz. Microsoft Azure Önizlemeleri Ek Kullanım Koşulları.

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.

REST API sürüm 2024-05-01-preview önizlemesini öneririz.

İ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 dereceleyicisi 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 semantik dereceleyici 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": "Swirling Currents 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": "Swirling Currents 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.