Najlepsze rozwiązania dotyczące interpretacji języka konwersacyjnego
Skorzystaj z poniższych wskazówek, aby utworzyć najlepsze możliwe projekty w zrozumieniu języka konwersacyjnego.
Wybieranie spójnego schematu
Schemat to definicja intencji i jednostek. Istnieją różne podejścia, które można podjąć podczas definiowania tego, co należy utworzyć jako intencję, a nie jednostkę. Spróbuj odpowiedzieć sobie na poniższe pytania:
- Jakie akcje lub zapytania próbuję przechwycić od mojego użytkownika?
- Jakie informacje są istotne w każdej akcji?
Zazwyczaj można traktować akcje i zapytania jako intencje, podczas gdy informacje wymagane do spełnienia tych zapytań to jednostki.
Załóżmy na przykład, że chcesz, aby klienci anulowali subskrypcje dla różnych produktów oferowanych przez czatbota. Możesz utworzyć intencję anulowania z różnymi przykładami, takimi jak "Anuluj usługę Contoso" lub "Zatrzymaj naliczanie opłat za subskrypcję firmy Fabrikam". Celem użytkownika jest anulowanie, a subskrypcja firmy Contoso lub Fabrikam to subskrypcje, które chcą anulować.
Aby kontynuować, należy utworzyć jednostkę dla subskrypcji. Następnie możesz modelować cały projekt, aby przechwytywać akcje jako intencje i używać jednostek do wypełniania tych akcji. Takie podejście umożliwia anulowanie dowolnych elementów zdefiniowanych jako jednostka, takich jak inne produkty. Następnie możesz mieć zamiar rejestracji, odnawiania i uaktualniania, które korzystają z subskrypcji i innych jednostek.
Powyższy projekt schematu ułatwia rozszerzanie istniejących funkcji (anulowanie, uaktualnianie lub rejestrowanie się) na nowe elementy docelowe przez utworzenie nowej jednostki.
Innym podejściem jest modelowanie informacji jako intencji i akcji jako jednostek. Przyjrzyjmy się takiemu przykładowi, że klienci mogą anulować subskrypcje za pośrednictwem czatbota.
Możesz utworzyć intencję dla każdej dostępnej subskrypcji, takiej jak Contoso, z wypowiedziami takimi jak "Anuluj contoso", "Zatrzymaj naliczanie opłat za usługi Contoso" i "Anuluj subskrypcję Contoso". Następnie utworzysz jednostkę w celu przechwycenia akcji anulowania. Można zdefiniować różne jednostki dla każdej akcji lub skonsolidować akcje jako jedną jednostkę ze składnikiem listy, aby odróżnić akcje za pomocą różnych kluczy.
Ten projekt schematu ułatwia rozszerzanie nowych akcji na istniejące obiekty docelowe przez dodanie nowych jednostek akcji lub składników jednostki.
Pamiętaj, aby uniknąć próby lejka wszystkich pojęć w intencje. Na przykład nie próbuj utworzyć intencji Anuluj contoso , która ma tylko cel tej konkretnej akcji. Intencje i jednostki powinny współpracować, aby przechwycić wszystkie wymagane informacje od klienta.
Należy również unikać mieszania różnych projektów schematów. Nie twórz połowy aplikacji z akcjami jako intencjami i drugą połowę z informacjami jako intencjami. Aby uzyskać możliwe wyniki, upewnij się, że jest ona spójna.
Równoważenie danych treningowych
Jeśli chodzi o dane szkoleniowe, spróbuj zachować zrównoważony schemat. Uwzględnienie dużych ilości jednej intencji i bardzo niewielu innych wyników w modelu, który jest stronniczy wobec określonych intencji.
Aby rozwiązać ten scenariusz, może być konieczne wyłączenie zestawu trenowania. Może być też konieczne dodanie do niego. Do downsample można wykonać następujące czynności:
- Pozbądź się pewnej wartości procentowej danych treningowych losowo.
- Przeanalizuj zestaw danych i usuń nadmiernie reprezentowane zduplikowane wpisy, co jest bardziej systematyczne.
Aby dodać zestaw szkoleniowy, w narzędziu Language Studio na karcie Etykietowanie danych wybierz pozycję Sugerowanie wypowiedzi. Usługa Language Understanding do konwersacji wysyła połączenie do usługi Azure OpenAI w celu wygenerowania podobnych wypowiedzi.
Należy również wyszukać niezamierzone "wzorce" w zestawie treningowym. Na przykład sprawdź, czy zestaw trenowania dla określonej intencji to małe litery lub zaczyna się od określonej frazy. W takich przypadkach trenowany model może nauczyć się tych niezamierzonych uprzedzeń w zestawie treningowym zamiast uogólniać.
Zalecamy wprowadzenie różnorodności wielkości liter i interpunkcji w zestawie treningowym. Jeśli model ma obsługiwać odmiany, upewnij się, że masz zestaw szkoleniowy, który odzwierciedla również różnorodność. Na przykład uwzględnij niektóre wypowiedzi we właściwej wielkości liter, a niektóre we wszystkich małych literach.
Jasne etykietowanie wypowiedzi
Upewnij się, że pojęcia, do których odwołują się jednostki, są dobrze zdefiniowane i możliwe do ich separowania. Sprawdź, czy możesz łatwo określić różnice niezawodnie. Jeśli nie możesz, ten brak rozróżnienia może wskazywać, że poznany składnik również będzie miał trudności.
Jeśli istnieje podobieństwo między jednostkami, upewnij się, że istnieją pewne aspekty danych, które zapewniają sygnał różnicy między nimi.
Jeśli na przykład utworzono model do zarezerwowania lotów, użytkownik może użyć wypowiedzi, takiej jak "Chcę lotu z Bostonu do Seattle". Oczekuje się, że miasto pochodzenia i miasto docelowe dla takich wypowiedzi będzie podobne. Sygnałem do odróżnienia miasta pochodzenia może być to, że słowo z często go poprzedza.
Upewnij się, że oznaczysz wszystkie wystąpienia każdej jednostki zarówno w danych szkoleniowych, jak i testowych. Jedną z metod jest użycie funkcji wyszukiwania w celu znalezienia wszystkich wystąpień wyrazu lub frazy w danych w celu sprawdzenia, czy są one poprawnie oznaczone.
Oznacz dane testowe dla jednostek, które nie mają poznanego składnika , a także dla jednostek, które to robią. Ta praktyka pomaga upewnić się, że metryki oceny są dokładne.
Korzystanie ze standardowego trenowania przed zaawansowanym szkoleniem
Trenowanie standardowe jest bezpłatne i szybsze niż zaawansowane szkolenie. Może to pomóc w szybkim zrozumieniu wpływu zmiany zestawu treningowego lub schematu podczas kompilowania modelu. Po zadowoleniu ze schematu rozważ użycie zaawansowanego szkolenia, aby uzyskać najlepszą jakość modelu.
Korzystanie z funkcji oceny
Podczas tworzenia aplikacji często warto wcześnie przechwytywać błędy. Zazwyczaj dobrym rozwiązaniem jest dodanie zestawu testowego podczas kompilowania aplikacji. Wyniki trenowania i oceny są przydatne podczas identyfikowania błędów lub problemów w schemacie.
Składniki i kompozycja uczenia maszynowego
Aby uzyskać więcej informacji, zobacz Typy składników.
Użyj progu wyniku Brak
Jeśli widzisz zbyt wiele wyników fałszywie dodatnich, takich jak wypowiedzi poza kontekstem oznaczone jako prawidłowe intencje, zobacz Próg ufności, aby uzyskać informacje na temat wpływu na wnioskowanie.
- Składniki jednostki inne niż uczenie maszynowe, takie jak listy i wyrażenia regularne, są definiowane jako nie kontekstowe. Jeśli w niezamierzonych miejscach zostanie wyświetlona lista lub jednostki wyrażeń regularnych, spróbuj oznaczyć synonimy listy jako składnik poznany na maszynie.
- W przypadku jednostek możesz użyć poznanego składnika jako składnika Wymagane, aby ograniczyć czas uruchamiania jednostki komponowanej.
Załóżmy na przykład, że masz jednostkę o nazwie Ticket Quantity , która próbuje wyodrębnić liczbę biletów, które chcesz zarezerwować na rezerwację lotów, w wypowiedziach, takich jak "Zarezerwuj dwa bilety jutro do Kairu".
Zazwyczaj dodaje się wstępnie utworzony składnik, Quantity.Number
który wyodrębnia już wszystkie liczby w wypowiedziach. Jeśli jednak jednostka została zdefiniowana tylko za pomocą wstępnie utworzonego składnika, wyodrębnia również inne numery w ramach jednostki Ticket Quantity , takie jak "Zarezerwuj dwa bilety jutro do Kairu o godzinie 15:00".
Aby rozwiązać ten problem, oznaczysz poznany składnik w danych treningowych dla wszystkich liczb, które mają być ilością biletu. Jednostka ma teraz dwa składniki:
- Wstępnie utworzony składnik, który może interpretować wszystkie liczby.
- Poznany składnik, który przewiduje, gdzie znajduje się ilość biletu w zdaniu.
Jeśli potrzebujesz poznanego składnika, upewnij się, że ilość biletów jest zwracana tylko wtedy, gdy poznany składnik przewidzi go w odpowiednim kontekście. Jeśli potrzebujesz również wstępnie utworzonego składnika, możesz zagwarantować, że zwrócona jednostka Ticket Quantity jest zarówno liczbą, jak i prawidłową pozycją.
Niespójności modelu adresów
Jeśli model jest nadmiernie wrażliwy na małe zmiany gramatyczne, takie jak wielkość liter lub znaki diakrytyczne, możesz systematycznie manipulować zestawem danych bezpośrednio w programie Language Studio. Aby użyć tych funkcji, wybierz kartę Ustawienia w okienku po lewej stronie i znajdź sekcję Zaawansowane ustawienia projektu.
Najpierw możesz włączyć ustawienie Włącz przekształcanie danych dla wielkości liter, które normalizuje wielkość liter wypowiedzi podczas trenowania, testowania i implementowania modelu. W przypadku migracji z usługi LUIS można rozpoznać, że usługa LUIS domyślnie wykonała tę normalizację. Aby uzyskać dostęp do tej funkcji za pośrednictwem interfejsu API, ustaw normalizeCasing
parametr na true
wartość . Zobacz poniższy przykład:
{
"projectFileVersion": "2022-10-01-preview",
...
"settings": {
...
"normalizeCasing": true
...
}
...
Po drugie, można również włączyć ustawienie Włącz rozszerzenie danych dla znaków diakrytycznych w celu wygenerowania odmian danych treningowych dla możliwych odmian diakrytycznych używanych w języku naturalnym. Ta funkcja jest dostępna dla wszystkich języków. Jest to szczególnie przydatne w przypadku języków niemieckich i słowiańskich, w których użytkownicy często piszą słowa przy użyciu klasycznych znaków w języku angielskim zamiast poprawnych znaków. Na przykład fraza "Navigate to the sports channel" (Przejdź do kanału sportowego) w języku francuskim to "Accédez à la chaîne sportive". Po włączeniu tej funkcji wyrażenie "Accedez a la chaine sportive" (bez znaków diakrytycznych) jest również zawarte w zestawie danych treningowych.
Jeśli włączysz tę funkcję, liczba wypowiedzi zestawu treningowego wzrośnie. Z tego powodu może być konieczne odpowiednie dostosowanie rozmiaru danych treningowych. Bieżąca maksymalna liczba wypowiedzi po rozszerzaniu wynosi 25 000. Aby uzyskać dostęp do tej funkcji za pośrednictwem interfejsu API, ustaw augmentDiacritics
parametr na true
wartość . Zobacz poniższy przykład:
{
"projectFileVersion": "2022-10-01-preview",
...
"settings": {
...
"augmentDiacritics": true
...
}
...
Nadmierna wydajność modelu adresów
Klienci mogą używać wersji konfiguracji tranzysyjnej LoraNorm, jeśli model jest niepoprawnie nadmiernie niedokonfidentny. Przykładem tego zachowania może być następujący scenariusz, w którym model przewiduje niepoprawną intencję z 100% ufnością. Ten wynik sprawia, że ustawienie projektu progu ufności jest bezużyteczne.
Text | Przewidywana intencja | Współczynnik ufności |
---|---|---|
"Kto zbudował Wieżę Eiffla?" | Sports |
1.00 |
"Czy dziś wyglądam dobrze?" | QueryWeather |
1.00 |
"Mam nadzieję, że masz dobry wieczór." | Alarm |
1.00 |
Aby rozwiązać ten scenariusz, użyj 2023-04-15
wersji konfiguracji, która normalizuje współczynniki ufności. Ustawienie projektu progu ufności można następnie dostosować w celu osiągnięcia żądanego wyniku.
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
}
}
Po wysłaniu żądania możesz śledzić postęp zadania szkoleniowego w programie Language Studio w zwykły sposób.
Uwaga
Po zaktualizowaniu confidenceThreshold
ustawienia projektu należy ponownie wytrenować model. Następnie należy ponownie opublikować aplikację, aby nowa wartość progowa weszła w życie.
Normalizacja w modelu w wersji 2023-04-15
W przypadku modelu w wersji 2023-04-15 zrozumienie języka konwersacyjnego zapewnia normalizację w warstwie wnioskowania, która nie ma wpływu na trenowanie.
Warstwa normalizacji normalizuje wyniki ufności klasyfikacji do ograniczonego zakresu. Wybrany zakres jest obecnie od [-a,a]
tego, gdzie "a" jest pierwiastek kwadratowy liczby intencji. W związku z tym normalizacja zależy od liczby intencji w aplikacji. Jeśli liczba intencji jest niska, warstwa normalizacji ma niewielki zakres do pracy. Dzięki dużej liczbie intencji normalizacja jest bardziej skuteczna.
Jeśli ta normalizacja nie pomaga intencjom, które są poza zakresem w zakresie, w jakim próg ufności może służyć do filtrowania wypowiedzi poza zakresem, może to być związane z liczbą intencji w aplikacji. Rozważ dodanie większej liczby intencji do aplikacji. Jeśli używasz architektury orkiestrowanej, rozważ scalenie aplikacji należących do tej samej domeny.
Debugowanie skomponowanych jednostek
Jednostki to funkcje emitujące zakresy w danych wejściowych ze skojarzonym typem. Co najmniej jeden składnik definiuje funkcję. Możesz oznaczyć składniki zgodnie z potrzebami i zdecydować, czy włączyć ustawienie Połącz składniki . Po połączeniu składników wszystkie zakresy nakładające się są scalane w jeden zakres. Jeśli ustawienie nie jest używane, każdy zakres poszczególnych składników jest emitowany.
Aby lepiej zrozumieć, jak działają poszczególne składniki, możesz wyłączyć ustawienie i ustawić każdy składnik na Wartość Nie jest wymagana. To ustawienie umożliwia inspekcję poszczególnych zakresów emitowanych i eksperymentowanie z usuwaniem składników w celu wygenerowania tylko problematycznych składników.
Ocenianie modelu przy użyciu wielu zestawów testów
Dane w projekcie interpretacji języka konwersacyjnego mogą mieć dwa zestawy danych: zestaw testów i zestaw szkoleniowy. Jeśli chcesz użyć wielu zestawów testów do oceny modelu, możesz:
- Nadaj zestawom testów różne nazwy (na przykład "test1" i "test2").
- Wyeksportuj projekt, aby uzyskać plik JSON z jego parametrami i konfiguracją.
- Za pomocą formatu JSON zaimportuj nowy projekt. Zmień nazwę drugiego żądanego zestawu testów na "test".
- Wytrenuj model, aby uruchomić ocenę przy użyciu drugiego zestawu testów.
Parametry niestandardowe dla aplikacji docelowych i aplikacji podrzędnych
Jeśli używasz zaaranżowanych aplikacji, możesz wysłać przesłonięcia parametrów niestandardowych dla różnych aplikacji podrzędnych. Pole targetProjectParameters
umożliwia użytkownikom wysyłanie słownika reprezentującego parametry dla każdego projektu docelowego. Rozważmy na przykład aplikację orkiestratora o nazwie Orchestrator
orchestrating między aplikacją do interpretacji języka konwersacyjnego o nazwie i niestandardową aplikacją do odpowiadania na pytania o nazwie CLU1
CQA1
. Jeśli chcesz wysłać parametr o nazwie "top" do aplikacji do odpowiadania na pytania, możesz użyć powyższego parametru.
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
}
}
}
}
}'
Kopiowanie projektów między zasobami językowymi
Często można kopiować projekty języka konwersacji z jednego zasobu do innego przy użyciu przycisku Kopiuj w programie Language Studio. W niektórych przypadkach kopiowanie projektów przy użyciu interfejsu API może być łatwiejsze.
Najpierw zidentyfikuj następujące elementy:
- Nazwa projektu źródłowego.
- Nazwa projektu docelowego.
- Zasób języka źródłowego.
- Zasób języka docelowego, czyli miejsce, do którego chcesz go skopiować.
Wywołaj interfejs API, aby autoryzować akcję kopiowania i uzyskać accessTokens
dla rzeczywistej operacji kopiowania później.
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}'
Wywołaj interfejs API, aby ukończyć operację kopiowania. Użyj odpowiedzi, która została wcześniej użyta jako ładunek.
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>"
}'
Rozwiązywanie problemów z wypowiedziami poza domeną
Klienci mogą używać nowo zaktualizowanej wersji 2024-08-01-preview
konfiguracji trenowania (wcześniej 2024-06-01-preview
), jeśli model ma niską jakość wypowiedzi poza domeną. Przykładem tego scenariusza z domyślną konfiguracją trenowania może być następujący przykład, w którym model ma trzy intencje: Sports
, QueryWeather
i Alarm
. Wypowiedzi testowe są wypowiedziami poza domeną, a model klasyfikuje je tak, jak InDomain
w przypadku stosunkowo wysokiego wskaźnika ufności.
Text | Przewidywana intencja | Współczynnik ufności |
---|---|---|
"Kto zbudował Wieżę Eiffla?" | Sports |
0.90 |
"Czy dziś wyglądam dobrze?" | QueryWeather |
1.00 |
"Mam nadzieję, że masz dobry wieczór." | Alarm |
0.80 |
Aby rozwiązać ten scenariusz, użyj 2024-08-01-preview
wersji konfiguracji, która została skompilowana specjalnie, aby rozwiązać ten problem, zachowując jednocześnie rozsądnie dobrą jakość InDomain
wypowiedzi.
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
}
}
Po wysłaniu żądania możesz śledzić postęp zadania szkoleniowego w programie Language Studio w zwykły sposób.
Zastrzeżenia:
- Próg oceny Brak dla aplikacji (próg ufności poniżej, który
topIntent
jest oznaczony jakoNone
) podczas korzystania z tej konfiguracji trenowania powinien być ustawiony na 0. To ustawienie jest używane, ponieważ ta nowa konfiguracja trenowania przypisuje pewną część prawdopodobieństwa w domenie do poza domeną, aby model nie był niepoprawnie nadmiernie nadzorowane w wypowiedziach w domenie. W związku z tym użytkownicy mogą nieznacznie zmniejszyć współczynniki ufności dla wypowiedzi w domenie w porównaniu z konfiguracją trenowania prod. - Nie zalecamy tej konfiguracji trenowania dla aplikacji z tylko dwiema intencjami, takimi jak
IntentA
iNone
, na przykład. - Nie zalecamy tej konfiguracji trenowania dla aplikacji z małą liczbą wypowiedzi na intencję. Zdecydowanie zalecamy co najmniej 25 wypowiedzi na intencję.