Skip to content

Commit d19874a

Browse files
author
MohamedAliBouhaouala
committed
feat: make nlu penalty factor setting configurable in UI
1 parent e2c14ab commit d19874a

File tree

5 files changed

+85
-9
lines changed

5 files changed

+85
-9
lines changed

api/src/chat/services/block.service.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,13 +210,14 @@ export class BlockService extends BaseService<
210210
return acc;
211211
}, []);
212212

213-
// @TODO Make nluPenaltyFactor configurable in UI settings
214-
const nluPenaltyFactor = 0.95;
215213
// Log the matched patterns
216214
this.logger.debug(
217215
`Matched patterns: ${JSON.stringify(matchesWithPatterns.map((p) => p.matchedPattern))}`,
218216
);
219217

218+
// Retrieve Nlu Penalty Factor from global settings
219+
const nluPenaltyFactor = await this.getDefaultNluPenaltyFactor();
220+
220221
// Proceed with matching the best NLP block
221222
if (matchesWithPatterns.length > 0) {
222223
block = (await this.matchBestNLP(
@@ -474,6 +475,20 @@ export class BlockService extends BaseService<
474475
return patternScores.reduce((sum, score) => sum + score, 0);
475476
}
476477

478+
/**
479+
* Retrieves the default NLU penalty factor from chatbot settings.
480+
*
481+
* This factor is used in NLU-based block scoring to reduce the influence
482+
* of generic or broad entity matches (e.g. patterns using "Any").
483+
* It helps prioritize blocks with more specific and confident entity matches.
484+
*
485+
* @returns {Promise<number>} The configured default NLU penalty factor.
486+
*/
487+
async getDefaultNluPenaltyFactor(): Promise<number> {
488+
const settings: Settings = await this.settingService.getSettings();
489+
return settings.chatbot_settings.default_nlu_penalty_factor;
490+
}
491+
477492
/**
478493
* Matches an outcome-based block from a list of available blocks
479494
* based on the outcome of a system message.

api/src/migration/migrations/1735836154221-v-2-2-0.migration.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,49 @@ const removeDefaultStorageHelper = async ({ logger }: MigrationServices) => {
817817
}
818818
};
819819

820+
const addDefaultNluPenaltyFactor = async ({ logger }: MigrationServices) => {
821+
const SettingModel = mongoose.model<Setting>(Setting.name, settingSchema);
822+
try {
823+
await SettingModel.updateOne(
824+
{
825+
group: 'chatbot_settings',
826+
label: 'default_nlu_penalty_factor',
827+
},
828+
{
829+
group: 'chatbot_settings',
830+
label: 'default_nlu_penalty_factor',
831+
value: 0.95,
832+
type: SettingType.number,
833+
config: {
834+
min: 0,
835+
max: 1,
836+
step: 0.01,
837+
},
838+
weight: 2,
839+
},
840+
{
841+
upsert: true,
842+
},
843+
);
844+
logger.log('Successfuly added the default NLU penalty factor setting');
845+
} catch (err) {
846+
logger.error('Unable to add the default NLU penalty factor setting');
847+
}
848+
};
849+
850+
const removeDefaultNluPenaltyFactor = async ({ logger }: MigrationServices) => {
851+
const SettingModel = mongoose.model<Setting>(Setting.name, settingSchema);
852+
try {
853+
await SettingModel.deleteOne({
854+
group: 'chatbot_settings',
855+
label: 'default_nlu_penalty_factor',
856+
});
857+
logger.log('Successfuly removed the default NLU penalty factor setting');
858+
} catch (err) {
859+
logger.error('Unable to remove the default local storage helper setting');
860+
}
861+
};
862+
820863
module.exports = {
821864
async up(services: MigrationServices) {
822865
await updateOldAvatarsPath(services);
@@ -830,6 +873,7 @@ module.exports = {
830873
await populateUserAvatars(services);
831874
await populateSubscriberAvatars(services);
832875
await addDefaultStorageHelper(services);
876+
await addDefaultNluPenaltyFactor(services);
833877
return true;
834878
},
835879
async down(services: MigrationServices) {
@@ -839,6 +883,7 @@ module.exports = {
839883
await migrateAttachmentBlocks(MigrationAction.DOWN, services);
840884
await migrateAttachmentContents(MigrationAction.DOWN, services);
841885
await removeDefaultStorageHelper(services);
886+
await removeDefaultNluPenaltyFactor(services);
842887
return true;
843888
},
844889
};

api/src/setting/seeds/setting.seed-model.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,24 @@ export const DEFAULT_SETTINGS = [
5252
},
5353
weight: 3,
5454
},
55+
{
56+
group: 'chatbot_settings',
57+
label: 'default_nlu_penalty_factor',
58+
value: 0.95,
59+
type: SettingType.number,
60+
config: {
61+
min: 0,
62+
max: 1,
63+
step: 0.01,
64+
},
65+
weight: 4,
66+
},
5567
{
5668
group: 'chatbot_settings',
5769
label: 'global_fallback',
5870
value: true,
5971
type: SettingType.checkbox,
60-
weight: 4,
72+
weight: 5,
6173
},
6274
{
6375
group: 'chatbot_settings',
@@ -72,7 +84,7 @@ export const DEFAULT_SETTINGS = [
7284
idKey: 'id',
7385
labelKey: 'name',
7486
},
75-
weight: 5,
87+
weight: 6,
7688
},
7789
{
7890
group: 'chatbot_settings',
@@ -82,7 +94,7 @@ export const DEFAULT_SETTINGS = [
8294
"I'm really sorry but i don't quite understand what you are saying :(",
8395
] as string[],
8496
type: SettingType.multiple_text,
85-
weight: 6,
97+
weight: 7,
8698
translatable: true,
8799
},
88100
{

frontend/public/locales/en/chatbot_settings.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88
"fallback_block": "Fallback Block",
99
"default_nlu_helper": "Default NLU Helper",
1010
"default_llm_helper": "Default LLM Helper",
11-
"default_storage_helper": "Default Storage Helper"
11+
"default_storage_helper": "Default Storage Helper",
12+
"default_nlu_penalty_factor": "Default NLU Penalty Factor"
1213
},
1314
"help": {
1415
"global_fallback": "Global fallback allows you to send custom messages when user entry does not match any of the block messages.",
1516
"fallback_message": "If no fallback block is selected, then one of these messages will be sent.",
1617
"default_nlu_helper": "The NLU helper is responsible for processing and understanding user inputs, including tasks like intent prediction, language detection, and entity recognition.",
1718
"default_llm_helper": "The LLM helper leverages advanced generative AI to perform tasks such as text generation, chat completion, and complex query responses.",
18-
"default_storage_helper": "The storage helper defines where to store attachment files. By default, the default local storage helper stores them locally, but you can choose to use Minio or any other storage solution."
19+
"default_storage_helper": "The storage helper defines where to store attachment files. By default, the default local storage helper stores them locally, but you can choose to use Minio or any other storage solution.",
20+
"default_nlu_penalty_factor": "The NLU penalty factor is a coefficient (between 0 and 1) applied exclusively to NLU-based entity matching. It reduces the score contribution of patterns that match broadly (e.g. using wildcard values like Any) rather than specific entity values. This helps the engine prioritize blocks triggered by more precise NLU matches, without affecting other matching strategies such as text, regex, or interaction triggers."
1921
}
2022
}

frontend/public/locales/fr/chatbot_settings.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88
"fallback_block": "Bloc de secours",
99
"default_nlu_helper": "Utilitaire NLU par défaut",
1010
"default_llm_helper": "Utilitaire LLM par défaut",
11-
"default_storage_helper": "Utilitaire de stockage par défaut"
11+
"default_storage_helper": "Utilitaire de stockage par défaut",
12+
"default_nlu_penalty_factor": "Facteur de pénalité NLU par défaut"
1213
},
1314
"help": {
1415
"global_fallback": "La réponse de secours globale vous permet d'envoyer des messages personnalisés lorsque l'entrée de l'utilisateur ne correspond à aucun des messages des blocs.",
1516
"fallback_message": "Si aucun bloc de secours n'est sélectionné, l'un de ces messages sera envoyé.",
1617
"default_nlu_helper": "Utilitaire du traitement et de la compréhension des entrées des utilisateurs, incluant des tâches telles que la prédiction d'intention, la détection de langue et la reconnaissance d'entités.",
1718
"default_llm_helper": "Utilitaire responsable de l'intelligence artificielle générative avancée pour effectuer des tâches telles que la génération de texte, la complétion de chat et les réponses à des requêtes complexes.",
18-
"default_storage_helper": "Utilitaire de stockage définit l'emplacement où stocker les fichiers joints. Par défaut, le stockage local les conserve localement, mais vous pouvez choisir d'utiliser Minio ou toute autre solution de stockage."
19+
"default_storage_helper": "Utilitaire de stockage définit l'emplacement où stocker les fichiers joints. Par défaut, le stockage local les conserve localement, mais vous pouvez choisir d'utiliser Minio ou toute autre solution de stockage.",
20+
"default_nlu_penalty_factor": "Le facteur de pénalité NLU est un coefficient (entre 0 et 1) appliqué exclusivement aux correspondances d'entités basées sur NLU. Il réduit la contribution au score des motifs qui correspondent de manière générale (par exemple, en utilisant des valeurs génériques comme Any) plutôt que des valeurs d'entité spécifiques. Cela permet au chatbot de donner la priorité aux blocs déclenchés par des correspondances NLU plus précises, sans affecter d'autres stratégies de correspondance telles que le texte, les expressions regex ou les déclencheurs d'interaction."
1921
}
2022
}

0 commit comments

Comments
 (0)