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
Vektör ve nonvector alanlarını içeren
searchable
bir arama dizini. Hızlı bir şekilde dizin oluşturmak için Verileri içeri aktarma ve vektörleştirme sihirbazını öneririz. Aksi takdirde bkz. Dizin oluşturma ve Arama dizinine vektör alanları ekleme.(İsteğe bağlı) Anlam derecesini almak istiyorsanız, arama hizmetinizin Temel katman veya üzeri olması ve anlamsal dereceleyicinin etkin olması gerekir.
(İsteğe bağlı) Bir sorgu dizesinin yerleşik metinden vektöre dönüştürülmesini istiyorsanız, arama dizinindeki vektör alanlarına vektörleştirici oluşturun ve atayın.
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
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.
Görünüm altında JSON görünümü'nü seçerek vektör sorgusuna yapıştırabilirsiniz.
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
search
belirtilen bir metin sorgusu ve altındavectorQueries.vector
belirtilen 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 } ] }
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 retrievable
dö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ınkind
. İsteğe bağlı olarak, vektör alanının tüm içeriğini sorgulamak için true olarak ayarlayınexhaustive
.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. kullanmakpostFilter
iç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:
En son önizleme Arama Belgeleri REST API'sini veya özelliği sağlayan bir Azure SDK beta paketini kullanın.
OData filtre ifadesine yeni
vectorQueries.filterOverride
bir parametre kümesi ekleyerek sorgu isteğini değiştirin.
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
}
Anlamsal karma arama
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.
Bu parametreleri belirtmek için Arama - POST veya Arama - 2024-05-01-preview sürümünde GET kullanın.
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" öğesininmaxTextRecallSize
kapsamını olarak ayarlayabilirsiniz.
Vektör benzerliği araması genellikle karma sorgunun metin tarafında daha iyi performans gösterirse azaltın
maxTextRecallSize
.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 ,skip
venext
de ayarlayabilirsiniztop
.
Aşağıdaki REST örneklerde ayarı maxTextRecallSize
iç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 maxTextRecallSize
sonuç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.