Metodtips för förståelse av konversationsspråk
Använd följande riktlinjer för att skapa de bästa möjliga projekten inom förståelse för konversationsspråk.
Välj ett konsekvent schema
Schema är definitionen av dina avsikter och entiteter. Det finns olika metoder som du kan använda när du definierar vad du ska skapa som en avsikt jämfört med en entitet. Ställ dig följande frågor:
- Vilka åtgärder eller frågor försöker jag samla in från min användare?
- Vilka uppgifter är relevanta för varje åtgärd?
Du kan vanligtvis betrakta åtgärder och frågor som avsikter, medan den information som krävs för att uppfylla dessa frågor är entiteter.
Anta till exempel att du vill att dina kunder ska avbryta prenumerationer för olika produkter som du erbjuder via chattroboten. Du kan skapa en avsikt att avbryta med olika exempel som "Avbryt Contoso-tjänsten" eller "Sluta debitera mig för Fabrikam-prenumerationen". Användarens avsikt här är att avbryta och Contoso-tjänsten eller Fabrikam-prenumerationen är de prenumerationer som de vill avbryta.
För att fortsätta skapar du en entitet för prenumerationer. Sedan kan du modellera hela projektet för att avbilda åtgärder som avsikter och använda entiteter för att fylla i dessa åtgärder. Med den här metoden kan du avbryta allt du definierar som en entitet, till exempel andra produkter. Du kan sedan ha avsikter för att registrera dig, förnya och uppgradera som alla använder prenumerationer och andra entiteter .
Den föregående schemadesignen gör det enkelt för dig att utöka befintliga funktioner (avbryta, uppgradera eller registrera dig) till nya mål genom att skapa en ny entitet.
En annan metod är att modellera informationen som avsikter och åtgärderna som entiteter. Låt oss ta samma exempel på hur du låter dina kunder avbryta prenumerationer via chattroboten.
Du kan skapa en avsikt för varje tillgänglig prenumeration, till exempel Contoso, med yttranden som "Avbryt Contoso", "Sluta debitera mig för Contoso-tjänster" och "Avbryt Contoso-prenumerationen". Sedan skapar du en entitet för att registrera åtgärden avbryt . Du kan definiera olika entiteter för varje åtgärd eller konsolidera åtgärder som en entitet med en listkomponent för att skilja mellan åtgärder med olika nycklar.
Den här schemadesignen gör det enkelt för dig att utöka nya åtgärder till befintliga mål genom att lägga till nya åtgärdsentiteter eller entitetskomponenter.
Se till att undvika att försöka tratta alla begrepp till avsikter. Försök till exempel inte skapa en Cancel Contoso-avsikt som bara har syftet med den specifika åtgärden. Avsikter och entiteter bör samarbeta för att samla in all nödvändig information från kunden.
Du vill också undvika att blanda olika schemadesigner. Skapa inte hälften av ditt program med åtgärder som avsikter och den andra hälften med information som avsikter. Se till att det är konsekvent för att få möjliga resultat.
Balansera träningsdata
När det gäller träningsdata kan du försöka hålla schemat väl balanserat. Att inkludera stora mängder av en avsikt och mycket få av en annan resulterar i en modell som är partisk mot vissa avsikter.
För att hantera det här scenariot kan du behöva göra en nedsampling av träningsuppsättningen. Eller så kan du behöva lägga till det. Om du vill göra en nedsampling kan du:
- Bli av med en viss procentandel av träningsdata slumpmässigt.
- Analysera datamängden och ta bort överrepresenterade duplicerade poster, vilket är ett mer systematiskt sätt.
Om du vill lägga till träningsuppsättningen går du till Language Studio och väljer Föreslå yttranden på fliken Dataetiketter. Conversational Language Understanding skickar ett anrop till Azure OpenAI för att generera liknande yttranden.
Du bör också leta efter oavsiktliga "mönster" i träningsuppsättningen. Titta till exempel för att se om träningsuppsättningen för en viss avsikt bara är gemener eller börjar med en viss fras. I sådana fall kan den modell som du tränar lära sig dessa oavsiktliga fördomar i träningsuppsättningen i stället för att kunna generalisera.
Vi rekommenderar att du introducerar mångfald av höljen och skiljetecken i träningsuppsättningen. Om din modell förväntas hantera variationer måste du ha en träningsuppsättning som också återspeglar den mångfalden. Ta till exempel med några yttranden i rätt hölje och vissa i alla gemener.
Tydligt etikettyttranden
Se till att de begrepp som dina entiteter refererar till är väldefinierade och separerbara. Kontrollera om du enkelt kan fastställa skillnaderna på ett tillförlitligt sätt. Om du inte kan det kan den här bristen på skillnad tyda på att den inlärda komponenten också kommer att ha problem.
Om det finns en likhet mellan entiteter kontrollerar du att det finns någon aspekt av dina data som ger en signal om skillnaden mellan dem.
Om du till exempel har skapat en modell för att boka flyg kan en användare använda ett yttrande som "Jag vill ha ett flyg från Boston till Seattle". Ursprungsstaden och målstaden för sådana yttranden förväntas vara liknande. En signal för att särskilja ursprungsstaden kan vara att ordet från ofta föregår det.
Se till att du märker alla instanser av varje entitet i både tränings- och testdata. En metod är att använda sökfunktionen för att hitta alla instanser av ett ord eller en fras i dina data för att kontrollera om de är korrekt märkta.
Märka testdata för entiteter som inte har någon inlärd komponent och även för de entiteter som gör det. Den här metoden hjälper till att säkerställa att dina utvärderingsmått är korrekta.
Använd standardträning före avancerad träning
Standardträningen är kostnadsfri och snabbare än avancerad träning. Det kan hjälpa dig att snabbt förstå effekten av att ändra träningsuppsättningen eller schemat när du skapar modellen. När du är nöjd med schemat bör du överväga att använda avancerad träning för att få bästa modellkvalitet.
Använda utvärderingsfunktionen
När du skapar en app är det ofta bra att fånga fel tidigt. Det är vanligtvis en bra idé att lägga till en testuppsättning när du skapar appen. Tränings- och utvärderingsresultat är användbara för att identifiera fel eller problem i schemat.
Maskininlärningskomponenter och komposition
Mer information finns i Komponenttyper.
Använd tröskelvärdet Ingen poäng
Om du ser för många falska positiva identifieringar, till exempel att utgående yttranden markeras som giltiga avsikter, se Tröskelvärde för konfidens för information om hur det påverkar slutsatsdragning.
- Icke-maskininlärda entitetskomponenter, till exempel listor och regex, är per definition inte kontextuella. Om du ser en lista eller regex-entiteter på oavsiktliga platser kan du prova att märka list synonymerna som den maskininlärda komponenten.
- För entiteter kan du använda den inlärda komponenten som nödvändig komponent för att begränsa när en sammansatt entitet ska utlösas.
Anta till exempel att du har en entitet med namnet Ticket Quantity som försöker extrahera antalet biljetter som du vill reservera för bokning av flyg, för yttranden som "Boka två biljetter i morgon till Kairo".
Vanligtvis lägger du till en fördefinierad komponent för Quantity.Number
som redan extraherar alla tal i yttranden. Men om din entitet bara har definierats med den fördefinierade komponenten extraherar den även andra nummer som en del av entiteten Biljettkvantitet , till exempel "Boka två biljetter i morgon till Kairo kl. 15.00".
Lös problemet genom att märka en inlärd komponent i dina träningsdata för alla nummer som är avsedda att vara en biljettkvantitet. Entiteten har nu två komponenter:
- Den fördefinierade komponenten som kan tolka alla tal.
- Den inlärda komponenten som förutsäger var biljettkvantiteten finns i en mening.
Om du behöver den inlärda komponenten kontrollerar du att Biljettkvantitet endast returneras när den inlärda komponenten förutsäger den i rätt kontext. Om du också behöver den fördefinierade komponenten kan du garantera att den returnerade entiteten Biljettkvantitet är både ett tal och i rätt position.
Inkonsekvenser i adressmodellen
Om din modell är alltför känslig för små grammatiska ändringar, till exempel höljen eller diakritiska tecken, kan du systematiskt manipulera datauppsättningen direkt i Language Studio. Om du vill använda de här funktionerna väljer du fliken Inställningar i det vänstra fönstret och letar upp avsnittet Avancerade projektinställningar .
Först kan du aktivera inställningen Aktivera datatransformering för hölje, vilket normaliserar höljet för yttranden när du tränar, testar och implementerar din modell. Om du migrerade från LUIS kanske du känner igen att LUIS gjorde den här normaliseringen som standard. Om du vill komma åt den här funktionen via API:et anger du parametern normalizeCasing
till true
. Se följande exempel:
{
"projectFileVersion": "2022-10-01-preview",
...
"settings": {
...
"normalizeCasing": true
...
}
...
För det andra kan du också aktivera inställningen Aktivera dataförstoring för diakritiska tecken för att generera variationer av dina träningsdata för möjliga diakritiska variationer som används på naturligt språk. Den här funktionen är tillgänglig för alla språk. Det är särskilt användbart för germanska och slaviska språk, där användarna ofta skriver ord med klassiska engelska tecken i stället för rätt tecken. Frasen "Navigera till sportkanalen" på franska är till exempel "Accédez à la chaîne sportive". När den här funktionen är aktiverad ingår även frasen "Accedez a la chaine sportive" (utan diakritiska tecken) i träningsdatauppsättningen.
Om du aktiverar den här funktionen ökar antalet yttranden i träningsuppsättningen. Därför kan du behöva justera träningsdatastorleken i enlighet med detta. Det aktuella maximala antalet yttranden efter förhöjdhet är 25 000. Om du vill komma åt den här funktionen via API:et anger du parametern augmentDiacritics
till true
. Se följande exempel:
{
"projectFileVersion": "2022-10-01-preview",
...
"settings": {
...
"augmentDiacritics": true
...
}
...
Övertro på adressmodell
Kunder kan använda LoraNorm-transkonfigurationsversionen om modellen är felaktigt överkonfigurerbar. Ett exempel på det här beteendet kan vara som i följande scenario där modellen förutsäger den felaktiga avsikten med 100 % konfidens. Den här poängen gör konfidenströskelprojektets inställning oanvändbar.
Text | Förutsagd avsikt | Konfidenspoäng |
---|---|---|
"Vem byggde Eiffeltornet?" | Sports |
1,00 |
"Ser jag bra ut för dig idag?" | QueryWeather |
1,00 |
"Jag hoppas att du har en god kväll." | Alarm |
1,00 |
Använd den konfigurationsversion som normaliserar konfidenspoäng för 2023-04-15
att hantera det här scenariot. Konfidenströskelprojektinställningen kan sedan justeras för att uppnå önskat resultat.
curl --location 'https://<your-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<your-project>/:train?api-version=2022-10-01-preview' \
--header 'Ocp-Apim-Subscription-Key: <your subscription key>' \
--header 'Content-Type: application/json' \
--data '{
"modelLabel": "<modelLabel>",
"trainingMode": "advanced",
"trainingConfigVersion": "2023-04-15",
"evaluationOptions": {
"kind": "percentage",
"testingSplitPercentage": 0,
"trainingSplitPercentage": 100
}
}
När begäran har skickats kan du spåra förloppet för träningsjobbet i Language Studio som vanligt.
Kommentar
Du måste träna om din modell när du har uppdaterat projektinställningen confidenceThreshold
. Efteråt måste du publicera om appen för att det nya tröskelvärdet ska börja gälla.
Normalisering i modellversion 2023-04-15
Med modellversion 2023-04-15 ger förståelse för konversationsspråk normalisering i slutsatsskiktet som inte påverkar träningen.
Normaliseringsskiktet normaliserar klassificeringens konfidenspoäng till ett begränsat intervall. Det valda intervallet är från [-a,a]
där "a" är kvadratroten för antalet avsikter. Därför beror normaliseringen på antalet avsikter i appen. Om antalet avsikter är lågt har normaliseringsskiktet ett litet intervall att arbeta med. Med ett stort antal avsikter är normaliseringen effektivare.
Om den här normaliseringen inte verkar hjälpa avsikter som ligger utanför omfånget i den utsträckning som tröskelvärdet för konfidens kan användas för att filtrera utanför omfångsyttranden, kan det vara relaterat till antalet avsikter i appen. Överväg att lägga till fler avsikter i appen. Om du använder en orkestrerad arkitektur kan du överväga att slå samman appar som tillhör samma domän tillsammans.
Felsöka sammansatta entiteter
Entiteter är funktioner som genererar intervall i dina indata med en associerad typ. En eller flera komponenter definierar funktionen. Du kan markera komponenter efter behov och du kan bestämma om du vill aktivera inställningen Kombinera komponenter . När du kombinerar komponenter sammanfogas alla överlappningar till ett enda spann. Om inställningen inte används genereras varje enskilt komponentintervall.
För att bättre förstå hur enskilda komponenter fungerar kan du inaktivera inställningen och ställa in varje komponent på Inte obligatoriskt. Med den här inställningen kan du inspektera de enskilda intervall som genereras och experimentera med att ta bort komponenter så att endast problematiska komponenter genereras.
Utvärdera en modell med hjälp av flera testuppsättningar
Data i ett projekt för förståelse av konversationsspråk kan ha två datauppsättningar: en testuppsättning och en träningsuppsättning. Om du vill använda flera testuppsättningar för att utvärdera din modell kan du:
- Ge testuppsättningarna olika namn (till exempel "test1" och "test2").
- Exportera projektet för att hämta en JSON-fil med dess parametrar och konfiguration.
- Använd JSON för att importera ett nytt projekt. Byt namn på den andra önskade testuppsättningen till "test".
- Träna modellen att köra utvärderingen med hjälp av din andra testuppsättning.
Anpassade parametrar för målappar och underordnade appar
Om du använder orkestrerade appar kanske du vill skicka anpassade parameter åsidosättningar för olika underordnade appar. Med targetProjectParameters
fältet kan användare skicka en ordlista som representerar parametrarna för varje målprojekt. Tänk dig till exempel en orchestrator-app med namnet Orchestrator
orchestrating mellan en app för konversationsspråkförstålning med namnet CLU1
och en anpassad fråga som svarar på appen med namnet CQA1
. Om du vill skicka en parameter med namnet "top" till frågesvarsappen kan du använda föregående parameter.
curl --request POST \
--url 'https://<your-language-resource>.cognitiveservices.azure.com/language/:analyze-conversations?api-version=2022-10-01-preview' \
--header 'ocp-apim-subscription-key: <your subscription key>' \
--data '{
"kind": "Conversation",
"analysisInput": {
"conversationItem": {
"id": "1",
"text": "Turn down the volume",
"modality": "text",
"language": "en-us",
"participantId": "1"
}
},
"parameters": {
"projectName": "Orchestrator",
"verbose": true,
"deploymentName": "std",
"stringIndexType": "TextElement_V8",
"targetProjectParameters": {
"CQA1": {
"targetProjectKind": "QuestionAnswering",
"callingOptions": {
"top": 1
}
}
}
}
}'
Kopiera projekt mellan språkresurser
Ofta kan du kopiera projekt för konversationsspråkstolkning från en resurs till en annan med hjälp av knappen Kopiera i Language Studio. I vissa fall kan det vara enklare att kopiera projekt med hjälp av API:et.
Identifiera först följande:
- Källprojektnamn.
- Målprojektnamn.
- Källspråkresurs.
- Målspråkresurs, som du vill kopiera den till.
Anropa API:et för att auktorisera kopieringsåtgärden och hämta accessTokens
för den faktiska kopieringsåtgärden senare.
curl --request POST \
--url 'https://<target-language-resource>.cognitiveservices.azure.com//language/authoring/analyze-conversations/projects/<source-project-name>/:authorize-copy?api-version=2023-04-15-preview' \
--header 'Content-Type: application/json' \
--header 'Ocp-Apim-Subscription-Key: <Your-Subscription-Key>' \
--data '{"projectKind":"Conversation","allowOverwrite":false}'
Anropa API:et för att slutföra kopieringsåtgärden. Använd det svar som du fick tidigare som nyttolast.
curl --request POST \
--url 'https://<source-language-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<source-project-name>/:copy?api-version=2023-04-15-preview' \
--header 'Content-Type: application/json' \
--header 'Ocp-Apim-Subscription-Key: <Your-Subscription-Key>\
--data '{
"projectKind": "Conversation",
"targetProjectName": "<target-project-name>",
"accessToken": "<access-token>",
"expiresAt": "<expiry-date>",
"targetResourceId": "<target-resource-id>",
"targetResourceRegion": "<target-region>"
}'
Ta itu med yttranden som inte är domäner
Kunder kan använda den nyligen uppdaterade träningskonfigurationsversionen 2024-08-01-preview
(tidigare 2024-06-01-preview
) om modellen har dålig kvalitet på yttranden som inte finns i domänen. Ett exempel på det här scenariot med standardkonfigurationen för träning kan vara som i följande exempel där modellen har tre avsikter: Sports
, QueryWeather
och Alarm
. Testyttrandena är out-of-domain-yttranden och modellen klassificerar dem som InDomain
med en relativt hög konfidenspoäng.
Text | Förutsagd avsikt | Konfidenspoäng |
---|---|---|
"Vem byggde Eiffeltornet?" | Sports |
0.90 |
"Ser jag bra ut för dig idag?" | QueryWeather |
1,00 |
"Jag hoppas att du har en god kväll." | Alarm |
0.80 |
Du kan åtgärda det här scenariot genom att använda den 2024-08-01-preview
konfigurationsversion som har skapats specifikt för att åtgärda det här problemet, samtidigt som du bibehåller rimligen god kvalitet på InDomain
yttranden.
curl --location 'https://<your-resource>.cognitiveservices.azure.com/language/authoring/analyze-conversations/projects/<your-project>/:train?api-version=2022-10-01-preview' \
--header 'Ocp-Apim-Subscription-Key: <your subscription key>' \
--header 'Content-Type: application/json' \
--data '{
"modelLabel": "<modelLabel>",
"trainingMode": "advanced",
"trainingConfigVersion": "2024-08-01-preview",
"evaluationOptions": {
"kind": "percentage",
"testingSplitPercentage": 0,
"trainingSplitPercentage": 100
}
}
När begäran har skickats kan du spåra förloppet för träningsjobbet i Language Studio som vanligt.
Varningar:
- Tröskelvärdet Ingen poäng för appen (konfidenströskelvärdet under vilket
topIntent
är markerat somNone
) när du använder den här träningskonfigurationen ska vara inställt på 0. Den här inställningen används eftersom den här nya träningskonfigurationen tillskriver en viss del av sannolikheterna i domänen till out-of-domain så att modellen inte är felaktigt övertro på domänyttranden. Därför kan användarna se något lägre konfidenspoäng för domänyttranden jämfört med konfigurationen för prod-träning. - Vi rekommenderar inte den här träningskonfigurationen för appar med endast två avsikter, till exempel
IntentA
ochNone
. - Vi rekommenderar inte den här träningskonfigurationen för appar med ett lågt antal yttranden per avsikt. Vi rekommenderar starkt minst 25 yttranden per avsikt.