Zugriff auf Kontextdaten im Dialog
Der Kontext ist ein Objekt, das Variablen enthält, die während eines Gesprächs bestehen bleiben und vom Dialog und der Client-Anwendung gemeinsam genutzt werden können. Sowohl das Dialogmodul als auch die Clientanwendung kann Kontextvariablen lesen und schreiben.
Sie können auswählen, ob der Kontext von Ihrer Anwendung oder vom watsonx Assistant-Service verwaltet werden soll:
-
Wenn Sie die statusabhängige API
messageder Version 2 verwenden, wird der Kontext für jede Sitzung vom Assistenten automatisch verwaltet. Ihre Anwendung muss zu Beginn jedes Dialogs explizit eine Sitzung erstellen. Der Kontext wird vom Service als Teil der Sitzung gespeichert und nur dann in Nachrichtenantworten zurückgegeben, wenn Sie ihn anfordern. Weitere Informationen finden Sie in v2. -
Wenn Sie die statusunabhängige API
messageder Version 2 (oder die traditionelle APImessageder Version 1) verwenden, muss Ihre Anwendung Kontext nach jeder Dialogrunde speichern und mit der nächsten Nachricht an den Service zurücksenden. Für eine komplexe Anwendung oder für eine Anwendung, die personenbezogene Daten speichern muss, können Sie den Kontext wahlweise auch in einer Datenbank speichern.Zu Beginn des Dialogs wird automatisch eine Sitzungs-ID generiert; von dem Service werden jedoch keine Sitzungsdaten gespeichert. Bei Verwendung der statusunabhängigen API
messagewird der Kontext in jede Nachrichtenantwort eingeschlossen. Weitere Informationen finden Sie in v2.
Wichtig: Eine Verwendung des Kontexts besteht darin, für jeden Benutzer, der mit dem Assistenten interagiert, eine eindeutige Benutzer-ID festzulegen. Bei benutzerbasierten Plänen wird diese ID für Abrechnungszwecke verwendet. Weitere Informationen hierzu finden Sie im Abschnitt mit den Erläuterungen der benutzerbasierten Pläne.
Es gibt zwei Arten von Kontext:
-
Globaler Kontext: Kontextvariablen, die von allen Fähigkeiten geteilt werden, die von einem Assistenten verwendet werden, einschließlich interner Systemvariablen, die zur Steuerung des Gesprächsflusses verwendet werden. Der globale Kontext umfasst die Benutzer-ID und andere globale Werte wie die Zeitzone und die Sprache des Assistenten.
-
Skillbezogener Kontext: Spezifische Kontextvariablen für einen bestimmten Skill, (einschließlich aller von Ihrer Anwendung benötigten benutzerdefinierten Variablen). Momentan wird nur ein einziger Skill mit dem Namen
main skillunterstützt.
Benutzerdefinierte Kontextvariablen, die Sie in einem Dialogknoten angeben, sind Teil des user_defined-Objekts innerhalb des Kompetenzkontexts, wenn über die API darauf zugegriffen wird. Diese Struktur unterscheidet sich von der context-Struktur,
die im JSON-Editor in watsonx Assistant angezeigt wird. Sie können beispielsweise den folgenden Code im JSON-Editor angeben:
"context": {
"my_context_var": "this is the value"
}
In der API der Version 2 greifen Sie wie folgt auf diese benutzerdefinierte Variable zu:
"context": {
"skills": {
"main skill": {
"user_defined": {
"my_context_var": "this is the value"
}
}
}
}
Weitere Informationen zum Zugriff auf Kontextvariablen mithilfe der API finden Sie in v2.
Beispiel
Das folgende Beispiel zeigt eine zustandsbehaftete /message-Anfrage, die sowohl globale als auch fähigkeitsspezifische Kontextvariablen enthält; außerdem wird die options.return_context-Eigenschaft verwendet, um zu
verlangen, dass der Kontext mit der Antwort zurückgegeben wird. Diese Option ist nur anwendbar, wenn Sie die zustandsbehaftete message-Methode verwenden, da die zustandslose message-Methode immer den Kontext zurückgibt.
service
.message({
assistant_id: '{assistant_id}',
session_id: '{session_id}',
input: {
message_type: 'text',
text: 'Hello',
options: {
'return_context': true
}
},
context: {
'global': {
'system': {
'user_id': 'my_user_id'
}
},
'skills': {
'main skill': {
'user_defined': {
'account_number': '123456'
}
}
}
}
})
.then(res => {
console.log(JSON.stringify(res, null, 2));
})
.catch(err => {
console.log(err);
});
response=service.message(
assistant_id='{assistant_id}',
session_id='{session_id}',
input={
'message_type': 'text',
'text': 'Hello',
'options': {
'return_context': True
}
},
context={
'global': {
'system': {
'user_id': 'my_user_id'
}
},
'skills': {
'main skill': {
'user_defined': {
'account_number': '123456'
}
}
}
}
).get_result()
print(json.dumps(response, indent=2))
MessageInputOptions inputOptions = new MessageInputOptions.Builder()
.returnContext(true)
.build();
MessageInput input = new MessageInput.Builder()
.messageType("text")
.text("Hello")
.options(inputOptions)
.build();
// create global context with user ID
MessageContextGlobalSystem system = new MessageContextGlobalSystem.Builder()
.userId("my_user_id")
.build();
MessageContextGlobal globalContext = new MessageContextGlobal.Builder()
.system(system)
.build();
// build user-defined context variables, put in skill-specific context for main skill
Map<String, Object> userDefinedContext = new HashMap<>();
userDefinedContext.put("account_number","123456");
MessageContextSkill mainSkillContext = new MessageContextSkill.Builder()
.userDefined(userDefinedContext)
.build();
Map<String, MessageContextSkill> skillsContext = new HashMap<>();
skillsContext.put("main skill", mainSkillContext);
MessageContext context = new MessageContext.Builder()
.global(globalContext)
.skills(skillsContext)
.build();
MessageOptions options = new MessageOptions.Builder()
.assistantId("{assistant_id}")
.sessionId("{session_id}")
.input(input)
.context(context)
.build();
MessageResponse response = service.message(options).execute().getResult();
System.out.println(response);
In dieser Beispielanforderung gibt die Anwendung einen Wert für user_id als Teil des globalen Kontexts an. Außerdem wird eine benutzerdefinierte Kontextvariable (account_number) als Teil des skillbezogenen Kontexts
festgelegt. Diese Kontextvariable kann von Dialogmodulknoten als $account_number aufgerufen werden.
Sie können einen beliebigen Variablennamen angeben, den Sie für eine benutzerdefinierte Kontextvariable verwenden möchten. Wenn die angegebene Variable vorhanden ist, wird sie mit dem neuen Wert überschrieben; wenn nicht, wird dem Kontext eine neue Variable hinzugefügt.
Die Ausgabe dieser Anforderung enthält neben den üblichen Ausgabedaten den Kontext und zeigt, dass die angegebenen Werte hinzugefügt wurden. Wenn Sie die statusunabhängige Methode message verwenden, müssen diese Kontextdaten lokal
gespeichert und als Teil der nächsten Nachricht an den watsonx Assistant-Service zurückgesendet werden. Wenn Sie die zustandsbehaftete message-Methode verwenden, wird dieser Kontext automatisch gespeichert und bleibt für die Dauer
der Sitzung bestehen.
{
"output": {
"generic": [
{
"response_type": "text",
"text": "Welcome to the watsonx Assistant example!"
}
],
"intents": [
{
"intent": "hello",
"confidence": 1
}
],
"entities": []
},
"user_id": "my_user_id",
"context": {
"global": {
"system": {
"turn_count": 1,
"user_id": "my_user_id"
}
},
"skills": {
"main skill": {
"user_defined": {
"account_number": "123456"
}
}
}
}
}
Dialogstatus wiederherstellen
In manchen Situationen ist es hilfreich, wenn ein vorheriger Status des Dialogs wiederhergestellt werden kann.
Sie können die Option export in statusabhängigen Anforderungen message verwenden, um anzugeben, dass das Kontextobjekt in der Antwort die vollständigen Informationen zum Sitzungsstatus enthalten soll. Wenn Sie für diese
Option true angeben, enthält der zurückgegebene Skillkontext eine codierte Eigenschaft state, die den aktuellen Dialogstatus darstellt.
Wenn Sie die statusabhängige API message verwenden, speichert der Service die Dialogstatusdaten nur für die Lebensdauer der Sitzung. Wenn Sie jedoch diese Kontextdaten (einschließlich state ) speichern und sie mit einer
nachfolgenden Nachrichtenanfrage an den Dienst zurücksenden, können Sie die Konversation im gleichen Zustand wiederherstellen, selbst wenn die ursprüngliche Sitzung abgelaufen ist oder gelöscht wurde.
Wenn Sie die statusunabhängie API message verwenden, ist die Eigenschaft state immer in den Antworten enthalten (zusammen mit dem übrigen Inhalt von context). Obwohl statusunabhängige Sitzungen nicht ablaufen,
können Sie mithilfe der Statusdaten dennoch einen früheren Dialogstatus wiederherstellen.