Table of Contents | ||
---|---|---|
|
Getting Started
...
go to main.py
Ontology
What is an Ontology?
For general information please check out: Preliminaries and Quiz Materials.
For this project:
Intents represent the user's high-level actions or goals.
Example: When a user says, "Can you recommend a recipe?", the intent could be
requestRecommendation
.
Slots define specific pieces of information extracted from the user’s input.
Example: In the query "Add garlic and chicken thighs to the recipe filter,"
garlic
andchicken thighs
are slot values of theingredient
slot type.
The ontology file is where all the possible intents and slots for the system are defined.
Steps to Analyze the Ontology
Open the Ontology File
Locate the ontology file (
ontology.json
) in your project. This file contains two key sections:Intents: A list of all possible intents your system can predict.
Slots: A dictionary where the keys represent slot types (e.g.,
ingredient
) and the values are lists of possible slot values (e.g.,garlic
,chicken thighs
).
Review the Intents
Look at the
intents
section in the file. Each intent represents a unique user goal or action.Reflect on the variety of intents. For example:
What do intents like
greeting
orfarewell
imply about the system's capabilities?How does the system distinguish between
recipeRequest
andrequestRecommendation
?
Explore the Slots
Examine the
slots
section. This is a dictionary of slot types and their potential values.Key questions to consider:
How many slot types are defined? Examples might include
ingredient
,cuisine
, orrecipe
.Are there any patterns in the slot values?
How do these slots connect to our MARBEL agent potentially?
Think About Model Outputs
Your model will predict one intent per input (intent classification) and assign a slot label to each token in the input (slot filling).
Understanding the ontology helps you map these predictions to actionable output
Info |
---|
Stuff to Think About
|
Fitting Encoders
What Are Encoders?
Encoders translate text-based labels (like intents and slot types) into numerical values that the model can work with. This process standardizes the inputs and outputs, ensuring consistency across training, evaluation, and inference.
Intent Label Encoder:
Maps each intent from the ontology (e.g.,
recipeRequest
,greeting
) to a unique number.Used for intent classification.
Slot Label Encoder:
Converts slot types and their corresponding BIO-format tags (
B-slot
,I-slot
,O
) into numbers.Used for slot filling at the token level.
Steps in the Encoding Process
Take a close look at the fit_encoders
function in dataset.py
. It performs the following steps:
...
Load the Ontology:
The function reads the ontology file to extract the list of intents and slot types:
...
Fit the Intent Label Encoder:
The intent encoder assigns a unique numerical label to each intent in the ontology:
intent_label_encoder.fit(intents)
Key Insight: This step ensures that intent classification produces outputs in a consistent format.
Generate BIO Tags for Slots:
...
Slot tags are converted into BIO format:
B-{slot}
: Beginning of a slot entity.I-{slot}
: Inside a slot entity.O
: Outside of any slot entity.
All slot tags are compiled into a single list:
Code Block |
---|
all_slot_tags = ['O'] + [f'B-{slot}' for slot in slots.keys()]
+ [f'I-{slot}' for slot in slots.keys()] |
...
These tags are then fitted to the slot encoder:
...
Why BIO Format?: This labeling scheme helps identify the boundaries of multi-token slot entities.
Think about why this could be important in our context and what slots could specifically benefit.
Dataset
Preproccessing Distribution Dataset
Train
Evaluate
...
Natural Language Understanding (NLU) is a core component of conversational AI systems, enabling machines to interpret and act on user input in natural language. This Intent and Slot Classifier project is designed to help students understand the pipeline involved in building an NLU model that performs intent classification and slot filling. These tasks allow AI models to classify a user's goal (intent) and extract key information (slots) from their input.
For instance, given the input:
"Find me a Japanese recipe for lunch,"
the model would classify the intent as "find_recipe"
and extract slots like "cuisine: Japanese"
and "mealType: lunch"
.
This project uses BERT, a state-of-the-art transformer-based language model, to perform these tasks effectively. The system provides end-to-end functionality for training, evaluating, and running inference on the classifier.
...
Purpose of the Project
The primary goals of this project are:
To demonstrate the application of transformers for intent classification and slot filling.
To provide students with hands-on experience in creating and working with NLU pipelines.
To showcase best practices for preparing datasets, building models, and evaluating their performance.
To complete these goals you must go through all subpages in this section starting with Ontology.
...
Repository Overview
Note |
---|
Find the Intent and Slot Classifier files under / |
Code Block | ||
---|---|---|
| ||
The repository is structured as follows:
utils/
├── checkpoints/ # Directory for saving trained model checkpoints
├── data/ # Directory containing data files (ontology, train/test datasets)
│ ├── ontology.json # Ontology file containing intents, slots, and synonyms
│ ├── train.json # Training dataset
│ ├── test.json # Test dataset
│ └── synonyms.json # Synonyms for slot normalization
├── data_processing.py # Utilities for additional data preprocessing (if needed)
├── dataset.py # Dataset preparation and preprocessing module
├── evaluation.py # Model evaluation and metrics generation
├── run_train_test.py # Main script to run training, evaluation, and inference
├── model.py # Defines the BERT-based model architecture
├── predict.py # Inference module for predicting intents and slots
├── requirements.txt # Python dependencies for the project
├── train.py # Training module for the intent-slot classifier
└── utils.py # Helper functions for argument parsing, slot normalization, and synonym resolution
|
...
Explanation of Key Modules
run_train_test.py
This is the central script for orchestrating the intent and slot classifier independently. It integrates data preparation, training, evaluation, and inference, all controlled via command-line arguments.
dataset.py
This module handles data loading, preprocessing, and BIO tagging. It uses the NLURecipeDataset
class for creating PyTorch-compatible datasets.
model.py
Defines the BERTNLUModel
, a BERT-based architecture with separate heads for intent classification and slot filling.
train.py
Implements the training routine, including optimization and backpropagation.
evaluation.py
Provides functionality to evaluate the model’s performance, generating accuracy scores and classification reports.
predict.py
Handles inference by predicting intents and slot tags for new inputs. It includes functions for extracting and normalizing slots using the ontology.
utils.py
Contains helper functions for:
Parsing command-line arguments.
Loading and normalizing synonyms.
Extracting and formatting slot values from predictions.
...
Arguments
The utils.py
module defines the command-line arguments. Here’s a summary:
Argument | Type | Default | Description |
---|---|---|---|
|
|
| Path to the ontology JSON file. |
|
|
| Path to the training dataset. |
|
|
| Path to the test dataset. |
|
|
| Path to save/load the trained model weights. |
|
|
| Train the model when this flag is set. |
|
|
| Evaluate the model on the test dataset when this flag is set. |
|
|
| Number of epochs for training. |
|
|
| Batch size for training. |
|
|
| Learning rate for the optimizer. |
|
|
| Maximum sequence length for tokenization. |
|
|
| Random seed for reproducibility. |
|
|
| Text input for running inference. |
|
|
| Show the intent and slot distribution in the dataset. |
...
Use
Info |
---|
Due to how the imports are set up and because the intent and slot classifier is part of the social-interaction-cloud python package when you make changes you need to make sure to reinstall the social interaction cloud via |
1. Viewing Dataset Distribution
To analyze the distribution of intents and slots in the dataset:
Code Block |
---|
python run_train_test.py --show_dist |
2. Training the Model
To train the model using the training dataset:
Code Block |
---|
python run_train_test.py --train_model |
3. Evaluating the Model
To evaluate a pre-trained model on the test dataset:
Code Block |
---|
python run_train_test.py --evaluate |
4. Running Inference
To predict the intent and slots for a given input text:
Code Block |
---|
python run_train_test.py --inference_text "Find me a Japanese recipe for lunch." |
5. Run with ASR
When complete with this section read https://socialrobotics.atlassian.net/wiki/spaces/PCA2/pages/2709488567/Run+your+Conversational+Agent#Run-your-Intent-and-Slot-Classifier-with-WHISPER to connect your intent and slot classifier with WHISPER