Azure AI Search'te vektör sorgusu oluşturma

Azure AI Search'te, arama dizininde vektör alanlarınız varsa, bu makalede şunların nasıl yapılacağını açıklanmaktadır:

Bu makalede çizim için REST kullanılır. Diğer dillerdeki kod örnekleri için vektör sorguları içeren uçtan uca çözümler için azure-search-vector-samples GitHub deposuna bakın.

Önkoşullar

İpucu

Dizininizde vektör olup olmadığını hızla belirlemek için, özniteliği ve vectorSearchProfile ataması olan dimensions türünde Collection(Edm.Single)alanlar arayın.

Sorgu dizesi girişini vektöre dönüştürme

Vektör alanını sorgulamak için sorgunun kendisi bir vektör olmalıdır. Kullanıcının metin sorgu dizesini vektör gösterimine dönüştürmeye yönelik bir yaklaşım, uygulama kodunuzda bir ekleme kitaplığını veya API'yi çağırmaktır. En iyi yöntem olarak, her zaman kaynak belgelere ekleme oluşturmak için kullanılan aynı ekleme modellerini kullanın.

azure-search-vector-samples deposunda ekleme oluşturmayıgösteren kod örnekleri bulabilirsiniz.

Azure OpenAI ekleme modelinin dağıtımına gönderilen sorgu dizesinin REST API örneği aşağıda verilmiştir:

POST https://{{openai-service-name}}.openai.azure.com/openai/deployments/{{openai-deployment-name}}/embeddings?api-version={{openai-api-version}}
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "input": "what azure services support generative AI'"
}

Dağıtılan modele başarılı bir çağrı için beklenen yanıt 202'dir. Yanıtın gövdesindeki "ekleme" alanı, "input" sorgu dizesinin vektör gösterimidir. Test amacıyla, sonraki birkaç bölümde gösterilen söz dizimini kullanarak bir sorgu isteğinde "embedding" dizisinin değerini "vectorQueries.vector" içine kopyalayabilirsiniz.

Dağıtılan modele yapılan bu POST çağrısının gerçek yanıtı, okunabilirlik için yalnızca ilk birkaç vektöre kırpılmış 1536 ekleme içerir.

{
    "object": "list",
    "data": [
        {
            "object": "embedding",
            "index": 0,
            "embedding": [
                -0.009171937,
                0.018715322,
                ...
                -0.0016804502
            ]
        }
    ],
    "model": "ada",
    "usage": {
        "prompt_tokens": 7,
        "total_tokens": 7
    }
}

Bu yaklaşımda uygulama kodunuz bir modele bağlanmak, eklemeler oluşturmak ve yanıtı işlemekle sorumludur.

Vektör sorgu isteği

Bu bölümde vektör sorgusunun temel yapısı gösterilmektedir. Vektör sorgusunu formüle etmek için Azure portalını, REST API'lerini veya Azure SDK'larını kullanabilirsiniz. 2023-07-01-Preview sürümünden geçiş gerçekleştiriyorsanız hataya neden olan değişiklikler vardır. Ayrıntılar için bkz . En son REST API'ye yükseltme.

2023-11-01, Search POST için kararlı REST API sürümüdür. Bu sürüm şu desteği destekler:

  • vectorQueries , vektör araması için yapıdır.
  • kindvector ayarı, sorgunun bir vektör dizisi olduğunu belirtir.
  • vector sorgudur (metin veya görüntünün vektör gösterimi).
  • exhaustive (isteğe bağlı) alan HNSW için dizinlenmiş olsa bile sorgu zamanında kapsamlı KNN'yi çağırır.

Aşağıdaki örnekte, vektör şu dizenin bir gösterimidir: "Hangi Azure hizmetleri tam metin aramayı destekler". Sorgu alanı hedefler contentVector . Sorgu sonuçları döndürür k . Gerçek vektörde 1536 ekleme vardır, bu nedenle okunabilirlik için bu örnekte kırpılır.

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}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "k": 5
        }
    ]
}

Vektör sorgusu yanıtı

Azure AI Search'te sorgu yanıtları varsayılan olarak tüm retrievable alanlardan oluşur. Ancak, arama sonuçlarını bir deyimde listeleyerek alanların bir alt kümesiyle retrievable sınırlamak yaygın bir select durumdır.

Vektör sorgusunda, yanıttaki alanları vektöre almanız gerekip gerekmediğini dikkatle göz önünde bulundurun. Vektör alanları insan tarafından okunamaz, bu nedenle bir web sayfasına yanıt gönderirken sonucu temsil eden seçici olmayan alanları seçmeniz gerekir. Örneğin, sorgu üzerinde contentVectoryürütülürse, bunun yerine döndürebilirsiniz content .

Sonuçta vektör alanlarının olmasını istiyorsanız, yanıt yapısının bir örneğini aşağıda bulabilirsiniz. contentVector , kısa bir süre için burada kırpılmış bir ekleme dizesi dizisidir. Arama puanı ilgi düzeyini gösterir. Bağlam için diğer nonvector alanları dahil edilir.

{
    "@odata.count": 3,
    "value": [
        {
            "@search.score": 0.80025613,
            "title": "Azure Search",
            "category": "AI + Machine Learning",
            "contentVector": [
                -0.0018343845,
                0.017952163,
                0.0025753193,
                ...
            ]
        },
        {
            "@search.score": 0.78856903,
            "title": "Azure Application Insights",
            "category": "Management + Governance",
            "contentVector": [
                -0.016821077,
                0.0037742127,
                0.016136652,
                ...
            ]
        },
        {
            "@search.score": 0.78650564,
            "title": "Azure Media Services",
            "category": "Media",
            "contentVector": [
                -0.025449317,
                0.0038463024,
                -0.02488436,
                ...
            ]
        }
    ]
}

Önemli noktalar:

  • k en yakın kaç komşu sonucunun döndürüleceğini (bu örnekte üç) belirler. Algoritma sorgu vektörüne en yakın komşuları bulduğu k için, düşük benzerliğe sahip belgeler olsa bile vektör sorguları her zaman en az k belge olduğunu varsayarak sonuç döndürürk.

  • @search.score, vektör arama algoritması tarafından belirlenir.

  • Arama sonuçlarındaki alanlar tüm retrievable alanlar veya yan select tümcedeki alanlardır. Vektör sorgu yürütmesi sırasında, eşleşme yalnızca vektör verilerinde yapılır. Ancak, yanıt bir dizindeki herhangi retrievable bir alanı içerebilir. Vektör alanı sonucunun kodunu çözme olanağı olmadığından, nonvector metin alanlarının eklenmesi, insan tarafından okunabilen değerleri için yararlıdır.

Filtre içeren vektör sorgusu

Sorgu isteği vektör sorgusu ve filtre ifadesi içerebilir. Filtreler metin ve sayısal alanlara filterable uygulanır ve filtre ölçütlerine göre arama belgelerini dahil etmek veya dışlamak için kullanışlıdır. Bir vektör alanı kendi kendine filtrelenemese de, sorgu aynı dizindeki diğer alanlarda filtreler belirtebilir.

Daha yeni API sürümlerinde, vektör sorgusu yürütmeden önce veya sonra filtre uygulamak için bir filtre modu ayarlayabilirsiniz. Her modun ve dizin boyutuna göre beklenen performansın karşılaştırması için bkz . Vektör sorgularındaki filtreler.

İpucu

Metin veya sayısal değerler içeren kaynak alanlarınız yoksa, meta veri filtresinde yararlı olabilecek LastModified veya CreatedBy özellikleri gibi belge meta verilerini denetleyin.

2023-11-01 , bu API'nin kararlı sürümüdür. Şu şekildedir:

  • vectorFilterMode ön filtre (varsayılan) veya filtre sonrası filtreleme modları için.
  • filter ölçütleri sağlar.

Aşağıdaki örnekte vektör, şu sorgu dizesinin bir gösterimidir: "Hangi Azure hizmetleri tam metin aramayı destekler". Sorgu alanı hedefler contentVector . Gerçek vektörde 1536 ekleme vardır, bu nedenle okunabilirlik için bu örnekte kırpılır.

Filtre ölçütleri, arama altyapısı vektör sorgusunu yürütmeden önce filtrelenebilir bir metin alanına (category bu örnekte) uygulanır.

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}}
{
    "count": true,
    "select": "title, content, category",
    "filter": "category eq 'Databases'",
    "vectorFilterMode": "preFilter",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector",
            "k": 5
        }
    ]
}

Birden çok vektör alanı

"vectorQueries.fields" özelliğini birden çok vektör alanına ayarlayabilirsiniz. Vektör sorgusu, listede sağladığınız fields her vektör alanında yürütülür. Birden çok vektör alanını sorgularken, her birinin aynı ekleme modelinden eklemeler içerdiğinden ve sorgunun aynı ekleme modelinden de oluşturulduğundan emin olun.

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}}
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "exhaustive": true,
            "fields": "contentVector, titleVector",
            "k": 5
        }
    ]
}

Birden çok vektör sorgusu

Çok sorgulu vektör araması, arama dizininizdeki birden çok vektör alanında birden çok sorgu gönderir. Bu sorgu isteğinin yaygın bir örneği, aynı modelin görüntü ve metin içeriğini vektörleştirebildiği çok modüllü vektör araması için CLIP gibi modellerin kullanılmasıdır.

Aşağıdaki sorgu örneği hem hem myTextVectorde myImageVector içinde benzerlik arar, ancak her biri paralel olarak yürütülen sırasıyla iki farklı sorgu ekleme işlemi gönderir. Bu sorgu, Karşılıklı Rank Fusion (RRF) kullanılarak puanlanan bir sonuç üretir.

  • vectorQueries bir dizi vektör sorgusu sağlar.
  • vector arama dizinindeki görüntü vektörlerini ve metin vektörlerini içerir. Her örnek ayrı bir sorgudur.
  • fields hedeflenen vektör alanını belirtir.
  • k sonuçlara dahil etmek için en yakın komşu eşleşmelerinin sayısıdır.
{
    "count": true,
    "select": "title, content, category",
    "vectorQueries": [
        {
            "kind": "vector",
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "myimagevector",
            "k": 5
        },
        {
            "kind": "vector"
            "vector": [
                -0.002222222,
                0.018708462,
                -0.013770515,
            . . .
            ],
            "fields": "mytextvector",
            "k": 5
        }
    ]
}

Arama dizininizin görüntü dosyası için bir alan içerdiği varsayılarak arama sonuçları metin ve görüntülerin bir bileşimini içerir (arama dizini görüntüleri depolamaz).

Tümleşik vektörleştirme ile sorgulama (önizleme)

Bu bölümde, bir metin sorgusunu vektöre dönüştüren yeni tümleşik vektörleştirme önizleme özelliğini çağıran bir vektör sorgusu gösterilmektedir. 2023-10-01-Preview REST API'sini veya güncelleştirilmiş bir beta Azure SDK paketini kullanın.

Önkoşul, vektörleştiricinin yapılandırıldığı ve bir vektör alanına atandığı bir arama dizinidir. Vektörleştirici, sorgu zamanında kullanılan bir ekleme modeline bağlantı bilgileri sağlar.

Sorgular vektörler yerine metin dizeleri sağlar:

  • kind olarak ayarlanmalıdır text .
  • text bir metin dizesine sahip olmalıdır. Vektör alanına atanan vektörleştiriciye geçirilir.
  • fields aranacak vektör alanıdır.

Burada, sorgu zamanında vektörleştirilmiş basit bir sorgu örneği verilmiştir. Metin dizesi vektörleştirilir ve descriptionVector alanını sorgulamak için kullanılır.

POST https://{{search-service}}.search.windows.net/indexes/{{index}}/docs/search?api-version=2023-10-01-preview
{
    "select": "title, genre, description",
    "vectorQueries": [
        {
            "kind": "text",
            "text": "mystery novel set in London",
            "fields": "descriptionVector",
            "k": 5
        }
    ]
}

Metin sorgularının tümleşik vektörleştirmesini kullanan karma sorgu aşağıdadır. Bu sorgu birden çok sorgu vektörü alanı, birden çok nonvector alanı, bir filtre ve anlam derecelendirmesi içerir. Yine farklar vektör sorgusu ve text yerine dizesidir.kindvector

Bu örnekte, arama altyapısı , synopsisVectorve authorBioVector dizininde atanan descriptionVectorvektörleştiricilere üç vektörleştirme çağrısı yapar. Sonuçta elde edilen vektörler, belgeleri ilgili alanlarına göre almak için kullanılır. Arama altyapısı ayrıca sorguda search "Londra'da gizemli roman kümesi" adlı bir anahtar sözcük araması yürütür.

POST https://{{search-service}}.search.windows.net/indexes/{{index}}/docs/search?api-version=2023-10-01-preview
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "search":"mystery novel set in London", 
    "searchFields":"description, synopsis", 
    "semanticConfiguration":"my-semantic-config", 
    "queryType":"semantic",
    "select": "title, author, synopsis",
    "filter": "genre eq 'mystery'",
    "vectorFilterMode": "postFilter",
    "vectorQueries": [
        {
            "kind": "text",
            "text": "mystery novel set in London",
            "fields": "descriptionVector, synopsisVector",
            "k": 5
        },
        {
            "kind": "text"
            "text": "living english author",
            "fields": "authorBioVector",
            "k": 5
        }
    ]
}

Dört sorgunun da puanlanan sonuçları RRF derecelendirmesi kullanılarak birleştirilir. İkincil semantik derecelendirme , birleştirilmiş arama sonuçları üzerinden çağrılır, ancak searchFields yalnızca, en semantik olarak ile hizalanmış "search":"mystery novel set in London"sonuçları artırır.

Not

Vektörleştiriciler dizin oluşturma ve sorgulama sırasında kullanılır. Dizinde veri öbekleme ve vektörleştirmeye ihtiyacınız yoksa dizin oluşturucu, beceri kümesi ve veri kaynağı oluşturma gibi adımları atlayabilirsiniz. Bu senaryoda vektörleştirici, bir metin dizesini eklemeye dönüştürmek için yalnızca sorgu zamanında kullanılır.

Vektör sorgusu yanıtında dereceli sonuçların miktarı

Vektör sorgusu, sonuçlarda k kaç eşleşme döndürüleceğini belirleyen parametresini belirtir. Arama altyapısı her zaman eşleşme sayısını döndürür k . Dizindeki belge sayısından büyükse k , belge sayısı döndürülebileceklerin üst sınırını belirler.

Tam metin araması hakkında bilgi sahibiyseniz, dizinde terim veya tümcecik yoksa sıfır sonuç beklemeniz gerekir. Ancak vektör aramasında, arama işlemi en yakın komşuları tanımlar ve en yakın komşular bu kadar benzer olmasa bile her zaman sonuç döndürür k . Bu nedenle, özellikle sınırları ayarlamak için istemleri kullanmıyorsanız, önemli olmayan veya konu dışı sorgular için sonuçlar alabilirsiniz. Daha az ilgili sonuçlar daha kötü bir benzerlik puanına sahiptir, ancak daha yakın bir şey yoksa yine de "en yakın" vektörlerdir. Bu nedenle, anlamlı sonuç içermeyen bir yanıt yine de sonuç döndürebilir k , ancak her sonucun benzerlik puanı düşük olur.

Tam metin araması içeren karma bir yaklaşım bu sorunu hafifletebilir. Başka bir azaltma, arama puanı üzerinde en düşük eşiği ayarlamaktır, ancak yalnızca sorgu tek bir vektör sorgusuysa. Karma sorgular en düşük eşiklere uygun değildir çünkü RRF aralıkları çok daha küçük ve geçicidir.

Sonuç sayısını etkileyen sorgu parametreleri şunlardır:

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

Vektör sorgusunda kullanılan derecelendirme algoritmaları

Sonuçların derecelendirmesi aşağıdakilerden biri tarafından hesaplanır:

  • Benzerlik ölçümü
  • Birden çok arama sonucu kümesi varsa karşılıklı Rank Fusion (RRF).

Benzerlik ölçümü

Yalnızca vektör sorgusu için dizin vectorSearch bölümünde belirtilen benzerlik ölçümü. Geçerli değerler: cosine, euclidean ve dotProduct.

Azure OpenAI ekleme modellerinde kosinüs benzerliği kullanılır. Bu nedenle Azure OpenAI ekleme modellerini cosine kullanıyorsanız önerilen ölçümdür. Desteklenen diğer derecelendirme ölçümleri şunlardır euclidean : ve dotProduct.

RRF kullanma

Sorgu birden çok vektör alanını hedeflediyse, birden çok vektör sorgusunu paralel olarak çalıştırıyorsa veya sorgu, anlamsal derecelendirmeyle veya sıralama olmadan vektör ve tam metin aramasının karmasıysa birden çok küme oluşturulur.

Sorgu yürütme sırasında vektör sorgusu yalnızca bir iç vektör dizinini hedefleyebilir. Bu nedenle, birden çok vektör alanı ve birden çok vektör sorgusu için arama altyapısı, her alanın ilgili vektör dizinlerini hedefleyen birden çok sorgu oluşturur. Çıkış, her sorgu için RRF kullanılarak birleştirilmiş sıralanmış sonuçlar kümesidir. Daha fazla bilgi için bkz . Reciprocal Rank Fusion (RRF) kullanarak ilgi puanı.

Sonraki adımlar

Sonraki adım olarak Python, C# veya JavaScript'teki vektör sorgu kodu örneklerini gözden geçirin.