This specification defines the syntax and semantics for Utility Models that are used to create and drive conversational experiences. Utility Models allow authors to encode preferences over states of the world, enabling task-oriented programming languages to autonomously drive agents towards settings with the highest possible utility.
As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.
This specification aims to establish a paradigm that allows for the authoring of value drive content to be used in intelligent agent systems.
This document is limited to specifying the syntax and semantics of designing and incorporating
Utility Models
into any Task-Oriented programming language.
One example application of Utility Models
arises in chat-bot settings where authors are
able to specify preferences between interactions allowing for a more fluid and dynamic conversation.
Designing Utility Models
allows authors to create intelligent self-driven agents. In a
teacher-student setting, this allows agents to understand where a user is having trouble and provide
assistance to help them overcome said obstacle.
Utility is a sequence of Pair objects.
typedef sequence< Pair > Utility;
[ Pair1, Pair2, Pair3, ... ]
typedef sequence< Config > configSequence; [Exposed=Global] interface Pair { attribute configSequence configs; };
The configSequence data
type refers to a custom typedef
such
that the type configSequence denotes a sequence of Config objects. The
sequence
type is defined in
[[WebIDL-20161215]].
The configs attribute then specifies a sequence of two or more Config objects. For the sake of simplicity we assume the sequence of Config objects is ordered in descending order of utility. That is, the first Config object has the highest assigned utility, while the last Config object has the smallest assigned utility.
[ Config1, Config2, Config3, ... ]
typedef Dictionary Config;
The Config interface specifies a Dictionary
of key:value
pairings denoting the environmental
settings. The key
of each corresponding pair will always have a
String data type while the value
can be
any of the numeric or boolean data
types defined in [[[WebIDL-20161215]]].
{ "numWrongAttempts": 1, "success": true }
In a setting where a client is autonomously attempting to effectively teach a user, for example a mathematical concept, clients are able to specify the preferences of the states. In this case we've specified that a lower count of wrong attempts is preferred over a higher count, as this shows the user is at least attempting to learn.
[ [{"numWrongAttempts": 1, "success": true}, {"numWrongAttempts": 0, "success": false}], [{"numWrongAttempts": 3, "success": false}, {"numWrongAttempts": 5, "success": true}], ]
Being able to assign utility allows us to indirectly specify a desired trajectory. In the following example, animating all characters in a game setting has higher preferences than beginning the game.
[ [ { "is_pig_visible": true, "start_game": true }, { "is_pig_visible": false, "start_game": true } ], [ { "is_frog_visible": true, "start_game": true }, { "is_frog_visible": false, "start_game": true } ], [ { "is_fox_visible": true, "start_game": true }, { "is_fox_visible": false, "start_game": true } ] ]
When designing the utilities, the paired preferences do not have to belong to the same topic. By providing a variety of examples, the Utility Model is able to generalize to a richer interactive experience.
[ [ { "start_game": true }, { "start_game": false } ], [ { "start_game": true, "know_name": true }, { "start_game": false, "know_name": false } ], [ { "start_game": true, "say_welcome": true }, { "start_game": false, "say_welcome": false } ], [ { "remark_current_event": true }, { "remark_current_event": false } ], [ { "remark_day_of_week": true }, { "remark_day_of_week": false } ], [ { "remark_day": true }, { "remark_day": false } ], [ { "remark_weather": true }, { "remark_weather": false } ], [ { "remark_last_seen": true }, { "remark_last_seen": false } ], [ { "user_knows_name": true }, { "user_knows_name": false } ], [ { "asked_name_reminder": true }, { "asked_name_reminder": false } ], [ { "num_interaction": 3 }, { "num_interaction": 12 } ], [ { "num_interaction": 3 }, { "num_interaction": -6 } ] ]
Utility Models
vs. Rank-SVM
In Rank-SVM
the following set of feature vectors generates the following preferences. Note,
in the following example the sidelined # 1A, #1B, and # 1C is simply naming convention for the purposes of demonstration.
3 qid:1 1:1 2:1 3:0 4:0.2 5:0 # 1A 2 qid:1 1:0 2:0 3:1 4:0.1 5:1 # 1B 1 qid:1 1:0 2:1 3:0 4:0.4 5:0 # 1C 1 qid:1 1:0 2:0 3:1 4:0.3 5:0 # 1D 1 qid:2 1:0 2:0 3:1 4:0.2 5:0 # 2A 2 qid:2 1:1 2:0 3:1 4:0.4 5:0 # 2B 1 qid:2 1:0 2:0 3:1 4:0.1 5:0 # 2C 1 qid:2 1:0 2:0 3:1 4:0.2 5:0 # 2D 2 qid:3 1:0 2:0 3:1 4:0.1 5:1 # 3A 3 qid:3 1:1 2:1 3:0 4:0.3 5:0 # 3B 4 qid:3 1:1 2:0 3:0 4:0.4 5:1 # 3C 1 qid:3 1:0 2:1 3:1 4:0.5 5:0 # 3D
1A>1B, 1A>1C, 1A>1D, 1B>1C, 1B>1D, 2B>2A, 2B>2C, 2B>2D, 3C>3A, 3C>3B, 3C>3D, 3B>3A, 3B>3D, 3A>3D
The same set of feature preferences can be specified using the Utility Model syntax and semantics defined within this document in a more readable format.
[ [ { "1A_feature_1": 1, "1A_feature_2": 2, "1A_feature_3": 0, "1A_feature_4": 0.2 "1A_feature_5": 0 }, { "1B_feature_1": 0, "1B_feature_2": 0, "1B_feature_3": 1, "1B_feature_4": 0.1 "1B_feature_5": 1 } ], [ { "1A_feature_1": 1, "1A_feature_2": 2, "1A_feature_3": 0, "1A_feature_4": 0.2 "1A_feature_5": 0 }, { "1C_feature_1": 0, "1C_feature_2": 1, "1C_feature_3": 0, "1C_feature_4": 0.4 "1C_feature_5": 0 } ], [ { "1A_feature_1": 1, "1A_feature_2": 2, "1A_feature_3": 0, "1A_feature_4": 0.2 "1A_feature_5": 0 }, { "1D_feature_1": 0, "1D_feature_2": 0, "1D_feature_3": 1, "1D_feature_4": 0.3 "1D_feature_5": 0 } ], [ { "2B_feature_1": 0, "2B_feature_2": 0, "2B_feature_3": 1, "2B_feature_4": 0.2 "2B_feature_5": 0 }, { "2A_feature_1": 1, "2A_feature_2": 0, "2A_feature_3": 1, "2A_feature_4": 0.4 "2A_feature_5": 0 } ], [ { "2B_feature_1": 0, "2B_feature_2": 0, "2B_feature_3": 1, "2B_feature_4": 0.2 "2B_feature_5": 0 }, { "2C_feature_1": 0, "2C_feature_2": 0, "2C_feature_3": 1, "2C_feature_4": 0.1 "2C_feature_5": 0 } ], [ { "2B_feature_1": 0, "2B_feature_2": 0, "2B_feature_3": 1, "2B_feature_4": 0.2 "2B_feature_5": 0 }, { "2D_feature_1": 0, "2D_feature_2": 0, "2D_feature_3": 1, "2D_feature_4": 0.2 "2D_feature_5": 0 } ], [ { "3C_feature_1": 1, "3C_feature_2": 0, "3C_feature_3": 0, "3C_feature_4": 0.4 "3C_feature_5": 1 }, { "3A_feature_1": 0, "3A_feature_2": 0, "3A_feature_3": 1, "3A_feature_4": 0.1 "3A_feature_5": 1 } ], [ { "3C_feature_1": 1, "3C_feature_2": 0, "3C_feature_3": 0, "3C_feature_4": 0.4 "3C_feature_5": 1 }, { "3B_feature_1": 1, "3B_feature_2": 1, "3B_feature_3": 0, "3B_feature_4": 0.3 "3B_feature_5": 0 } ], [ { "3C_feature_1": 1, "3C_feature_2": 0, "3C_feature_3": 0, "3C_feature_4": 0.4 "3C_feature_5": 1 }, { "3D_feature_1": 0, "3D_feature_2": 1, "3D_feature_3": 1, "3D_feature_4": 0.5 "3D_feature_5": 0 } ], [ { "3B_feature_1": 1, "3B_feature_2": 1, "3B_feature_3": 0, "3B_feature_4": 0.3 "3B_feature_5": 0 }, { "3A_feature_1": 0, "3A_feature_2": 0, "3A_feature_3": 1, "3A_feature_4": 0.1 "3A_feature_5": 1 } ], [ { "3B_feature_1": 1, "3B_feature_2": 1, "3B_feature_3": 0, "3B_feature_4": 0.3 "3B_feature_5": 0 }, { "3D_feature_1": 0, "3D_feature_2": 1, "3D_feature_3": 1, "3D_feature_4": 0.5 "3D_feature_5": 0 } ], [ { "3A_feature_1": 0, "3A_feature_2": 0, "3A_feature_3": 1, "3A_feature_4": 0.1 "3A_feature_5": 1 }, { "3D_feature_1": 0, "3D_feature_2": 1, "3D_feature_3": 1, "3D_feature_4": 0.5 "3D_feature_5": 0 } ] ]