Dela via


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. Det finns några frågor du behöver ställa dig själv:

  • 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 som 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, Contoso-tjänsten eller Fabrikam-prenumerationen är de prenumerationer som de vill avbryta. Därför kan du skapa en entitet för prenumerationer. Du kan sedan modellera hela projektet för att avbilda åtgärder som avsikter och använda entiteter för att fylla i dessa åtgärder. På så sätt 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, uppgradera osv. som alla använder prenumerationerna och andra entiteter .

Schemadesignen ovan gör det enkelt för dig att utöka befintliga funktioner (avbryta, uppgradera, registrera dig) till nya mål genom att skapa en ny entitet.

En annan metod är att modellera informationen som avsikter och åtgärder som entiteter. Låt oss ta samma exempel så att dina kunder kan 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", "Avbryt Contoso-prenumerationen". Du skulle sedan skapa en entitet för att samla in åtgärden, avbryta. 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 bara avsikter, till exempel försök 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

Du bör försöka hålla schemat väl balanserat när det gäller träningsdata. Att inkludera stora mängder av en avsikt och mycket få av en annan kommer att resultera i en modell som är starkt partisk mot vissa avsikter.

För att åtgärda detta kan du behöva göra en nedsampling av träningsuppsättningen eller lägga till den. Du kan antingen utföra nedsampling genom att:

  • Bli av med en viss procentandel av träningsdata slumpmässigt.
  • På ett mer systematiskt sätt genom att analysera datamängden och ta bort överrepresenterade duplicerade poster.

Du kan också lägga till i träningsuppsättningen genom att välja Föreslå yttrandenfliken Dataetiketter i Language Studio. Conversational Language Understanding skickar ett anrop till Azure OpenAI för att generera liknande yttranden.

En skärmbild som visar yttrandeförslag i Language Studio.

Du bör också leta efter oavsiktliga "mönster" i träningsuppsättningen. Om träningsuppsättningen för en viss avsikt till exempel bara är gemen 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 detta vara en indikation på att den inlärda komponenten också kommer att ha problem.

  • Om det finns en likhet mellan entiteter ser du till 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 "Origin city" kan vara att den ofta föregås av ordet "från".

  • 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 dem som gör det. På så sätt kan du se till 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, vilket gör det användbart 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å ut bästa möjliga AIQ av din modell.

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, eftersom tränings- och utvärderingsresultat är mycket användbara för att identifiera fel eller problem i schemat.

Maskininlärningskomponenter och komposition

Se Komponenttyper.

Använda tröskelvärdet "ingen"

Om du ser för många falska positiva identifieringar, till exempel att utgående yttranden markeras som giltiga avsikter, se tröskelvärdet för konfidens för information om hur det påverkar slutsatsdragning.

  • Icke-maskininlärda entitetskomponenter som 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 komponenten Obligatorisk för att begränsa när en sammansatt entitet ska utlösas.

Anta till exempel att du har en entitet som kallas "biljettkvantitet" som försöker extrahera antalet biljetter som du vill reservera för att boka 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 skulle den också extrahera andra nummer som en del av entiteten biljettkvantitet, till exempel "Boka två biljetter i morgon till Kairo klockan 15.00".

För att lösa detta skulle du märka en inlärd komponent i dina träningsdata för alla tal som är avsedda att vara en biljettkvantitet. Entiteten har nu två komponenter:

  • Den fördefinierade komponenten som kan tolka alla tal och
  • 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 biljettkvantiteten 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 biljettkvantitetsentiteten är både ett tal och i rätt position.

Hantera inkonsekvenser i modellen

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 klickar du på fliken Inställningar i det vänstra verktygsfältet och letar upp avsnittet Avancerade projektinställningar .

En skärmbild som visar ett exempel på avancerade projektinställningar.

Först kan du 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 har migrerat 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 ett exempel nedan:

{
  "projectFileVersion": "2022-10-01-preview",
    ...
    "settings": {
      ...
      "normalizeCasing": true
      ...
    }
...

För det andra kan du också använda avancerade projektinställningar för att 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, men den är särskilt användbar 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 bör du tänka på att antalet yttranden i träningsuppsättningen ökar och att du kan behöva justera storleken på träningsdata 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 ett exempel nedan:

{
  "projectFileVersion": "2022-10-01-preview",
    ...
    "settings": {
      ...
      "augmentDiacritics": true
      ...
    }
...

Hantera övertro på modell

Kunder kan använda LoraNorm-receptversionen om modellen är felaktigt överkonfederation. Ett exempel på detta kan vara som nedan (observera att modellen förutsäger den felaktiga avsikten med 100 % konfidens). Detta 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 bra kväll." Alarm 1,00

Du kan åtgärda detta genom att använda konfigurationsversionen 2023-04-15 som normaliserar konfidenspoäng. 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

Modellversion 2023-04-15, förståelse av konversationsspråk ger 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 det finns ett mycket lågt antal avsikter har normaliseringsskiktet ett mycket litet intervall att arbeta med. Med ett ganska 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 bort omfångsyttranden, kan det vara relaterat till antalet avsikter i appen. Överväg att lägga till fler avsikter i appen, eller om du använder en orkestrerad arkitektur bör du överväga att slå samman appar som tillhör samma domän.

Felsöka sammansatta entiteter

Entiteter är funktioner som genererar intervall i dina indata med en associerad typ. Funktionen definieras av en eller flera komponenter. 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å "krävs inte". På så sätt 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 flera testuppsättningar

Data i ett projekt för att förstå 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 och 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 parametern ovan.

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 kopieringsknappen i Azure Language Studio. I vissa fall kan det dock 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 för den faktiska kopieringsåtgärden accessTokens 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>" 
}'

Adressering från domänyttranden

Kunder kan använda den nya receptversionen "2024-06-01-preview" om modellen har dålig AIQ på yttranden från domänen. Ett exempel på detta med standardreceptet kan vara som nedan där modellen har 3 avsikter Sports, QueryWeather och Alarm. Testyttrandena är slut på domänyttranden 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 bra kväll." Alarm 0.80

Du kan åtgärda detta genom att använda den 2024-06-01-preview konfigurationsversion som har skapats specifikt för att åtgärda det här problemet, samtidigt som du bibehåller någorlunda god kvalitet i indomänyttranden.

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-06-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 markeras som Ingen) när du använder det här receptet ska vara inställt på 0. Det beror på att det här nya receptet tillskriver en viss del av domänens sannolikheter till out-of-domain så att modellen inte är felaktigt övertrolig i domänyttranden. Därför kan användarna se något lägre konfidenspoäng för domänyttranden jämfört med prod-receptet.
  • Det här receptet rekommenderas inte för appar med bara två (2) avsikter, till exempel IntentA och None.
  • Det här receptet rekommenderas inte för appar med lågt antal yttranden per avsikt. Minst 25 yttranden per avsikt rekommenderas starkt.