Azure AI Search'te karma sorgu oluşturma

Karma arama , bir veya daha fazla 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, tek bir dereceli sonuç kümesi döndürmek için Karşılıklı 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.

Karma sorgu tanımlamak için REST API 2023-11-01, 2023-10-01-preview, 2024-03-01-preview, Azure portalında Arama Gezgini veya Azure SDK'larının daha yeni sürümlerini kullanın.

Önkoşullar

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
    }],
    "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, başlık 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. Her iki sorgunun da eşit gösterimi için "k" ve "top" değerini 50 olarak ayarlayın.

  • "queryType" ve "semanticConfiguration" gereklidir.

  • "başlık s" ve "answers" 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

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, yanıt için bir üst sınır belirtmeniz gerekir:

  • "k": n yalnızca vektör sorguları için sonuçlar
  • "top": n "search" parametresi içeren karma sorguların sonuçları

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.

Anlam derecelendirmesi kullanıyorsanız hem "k" hem de "top" değerini en az 50 olarak ayarlamak en iyi yöntemdir. Semantik dereceleyici 50'ye kadar sonuç alabilir. Her sorgu için 50 belirterek, her iki arama alt sisteminden de eşit gösterim elde edersiniz.

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.