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
Vektör ve nonvector alanlarını içeren
searchable
bir arama dizini. Bkz. Dizin oluşturma ve Arama dizinine vektör alanları ekleme.(İsteğe bağlı) Anlamsal derecelendirme istiyorsanız, arama hizmetinizin anlam derecelendirmesi etkin olarak Temel katman veya daha yüksek olması gerekir.
(İsteğe bağlı) Sorgu dizesinin metinden vektöre dönüştürülmesini istiyorsanız (şu anda önizlemede), arama dizinindeki vektör alanlarına vektörleştirici oluşturun ve atayın.
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
vecountAndFacetMode
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
Arama Gezgini'nde API sürümünün 2023-10-01-preview veya üzeri olduğundan emin olun.
Görünüm altında JSON görünümü'nü seçin.
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
search
belirtilen bir metin sorgusuna ve altındavectorQueries.vector
belirtilen 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 } ] }
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 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=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ı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=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. 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.
Anlamsal karma arama
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.
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 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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin