LG-Dateiformat
GILT FÜR: SDK v4
In der LG-Datei werden Vorlagen für die Sprachgenerierung mit Entitätsverweisen und deren Komposition beschrieben. In diesem Artikel werden die verschiedenen Konzepte behandelt, die mit dem LG-Dateiformat ausgedrückt werden.
Sonderzeichen
Kommentare
Verwenden Sie >, um einen Kommentar zu erstellen. Alle Zeilen mit diesem Präfix werden vom Parser übersprungen.
> This is a comment.
Escapezeichen
Verwenden Sie als Escapezeichen \.
# TemplateName
- You can say cheese and tomato \[toppings are optional\]
Arrays und Objekte
Erstellen eines Arrays
Verwenden Sie zum Erstellen eines Arrays die Syntax ${[object1, object2, ...]} . Dieser Ausdruck, zum Beispiel:
${['a', 'b', 'c']}
Gibt das Array ['a', 'b', 'c']
zurück.
Erstellen eines -Objekts
Verwenden Sie zum Erstellen eines Objekts die Syntax ${{key1:value1, key2:value2, ...}} . Dieser Ausdruck, zum Beispiel:
${{user: {name: "Wilson", age: 27}}}
Gibt folgendes JSON-Objekt zurück:
{
"user": {
"name": "Wilson",
"age": 27
}
}
Vorlagen
Vorlagen sind das Kernkonzept des Systems zur Sprachgenerierung. Jede Vorlage verfügt über einen Namen und eine der folgenden Komponenten:
- eine Liste von Textwerten mit 1-von-Variationen
- eine Definition für strukturierte Inhalte
- eine Sammlung von Bedingungen, jeweils mit:
- einem adaptiven Ausdruck
- einer Liste von Textwerten mit 1-von-Variationen pro Bedingung
Vorlagennamen
Bei Vorlagennamen wird die Groß-/Kleinschreibung beachtet und darf nur Buchstaben, Unterstriche und Zahlen enthalten. Es folgt ein Beispiel für eine ManifestVorlagendatei namens TemplateName
.
# TemplateName
Vorlagen können nicht mit einer Zahl beginnen und ein Teil eines Vorlagennamens, der durch geteilt wird, kann nicht mit einer Zahl beginnen.
Vorlagen-Antwortvariationen
Variationen werden als Markdown-Liste ausgedrückt. Sie können jeder Variation mithilfe der Zeichen -, ' oder + ein Präfix voranstellen.
# Template1
- text variation 1
- text variation 2
- one
- two
# Template2
* text variation 1
* text variation 2
# Template3
+ one
+ two
Vorlage für eine einfache Antwort
Eine Vorlage für eine einfache Antwort enthält Textvariationen, die für Komposition und Erweiterung verwendet werden. Eine der bereitgestellten Variationen wird von der LG-Bibliothek nach dem Zufallsprinzip ausgewählt.
Im Folgenden finden Sie ein Beispiel für eine einfache Vorlage, die zwei Variationen enthält.
> Greeting template with two variations.
# GreetingPrefix
- Hi
- Hello
Vorlage für eine bedingte Antwort
Mithilfe von Vorlagen für bedingte Antworten können Sie Inhalte erstellen, die basierend auf einer Bedingung ausgewählt werden. Alle Bedingungen werden mithilfe von adaptiven Ausdrücken ausgedrückt.
Wichtig
Bedingte Vorlagen können nicht in einer einzelnen Vorlage für eine bedingte Antwort geschachtelt werden. Verwenden Sie die Komposition in einer Vorlage für eine strukturierte Antwort, um bedingte Vorlagen zu schachteln.
IF-ELSE-Vorlage
Mit einer IF-ELSE-Vorlage können Sie eine Vorlage erstellen, die eine Sammlung basierend auf einer kaskadierenden Reihenfolge von Bedingungen auswählt. Die Auswertung erfolgt von oben nach unten und wird beendet, wenn eine Bedingung als true
ausgewertet oder der ELSE-Block erreicht wird.
Bedingte Ausdrücke werden in geschweifte Klammern ${} eingeschlossen. Im Folgenden finden Sie ein Beispiel, das eine Definition für eine einfache IF-ELSE-Vorlage für bedingte Antworten zeigt.
> time of day greeting reply template with conditions.
# timeOfDayGreeting
- IF: ${timeOfDay == 'morning'}
- good morning
- ELSE:
- good evening
Im Folgenden finden Sie ein weiteres Beispiel, das die Definition einer IF-ELSE-Vorlage für bedingte Antworten zeigt. Beachten Sie, dass Sie Verweise auf andere Vorlagen für einfache oder bedingte Antworten in der Variation für eine der Bedingungen einschließen können.
# timeOfDayGreeting
- IF: ${timeOfDay == 'morning'}
- ${morningTemplate()}
- ELSEIF: ${timeOfDay == 'afternoon'}
- ${afternoonTemplate()}
- ELSE:
- I love the evenings! Just saying. ${eveningTemplate()}
SWITCH-Vorlage
Mithilfe der SWITCH-Vorlage können Sie eine Vorlage entwerfen, die den Wert eines Ausdrucks mit einer CASE-Klausel vergleicht und die Ausgabe auf der Grundlage dieser Klausel erzeugt. Bedingte Ausdrücke werden in geschweifte Klammern ${} eingeschlossen.
Im Folgenden wird erläutert, wie Sie in LG einen SWITCH-CASE-DEFAULT-Block angeben können.
# TestTemplate
- SWITCH: ${condition}
- CASE: ${case-expression-1}
- output1
- CASE: ${case-expression-2}
- output2
- DEFAULT:
- final output
Im Folgenden finden Sie ein komplexeres Beispiel für SWITCH-CASE-DEFAULT:
> Note: Any of the cases can include reference to one or more templates.
# greetInAWeek
- SWITCH: ${dayOfWeek(utcNow())}
- CASE: ${0}
- Happy Sunday!
-CASE: ${6}
- Happy Saturday!
-DEFAULT:
- ${apology-phrase()}, ${defaultResponseTemplate()}
Hinweis
Wie bedingte Vorlagen können auch Switch-Vorlagen nicht geschachtelt werden.
Vorlage für eine strukturierte Antwort
Mit Vorlagen für strukturierte Antworten können Sie eine komplexe Struktur definieren, die die LG-Hauptfunktionalität unterstützt (z. B. Vorlagen, Komposition und Ersetzung), und gleichzeitig die Interpretation der strukturierten Antwort beim Aufrufer der LG-Bibliothek belassen.
Für Botanwendungen wird Folgendes nativ unterstützt:
- Aktivitätsdefinition
- Kartendefinition
Weitere Informationen finden Sie unter Vorlage für eine strukturierte Antwort.
Vorlagenkomposition und -erweiterung
Verweise auf Vorlagen
Der Variantentext kann Verweise auf andere benannte Vorlagen enthalten, um die Komposition und Auflösung von komplexen Antworten zu unterstützen. Verweise auf andere benannte Vorlagen werden mit geschweiften Klammern gekennzeichnet, z. B. ${<TemplateName>()}
> Example of a template that includes composition reference to another template.
# GreetingReply
- ${GreetingPrefix()}, ${timeOfDayGreeting()}
# GreetingPrefix
- Hi
- Hello
# timeOfDayGreeting
- IF: ${timeOfDay == 'morning'}
- good morning
- ELSEIF: ${timeOfDay == 'afternoon'}
- good afternoon
- ELSE:
- good evening
Ein Aufruf der Vorlage GreetingReply
kann zu einer der folgenden Erweiterungsauflösungen führen:
Hi, good morning
Hi, good afternoon
Hi, good evening
Hello, good morning
Hello, good afternoon
Hello, good evening
Entitäten
Wenn sie direkt innerhalb eines 1-von-Variationstexts verwendet werden, werden Entitätsverweise durch Einschließen in geschweifte Klammern (z. B. „${entityName
}“) gekennzeichnet. Die geschweiften Klammern können weggelassen werden, wenn sie als Parameter verwendet werden.
Entitäten können als Parameter verwendet werden:
- innerhalb einer vordefinierten Funktion
- innerhalb einer Bedingung in einer Vorlage für eine bedingte Antwort
- in einem Aufruf zur Vorlagenauflösung
Verwenden von vordefinierten Funktionen in Variationen
Vordefinierte Funktionen, die von adaptiven Ausdrücken unterstützt werden, können auch inline in einem 1-von-Variationstext verwendet werden, um eine noch leistungsfähigere Textkomposition zu erzielen. Um einen Ausdruck inline zu verwenden, schließen Sie ihn einfach in geschweifte Klammern ein.
# RecentTasks
- IF: ${count(recentTasks) == 1}
- Your most recent task is ${recentTasks[0]}. You can let me know if you want to add or complete a task.
- ELSEIF: ${count(recentTasks) == 2}
- Your most recent tasks are ${join(recentTasks, ', ', ' and ')}. You can let me know if you want to add or complete a task.
- ELSEIF: ${count(recentTasks) > 2}
- Your most recent ${count(recentTasks)} tasks are ${join(recentTasks, ', ', ' and ')}. You can let me know if you want to add or complete a task.
- ELSE:
- You don't have any tasks.
Im obigen Beispiel wird die vordefinierte Funktion join verwendet, um alle Werte in der Sammlung recentTasks
aufzulisten.
Da bestimmte Vorlagen und vordefinierte Funktionen dieselbe Aufrufsignatur verwenden, darf der Vorlagenname nicht mit dem Namen einer vordefinierten Funktion identisch sein.
Ein Vorlagenname sollte nicht mit dem Namen einer vordefinierten Funktion identisch sein. Die vordefinierte Funktion hat in diesem Fall Vorrang. Um solche Konflikte zu vermeiden, können Sie bei einem Verweis auf Ihren Vorlagennamen die Zeichenfolge lg.
voranstellen. Beispiel:
> Custom length function with one parameter.
# length(a)
- This is use's customized length function
# myfunc1
> will call prebuilt function length, and return 2
- ${length('hi')}
# mufunc2
> this calls the lg template and output 'This is use's customized length function'
- ${lg.length('hi')}
Mehrzeiliger Text in Variationen
Jede 1-von-Variation kann mehrzeiligen Text enthalten, der in dreifache Anführungszeichen eingeschlossen ist.
# MultiLineExample
- ```This is a multiline list
- one
- two
```
- ```This is a multiline variation
- three
- four
```
In mehrzeiligen Variationen können Vorlagenerweiterungen und Entitätsersetzungen angefordert werden, indem der angeforderte Vorgang in geschweifte Klammern (${}) eingeschlossen wird.
# MultiLineExample
- ```
Here is what I have for the order
- Title: ${reservation.title}
- Location: ${reservation.location}
- Date/ time: ${reservation.dateTimeReadBack}
```
Durch die Unterstützung von mehrzeiligem Text können Sie komplexen JSON- oder XML-Code (z. B. in SSML umschlossenen Text zum Steuern der gesprochenen Antwort des Bots) vollständig im Subsystem zur Sprachgenerierung auflösen.
Parametrisierung von Vorlagen
Um die kontextbezogene Wiederverwendbarkeit zu unterstützen, können Vorlagen parametrisiert werden. Verschiedene Aufrufer der Vorlage können unterschiedliche Werte zur Verwendung bei der Erweiterungsauflösung übergeben.
# timeOfDayGreetingTemplate (param1)
- IF: ${param1 == 'morning'}
- good morning
- ELSEIF: ${param1 == 'afternoon'}
- good afternoon
- ELSE:
- good evening
# morningGreeting
- ${timeOfDayGreetingTemplate('morning')}
# timeOfDayGreeting
- ${timeOfDayGreetingTemplate(timeOfDay)}
Importieren externer Verweise
Sie können Ihre Vorlagen zur Sprachgenerierung in separate Dateien aufteilen und dann in einer Datei auf eine Vorlage in einer anderen Datei verweisen. Sie können Links im Markdown-Stil verwenden, um Vorlagen zu importieren, die in einer anderen Datei definiert sind.
[Link description](filePathOrUri)
Es werden alle Vorlagen gepullt, die in der Zieldatei definiert sind. Stellen Sie sicher, dass die Vorlagennamen für alle gepullten Dateien eindeutig sind (oder mit # \<namespace>.\<templatename>
einem Namespace zugeordnet sind).
[Shared](../shared/common.lg)
Von LG eingefügte Funktionen
Adaptive Ausdrücke bieten Ihnen die Möglichkeit, einen benutzerdefinierten Satz von Funktionen einzufügen. Weitere Informationen finden Sie unter Von der LG-Bibliothek eingefügte Funktionen.
Optionen
Entwickler können Parseroptionen festlegen, um die Auswertung von Eingaben anzupassen. Verwenden Sie die Notation > !#
, um Parseroptionen festzulegen.
Wichtig
Die letzte in der Datei gefundene Einstellung hat Priorität gegenüber vorherigen Einstellungen im selben Dokument.
strict-Option
Entwickler, die kein Null-Ergebnis für ein mit Null ausgewertetes Ergebnis zulassen möchten, können die Option strikt implementieren. Nachstehend sehen Sie ein Beispiel für eine einfache strict-Option:
> !# @strict = true
# template
- hi
Wenn die strict-Option aktiviert ist, lösen NULL-Fehler eine benutzerfreundliche Meldung aus.
# welcome
- hi ${name}
Wenn „name“ den Wert NULL hat, lautet die Diagnose: 'name' als NULL ausgewertet. [welcome] Fehler beim Auswerten von '- hi ${name}'.. Wenn strict auf FALSE oder gar nicht festgelegt ist, wird ein kompatibles Ergebnis ausgegeben. Im obigen Beispiel wird hi null erzeugt.
replaceNull-Option
Entwickler können Stellvertreter zum Ersetzen von Null-Werten in ausgewerteten Ausdrücken erstellen. Dazu verwenden sie die Option replaceNull:
> !# @replaceNull = ${path} is undefined
Im obigen Beispiel wird die NULL-Eingabe in der Variable path
durch ${path} is undefined ersetzt. Sehen Sie sich auch die folgende Eingabe an, bei der user.name
den Wert NULL hat:
hi ${user.name}
Da Ergebnis lautet in diesem Fall hi user.name is undefined.
lineBreakStyle option
Entwickler können mithilfe der Option lineBreakStyle festlegen, wie das LG-System Zeilenumbrüche rendert. Derzeit werden zwei Modi unterstützt:
default
: Zeilenumbrüche in mehrzeiligem Text erzeugen normale Zeilenumbrüche.markdown
: Zeilenumbrüche in mehrzeiligem Text werden automatisch in zwei Zeilen konvertiert, um einen Zeilenumbruch zu erzeugen.
Im folgenden Beispiel wird gezeigt, wie die Option lineBreakStyle auf markdown
festgelegt wird:
> !# @lineBreakStyle = markdown
Namespace (Option)
Sie können einen Namespace für die LG-Vorlagen registrieren, die Sie exportieren möchten. Wenn kein Namespace angegeben ist, wird der Namespace ohne Erweiterung auf den Dateinamen festgelegt.
Im folgenden Beispiel wird gezeigt, wie die Namespace-Option auf foo
festgelegt wird:
> !# @Namespace = foo
Exports (Option)
Sie können eine Liste der zu exportierenden LG-Vorlagen angeben. Die exportierten Vorlagen können wie vorgefertigte Funktionen aufgerufen werden.
Im folgenden Beispiel wird gezeigt, wie die Exportoption auf template1, template2
festgelegt wird:
> !# @Namespace = foo
> !# @Exports = template1, template2
# template1(a, b)
- ${a + b}
# template2(a, b)
- ${join(a, b)}
Verwenden Sie foo.template1(1,2), foo.template2(['a', 'b', 'c'], ',')
, um diese exportierten Vorlagen aufzurufen.
Cache-Bereich
Mit den Cache-Bereichs-Optionen können Sie steuern, wann der LG-Evaluator einen Zuvor gesehenen Ausdruck neu bewertet und ein zwischengespeichertes Ergebnis speichert und verwendet.
- Der globale Cache ist im Lebenszyklus einer Auswertung wirksam. LG speichert alle Auswertungsergebnisse zwischen und wenn der Vorlagenname und die Parameter identisch sind, wird das Ergebnis aus dem Cache zurückgegeben.
- Der lokale Cachebereich ist die Standardeinstellung. Wenn in derselben Ebene die vorherige Vorlage mit demselben Vorlagennamen und denselben Parametern aufgerufen wurde, wird das zwischengespeicherte Ergebnis direkt zurückgegeben.
- Der Bereich ohne Cache deaktiviert den gesamten Cachebereich und gibt jedes Mal das neue Ergebnis zurück.
Beispiele finden Sie in den Beispielen für den globalen und lokalen Cachebereich.
> !# @cacheScope= global // global cache
> !# @cacheScope= local // local cache
> !# @cacheScope= none // none cache
> !# @cacheScope= xxx // fallback to local cache
Beachten Sie, dass bei der Cachebereichs-Option die Groß-/Kleinschreibung nicht beachtet wird.
> !# @cacheScope= global // ok
> !# @CACHESCOPE= global // ok
> !# @cachescope= global // ok
Beachten Sie, dass der Cachebereich dem Bereich der LG-Datei von Microsoft Entrance folgt.
Angenommen, Sie haben zwei Dateien: a.lg
und b.lg
, unten dargestellt:
a.lg
> !# @cacheScope= global
[import](b.lg)
b.lg
> !# @cacheScope= none
# template1
- ${template2()} ${template2()}
# template2
- ${rand(1, 10000000)}
Wenn Sie den folgenden Code ausführen, werden Sie feststellen, dass template2
das zwischengespeicherte Ergebnis des ersten ausgewerteten Ergebnisses aufgrund der global
Cachebereichsoption in a.lg verwendet wird:
var templates = Templates.ParseFile("a.lg");
var result = templates.Evaluate("template1"); // the second "template2" would use the cache of the first evaluate result
Einfluss der erneuten Ausführung von Markierungen
Wenn der Vorlagenname mit "!" endet, erzwingt die Vorlage die erneute Ausführung. Dieses Ergebnis wird unabhängig vom Cachebereich nicht dem Cache hinzugefügt.
Angenommen, Sie haben folgende Vorlage:
# template2
- ${template1()} ${template1!()} ${template1()}
template1!()
wird ausgelöst, und das Ergebnis wird dem Cache hinzugefügt. Der zweite template1()
Klobber das Ergebnis aus dem ersten template1()
. Der letzte Aufruf verwendet die im Cache gespeicherten Ergebnisse.
Beispiel für den globalen Cachebereich
Angenommen, Sie verwenden die folgenden Vorlagen:
# template1
- ${template2()} ${template3()}
# template2
- ${rand(1, 10)}
- abc
- hi
# template3
- ${template2()}
template2
wird einmal ausgewertet, und die zweite Ausführung in template3
würde den Cache des ersten anwenden.
Der folgende Codeausschnitt ist ein Beispiel.
var templates = Templates.ParseFile("xxx.lg");
var result1 = templates.Evaluate("template", null, new EvaluationOptions { CacheScope = LGCacheScope.Global});
// The second evaluation would drop all the results cached before.
var result2 = templates.Evaluate("template", null, new EvaluationOptions { CacheScope = LGCacheScope.Global});
Eine Vorlage wird mithilfe der Templates.ParseFile()
Funktion analysiert, und die Ergebnisse der Vorlagenauswertung werden in result1
gespeichert. Beachten Sie, dass die zweiten Auswertungsergebnisse, result2
, alle zuvor zwischengespeicherten Ergebnisse fallen lassen.
Beispiel für den lokalen Cache-Bereich
Die folgenden Beispiele zeigen, wann der lokale Cache-Bereich funktioniert und nicht funktioniert. Gehen Sie davon aus, dass t()
vorlagen subT()
einen Parameter annehmen:
> Cache works, the second template call would re-use the first's result.
# template1
- ${t(param)} ${t(param)}
> Cache doesn't work because param1's value is different with param2's. value)
# template2
- ${t(param1)} ${t(param2)}
> Cache doesn't work because of different layers.
# template3
- ${subT(param1)} ${t(param2)}
# subT(param)
- ${t(param)}
Weitere Ressourcen
- C#-API-Referenz
- JavaScript-API-Referenz
- Lesen Sie Debuggen mit adaptiven Tools, um zu erfahren, wie Sie .lg-Dateien analysieren und debuggen.