Snabbstart: Luis-klientbibliotek (Language Understanding) och REST API
Viktigt!
LUIS dras tillbaka den 1 oktober 2025 och från och med den 1 april 2023 kommer du inte att kunna skapa nya LUIS-resurser. Vi rekommenderar att du migrerar dina LUIS-program till förståelse för konversationsspråk för att dra nytta av fortsatt produktsupport och flerspråkiga funktioner.
Skapa och fråga en AZURE LUIS-app för artificiell intelligens (AI) med LUIS SDK-klientbiblioteken med den här snabbstarten med C#, Python eller JavaScript. Du kan också använda cURL för att skicka begäranden med hjälp av REST-API:et.
Med Language Understanding (LUIS) kan du tillämpa bearbetning av naturligt språk (NLP) på en användares konversationstext med naturligt språk för att förutsäga den övergripande innebörden och hämta relevant, detaljerad information.
- Med redigeringsklientbiblioteket och REST-API:et kan du skapa, redigera, träna och publicera din LUIS-app.
- Med klientbiblioteket för förutsägelsekörning och REST API kan du fråga den publicerade appen.
Använd KLIENTbiblioteken för Language Understanding (LUIS) för .NET för att:
- Skapa ett program
- Lägg till en avsikt, en maskininlärd entitet, med ett exempelyttrande
- Träna och publicera app
- CLR för frågeförutsägelse
Referensdokumentation | Författar- och förutsägelsebibliotekets källkod | Redigera och förutsäga NuGet | C#-exempel
Förutsättningar
- Den aktuella versionen av .NET Core och .NET Core CLI.
- Azure-prenumeration – Skapa en kostnadsfritt
- När du har din Azure-prenumeration skapar du en Language Understanding-redigeringsresurs i Azure Portal för att hämta din nyckel och slutpunkt. Vänta tills den har distribuerats och klicka på knappen Gå till resurs .
- Du behöver nyckeln och slutpunkten från resursen som du skapar för att ansluta ditt program till Language Understanding-redigering. Du klistrar in nyckeln och slutpunkten i koden nedan senare i snabbstarten. Du kan använda den kostnadsfria prisnivån (
F0
) för att prova tjänsten.
- Du behöver nyckeln och slutpunkten från resursen som du skapar för att ansluta ditt program till Language Understanding-redigering. Du klistrar in nyckeln och slutpunkten i koden nedan senare i snabbstarten. Du kan använda den kostnadsfria prisnivån (
Konfigurera
Skapa ett nytt C#-program
Skapa ett nytt .NET Core-program i önskad redigerare eller IDE.
I ett konsolfönster (till exempel cmd, PowerShell eller Bash) använder du dotnet-kommandot
new
för att skapa en ny konsolapp med namnetlanguage-understanding-quickstart
. Det här kommandot skapar ett enkelt "Hello World"-C#-projekt med en enda källfil:Program.cs
.dotnet new console -n language-understanding-quickstart
Ändra katalogen till den nyligen skapade appmappen.
cd language-understanding-quickstart
Du kan skapa programmet med:
dotnet build
Kompileringsutdata får inte innehålla några varningar eller fel.
... Build succeeded. 0 Warning(s) 0 Error(s) ...
Installera NuGet-biblioteken
I programkatalogen installerar du LUIS-klientbiblioteken (Language Understanding) för .NET med följande kommandon:
dotnet add package Microsoft.Azure.CognitiveServices.Language.LUIS.Authoring --version 3.2.0-preview.3
dotnet add package Microsoft.Azure.CognitiveServices.Language.LUIS.Runtime --version 3.1.0-preview.1
Redigeringsobjektmodell
Luis-redigeringsklienten (Language Understanding) är ett LUISAuthoringClient-objekt som autentiserar till Azure, som innehåller din redigeringsnyckel.
Kodexempel för redigering
När klienten har skapats använder du den här klienten för att få åtkomst till funktioner som:
- Appar – skapa, ta bort, publicera
- Exempelyttranden – lägg till, ta bort med ID
- Funktioner – hantera fraslistor
- Modell – hantera avsikter och entiteter
- Mönster – hantera mönster
- Träna – träna appen och söka efter träningsstatus
- Versioner – hantera med klona, exportera och ta bort
Förutsägelseobjektmodell
Luis-förutsägelsekörningsklienten (Language Understanding) är ett LUISRuntimeClient-objekt som autentiserar till Azure, som innehåller din resursnyckel.
Kodexempel för förutsägelsekörning
När klienten har skapats använder du den här klienten för att få åtkomst till funktioner som:
- Förutsägelse efter mellanlagring eller produktionsplats
- Förutsägelse efter version
Kodexempel
De här kodfragmenten visar hur du gör följande med LUIS-klientbiblioteket (Language Understanding) för Python:
- Skapa en app
- Lägg till avsikt
- Lägg till entiteter
- Lägga till exempelyttranden
- Träna appen
- Publicera appen
- Förutsägelse efter fack
Lägg till beroendena
Öppna filen Program.cs i önskad redigerare eller IDE från projektkatalogen. Ersätt den befintliga using
koden med följande using
direktiv:
using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Azure.CognitiveServices.Language.LUIS.Authoring;
using Microsoft.Azure.CognitiveServices.Language.LUIS.Authoring.Models;
using Microsoft.Azure.CognitiveServices.Language.LUIS.Runtime;
using Microsoft.Azure.CognitiveServices.Language.LUIS.Runtime.Models;
using Newtonsoft.Json;
Lägg till pannplåtskod
Ändra signaturen för
Main
metoden för att tillåta asynkrona anrop:public static async Task Main()
Lägg till resten av koden i
Main
-metoden förProgram
klassen om inget annat anges.
Skapa variabler för appen
Skapa två uppsättningar variabler: den första uppsättningen som du ändrar, den andra uppsättningen lämnar som de visas i kodexemplet.
Viktigt!
Kom ihåg att ta bort nyckeln från koden när du är klar och publicera den aldrig offentligt. För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information finns i säkerhetsartikeln för Azure AI-tjänster.
Skapa variabler för redigeringsnyckeln och resursnamnen.
var key = "PASTE_YOUR_LUIS_AUTHORING_SUBSCRIPTION_KEY_HERE"; var authoringEndpoint = "PASTE_YOUR_LUIS_AUTHORING_ENDPOINT_HERE"; var predictionEndpoint = "PASTE_YOUR_LUIS_PREDICTION_ENDPOINT_HERE";
Skapa variabler för att lagra dina slutpunkter, appnamn, version och avsiktsnamn.
var appName = "Contoso Pizza Company"; var versionId = "0.1"; var intentName = "OrderPizzaIntent";
Autentisera klienten
Skapa ett ApiKeyServiceClientCredentials-objekt med nyckeln och använd det med slutpunkten för att skapa ett LUISAuthoringClient-objekt .
var credentials = new Microsoft.Azure.CognitiveServices.Language.LUIS.Authoring.ApiKeyServiceClientCredentials(key);
var client = new LUISAuthoringClient(credentials) { Endpoint = authoringEndpoint };
Skapa en LUIS-app
En LUIS-app innehåller nlp-modellen (natural language processing) inklusive avsikter, entiteter och exempelyttranden.
Skapa ett programSkapaObjekt. Namn- och språkkulturen är obligatoriska egenskaper. Anropa metoden Apps.AddAsync. Svaret är app-ID:t.
var newApp = new ApplicationCreateObject
{
Culture = "en-us",
Name = appName,
InitialVersionId = versionId
};
var appId = await client.Apps.AddAsync(newApp);
Skapa avsikt för appen
Det primära objektet i en LUIS-apps modell är avsikten. Avsikten överensstämmer med en gruppering av avsikterna med användaryttranden. En användare kan ställa en fråga eller göra en instruktion för att söka efter ett visst avsett svar från en robot (eller något annat klientprogram). Exempel på avsikter är att boka en flygresa, fråga om vädret i en målstad och fråga om kontaktinformation för kundtjänst.
Skapa en modellSkapaObjekt med namnet på den unika avsikten och skicka sedan app-ID, versions-ID och ModelCreateObject till metoden Model.AddIntentAsync . Svaret är avsikts-ID:t.
Värdet intentName
är hårdkodat som OrderPizzaIntent
en del av variablerna i avsnittet Skapa variabler för appen .
await client.Model.AddIntentAsync(appId, versionId, new ModelCreateObject()
{
Name = intentName
});
Skapa entiteter för appen
Även om entiteter inte krävs finns de i de flesta appar. Entiteten extraherar information från användaryttrandet som krävs för att fullständigfila användarens avsikt. Det finns flera typer av fördefinierade och anpassade entiteter , var och en med sina egna DTO-modeller (Data Transformation Object). Vanliga fördefinierade entiteter att lägga till i din app är nummer, datetimeV2, geographyV2, ordningstal.
Det är viktigt att känna till att entiteter inte har markerats med en avsikt. De kan och gäller vanligtvis för många avsikter. Endast exempelanvändaryttranden är markerade för en specifik, enskild avsikt.
Skapandemetoder för entiteter ingår i klassen Modell . Varje entitetstyp har en egen modell för datatransformeringsobjekt (DTO), som vanligtvis innehåller ordet model
i namnområdet Modeller .
Koden för att skapa entitet skapar en maskininlärningsentitet med underentiteter och funktioner som tillämpas på underentiteterna Quantity
.
// Add Prebuilt entity
await client.Model.AddPrebuiltAsync(appId, versionId, new[] { "number" });
// Define ml entity with children and grandchildren
var mlEntityDefinition = new EntityModelCreateObject
{
Name = "Pizza order",
Children = new[]
{
new ChildEntityModelCreateObject
{
Name = "Pizza",
Children = new[]
{
new ChildEntityModelCreateObject { Name = "Quantity" },
new ChildEntityModelCreateObject { Name = "Type" },
new ChildEntityModelCreateObject { Name = "Size" }
}
},
new ChildEntityModelCreateObject
{
Name = "Toppings",
Children = new[]
{
new ChildEntityModelCreateObject { Name = "Type" },
new ChildEntityModelCreateObject { Name = "Quantity" }
}
}
}
};
// Add ML entity
var mlEntityId = await client.Model.AddEntityAsync(appId, versionId, mlEntityDefinition); ;
// Add phraselist feature
var phraselistId = await client.Features.AddPhraseListAsync(appId, versionId, new PhraselistCreateObject
{
EnabledForAllModels = false,
IsExchangeable = true,
Name = "QuantityPhraselist",
Phrases = "few,more,extra"
});
// Get entity and subentities
var model = await client.Model.GetEntityAsync(appId, versionId, mlEntityId);
var toppingQuantityId = GetModelGrandchild(model, "Toppings", "Quantity");
var pizzaQuantityId = GetModelGrandchild(model, "Pizza", "Quantity");
// add model as feature to subentity model
await client.Features.AddEntityFeatureAsync(appId, versionId, pizzaQuantityId, new ModelFeatureInformation { ModelName = "number", IsRequired = true });
await client.Features.AddEntityFeatureAsync(appId, versionId, toppingQuantityId, new ModelFeatureInformation { ModelName = "number"});
// add phrase list as feature to subentity model
await client.Features.AddEntityFeatureAsync(appId, versionId, toppingQuantityId, new ModelFeatureInformation { FeatureName = "QuantityPhraselist" });
Använd följande metod till klassen för att hitta underdelen Kvantitets-ID för att tilldela funktionerna till den underdelen.
static Guid GetModelGrandchild(NDepthEntityExtractor model, string childName, string grandchildName)
{
return model.Children.
Single(c => c.Name == childName).
Children.
Single(c => c.Name == grandchildName).Id;
}
Lägga till exempelyttrande i avsikt
För att kunna fastställa ett yttrandes avsikt och extrahera entiteter behöver appen exempel på yttranden. Exemplen måste rikta in sig på en specifik, enskild avsikt och markera alla anpassade entiteter. Fördefinierade entiteter behöver inte markeras.
Lägg till exempelyttranden genom att skapa en lista över ExampleLabelObject-objekt , ett objekt för varje exempelyttrande. Varje exempel bör markera alla entiteter med en ordlista med namn/värde-par med entitetsnamn och entitetsvärde. Entitetsvärdet ska vara exakt som det visas i texten i exempelyttrandet.
Anropa Examples.AddAsync med app-ID, versions-ID och exemplet.
// Define labeled example
var labeledExampleUtteranceWithMLEntity = new ExampleLabelObject
{
Text = "I want two small seafood pizzas with extra cheese.",
IntentName = intentName,
EntityLabels = new[]
{
new EntityLabelObject
{
StartCharIndex = 7,
EndCharIndex = 48,
EntityName = "Pizza order",
Children = new[]
{
new EntityLabelObject
{
StartCharIndex = 7,
EndCharIndex = 30,
EntityName = "Pizza",
Children = new[]
{
new EntityLabelObject { StartCharIndex = 7, EndCharIndex = 9, EntityName = "Quantity" },
new EntityLabelObject { StartCharIndex = 11, EndCharIndex = 15, EntityName = "Size" },
new EntityLabelObject { StartCharIndex = 17, EndCharIndex = 23, EntityName = "Type" }
}
},
new EntityLabelObject
{
StartCharIndex = 37,
EndCharIndex = 48,
EntityName = "Toppings",
Children = new[]
{
new EntityLabelObject { StartCharIndex = 37, EndCharIndex = 41, EntityName = "Quantity" },
new EntityLabelObject { StartCharIndex = 43, EndCharIndex = 48, EntityName = "Type" }
}
}
}
},
}
};
// Add an example for the entity.
// Enable nested children to allow using multiple models with the same name.
// The quantity subentity and the phraselist could have the same exact name if this is set to True
await client.Examples.AddAsync(appId, versionId, labeledExampleUtteranceWithMLEntity, enableNestedChildren: true);
Träna appen
När modellen har skapats måste LUIS-appen tränas för den här versionen av modellen. En tränad modell kan användas i en container eller publiceras till mellanlagrings- eller produktfack.
Metoden Train.TrainVersionAsync behöver app-ID och versions-ID.
En mycket liten modell, som den här snabbstarten visar, kommer att träna mycket snabbt. För program på produktionsnivå bör träning av appen innehålla ett avsökningsanrop till metoden GetStatusAsync för att avgöra när eller om träningen lyckades. Svaret är en lista över ModelTrainingInfo-objekt med en separat status för varje objekt. Alla objekt måste lyckas för att träningen ska anses vara slutförd.
await client.Train.TrainVersionAsync(appId, versionId);
while (true)
{
var status = await client.Train.GetStatusAsync(appId, versionId);
if (status.All(m => m.Details.Status == "Success"))
{
// Assumes that we never fail, and that eventually we'll always succeed.
break;
}
}
Publicera app till produktionsplats
Publicera LUIS-appen med metoden PublishAsync . Detta publicerar den aktuella tränade versionen till det angivna facket vid slutpunkten. Klientprogrammet använder den här slutpunkten för att skicka användaryttranden för förutsägelse av avsikt och entitetsextrahering.
await client.Apps.PublishAsync(appId, new ApplicationPublishObject { VersionId = versionId, IsStaging=false});
Autentisera förutsägelsekörningsklienten
Använd ett ApiKeyServiceClientCredentials-objekt med nyckeln och använd det med slutpunkten för att skapa ett LUISRuntimeClient-objekt .
Varning
Den här snabbstarten använder redigeringsnyckeln som en del av körningsautentiseringsuppgifterna. Redigeringsnyckeln kan köra frågor mot körningen med några frågor. För mellanlagring och kod på produktionsnivå ersätter du redigeringsnyckeln med en förutsägelsekörningsnyckel.
var runtimeClient = new LUISRuntimeClient(credentials) { Endpoint = predictionEndpoint };
Hämta förutsägelse från körning
Lägg till följande kod för att skapa begäran till förutsägelsekörningen.
Användaryttrandet är en del av PredictionRequest-objektet.
Metoden GetSlotPredictionAsync behöver flera parametrar, till exempel app-ID: t, facknamnet, förutsägelsebegäransobjektet för att uppfylla begäran. De andra alternativen, till exempel utförliga, visar alla avsikter och loggen är valfria.
// Production == slot name
var request = new PredictionRequest { Query = "I want two small pepperoni pizzas with more salsa" };
var prediction = await runtimeClient.Prediction.GetSlotPredictionAsync(appId, "Production", request);
Console.Write(JsonConvert.SerializeObject(prediction, Formatting.Indented));
Förutsägelsesvaret är ett JSON-objekt inklusive avsikten och alla entiteter som hittas.
{
"query": "I want two small pepperoni pizzas with more salsa",
"prediction": {
"topIntent": "OrderPizzaIntent",
"intents": {
"OrderPizzaIntent": {
"score": 0.753606856
},
"None": {
"score": 0.119097039
}
},
"entities": {
"Pizza order": [
{
"Pizza": [
{
"Quantity": [
2
],
"Type": [
"pepperoni"
],
"Size": [
"small"
],
"$instance": {
"Quantity": [
{
"type": "builtin.number",
"text": "two",
"startIndex": 7,
"length": 3,
"score": 0.968156934,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Type": [
{
"type": "Type",
"text": "pepperoni",
"startIndex": 17,
"length": 9,
"score": 0.9345611,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Size": [
{
"type": "Size",
"text": "small",
"startIndex": 11,
"length": 5,
"score": 0.9592077,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"Toppings": [
{
"Type": [
"salsa"
],
"Quantity": [
"more"
],
"$instance": {
"Type": [
{
"type": "Type",
"text": "salsa",
"startIndex": 44,
"length": 5,
"score": 0.7292897,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Quantity": [
{
"type": "Quantity",
"text": "more",
"startIndex": 39,
"length": 4,
"score": 0.9320932,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"$instance": {
"Pizza": [
{
"type": "Pizza",
"text": "two small pepperoni pizzas",
"startIndex": 7,
"length": 26,
"score": 0.812199831,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Toppings": [
{
"type": "Toppings",
"text": "more salsa",
"startIndex": 39,
"length": 10,
"score": 0.7250252,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"$instance": {
"Pizza order": [
{
"type": "Pizza order",
"text": "two small pepperoni pizzas with more salsa",
"startIndex": 7,
"length": 42,
"score": 0.769223332,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
}
}
Kör appen
Kör programmet med kommandot från programkatalogen dotnet run
.
dotnet run
Använd KLIENTbiblioteken för Language Understanding (LUIS) för Node.js för att:
- Skapa ett program
- Lägg till en avsikt, en maskininlärd entitet, med ett exempelyttrande
- Träna och publicera app
- CLR för frågeförutsägelse
Referensdokumentation | Författar- och förutsägelse-NPM | Prover
Förutsättningar
- Node.js
- Azure-prenumeration – Skapa en kostnadsfritt
- När du har din Azure-prenumeration skapar du en Language Understanding-redigeringsresurs i Azure Portal för att hämta din nyckel och slutpunkt. Vänta tills den har distribuerats och klicka på knappen Gå till resurs .
- Du behöver nyckeln och slutpunkten från resursen som du skapar för att ansluta ditt program till Language Understanding-redigering. Du klistrar in nyckeln och slutpunkten i koden nedan senare i snabbstarten. Du kan använda den kostnadsfria prisnivån (
F0
) för att prova tjänsten.
- Du behöver nyckeln och slutpunkten från resursen som du skapar för att ansluta ditt program till Language Understanding-redigering. Du klistrar in nyckeln och slutpunkten i koden nedan senare i snabbstarten. Du kan använda den kostnadsfria prisnivån (
Konfigurera
Skapa ett nytt JavaScript-program
I ett konsolfönster skapar du en ny katalog för ditt program och flyttar till den katalogen.
mkdir quickstart-sdk && cd quickstart-sdk
Initiera katalogen som ett JavaScript-program genom att skapa en
package.json
fil.npm init -y
Skapa en fil med namnet
index.js
för din JavaScript-kod.touch index.js
Installera NPM-biblioteken
Installera beroendena med följande kommandon i programkatalogen och kör en rad i taget:
npm install @azure/ms-rest-js
npm install @azure/cognitiveservices-luis-authoring
npm install @azure/cognitiveservices-luis-runtime
Du package.json
bör se ut så här:
{
"name": "quickstart-sdk",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@azure/cognitiveservices-luis-authoring": "^4.0.0-preview.3",
"@azure/cognitiveservices-luis-runtime": "^5.0.0",
"@azure/ms-rest-js": "^2.0.8"
}
}
Redigeringsobjektmodell
Luis-redigeringsklienten (Language Understanding) är ett LUISAuthoringClient-objekt som autentiserar till Azure, som innehåller din redigeringsnyckel.
Kodexempel för redigering
När klienten har skapats använder du den här klienten för att få åtkomst till funktioner som:
- Appar – lägga till, ta bort, publicera
- Exempelyttranden – lägg till efter batch, ta bort med ID
- Funktioner – hantera fraslistor
- Modell – hantera avsikter och entiteter
- Mönster – hantera mönster
- Träna – träna appen och söka efter träningsstatus
- Versioner – hantera med klona, exportera och ta bort
Förutsägelseobjektmodell
Luis-redigeringsklienten (Language Understanding) är ett LUISAuthoringClient-objekt som autentiserar till Azure, som innehåller din redigeringsnyckel.
Kodexempel för förutsägelsekörning
När klienten har skapats använder du den här klienten för att få åtkomst till funktioner som:
- Förutsägelse efter
staging
ellerproduction
fack - Förutsägelse efter version
Kodexempel
De här kodfragmenten visar hur du gör följande med LUIS-klientbiblioteket (Language Understanding) för Python:
- Skapa en app
- Lägg till avsikt
- Lägg till entiteter
- Lägga till exempelyttranden
- Träna appen
- Publicera appen
- Förutsägelse efter fack
Lägg till beroendena
index.js
Öppna filen i önskad redigerare eller IDE med namnet och lägg sedan till följande beroenden.
const msRest = require("@azure/ms-rest-js");
const LUIS_Authoring = require("@azure/cognitiveservices-luis-authoring");
const LUIS_Prediction = require("@azure/cognitiveservices-luis-runtime");
Lägg till pannplåtskod
quickstart
Lägg till metoden och dess anrop. Den här metoden innehåller det mesta av den återstående koden. Den här metoden anropas i slutet av filen.const quickstart = async () => { // add calls here } quickstart() .then(result => console.log("Done")) .catch(err => { console.log(`Error: ${err}`) })
Lägg till den återstående koden i snabbstartsmetoden om inget annat anges.
Skapa variabler för appen
Skapa två uppsättningar variabler: den första uppsättningen som du ändrar, den andra uppsättningen lämnar som de visas i kodexemplet.
Viktigt!
Kom ihåg att ta bort nyckeln från koden när du är klar och publicera den aldrig offentligt. För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information finns i säkerhetsartikeln för Azure AI-tjänster.
Skapa variabler för redigeringsnyckeln och resursnamnen.
const authoringKey = 'PASTE_YOUR_LUIS_AUTHORING_SUBSCRIPTION_KEY_HERE'; const authoringEndpoint = "PASTE_YOUR_LUIS_AUTHORING_ENDPOINT_HERE"; const predictionEndpoint = "PASTE_YOUR_LUIS_PREDICTION_ENDPOINT_HERE";
Skapa variabler för att lagra dina slutpunkter, appnamn, version och avsiktsnamn.
const appName = "Contoso Pizza Company"; const versionId = "0.1"; const intentName = "OrderPizzaIntent";
Autentisera klienten
Skapa ett CognitiveServicesCredentials-objekt med nyckeln och använd det med slutpunkten för att skapa ett LUISAuthoringClient-objekt .
const luisAuthoringCredentials = new msRest.ApiKeyCredentials({
inHeader: { "Ocp-Apim-Subscription-Key": authoringKey }
});
const client = new LUIS_Authoring.LUISAuthoringClient(
luisAuthoringCredentials,
authoringEndpoint
);
Skapa en LUIS-app
En LUIS-app innehåller nlp-modellen (natural language processing) inklusive avsikter, entiteter och exempelyttranden.
Skapa ett AppsOperation-objekts tilläggsmetod för att skapa appen. Namn- och språkkulturen är obligatoriska egenskaper.
const create_app_payload = {
name: appName,
initialVersionId: versionId,
culture: "en-us"
};
const createAppResult = await client.apps.add(
create_app_payload
);
const appId = createAppResult.body
Skapa avsikt för appen
Det primära objektet i en LUIS-apps modell är avsikten. Avsikten överensstämmer med en gruppering av avsikterna med användaryttranden. En användare kan ställa en fråga eller göra en instruktion för att söka efter ett visst avsett svar från en robot (eller något annat klientprogram). Exempel på avsikter är att boka en flygresa, fråga om vädret i en målstad och fråga om kontaktinformation för kundtjänst.
Använd metoden model.add_intent med namnet på den unika avsikten och skicka sedan app-ID, versions-ID och nytt avsiktsnamn.
Värdet intentName
är hårdkodat som OrderPizzaIntent
en del av variablerna i avsnittet Skapa variabler för appen .
await client.model.addIntent(
appId,
versionId,
{ name: intentName }
);
Skapa entiteter för appen
Även om entiteter inte krävs finns de i de flesta appar. Entiteten extraherar information från användaryttrandet som krävs för att fullständigfila användarens avsikt. Det finns flera typer av fördefinierade och anpassade entiteter , var och en med sina egna DTO-modeller (Data Transformation Object). Vanliga fördefinierade entiteter att lägga till i din app är nummer, datetimeV2, geographyV2, ordningstal.
Det är viktigt att känna till att entiteter inte har markerats med en avsikt. De kan och gäller vanligtvis för många avsikter. Endast exempel på användaryttranden markeras för en specifik, enskild avsikt.
Skapandemetoder för entiteter ingår i klassen Modell . Varje entitetstyp har en egen DTO-modell (Data Transformation Object).
Koden för att skapa entitet skapar en maskininlärningsentitet med underentiteter och funktioner som tillämpas på underentiteterna Quantity
.
// Add Prebuilt entity
await client.model.addPrebuilt(appId, versionId, ["number"]);
// Define ml entity with children and grandchildren
const mlEntityDefinition = {
name: "Pizza order",
children: [
{
name: "Pizza",
children: [
{ name: "Quantity" },
{ name: "Type" },
{ name: "Size" }
]
},
{
name: "Toppings",
children: [
{ name: "Type" },
{ name: "Quantity" }
]
}
]
};
// Add ML entity
const response = await client.model.addEntity(appId, versionId, mlEntityDefinition);
const mlEntityId = response.body;
// Add phraselist feature
const phraselistResponse = await client.features.addPhraseList(appId, versionId, {
enabledForAllModels: false,
isExchangeable: true,
name: "QuantityPhraselist",
phrases: "few,more,extra"
});
const phraseListId = phraselistResponse.body;
// Get entity and subentities
const model = await client.model.getEntity(appId, versionId, mlEntityId);
const toppingQuantityId = getModelGrandchild(model, "Toppings", "Quantity");
const pizzaQuantityId = getModelGrandchild(model, "Pizza", "Quantity");
// add model as feature to subentity model
await client.features.addEntityFeature(appId, versionId, pizzaQuantityId, { modelName: "number", isRequired: true });
await client.features.addEntityFeature(appId, versionId, toppingQuantityId, { modelName: "number" });
// add phrase list as feature to subentity model
await client.features.addEntityFeature(appId, versionId, toppingQuantityId, { featureName: "QuantityPhraselist" });
Placera följande metod ovanför quickstart
metoden för att hitta kvantitetsunderdelens ID för att tilldela funktionerna till den underdelen.
const getModelGrandchild = (model, childName, grandchildName) => {
return model.children.find(c => c.name == childName).children.find(c => c.name == grandchildName).id
}
Lägga till exempelyttrande i avsikt
För att kunna fastställa ett yttrandes avsikt och extrahera entiteter behöver appen exempel på yttranden. Exemplen måste rikta in sig på en specifik, enskild avsikt och markera alla anpassade entiteter. Fördefinierade entiteter behöver inte markeras.
Lägg till exempelyttranden genom att skapa en lista över ExampleLabelObject-objekt, ett objekt för varje exempelyttrande. Varje exempel bör markera alla entiteter med en ordlista med namn/värde-par med entitetsnamn och entitetsvärde. Entitetsvärdet ska vara exakt som det visas i texten i exempelyttrandet.
Anropa examples.add med app-ID, versions-ID och exemplet.
// Define labeled example
const labeledExampleUtteranceWithMLEntity =
{
text: "I want two small seafood pizzas with extra cheese.",
intentName: intentName,
entityLabels: [
{
startCharIndex: 7,
endCharIndex: 48,
entityName: "Pizza order",
children: [
{
startCharIndex: 7,
endCharIndex: 30,
entityName: "Pizza",
children: [
{
startCharIndex: 7,
endCharIndex: 9,
entityName: "Quantity"
},
{
startCharIndex: 11,
endCharIndex: 15,
entityName: "Size"
},
{
startCharIndex: 17,
endCharIndex: 23,
entityName: "Type"
}]
},
{
startCharIndex: 37,
endCharIndex: 48,
entityName: "Toppings",
children: [
{
startCharIndex: 37,
endCharIndex: 41,
entityName: "Quantity"
},
{
startCharIndex: 43,
endCharIndex: 48,
entityName: "Type"
}]
}
]
}
]
};
console.log("Labeled Example Utterance:", JSON.stringify(labeledExampleUtteranceWithMLEntity, null, 4 ));
// Add an example for the entity.
// Enable nested children to allow using multiple models with the same name.
// The quantity subentity and the phraselist could have the same exact name if this is set to True
await client.examples.add(appId, versionId, labeledExampleUtteranceWithMLEntity, { enableNestedChildren: true });
Träna appen
När modellen har skapats måste LUIS-appen tränas för den här versionen av modellen. En tränad modell kan användas i en container eller publiceras till mellanlagrings- eller produktfack.
Metoden train.trainVersion behöver app-ID:t och versions-ID:t.
En mycket liten modell, som den här snabbstarten visar, kommer att träna mycket snabbt. För program på produktionsnivå bör träning av appen innehålla ett avsökningsanrop till get_status-metoden för att avgöra när eller om träningen lyckades. Svaret är en lista över ModelTrainingInfo-objekt med en separat status för varje objekt. Alla objekt måste lyckas för att träningen ska anses vara slutförd.
await client.train.trainVersion(appId, versionId);
while (true) {
const status = await client.train.getStatus(appId, versionId);
if (status.every(m => m.details.status == "Success")) {
// Assumes that we never fail, and that eventually we'll always succeed.
break;
}
}
Publicera app till produktionsplats
Publicera LUIS-appen med metoden app.publish . Detta publicerar den aktuella tränade versionen till det angivna facket vid slutpunkten. Klientprogrammet använder den här slutpunkten för att skicka användaryttranden för förutsägelse av avsikt och entitetsextrahering.
await client.apps.publish(appId, { versionId: versionId, isStaging: false });
Autentisera förutsägelsekörningsklienten
Använd ett msRest.ApiKeyCredentials
objekt med din nyckel och använd det med slutpunkten för att skapa en LUIS. LUISRuntimeClient-objekt .
Varning
Den här snabbstarten använder redigeringsnyckeln som en del av körningsautentiseringsuppgifterna. Redigeringsnyckeln kan köra frågor mot körningen med några frågor. För mellanlagring och kod på produktionsnivå ersätter du redigeringsnyckeln med en förutsägelsekörningsnyckel.
const luisPredictionClient = new LUIS_Prediction.LUISRuntimeClient(
luisAuthoringCredentials,
predictionEndpoint
);
Hämta förutsägelse från körning
Lägg till följande kod för att skapa begäran till förutsägelsekörningen. Användaryttrandet är en del av predictionRequest-objektet.
Metoden luisRuntimeClient.prediction.getSlotPrediction behöver flera parametrar, till exempel app-ID, facknamnet och förutsägelsebegäransobjektet för att uppfylla begäran. De andra alternativen, till exempel utförliga, visar alla avsikter och loggen är valfria.
// Production == slot name
const request = { query: "I want two small pepperoni pizzas with more salsa" };
const response = await luisPredictionClient.prediction.getSlotPrediction(appId, "Production", request);
console.log(JSON.stringify(response.prediction, null, 4 ));
Förutsägelsesvaret är ett JSON-objekt inklusive avsikten och alla entiteter som hittas.
{
"query": "I want two small pepperoni pizzas with more salsa",
"prediction": {
"topIntent": "OrderPizzaIntent",
"intents": {
"OrderPizzaIntent": {
"score": 0.753606856
},
"None": {
"score": 0.119097039
}
},
"entities": {
"Pizza order": [
{
"Pizza": [
{
"Quantity": [
2
],
"Type": [
"pepperoni"
],
"Size": [
"small"
],
"$instance": {
"Quantity": [
{
"type": "builtin.number",
"text": "two",
"startIndex": 7,
"length": 3,
"score": 0.968156934,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Type": [
{
"type": "Type",
"text": "pepperoni",
"startIndex": 17,
"length": 9,
"score": 0.9345611,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Size": [
{
"type": "Size",
"text": "small",
"startIndex": 11,
"length": 5,
"score": 0.9592077,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"Toppings": [
{
"Type": [
"salsa"
],
"Quantity": [
"more"
],
"$instance": {
"Type": [
{
"type": "Type",
"text": "salsa",
"startIndex": 44,
"length": 5,
"score": 0.7292897,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Quantity": [
{
"type": "Quantity",
"text": "more",
"startIndex": 39,
"length": 4,
"score": 0.9320932,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"$instance": {
"Pizza": [
{
"type": "Pizza",
"text": "two small pepperoni pizzas",
"startIndex": 7,
"length": 26,
"score": 0.812199831,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Toppings": [
{
"type": "Toppings",
"text": "more salsa",
"startIndex": 39,
"length": 10,
"score": 0.7250252,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"$instance": {
"Pizza order": [
{
"type": "Pizza order",
"text": "two small pepperoni pizzas with more salsa",
"startIndex": 7,
"length": 42,
"score": 0.769223332,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
}
}
Kör appen
Kör programmet med kommandot node index.js
på din snabbstartsfil.
node index.js
Använd KLIENTbiblioteken för Language Understanding (LUIS) för Python för att:
- Skapa ett program
- Lägg till en avsikt, en maskininlärd entitet, med ett exempelyttrande
- Träna och publicera app
- CLR för frågeförutsägelse
Referensdokumentation | Författar- och förutsägelsebibliotekets källkod | Paket (Pypi) | Exempel
Förutsättningar
- Den aktuella versionen av Python 3.x.
- Azure-prenumeration – Skapa en kostnadsfritt
- När du har din Azure-prenumeration skapar du en Language Understanding-redigeringsresurs i Azure Portal för att hämta din nyckel och slutpunkt. Vänta tills den har distribuerats och klicka på knappen Gå till resurs .
- Du behöver nyckeln och slutpunkten från resursen som du skapar för att ansluta ditt program till Language Understanding-redigering. Du klistrar in nyckeln och slutpunkten i koden nedan senare i snabbstarten. Du kan använda den kostnadsfria prisnivån (
F0
) för att prova tjänsten.
- Du behöver nyckeln och slutpunkten från resursen som du skapar för att ansluta ditt program till Language Understanding-redigering. Du klistrar in nyckeln och slutpunkten i koden nedan senare i snabbstarten. Du kan använda den kostnadsfria prisnivån (
Konfigurera
Skapa ett nytt Python-program
I ett konsolfönster skapar du en ny katalog för ditt program och flyttar till den katalogen.
mkdir quickstart-sdk && cd quickstart-sdk
Skapa en fil med namnet
authoring_and_predict.py
för din Python-kod.touch authoring_and_predict.py
Installera klientbiblioteket med Pip
I programkatalogen installerar du LUIS-klientbiblioteket (Language Understanding) för Python med följande kommando:
pip install azure-cognitiveservices-language-luis
Redigeringsobjektmodell
Luis-redigeringsklienten (Language Understanding) är ett LUISAuthoringClient-objekt som autentiserar till Azure, som innehåller din redigeringsnyckel.
Kodexempel för redigering
När klienten har skapats använder du den här klienten för att få åtkomst till funktioner som:
- Appar – skapa, ta bort, publicera
- Exempelyttranden – lägg till efter batch, ta bort med ID
- Funktioner – hantera fraslistor
- Modell – hantera avsikter och entiteter
- Mönster – hantera mönster
- Träna – träna appen och söka efter träningsstatus
- Versioner – hantera med klona, exportera och ta bort
Förutsägelseobjektmodell
Luis-förutsägelsekörningsklienten (Language Understanding) är ett LUISRuntimeClient-objekt som autentiserar till Azure, som innehåller din resursnyckel.
Kodexempel för förutsägelsekörning
När klienten har skapats använder du den här klienten för att få åtkomst till funktioner som:
- Förutsägelse efter mellanlagring eller produktionsplats
- Förutsägelse efter version
Kodexempel
De här kodfragmenten visar hur du gör följande med LUIS-klientbiblioteket (Language Understanding) för Python:
- Skapa en app
- Lägg till avsikt
- Lägg till entiteter
- Lägga till exempelyttranden
- Träna appen
- Publicera appen
- Förutsägelse efter fack
Lägg till beroendena
Lägg till klientbiblioteken i Python-filen.
from azure.cognitiveservices.language.luis.authoring import LUISAuthoringClient
from azure.cognitiveservices.language.luis.authoring.models import ApplicationCreateObject
from azure.cognitiveservices.language.luis.runtime import LUISRuntimeClient
from msrest.authentication import CognitiveServicesCredentials
from functools import reduce
import json, time, uuid
Lägg till pannplåtskod
quickstart
Lägg till metoden och dess anrop. Den här metoden innehåller det mesta av den återstående koden. Den här metoden anropas i slutet av filen.def quickstart(): # add calls here, remember to indent properly quickstart()
Lägg till den återstående koden i snabbstartsmetoden om inget annat anges.
Skapa variabler för appen
Skapa två uppsättningar variabler: den första uppsättningen som du ändrar, den andra uppsättningen lämnar som de visas i kodexemplet.
Viktigt!
Kom ihåg att ta bort nyckeln från koden när du är klar och publicera den aldrig offentligt. För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information finns i säkerhetsartikeln för Azure AI-tjänster.
Skapa variabler för redigeringsnyckeln och resursnamnen.
authoringKey = 'PASTE_YOUR_LUIS_AUTHORING_SUBSCRIPTION_KEY_HERE' authoringEndpoint = 'PASTE_YOUR_LUIS_AUTHORING_ENDPOINT_HERE' predictionKey = 'PASTE_YOUR_LUIS_PREDICTION_SUBSCRIPTION_KEY_HERE' predictionEndpoint = 'PASTE_YOUR_LUIS_PREDICTION_ENDPOINT_HERE'
Skapa variabler för att lagra dina slutpunkter, appnamn, version och avsiktsnamn.
# We use a UUID to avoid name collisions. appName = "Contoso Pizza Company " + str(uuid.uuid4()) versionId = "0.1" intentName = "OrderPizzaIntent"
Autentisera klienten
Skapa ett CognitiveServicesCredentials-objekt med din nyckel och använd det med slutpunkten för att skapa ett LUISAuthoringClient-objekt .
client = LUISAuthoringClient(authoringEndpoint, CognitiveServicesCredentials(authoringKey))
Skapa en LUIS-app
En LUIS-app innehåller nlp-modellen (natural language processing) inklusive avsikter, entiteter och exempelyttranden.
Skapa ett AppsOperation-objekts tilläggsmetod för att skapa appen. Namn- och språkkulturen är obligatoriska egenskaper.
# define app basics
appDefinition = ApplicationCreateObject (name=appName, initial_version_id=versionId, culture='en-us')
# create app
app_id = client.apps.add(appDefinition)
# get app id - necessary for all other changes
print("Created LUIS app with ID {}".format(app_id))
Skapa avsikt för appen
Det primära objektet i en LUIS-apps modell är avsikten. Avsikten överensstämmer med en gruppering av avsikterna med användaryttranden. En användare kan ställa en fråga eller göra en instruktion för att söka efter ett visst avsett svar från en robot (eller något annat klientprogram). Exempel på avsikter är att boka en flygresa, fråga om vädret i en målstad och fråga om kontaktinformation för kundtjänst.
Använd metoden model.add_intent med namnet på den unika avsikten och skicka sedan app-ID, versions-ID och nytt avsiktsnamn.
Värdet intentName
är hårdkodat som OrderPizzaIntent
en del av variablerna i avsnittet Skapa variabler för appen .
client.model.add_intent(app_id, versionId, intentName)
Skapa entiteter för appen
Även om entiteter inte krävs finns de i de flesta appar. Entiteten extraherar information från användaryttrandet som krävs för att fullständigfila användarens avsikt. Det finns flera typer av fördefinierade och anpassade entiteter , var och en med sina egna DTO-modeller (Data Transformation Object). Vanliga fördefinierade entiteter att lägga till i din app är nummer, datetimeV2, geographyV2, ordningstal.
Det är viktigt att känna till att entiteter inte har markerats med en avsikt. De kan och gäller vanligtvis för många avsikter. Endast exempel på användaryttranden markeras för en specifik, enskild avsikt.
Skapandemetoder för entiteter ingår i klassen ModelOperations . Varje entitetstyp har en egen DTO-modell (Data Transformation Object).
Koden för att skapa entitet skapar en maskininlärningsentitet med underentiteter och funktioner som tillämpas på underentiteterna Quantity
.
# Add Prebuilt entity
client.model.add_prebuilt(app_id, versionId, prebuilt_extractor_names=["number"])
# define machine-learned entity
mlEntityDefinition = [
{
"name": "Pizza",
"children": [
{ "name": "Quantity" },
{ "name": "Type" },
{ "name": "Size" }
]
},
{
"name": "Toppings",
"children": [
{ "name": "Type" },
{ "name": "Quantity" }
]
}]
# add entity to app
modelId = client.model.add_entity(app_id, versionId, name="Pizza order", children=mlEntityDefinition)
# define phraselist - add phrases as significant vocabulary to app
phraseList = {
"enabledForAllModels": False,
"isExchangeable": True,
"name": "QuantityPhraselist",
"phrases": "few,more,extra"
}
# add phrase list to app
phraseListId = client.features.add_phrase_list(app_id, versionId, phraseList)
# Get entity and subentities
modelObject = client.model.get_entity(app_id, versionId, modelId)
toppingQuantityId = get_grandchild_id(modelObject, "Toppings", "Quantity")
pizzaQuantityId = get_grandchild_id(modelObject, "Pizza", "Quantity")
# add model as feature to subentity model
prebuiltFeatureRequiredDefinition = { "model_name": "number", "is_required": True }
client.features.add_entity_feature(app_id, versionId, pizzaQuantityId, prebuiltFeatureRequiredDefinition)
# add model as feature to subentity model
prebuiltFeatureNotRequiredDefinition = { "model_name": "number" }
client.features.add_entity_feature(app_id, versionId, toppingQuantityId, prebuiltFeatureNotRequiredDefinition)
# add phrase list as feature to subentity model
phraseListFeatureDefinition = { "feature_name": "QuantityPhraselist", "model_name": None }
client.features.add_entity_feature(app_id, versionId, toppingQuantityId, phraseListFeatureDefinition)
Placera följande metod ovanför quickstart
metoden för att hitta kvantitetsunderdelens ID för att tilldela funktionerna till den underdelen.
def get_grandchild_id(model, childName, grandChildName):
theseChildren = next(filter((lambda child: child.name == childName), model.children))
theseGrandchildren = next(filter((lambda child: child.name == grandChildName), theseChildren.children))
grandChildId = theseGrandchildren.id
return grandChildId
Lägga till exempelyttrande i avsikt
För att kunna fastställa ett yttrandes avsikt och extrahera entiteter behöver appen exempel på yttranden. Exemplen måste rikta in sig på en specifik, enskild avsikt och markera alla anpassade entiteter. Fördefinierade entiteter behöver inte markeras.
Lägg till exempelyttranden genom att skapa en lista över ExampleLabelObject-objekt , ett objekt för varje exempelyttrande. Varje exempel bör markera alla entiteter med en ordlista med namn/värde-par med entitetsnamn och entitetsvärde. Entitetsvärdet ska vara exakt som det visas i texten i exempelyttrandet.
Anropa examples.add med app-ID, versions-ID och exemplet.
# Define labeled example
labeledExampleUtteranceWithMLEntity = {
"text": "I want two small seafood pizzas with extra cheese.",
"intentName": intentName,
"entityLabels": [
{
"startCharIndex": 7,
"endCharIndex": 48,
"entityName": "Pizza order",
"children": [
{
"startCharIndex": 7,
"endCharIndex": 30,
"entityName": "Pizza",
"children": [
{
"startCharIndex": 7,
"endCharIndex": 9,
"entityName": "Quantity"
},
{
"startCharIndex": 11,
"endCharIndex": 15,
"entityName": "Size"
},
{
"startCharIndex": 17,
"endCharIndex": 23,
"entityName": "Type"
}]
},
{
"startCharIndex": 37,
"endCharIndex": 48,
"entityName": "Toppings",
"children": [
{
"startCharIndex": 37,
"endCharIndex": 41,
"entityName": "Quantity"
},
{
"startCharIndex": 43,
"endCharIndex": 48,
"entityName": "Type"
}]
}
]
}
]
}
print("Labeled Example Utterance:", labeledExampleUtteranceWithMLEntity)
# Add an example for the entity.
# Enable nested children to allow using multiple models with the same name.
# The quantity subentity and the phraselist could have the same exact name if this is set to True
client.examples.add(app_id, versionId, labeledExampleUtteranceWithMLEntity, { "enableNestedChildren": True })
Träna appen
När modellen har skapats måste LUIS-appen tränas för den här versionen av modellen. En tränad modell kan användas i en container eller publiceras till mellanlagrings- eller produktfack.
Metoden train.train_version behöver app-ID:t och versions-ID:t.
En mycket liten modell, som den här snabbstarten visar, kommer att träna mycket snabbt. För program på produktionsnivå bör träning av appen innehålla ett avsökningsanrop till get_status-metoden för att avgöra när eller om träningen lyckades. Svaret är en lista över ModelTrainingInfo-objekt med en separat status för varje objekt. Alla objekt måste lyckas för att träningen ska anses vara slutförd.
client.train.train_version(app_id, versionId)
waiting = True
while waiting:
info = client.train.get_status(app_id, versionId)
# get_status returns a list of training statuses, one for each model. Loop through them and make sure all are done.
waiting = any(map(lambda x: 'Queued' == x.details.status or 'InProgress' == x.details.status, info))
if waiting:
print ("Waiting 10 seconds for training to complete...")
time.sleep(10)
else:
print ("trained")
waiting = False
Publicera app till produktionsplats
Publicera LUIS-appen med metoden app.publish . Detta publicerar den aktuella tränade versionen till det angivna facket vid slutpunkten. Klientprogrammet använder den här slutpunkten för att skicka användaryttranden för förutsägelse av avsikt och entitetsextrahering.
# Mark the app as public so we can query it using any prediction endpoint.
# Note: For production scenarios, you should instead assign the app to your own LUIS prediction endpoint. See:
# https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-how-to-azure-subscription#assign-a-resource-to-an-app
client.apps.update_settings(app_id, is_public=True)
responseEndpointInfo = client.apps.publish(app_id, versionId, is_staging=False)
Autentisera förutsägelsekörningsklienten
Använd autentiseringsuppgifterna med din nyckel och använd det med slutpunkten för att skapa ett LUISRuntimeClientConfiguration-objekt .
Varning
Den här snabbstarten använder redigeringsnyckeln som en del av körningsautentiseringsuppgifterna. Redigeringsnyckeln kan köra frågor mot körningen med några frågor. För mellanlagring och kod på produktionsnivå ersätter du redigeringsnyckeln med en förutsägelsekörningsnyckel.
runtimeCredentials = CognitiveServicesCredentials(predictionKey)
clientRuntime = LUISRuntimeClient(endpoint=predictionEndpoint, credentials=runtimeCredentials)
Hämta förutsägelse från körning
Lägg till följande kod för att skapa begäran till förutsägelsekörningen.
Användaryttrandet är en del av prediction_request-objektet.
Metoden get_slot_prediction behöver flera parametrar, till exempel app-ID, facknamn och förutsägelsebegäran för att uppfylla begäran. De andra alternativen, till exempel utförliga, visar alla avsikter och loggen är valfria. Begäran returnerar ett PredictionResponse-objekt .
# Production == slot name
predictionRequest = { "query" : "I want two small pepperoni pizzas with more salsa" }
predictionResponse = clientRuntime.prediction.get_slot_prediction(app_id, "Production", predictionRequest)
print("Top intent: {}".format(predictionResponse.prediction.top_intent))
print("Sentiment: {}".format (predictionResponse.prediction.sentiment))
print("Intents: ")
for intent in predictionResponse.prediction.intents:
print("\t{}".format (json.dumps (intent)))
print("Entities: {}".format (predictionResponse.prediction.entities))
Förutsägelsesvaret är ett JSON-objekt inklusive avsikten och alla entiteter som hittas.
{
"query": "I want two small pepperoni pizzas with more salsa",
"prediction": {
"topIntent": "OrderPizzaIntent",
"intents": {
"OrderPizzaIntent": {
"score": 0.753606856
},
"None": {
"score": 0.119097039
}
},
"entities": {
"Pizza order": [
{
"Pizza": [
{
"Quantity": [
2
],
"Type": [
"pepperoni"
],
"Size": [
"small"
],
"$instance": {
"Quantity": [
{
"type": "builtin.number",
"text": "two",
"startIndex": 7,
"length": 3,
"score": 0.968156934,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Type": [
{
"type": "Type",
"text": "pepperoni",
"startIndex": 17,
"length": 9,
"score": 0.9345611,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Size": [
{
"type": "Size",
"text": "small",
"startIndex": 11,
"length": 5,
"score": 0.9592077,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"Toppings": [
{
"Type": [
"salsa"
],
"Quantity": [
"more"
],
"$instance": {
"Type": [
{
"type": "Type",
"text": "salsa",
"startIndex": 44,
"length": 5,
"score": 0.7292897,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Quantity": [
{
"type": "Quantity",
"text": "more",
"startIndex": 39,
"length": 4,
"score": 0.9320932,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"$instance": {
"Pizza": [
{
"type": "Pizza",
"text": "two small pepperoni pizzas",
"startIndex": 7,
"length": 26,
"score": 0.812199831,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
],
"Toppings": [
{
"type": "Toppings",
"text": "more salsa",
"startIndex": 39,
"length": 10,
"score": 0.7250252,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
],
"$instance": {
"Pizza order": [
{
"type": "Pizza order",
"text": "two small pepperoni pizzas with more salsa",
"startIndex": 7,
"length": 42,
"score": 0.769223332,
"modelTypeId": 1,
"modelType": "Entity Extractor",
"recognitionSources": [
"model"
]
}
]
}
}
}
}
Kör appen
Kör programmet med kommandot python
på din snabbstartsfil.
python authoring_and_predict.py
Genom att följa den här snabbstarten utför du tre REST-anrop i följd.
- Först laddar du upp en batch med exempelyttranden som ska användas för att träna Pizza-appmodellen med hjälp av REST Batch-anropet för att lägga till etiketter .
- Därefter påbörjar du ett träningspass för Pizza-appen med hjälp av REST Train-programversionsanropet .
- Slutligen får du statusen för utbildningssessionen för Pizza-appen med hjälp av statusanropet REST Get version training ( REST Get version training status ).
Förutsättningar
Ett kostnadsfritt LUIS-konto .
En textredigerare som Visual Studio Code.
Kommandoradsprogrammet cURL. CURL-programmet är redan installerat på macOS, de flesta Linux-distributioner och Windows 10 build 1803 och senare.
Om du behöver installera cURL kan du ladda ned cURL från nedladdningssidan för cURL.
Skapa pizzaapp
Skapa pizzaappen.
- Välj pizza-app-for-luis-v6.json för att visa GitHub-sidan för
pizza-app-for-luis.json
filen. - Högerklicka eller tryck länge på raw-knappen och välj Spara länk för att spara på
pizza-app-for-luis.json
datorn. - Logga in på LUIS-portalen.
- Välj Mina appar.
- På sidan Mina appar väljer du + Ny app för konversation.
- Välj Importera som JSON.
- I dialogrutan Importera ny app väljer du knappen Välj fil.
- Välj den
pizza-app-for-luis.json
fil som du laddade ned och välj sedan Öppna. - I dialogrutan Importera nytt appnamn anger du ett namn för din Pizza-app och väljer sedan knappen Klar.
Appen importeras.
Om du ser en dialogruta Så här skapar du en effektiv LUIS-app stänger du dialogrutan.
Träna och publicera Pizza-appen
Du bör se sidan Avsikter med en lista över avsikter i Pizza-appen.
Välj knappen Träna längst upp till höger på LUIS-webbplatsen.
Träningen är klar när knappen Träna är inaktiverad.
För att få en LUIS-förutsägelse i en chattrobot eller andra klientprogram måste du publicera appen till förutsägelseslutpunkten.
Välj Publicera i det övre högra navigeringsfältet.
Välj produktionsplatsen och välj sedan Klar.
Välj Åtkomst till slutpunkts-URL:er i meddelandet för att gå till sidan Azure-resurser . Du kan bara se URL:erna om du har en förutsägelseresurs som är associerad med appen. Du hittar även sidan Azure-resurser genom att klicka på Hantera.
Lägga till en redigeringsresurs i Pizza-appen
- Välj HANTERA.
- Välj Azure-resurser.
- Välj Redigeringsresurs.
- Välj Ändra redigeringsresurs.
Om du har en redigeringsresurs anger du klientorganisationens namn, prenumerationsnamn och LUIS-resursnamnet för redigeringsresursen.
Om du inte har någon redigeringsresurs:
- Välj Skapa ny resurs.
- Ange ett klientnamn, resursnamn, prenumerationsnamn och Azure-resursgruppnamn.
Din Pizza-app är nu redo att användas.
Registrera åtkomstvärdena för din Pizza-app
Om du vill använda din nya Pizza-app behöver du app-ID, redigeringsnyckel och redigeringsslutpunkt för din Pizza-app. För att få förutsägelser behöver du din separata förutsägelseslutpunkt och förutsägelsenyckel.
Så här hittar du följande värden:
- På sidan Avsikter väljer du HANTERA.
- På sidan Programinställningar registrerar du app-ID :t.
- Välj Azure-resurser.
- Välj Redigeringsresurs.
- På flikarna Redigeringsresurs och Förutsägelseresurser registrerar du primärnyckeln. Det här värdet är din redigeringsnyckel.
- Registrera slutpunkts-URL :en. Det här värdet är din redigeringsslutpunkt.
Skapa en JSON-fil för att träna Pizza-appen
Om du vill skapa en JSON-fil med tre exempelyttranden sparar du följande JSON-data i en fil med namnet ExampleUtterances.JSON
:
[
{
"text": "order a pizza",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 6,
"endCharIndex": 12
}
]
},
{
"text": "order a large pepperoni pizza",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 6,
"endCharIndex": 28
},
{
"entityName": "FullPizzaWithModifiers",
"startCharIndex": 6,
"endCharIndex": 28
},
{
"entityName": "PizzaType",
"startCharIndex": 14,
"endCharIndex": 28
},
{
"entityName": "Size",
"startCharIndex": 8,
"endCharIndex": 12
}
]
},
{
"text": "I want two large pepperoni pizzas on thin crust",
"intentName": "ModifyOrder",
"entityLabels": [
{
"entityName": "Order",
"startCharIndex": 7,
"endCharIndex": 46
},
{
"entityName": "FullPizzaWithModifiers",
"startCharIndex": 7,
"endCharIndex": 46
},
{
"entityName": "PizzaType",
"startCharIndex": 17,
"endCharIndex": 32
},
{
"entityName": "Size",
"startCharIndex": 11,
"endCharIndex": 15
},
{
"entityName": "Quantity",
"startCharIndex": 7,
"endCharIndex": 9
},
{
"entityName": "Crust",
"startCharIndex": 37,
"endCharIndex": 46
}
]
}
]`
Exempelyttrandena JSON följer ett specifikt format.
Fältet text
innehåller texten för exempelyttrandet. Fältet intentName
måste motsvara namnet på en befintlig avsikt i LUIS-appen. Fältet entityLabels
är obligatoriskt. Om du inte vill märka ut några entiteter kan du ange en tom matris.
Om matrisen entityLabels inte är tom måste startCharIndex
och endCharIndex
märka ut den entitet som anges i fältet entityName
. Indexet är nollbaserat. Om du börjar eller avslutar etiketten vid ett blanksteg i texten misslyckas API-anropet för att lägga till yttrandena.
Lägga till exempelyttranden
Om du vill ladda upp batchen med exempelyttranden kopierar du det här kommandot till textredigeraren:
curl "***YOUR-AUTHORING-ENDPOINT***/luis/authoring/v3.0-preview/apps/***YOUR-APP-ID***/versions/***YOUR-APP-VERSION***/examples?verbose=true&show-all-intents=true" ^ --request POST ^ --header "Content-Type:application/json" ^ --header "Ocp-Apim-Subscription-Key: ***YOUR-AUTHORING-KEY***" ^ --data "@ExampleUtterances.JSON"
Ersätt värdena som börjar med
***YOUR-
dina egna värden.Information Syfte ***YOUR-AUTHORING-ENDPOINT***
Url-slutpunkten för redigering. Till exempel "https://REPLACE-WITH-YOUR-RESOURCE-NAME.api.cognitive.microsoft.com/". Du anger resursnamnet när du skapade resursen. ***YOUR-APP-ID***
Ditt LUIS-app-ID. ***YOUR-APP-VERSION***
Din LUIS-appversion. För Pizza-appen är versionsnumret "0.1" utan citattecken. ***YOUR-AUTHORING-KEY***
Redigeringsnyckeln på 32 tecken. Tilldelade nycklar och resurser visas i LUIS-portalen i avsnittet Hantera på sidan Azure-resurser . App-ID:t är tillgängligt i samma avsnitt Hantera på sidan Programinställningar .
Viktigt!
Kom ihåg att ta bort nyckeln från koden när du är klar och publicera den aldrig offentligt. För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information finns i säkerhetsartikeln för Azure AI-tjänster.
Starta en kommandotolk (Windows) eller Terminal (macOS och Linux) och ändra kataloger till samma katalog där du sparade
ExampleUtterances.JSON
filen.Kopiera cURL-kommandot från redigeraren och klistra in det i en kommandotolk (Windows) eller Terminal (macOS och Linux). Kör kommandot genom att trycka på Retur.
Du bör se följande svar:
[{"value":{"ExampleId":1255129706,"UtteranceText":"order a pizza"},"hasError":false},{"value":{"ExampleId":1255129707,"UtteranceText":"order a large pepperoni pizza"},"hasError":false},{"value":{"ExampleId":1255129708,"UtteranceText":"i want two large pepperoni pizzas on thin crust"},"hasError":false}]
Här är utdata som är formaterade för läsbarhet:
[ { "value": { "ExampleId": 1255129706, "UtteranceText": "order a pizza" }, "hasError": false }, { "value": { "ExampleId": 1255129707, "UtteranceText": "order a large pepperoni pizza" }, "hasError": false }, { "value": { "ExampleId": 1255129708, "UtteranceText": "i want two large pepperoni pizzas on thin crust" }, "hasError": false } ]
Träna Pizza-appmodellen
Om du vill starta en utbildningssession för Pizza-appen kopierar du det här kommandot till textredigeraren:
curl "***YOUR-AUTHORING-ENDPOINT***/luis/authoring/v3.0-preview/apps/***YOUR-APP-ID***/versions/***YOUR-APP-VERSION***/train?verbose=true&show-all-intents=true" ^ --data "" ^ --request POST ^ --header "Content-Type:application/json" ^ --header "Ocp-Apim-Subscription-Key: ***YOUR-AUTHORING-KEY***"
Som du gjorde tidigare ersätter du värdena som börjar med
***YOUR-
dina egna värden.Kopiera cURL-kommandot från redigeraren och klistra in det i en kommandotolk (Windows) eller Terminal (macOS och Linux). Kör kommandot genom att trycka på Retur.
Du bör se följande svar:
{"statusId":2,"status":"UpToDate"}
Här är utdata som är formaterade för läsbarhet:
{ "statusId": 2, "status": "UpToDate" }
Hämta status för träningen
Om du vill få träningsstatus för träningssessionen kopierar du det här kommandot till textredigeraren:
curl "***YOUR-AUTHORING-ENDPOINT***/luis/authoring/v3.0-preview/apps/***YOUR-APP-ID***/versions/***YOUR-APP-VERSION***/train?verbose=true&show-all-intents=true" ^ --request GET ^ --header "Content-Type:application/json" ^ --header "Ocp-Apim-Subscription-Key: ***YOUR-AUTHORING-KEY***"
Som du gjorde tidigare ersätter du värdena som börjar med
***YOUR-
dina egna värden.Kopiera cURL-kommandot från redigeraren och klistra in det i en kommandotolk (Windows) eller Terminal (macOS och Linux). Kör kommandot genom att trycka på Retur.
Du bör se följande svar:
[{"modelId":"8eb7ad8f-5db5-4c28-819b-ca3905fffd80","details":{"statusId":2,"status":"UpToDate","exampleCount":171}},{"modelId":"6f53bc92-ae54-44ce-bc4e-010d1f8cfda0","details":{"statusId":2,"status":"UpToDate","exampleCount":171}},{"modelId":"6cb17888-ad6e-464c-82c0-d37fd1f2c4f8","details":{"statusId":2,"status":"UpToDate","exampleCount":171}},{"modelId":"a16fc4fd-1949-4e77-9de3-30369f16c3a5","details":{"statusId":2,"status":"UpToDate","exampleCount":171}},{"modelId":"6bacdb75-1889-4f93-8971-8c8995ff8960","details":{"statusId":2,"status":"UpToDate","exampleCount":171}},{"modelId":"be963f4c-4898-48d7-9eba-3c6af0867b9d","details":{"statusId":2,"status":"UpToDate","exampleCount":171}}]
Här är utdata som är formaterade för läsbarhet:
[ { "modelId": "8eb7ad8f-5db5-4c28-819b-ca3905fffd80", "details": { "statusId": 2, "status": "UpToDate", "exampleCount": 171 } }, { "modelId": "6f53bc92-ae54-44ce-bc4e-010d1f8cfda0", "details": { "statusId": 2, "status": "UpToDate", "exampleCount": 171 } }, { "modelId": "6cb17888-ad6e-464c-82c0-d37fd1f2c4f8", "details": { "statusId": 2, "status": "UpToDate", "exampleCount": 171 } }, { "modelId": "a16fc4fd-1949-4e77-9de3-30369f16c3a5", "details": { "statusId": 2, "status": "UpToDate", "exampleCount": 171 } }, { "modelId": "6bacdb75-1889-4f93-8971-8c8995ff8960", "details": { "statusId": 2, "status": "UpToDate", "exampleCount": 171 } }, { "modelId": "be963f4c-4898-48d7-9eba-3c6af0867b9d", "details": { "statusId": 2, "status": "UpToDate", "exampleCount": 171 } } ]
Hämta avsikt från förutsägelseslutpunkten
Använd cURL för att fråga förutsägelseslutpunkten och få ett förutsägelseresultat.
Kommentar
Det här kommandot använder din förutsägelseslutpunkt.
Kopiera det här kommandot till textredigeraren:
curl "https://***YOUR-PREDICTION-ENDPOINT***/luis/prediction/v3.0/apps/***YOUR-APP-ID***/slots/production/predict" ^ --request GET ^ --get ^ --data "subscription-key=***YOUR-PREDICTION-KEY***" ^ --data "verbose=true" ^ --data "show-all-intents=true" ^ --data-urlencode "query=I want two large pepperoni pizzas on thin crust please"
Ersätt värdena som börjar med
***YOUR-
dina egna värden.Information Syfte ***YOUR-PREDICTION-ENDPOINT***
Slutpunkten för förutsägelse-URL:en. Finns på LUIS-portalen, sidan Azure-resurser för din app.
Exempel:https://westus.api.cognitive.microsoft.com/
***YOUR-APP-ID***
Ditt app-ID. Finns på LUIS-portalen, sidan Programinställningar för din app. ***YOUR-PREDICTION-KEY***
Förutsägelsenyckeln på 32 tecken. Finns på LUIS-portalen, sidan Azure-resurser för din app. Kopiera texten till ett konsolfönster och tryck på Retur för att köra kommandot:
Granska förutsägelsesvaret, som returneras som JSON:
{"query":"I want two large pepperoni pizzas on thin crust please","prediction":{"topIntent":"ModifyOrder","intents":{"ModifyOrder":{"score":1.0},"None":{"score":8.55E-09},"Greetings":{"score":1.82222226E-09},"CancelOrder":{"score":1.47272727E-09},"Confirmation":{"score":9.8125E-10}},"entities":{"Order":[{"FullPizzaWithModifiers":[{"PizzaType":["pepperoni pizzas"],"Size":[["Large"]],"Quantity":[2],"Crust":[["Thin"]],"$instance":{"PizzaType":[{"type":"PizzaType","text":"pepperoni pizzas","startIndex":17,"length":16,"score":0.9978157,"modelTypeId":1,"modelType":"Entity Extractor","recognitionSources":["model"]}],"Size":[{"type":"SizeList","text":"large","startIndex":11,"length":5,"score":0.9984481,"modelTypeId":1,"modelType":"Entity Extractor","recognitionSources":["model"]}],"Quantity":[{"type":"builtin.number","text":"two","startIndex":7,"length":3,"score":0.999770939,"modelTypeId":1,"modelType":"Entity Extractor","recognitionSources":["model"]}],"Crust":[{"type":"CrustList","text":"thin crust","startIndex":37,"length":10,"score":0.933985531,"modelTypeId":1,"modelType":"Entity Extractor","recognitionSources":["model"]}]}}],"$instance":{"FullPizzaWithModifiers":[{"type":"FullPizzaWithModifiers","text":"two large pepperoni pizzas on thin crust","startIndex":7,"length":40,"score":0.90681237,"modelTypeId":1,"modelType":"Entity Extractor","recognitionSources":["model"]}]}}],"ToppingList":[["Pepperoni"]],"$instance":{"Order":[{"type":"Order","text":"two large pepperoni pizzas on thin crust","startIndex":7,"length":40,"score":0.9047088,"modelTypeId":1,"modelType":"Entity Extractor","recognitionSources":["model"]}],"ToppingList":[{"type":"ToppingList","text":"pepperoni","startIndex":17,"length":9,"modelTypeId":5,"modelType":"List Entity Extractor","recognitionSources":["model"]}]}}}}
JSON-svar formaterat för läsbarhet:
{ "query": "I want two large pepperoni pizzas on thin crust please", "prediction": { "topIntent": "ModifyOrder", "intents": { "ModifyOrder": { "score": 1.0 }, "None": { "score": 8.55e-9 }, "Greetings": { "score": 1.82222226e-9 }, "CancelOrder": { "score": 1.47272727e-9 }, "Confirmation": { "score": 9.8125e-10 } }, "entities": { "Order": [ { "FullPizzaWithModifiers": [ { "PizzaType": [ "pepperoni pizzas" ], "Size": [ [ "Large" ] ], "Quantity": [ 2 ], "Crust": [ [ "Thin" ] ], "$instance": { "PizzaType": [ { "type": "PizzaType", "text": "pepperoni pizzas", "startIndex": 17, "length": 16, "score": 0.9978157, "modelTypeId": 1, "modelType": "Entity Extractor", "recognitionSources": [ "model" ] } ], "Size": [ { "type": "SizeList", "text": "large", "startIndex": 11, "length": 5, "score": 0.9984481, "modelTypeId": 1, "modelType": "Entity Extractor", "recognitionSources": [ "model" ] } ], "Quantity": [ { "type": "builtin.number", "text": "two", "startIndex": 7, "length": 3, "score": 0.999770939, "modelTypeId": 1, "modelType": "Entity Extractor", "recognitionSources": [ "model" ] } ], "Crust": [ { "type": "CrustList", "text": "thin crust", "startIndex": 37, "length": 10, "score": 0.933985531, "modelTypeId": 1, "modelType": "Entity Extractor", "recognitionSources": [ "model" ] } ] } } ], "$instance": { "FullPizzaWithModifiers": [ { "type": "FullPizzaWithModifiers", "text": "two large pepperoni pizzas on thin crust", "startIndex": 7, "length": 40, "score": 0.90681237, "modelTypeId": 1, "modelType": "Entity Extractor", "recognitionSources": [ "model" ] } ] } } ], "ToppingList": [ [ "Pepperoni" ] ], "$instance": { "Order": [ { "type": "Order", "text": "two large pepperoni pizzas on thin crust", "startIndex": 7, "length": 40, "score": 0.9047088, "modelTypeId": 1, "modelType": "Entity Extractor", "recognitionSources": [ "model" ] } ], "ToppingList": [ { "type": "ToppingList", "text": "pepperoni", "startIndex": 17, "length": 9, "modelTypeId": 5, "modelType": "List Entity Extractor", "recognitionSources": [ "model" ] } ] } } } }
Rensa resurser
Du kan ta bort appen från LUIS-portalen och ta bort Azure-resurserna från Azure Portal.
Om du använder REST-API:et ExampleUtterances.JSON
tar du bort filen från filsystemet när du är klar med snabbstarten.
Felsökning
- Autentisera till klientbiblioteket – autentiseringsfel indikerar vanligtvis att fel nyckel och slutpunkt användes. Den här snabbstarten använder redigeringsnyckeln och slutpunkten för förutsägelsekörningen som en bekvämlighet, men fungerar bara om du inte redan har använt den månatliga kvoten. Om du inte kan använda redigeringsnyckeln och slutpunkten måste du använda förutsägelsekörningsnyckeln och slutpunkten vid åtkomst till SDK-klientbiblioteket för förutsägelsekörning.
- Skapa entiteter – om du får ett fel när du skapar den kapslade maskininlärningsentiteten som används i den här självstudien kontrollerar du att du kopierade koden och inte ändrade koden för att skapa en annan entitet.
- Skapa exempelyttranden – om du får ett fel när du skapar det märkta exempelyttrandet som används i den här självstudien kontrollerar du att du kopierade koden och inte ändrade koden för att skapa ett annat märkt exempel.
- Utbildning – om du får ett träningsfel indikerar detta vanligtvis en tom app (inga avsikter med exempelyttranden) eller en app med avsikter eller entiteter som är felaktigt formaterade.
- Diverse fel – eftersom koden anropar till klientbiblioteken med text- och JSON-objekt kontrollerar du att du inte har ändrat koden.
Andra fel – om du får ett fel som inte beskrivs i föregående lista meddelar du oss genom att ge feedback längst ned på den här sidan. Inkludera programmeringsspråket och versionen av de klientbibliotek som du har installerat.