Pontozási profilok hozzáadása a keresési pontszámok növeléséhez
A pontozási profilok lehetővé teszik az egyező dokumentumok rangsorolását a feltételek alapján. Ebből a cikkből megtudhatja, hogyan adhat meg és rendelhet hozzá olyan pontozóprofilt, amely a megadott paraméterek alapján növeli a keresési pontszámot.
Pontozási profilokat használhat kulcsszókereséshez, vektorkereséshez és hibrid kereséshez. A pontozási profilok azonban csak a nem meg nem tett mezőkre vonatkoznak, ezért győződjön meg arról, hogy az index szöveg- vagy numerikus mezőkkel rendelkezik, amelyek felhasználhatók a pontozási profilokban. A pontozóprofilok támogatása a vektoros és hibrid kereséshez a 2024-05-01 előzetes verzióban és a 2024-07-01 REST API-kban, valamint az ezeket a kiadásokat célzó Azure SDK-csomagokban érhető el.
A pontozási profilok főbb pontjai
A pontozási profil paraméterei a következők:
Súlyozott mezők, ahol egyezés található egy adott sztringmezőben. Előfordulhat például, hogy azt szeretné, hogy az "összegzés" mezőben található egyezések relevánsabbak legyenek, mint a "tartalom" mezőben található egyezések.
Függvények numerikus adatokhoz, beleértve a dátumokat, a tartományokat és a földrajzi koordinátákat. Van egy Címkék függvény is, amely egy tetszőleges sztringgyűjteményt biztosító mezőn működik. Ezt a megközelítést a súlyozott mezőkkel szemben is választhatja, ha szeretné növelni a pontszámot attól függően, hogy egyezés található-e egy címkemezőben.
Létrehozhat több profilt, majd módosíthatja a lekérdezési logikát, hogy kiválassza, melyiket használja.
Egy indexen belül legfeljebb 100 pontozási profillal rendelkezhet (lásd a szolgáltatási korlátokat), de egy adott lekérdezésben egyszerre csak egy profilt adhat meg.
A szemantikai rangsorolót pontozási profilokkal is használhatja. Ha több rangsorolási vagy relevanciafunkció is működik, a szemantikai rangsorolás az utolsó lépés. A keresési pontozás működése illusztráció.
Feljegyzés
Nem ismeri a relevancia fogalmait? A relevancia és a pontozás megtekintése az Azure AI Searchben a háttérért. Ezt a videószegmenst a YouTube-on is megnézheti a BM25 rangsorolt eredményein alapuló pontozási profilokért.
Pontozási profil definíciója
A pontozási profil egy indexsémában definiált objektum. A pontozási profil súlyozott mezőkből, függvényekből és paraméterekből áll.
Az alábbi definíció egy "geo" nevű egyszerű profilt mutat be. Ez a példa a hotelName mezőben található keresési kifejezéssel rendelkező találatokat emeli ki. A függvényt arra distance
is használja, hogy előnyben részesítse az aktuális hely 10 kilométeres körzetében lévő eredményeket. Ha valaki a "fogadó" kifejezésre keres, és a fogadó a szálloda nevének része, az aktuális hely 10 km-es körzetében lévő fogadóval rendelkező szállodákat tartalmazó dokumentumok magasabban jelennek meg a keresési eredményekben.
"scoringProfiles": [
{
"name":"geo",
"text": {
"weights": {
"hotelName": 5
}
},
"functions": [
{
"type": "distance",
"boost": 5,
"fieldName": "location",
"interpolation": "logarithmic",
"distance": {
"referencePointParameter": "currentLocation",
"boostingDistance": 10
}
}
]
}
]
A pontozási profil használatához a lekérdezés úgy van kialakítva, hogy a kérelemben adja meg a scoringProfile paramétert. A REST API használata esetén a lekérdezések GET és POST kérésekkel vannak megadva. Az alábbi példában a "currentLocation" egy kötőjel () elválasztójelével rendelkezik-
. Ezt követik a hosszúsági és szélességi koordináták, ahol a hosszúság negatív érték.
GET /indexes/hotels/docs?search+inn&scoringProfile=geo&scoringParameter=currentLocation--122.123,44.77233&api-version=2024-07-01
Figyelje meg a szintaxisbeli különbségeket a POST használatakor. A POST-ben a "scoringParameters" többes szám, és tömb.
POST /indexes/hotels/docs&api-version=2024-07-01
{
"search": "inn",
"scoringProfile": "geo",
"scoringParameters": ["currentLocation--122.123,44.77233"]
}
Ez a lekérdezés a "fogadó" kifejezésre keres, és az aktuális helyen halad át. Figyelje meg, hogy ez a lekérdezés más paramétereket is tartalmaz, például a scoringParametert. A lekérdezési paramétereket, beleértve a "scoringParameter" paramétert, a Keresési dokumentumok (REST API) ismerteti.
További forgatókönyvekért tekintse meg a vektoros és hibrid keresés kiterjesztett példáját, a kulcsszókeresés bővített példáját.
A keresési pontozás működése az Azure AI Searchben
A pontozási profilok kiegészítik az alapértelmezett pontozási algoritmust a profil feltételeinek megfelelő egyezések pontszámának növelésével. A pontozási függvények a következőre vonatkoznak:
- Szöveg (kulcsszó) keresése
- Tiszta vektoros lekérdezések
- Hibrid lekérdezések szöveg- és vektoralkotó lekérdezésekkel, amelyeket párhuzamosan hajtanak végre
Önálló szöveges lekérdezések esetén a pontozási profilok legfeljebb 1000 egyezést azonosítanak egy BM25-rangsorolt keresésben, és a rendszer az első 50 találatot adja vissza az eredményekben.
A tiszta vektorok esetében a lekérdezés csak vektoros, de ha a k-egyező dokumentumok alfanumerikus mezőket tartalmaznak, amelyeket a pontozási profil képes feldolgozni, a rendszer egy pontozási profilt alkalmaz. A pontozási profil a profil feltételeinek megfelelő dokumentumok kiemelésével módosítja az eredményhalmazt.
A hibrid lekérdezések szöveges lekérdezései esetén a pontozási profilok a BM25-rangsorolt keresésekben legfeljebb 1000 egyezést azonosítanak. Az 1000 találat azonosítása után azonban a rendszer visszaállítja őket az eredeti BM25-sorrendbe, hogy a vektorok eredményeivel együtt a végső kölcsönös rangsorolási függvény (RRF) sorrendbe rendezze őket, ahol a pontozási profilt (az ábrán "végső dokumentum-növelő kiigazításként" azonosítva) az egyesített eredményekre, a vektorok súlyozásával és a szemantikai rangsorolással együtt alkalmazzák az utolsó lépésként.
Pontozási profil hozzáadása keresési indexhez
Kezdje egy indexdefinícióval. Meglévő indexek pontozási profiljait anélkül is hozzáadhatja és frissítheti, hogy újra kellene építenie. Korrektúra közzétételéhez használjon index-létrehozási vagy frissítési kérést.
Illessze be a cikkben megadott sablonba .
Adjon meg egy nevet, amely megfelel az elnevezési konvencióknak.
Adja meg a kiemelési feltételeket. Egyetlen profil tartalmazhat szöveges súlyozott mezőket, függvényeket vagy mindkettőt.
Iteratív módon kell dolgoznia egy olyan adatkészlet használatával, amely segít bizonyítani vagy cáfni egy adott profil hatékonyságát.
A pontozási profilok definiálhatók az Azure Portalon az alábbi képernyőképen látható módon, vagy programozott módon REST API-k vagy Azure SDK-k használatával, például a .NET-hez készült Azure SDK ScoringProfile osztályában.
Szöveg súlyozott mezőinek használata
Szöveggel súlyozott mezőket használjon, ha a mezőkörnyezet fontos, a lekérdezések pedig sztringmezőket tartalmaznak searchable
. Ha például egy lekérdezés tartalmazza a "repülőtér" kifejezést, akkor a Leírás mezőben a "repülőtér" kifejezés nagyobb súlyú lehet, mint a HotelName mezőben.
A súlyozott mezők egy mezőből és egy searchable
szorzóként használt pozitív számból álló név-érték párok. Ha a HotelName eredeti mezőpontszáma 3, a mező összesített pontszáma 6 lesz, ami hozzájárul a szülődokumentum magasabb összesített pontszámához.
"scoringProfiles": [
{
"name": "boostSearchTerms",
"text": {
"weights": {
"HotelName": 2,
"Description": 5
}
}
}
]
Függvények használata
Függvényeket akkor használjon, ha az egyszerű relatív súlyok nem elegendőek vagy nem alkalmazhatók, ahogyan a távolság és a frissesség esetében is, amelyek numerikus adatokkal kapcsolatos számítások. Pontozási profilonként több függvényt is megadhat. Az Azure AI Searchben használt EDM-adattípusokról további információt a Támogatott adattípusok című témakörben talál.
Függvény | Leírás | Használati esetek |
---|---|---|
távolság | Kiemelés közelség vagy földrajzi hely alapján. Ez a függvény csak mezőkkel Edm.GeographyPoint használható. |
"Keresés a közelben" forgatókönyvekhez használható. |
frissesség | Egy dátum/idő mező értékeinek kiemelése (Edm.DateTimeOffset ). Állítsa be a boostingDuration értéket egy olyan érték megadására, amely egy időbélyeget jelöl, amely fölött a kiemelés történik. |
Akkor érdemes használni, ha újabb vagy régebbi dátumokkal szeretné fokozni a használatot. Az elemek, például a naptáresemények rangsorolása jövőbeli dátumokkal, így a jelenhez közelebbi elemek magasabban rangsorolhatók, mint a jövőbeni elemek. A tartomány egyik vége az aktuális időponthoz van rögzítve. Ha a múltban több időt szeretne növelni, használjon pozitív boostingDurationt. A jövőbeni időtartományok növeléséhez használjon negatív boostingDuration értéket. |
magnitúdó | A rangsorolás módosítása egy numerikus mező értékeinek tartománya alapján. Az értéknek egész számnak vagy lebegőpontos számnak kell lennie. Az 1–4 csillagos értékelések esetében ez 1 lenne. Az 50% feletti margók esetében ez 50 lenne. Ez a függvény csak mezőkkel és Edm.Int mezőkkel Edm.Double használható. A nagyságfüggvény esetében megfordíthatja a tartományt magasról alacsonyra, ha az inverz mintázatot szeretné használni (például az alacsonyabb árú elemeket többre szeretné növelni, mint a magasabb árú elemeket). A 100 usd és 1 usd közötti ártartományt 100-nál és boostingRangeEnd 1-nél kell beállítania boostingRangeStart az alacsonyabb árú tételek kiemeléséhez. |
Akkor érdemes használni, ha nyereségmargó, minősítés, átkattintási szám, letöltések száma, legmagasabb ár, legalacsonyabb ár vagy letöltések száma alapján szeretné növelni. Ha két elem releváns, először a magasabb minősítésű elem jelenik meg. |
címke | A keresési dokumentumok és a lekérdezési sztringek gyakori címkéinek kiemelése. A címkéket egy tagsParameter . Ez a függvény csak olyan típusú keresési mezőkkel használható, mint a Edm.String Collection(Edm.String) . |
Címkemezők használata esetén. Ha a listában egy adott címke vesszővel tagolt lista, akkor a mező szöveg normalizálója segítségével a vesszőket a lekérdezéskor (a vessző karakterét szóközre képezheti le). Ez a megközelítés "összesimít" egy listát, hogy minden kifejezés egyetlen, hosszú vesszővel tagolt kifejezéssorozat legyen. |
Függvények használatának szabályai
- A függvények csak olyan mezőkre alkalmazhatók, amelyek a következőként
filterable
vannak hozzárendelve: . - A függvény típusának ("frissesség", "magnitúdó", "távolság", "címke") kisbetűnek kell lennie.
- A függvények nem tartalmazhatnak null vagy üres értékeket.
- A függvények függvénydefiníciónként csak egyetlen mezővel rendelkezhetnek. Ha kétszer szeretné használni a magnitúdó értékét ugyanabban a profilban, adjon meg két definíciós nagyságrendet, egyet minden mezőhöz.
Sablon
Ez a szakasz a pontozási profilok szintaxisát és sablonjait mutatja be. A tulajdonságok leírását a REST API-referencia ismerteti.
"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) "...",
Interpolációk beállítása
Az interpolációk a pontozáshoz használt meredekség alakját állítják be. Mivel a pontozás magas vagy alacsony, a meredekség mindig csökken, de az interpoláció határozza meg a lefelé mutató meredekség görbét. A következő interpolációk használhatók:
Interpoláció | Leírás |
---|---|
linear |
A maximális és minimális tartományon belüli elemeknél a kiemelést folyamatosan csökkenő mennyiségben alkalmazza a rendszer. A pontozási profil alapértelmezett interpolációja a lineáris. |
constant |
A kezdő és a záró tartományban lévő elemek esetében a rangsor eredményére állandó kiemelést alkalmazunk. |
quadratic |
A lineáris interpolációhoz képest, amely folyamatosan csökkenő lendületet ad, a Quadratic kezdetben kisebb ütemben csökken, majd a tartományhoz közeledve sokkal nagyobb időközönként csökken. Ez az interpolációs beállítás nem engedélyezett a címkepontozási függvényekben. |
logarithmic |
A folyamatosan csökkenő lökést adó lineáris interpolációhoz képest a logaritmikus kezdetben nagyobb ütemben csökken, majd a tartományhoz közeledve sokkal kisebb időközönként csökken. Ez az interpolációs beállítás nem engedélyezett a címkepontozási függvényekben. |
BoostingDuration beállítása a frissesség függvényhez
boostingDuration
a függvény attribútuma freshness
. Ezzel beállíthat egy lejárati időszakot, amely után a kiemelés leáll egy adott dokumentum esetében. Ha például egy 10 napos promóciós időszakra szeretné növelni egy terméksort vagy márkát, akkor a 10 napos időszakot "P10D" értékként kell megadnia ezekhez a dokumentumokhoz.
boostingDuration
XSD "dayTimeDuration" értékként kell formázni (az ISO 8601 időtartamérték korlátozott részhalmaza). Ennek mintája: "P[nD][T[nH][nM][nS]]".
Az alábbi táblázat több példát is tartalmaz.
Időtartam | boostingDuration |
---|---|
1 nap | "P1D" |
2 nap és 12 óra | "P2DT12H" |
15 perc | "PT15M" |
30 nap, 5 óra, 10 perc és 6,334 másodperc | "P30DT5H10M6.334S" |
További példákért lásd : XML-séma: Adattípusok (W3.org webhely).
Kiterjesztett példa vektoros és hibrid keresésre
Ebben a blogbejegyzésben és jegyzetfüzetben bemutatjuk a pontozási profilok és a dokumentumok vektoros és generatív AI-forgatókönyvekben való használatát.
Bővített példa kulcsszókeresésre
Az alábbi példa egy két pontozási profillal (boostGenre
, newAndHighlyRated
) rendelkező index sémáját mutatja be. Az index azon lekérdezése, amely bármelyik profilt lekérdezési paraméterként tartalmazza, a profilt használja az eredményhalmaz pontozására.
A boostGenre
profil súlyozott szövegmezőket használ, és növeli az albumTitle, a műfaj és az artistName mezőkben található találatokat. A mezők 1,5, 5, illetve 2-et emelnek ki. Miért olyan magasabb a műfaj, mint a többi? Ha a keresést kissé homogén adatokon végzik (ahogy a "műfaj" a musicstoreindexben), akkor nagyobb varianciára lehet szükség a relatív súlyokban. A musicstoreindexben például a "rock" műfajként és azonos kifejezésű műfaji leírásokban is megjelenik. Ha azt szeretné, hogy a műfaj meghaladja a műfaj leírását, a műfaji mezőnek sokkal nagyobb relatív súlyra lesz szüksége.
{
"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" ]
}
]
}