Sdílet prostřednictvím


Přidání hodnoticích profilů pro zvýšení skóre hledání

Profily bodování umožňují zvýšit hodnocení odpovídajících dokumentů na základě kritérií. V tomto článku se dozvíte, jak určit a přiřadit bodovací profil, který zvýší skóre hledání na základě zadaných parametrů.

Profily bodování můžete použít pro vyhledávání klíčových slov, vektorové vyhledávání a hybridní vyhledávání. Profily bodování se ale vztahují pouze na nevectorová pole, proto se ujistěte, že index obsahuje textová nebo číselná pole, která lze použít v bodovacím profilu. Podpora bodovacích profilů pro vektorové a hybridní vyhledávání je dostupná v 2024-05-01-preview a 2024-07-01 rozhraníCH REST API a v balíčcích sady Azure SDK, které cílí na tyto verze.

Klíčové body o bodovacích profilech

Parametry hodnoticího profilu jsou následující:

  • Vážená pole, kde se najde shoda v určitém řetězcovém poli. Můžete například chtít, aby shody nalezené v poli "souhrn" byly relevantnější než stejná shoda nalezená v poli "obsah".

  • Funkce pro číselná data, včetně kalendářních dat, rozsahů a geografických souřadnic Existuje také funkce Tags, která pracuje s polem poskytujícím libovolnou kolekci řetězců. Tento přístup můžete zvolit nad váženými poli, pokud chcete zvýšit skóre na základě toho, jestli se shoda najde v poli značek.

Můžete vytvořit více profilů a pak upravit logiku dotazu, abyste zvolili, který z nich se používá.

V indexu můžete mít až 100 hodnoticího profilu (viz limity služby), ale v libovolném dotazu můžete zadat pouze jeden profil.

Sémantický ranker můžete použít s bodovacími profily. Když se hraje více funkcí řazení nebo relevance, je sémantické řazení posledním krokem. Jak funguje bodování hledání, poskytuje obrázek.

Poznámka:

Neznáte koncepty relevance? Navštivte relevance a bodování ve službě Azure AI Search na pozadí. Můžete se také podívat na tento segment videa na YouTube , kde najdete profily bodování nad výsledky seřazené podle BM25.

Definice bodujícího profilu

Bodovací profil je pojmenovaný objekt definovaný ve schématu indexu. Profil bodování se skládá z vážených polí, funkcí a parametrů.

Následující definice ukazuje jednoduchý profil s názvem "geo". Tento příklad zvýší výsledky, které mají hledaný termín v poli hotelName. Používá také distance funkci k upřednostnění výsledků, které jsou v okruhu 10 kilometrů od aktuálního umístění. Pokud někdo hledá termín "inn" a "inn" je součástí názvu hotelu, dokumenty, které obsahují hotely s penzionem v okruhu 10 KM od aktuálního umístění, se ve výsledcích hledání zobrazí výš.

"scoringProfiles": [
  {  
    "name":"geo",
    "text": {  
      "weights": {  
        "hotelName": 5
      }                              
    },
    "functions": [
      {  
        "type": "distance",
        "boost": 5,
        "fieldName": "location",
        "interpolation": "logarithmic",
        "distance": {
          "referencePointParameter": "currentLocation",
          "boostingDistance": 10
        }                        
      }                                      
    ]                     
  }            
]

Pokud chcete použít tento profil bodování, je váš dotaz formulován tak, aby v požadavku určil parametr bodováníProfile. Pokud používáte rozhraní REST API, dotazy se zadají prostřednictvím požadavků GET a POST. V následujícím příkladu má "currentLocation" oddělovač jednoho pomlčky (-). Následuje souřadnice zeměpisné délky a zeměpisné šířky, kde zeměpisná délka je záporná hodnota.

GET /indexes/hotels/docs?search+inn&scoringProfile=geo&scoringParameter=currentLocation--122.123,44.77233&api-version=2024-07-01

Všimněte si rozdílů v syntaxi při použití příkazu POST. V POST je bodovacíParameters množné číslo a jedná se o pole.

POST /indexes/hotels/docs&api-version=2024-07-01
{
    "search": "inn",
    "scoringProfile": "geo",
    "scoringParameters": ["currentLocation--122.123,44.77233"]
}

Tento dotaz vyhledá termín "inn" a předá aktuální umístění. Všimněte si, že tento dotaz obsahuje další parametry, například bodováníParameter. Parametry dotazu, včetně hodnoticího parametruParameter, jsou popsány v rozhraní REST API (Search Documents).

Další scénáře najdete v rozšířeném příkladu vektorového a hybridního vyhledávání a rozšířeném příkladu pro hledání klíčových slov.

Profily bodování doplňují výchozí algoritmus bodování zvýšením skóre shod, které splňují kritéria profilu. Funkce bodování platí pro:

U samostatných textových dotazů identifikují profily vyhodnocování maximálně 1 000 shod v hledání seřazeném BM25 a ve výsledcích se vrátí prvních 50.

U čistých vektorů je dotaz pouze vektorový, ale pokud dokumenty odpovídající k obsahují alfanumerická pole, která může bodovací profil zpracovat, použije se bodovací profil. Profil bodování upraví sadu výsledků zvýšením dokumentů, které splňují kritéria v profilu.

U textových dotazů v hybridním dotazu identifikují profily bodování maximální počet 1 000 shod v hledání seřazeném podle BM25. Jakmile se ale identifikuje těchto 1 000 výsledků, obnoví se do původního pořadí BM25, aby bylo možné je přehodnotit společně s vektory v konečném pořadí reciproční funkce hodnocení (RRF), kde se profil bodování (identifikovaný jako "konečný dokument boosting adjusting" na obrázku) použije na sloučené výsledky spolu s váhou vektorů a sémantické řazení jako poslední krok.

Diagram znázorňující, která pole mají profil bodování a kdy dojde k řazení

Přidání hodnoticího profilu do indexu vyhledávání

  1. Začněte definicí indexu. Profily bodování můžete přidat a aktualizovat v existujícím indexu, aniž byste je museli znovu sestavit. K publikování revize použijte žádost o vytvoření nebo aktualizaci indexu.

  2. Vložte šablonu uvedenou v tomto článku.

  3. Zadejte název, který dodržuje zásady vytváření názvů.

  4. Zadejte kritéria zvýšení. Jeden profil může obsahovat textová vážená pole, funkce nebo obojí.

Měli byste pracovat iterativním způsobem pomocí datové sady, která vám pomůže prokázat nebo vyvrátit účinnost daného profilu.

Profily bodování je možné definovat na webu Azure Portal, jak je znázorněno na následujícím snímku obrazovky, nebo programově prostřednictvím rozhraní REST API nebo v sadách Azure SDK, jako je například třída ScoringProfile v sadě Azure SDK pro .NET.

Stránka Přidat bodovací profily

Použití textových polí s váhou

Textově vážená pole používejte, pokud je kontext pole důležitý a dotazy obsahují searchable řetězcová pole. Pokud například dotaz obsahuje termín "letiště", může být v poli Popis vhodnější "letiště", aby měl větší váhu než v hoteluName.

Vážená pole jsou páry název-hodnota složené z searchable pole a kladné číslo, které se používá jako násobitel. Pokud je původní skóre pole HotelName 3, zvýší se skóre pro toto pole 6, což přispívá k vyššímu celkovému skóre pro samotný nadřazený dokument.

"scoringProfiles": [  
    {  
      "name": "boostSearchTerms",  
      "text": {  
        "weights": {  
          "HotelName": 2,  
          "Description": 5 
        }  
      }  
    }
]

Použití funkcí

Funkce používejte, pokud jsou jednoduché relativní váhy nedostatečné nebo se nepoužívají, stejně jako v případě vzdálenosti a aktuálnosti, což jsou výpočty s číselnými daty. Pro každý bodovací profil můžete zadat více funkcí. Další informace o datových typech EDM používaných ve službě Azure AI Search najdete v tématu Podporované datové typy.

Function Popis Případy použití
vzdálenost Zvyšte vzdálenost nebo zeměpisnou polohu. Tuto funkci lze použít pouze s Edm.GeographyPoint poli. Používá se pro scénáře "najít blízko mě".
svěžest Zvýšení hodnoty v poli datetime (Edm.DateTimeOffset). Nastavte boostingDuration pro určení hodnoty představující časový interval, při kterém dochází ke zvýšení. Použijte, když chcete zvýšit využití novějších nebo starších dat. Pořadí položek, jako jsou události kalendáře s budoucími daty, aby položky blíže k prezentaci mohly být seřazeny výš než položky dále v budoucnu. Jeden konec rozsahu je pevně nastaven na aktuální čas. Pokud chcete zvýšit rozsah časů v minulosti, použijte pozitivní boostingDuration. Pokud chcete zvýšit rozsah časů v budoucnu, použijte negativní boostingDuration.
velikost Změna pořadí na základě rozsahu hodnot číselného pole Hodnota musí být celé číslo nebo číslo s plovoucí desetinou čárkou. U hodnocení hvězdičky 1 až 4 by to bylo 1. U okrajů nad 50 % by to bylo 50. Tuto funkci lze použít pouze s Edm.Double poli a Edm.Int poli. U funkce rozsahu můžete obrátit rozsah, vysoký až nízký, pokud chcete inverzní vzor (například zvýšit nižší cenu položek více než položky s vyšší cenou). Vzhledem k rozsahu cen od 100 do 1 00 Kč byste nastavili boostingRangeStart 100 a boostingRangeEnd na 1, aby se zvýšily nižší ceny položek. Použijte, když chcete zvýšit ziskovou marži, hodnocení, počet kliknutí, počet stažení, nejvyšší cenu, nejnižší cenu nebo počet stažení. Pokud jsou relevantní dvě položky, zobrazí se nejprve položka s vyšším hodnocením.
značka Zvyšte je o značky, které jsou společné pro hledání dokumentů i řetězců dotazů. Značky jsou k dispozici v souboru tagsParameter. Tuto funkci lze použít pouze s vyhledávacími poli typu Edm.String a Collection(Edm.String). Použijte, když máte pole značek. Pokud je daná značka v seznamu sama o sobě čárkami odděleným seznamem, můžete pomocí normalizátoru textu v poli odstranit čárky v době dotazu (namapovat znak čárky na mezeru). Tento přístup "zploštěl" seznam tak, aby všechny termíny byly jeden dlouhý řetězec termínů oddělených čárkami.

Pravidla pro používání funkcí

  • Funkce lze použít pouze u polí, která jsou přiřazena jako filterable.
  • Typ funkce ("aktuálnost", "velikost", "vzdálenost", "značka") musí být malé písmeno.
  • Funkce nemohou obsahovat hodnoty null ani prázdné hodnoty.
  • Funkce můžou mít pouze jedno pole pro každou definici funkce. Chcete-li použít velikost dvakrát ve stejném profilu, zadejte dvě definice velikost, jednu pro každé pole.

Šablona

Tato část ukazuje syntaxi a šablonu pro bodovací profily. Popis vlastností najdete v referenčních informacích k rozhraní REST API.

"scoringProfiles": [  
  {   
    "name": "name of scoring profile",   
    "text": (optional, only applies to searchable fields) {   
      "weights": {   
        "searchable_field_name": relative_weight_value (positive #'s),   
        ...   
      }   
    },   
    "functions": (optional) [  
      {   
        "type": "magnitude | freshness | distance | tag",   
        "boost": # (positive number used as multiplier for raw score != 1),   
        "fieldName": "(...)",   
        "interpolation": "constant | linear (default) | quadratic | logarithmic",   

        "magnitude": {
          "boostingRangeStart": #,   
          "boostingRangeEnd": #,   
          "constantBoostBeyondRange": true | false (default)
        }  

        // ( - or -)  

        "freshness": {
          "boostingDuration": "..." (value representing timespan over which boosting occurs)   
        }  

        // ( - or -)  

        "distance": {
          "referencePointParameter": "...", (parameter to be passed in queries to use as reference location)   
          "boostingDistance": # (the distance in kilometers from the reference location where the boosting range ends)   
        }   

        // ( - or -)  

        "tag": {
          "tagsParameter":  "..."(parameter to be passed in queries to specify a list of tags to compare against target field)   
        }
      }
    ],   
    "functionAggregation": (optional, applies only when functions are specified) "sum (default) | average | minimum | maximum | firstMatching"   
  }   
],   
"defaultScoringProfile": (optional) "...", 

Nastavení interpolací

Interpolace nastaví tvar sklonu použitého pro bodování. Vzhledem k tomu, že bodování je vysoké až nízké, sklon se vždy snižuje, ale interpolace určuje křivku sklonu dolů. Můžete použít následující interpolace:

Interpolace Popis
linear U položek, které jsou v maximálním a minimálním rozsahu, se zvýšení použije v neustále se snižujícím množství. Lineární je výchozí interpolace pro bodovací profil.
constant U položek, které jsou v počátečním a koncovém rozsahu, se na výsledky pořadí použije konstantní zvýšení.
quadratic Ve srovnání s lineární interpolací, která má neustále se snižující zvýšení, quadratický zpočátku klesá menším tempem a pak se blíží koncovému rozsahu, snižuje se v mnohem vyšším intervalu. Tato možnost interpolace není povolená ve funkcích bodování značek.
logarithmic Ve srovnání s lineární interpolací, která má neustále se snižující zvýšení, logaritmické zpočátku klesá vyšším tempem a poté, co se blíží koncovému rozsahu, se sníží v mnohem menším intervalu. Tato možnost interpolace není povolená ve funkcích bodování značek.

Konstantní, lineární, kvadratický, log10 spojnic v grafu

Nastavení boostingDuration pro funkci aktuálnosti

boostingDuration je atribut funkce freshness . Použijete ho k nastavení období vypršení platnosti, po kterém se u konkrétního dokumentu zastaví zvýšení. Pokud například chcete zvýšit produktovou řadu nebo značku na 10denní propagační období, zadáte pro tyto dokumenty 10denní období jako P10D.

boostingDuration musí být formátována jako hodnota XSD dayTimeDuration (omezená podmnožina hodnoty doby trvání ISO 8601). Vzor pro toto je: "P[nD][T[nH][nM][nS]]".

Následující tabulka obsahuje několik příkladů.

Doba trvání boostingDuration
1 den "P1D"
2 dny a 12 hodin "P2DT12H"
15 minut "PT15M"
30 dní, 5 hodin, 10 minut a 6,334 sekund "P30DT5H10M6.334S"

Další příklady najdete ve schématu XML: Datové typy (W3.org webu).

Podívejte se na tento blogový příspěvek a poznámkový blok s ukázkou použití hodnoticích profilů a posílení dokumentů ve scénářích vektoru a generování umělé inteligence.

Následující příklad ukazuje schéma indexu se dvěma profily bodování (boostGenre, newAndHighlyRated). Jakýkoli dotaz na tento index, který obsahuje některý z profilů jako parametr dotazu, použije profil k určení skóre sady výsledků.

Profil boostGenre používá vážená textová pole, zvýšení shody nalezené v polích albumTitle, žánr a artistName. Pole se zvýší o 1,5, 5 a 2. Proč se žánr zvyšuje mnohem výš než ostatní? Pokud se vyhledávání provádí přes data, která jsou poněkud homogenní (stejně jako u žánru v musicstoreindex), možná budete potřebovat větší odchylku v relativní hmotnosti. Například v musicstoreindex se "rock" zobrazuje jako žánr i ve identicky frázovaných popisech žánrů. Pokud chcete, aby žánr převažoval nad popisem žánru, pole žánru bude potřebovat mnohem vyšší relativní váhu.

{  
  "name": "musicstoreindex",  
  "fields": [  
    { "name": "key", "type": "Edm.String", "key": true },  
    { "name": "albumTitle", "type": "Edm.String" },  
    { "name": "albumUrl", "type": "Edm.String", "filterable": false },  
    { "name": "genre", "type": "Edm.String" },  
    { "name": "genreDescription", "type": "Edm.String", "filterable": false },  
    { "name": "artistName", "type": "Edm.String" },  
    { "name": "orderableOnline", "type": "Edm.Boolean" },  
    { "name": "rating", "type": "Edm.Int32" },  
    { "name": "tags", "type": "Collection(Edm.String)" },  
    { "name": "price", "type": "Edm.Double", "filterable": false },  
    { "name": "margin", "type": "Edm.Int32", "retrievable": false },  
    { "name": "inventory", "type": "Edm.Int32" },  
    { "name": "lastUpdated", "type": "Edm.DateTimeOffset" }  
  ],  
  "scoringProfiles": [  
    {  
      "name": "boostGenre",  
      "text": {  
        "weights": {  
          "albumTitle": 1.5,  
          "genre": 5,  
          "artistName": 2  
        }  
      }  
    },  
    {  
      "name": "newAndHighlyRated",  
      "functions": [  
        {  
          "type": "freshness",  
          "fieldName": "lastUpdated",  
          "boost": 10,  
          "interpolation": "quadratic",  
          "freshness": {  
            "boostingDuration": "P365D"  
          }  
        },  
        {
          "type": "magnitude",  
          "fieldName": "rating",  
          "boost": 10,  
          "interpolation": "linear",  
          "magnitude": {  
            "boostingRangeStart": 1,  
            "boostingRangeEnd": 5,  
            "constantBoostBeyondRange": false  
          }  
        }  
      ]  
    }  
  ],  
  "suggesters": [  
    {  
      "name": "sg",  
      "searchMode": "analyzingInfixMatching",  
      "sourceFields": [ "albumTitle", "artistName" ]  
    }  
  ]   
}  

Viz také