Gladys Assistant
Pierre-Gilles Leymarie
17 Septembre 2019
Orléans Tech
Un assistant intelligent open-source pour la maison connectée
Gladys Assistant, c'est quoi ?
2013 : Genèse du projet
2013 : Genèse du projet
2014 : 1ère version open-source
- Serveur PHP
- Scripts Python
- Bootstrap 2.0
2015 : Gladys 2.0, re-écrit en Node.js
2016 : Gladys 3.0, axée sur la communauté
2017 : Monétisation du projet
2017 : Monétisation du projet
2018 : Gladys comme activité principale
Fin 2018 : Lancement du Gladys Gateway
🌐 Contrôle à distance
🔐 Chiffré de bout en bout
💳 9.99€/mois pour toute la famille
2019 : Gladys 4, le futur du projet
2019 : Gladys 4 stack
1. Le NLP dans Gladys 4
2. E2E Encrypted Gladys Gateway
Le NLP dans Gladys 4
De la classification avec NLP.js
NLP.js, un librairie puissante
const { NlpManager } = require('node-nlp');
const manager = new NlpManager({ languages: ['fr'] });
// turn on
manager.addDocument('fr', 'Allume la lumière', 'light.turnon');
manager.addDocument('fr', 'Je veux plus de lumière', 'light.turnon');
manager.addDocument('fr', 'Il fait sombre', 'light.turnon');
// turn off
manager.addDocument('fr', 'Eteins la lumière', 'light.turnoff');
// Train also the NLG
manager.addAnswer('fr', 'light.turnon', 'Lumière allumée !');
manager.addAnswer('fr', 'light.turnoff', 'Lumière éteinte !');
// Train and save the model.
(async() => {
await manager.train();
manager.save();
const response = await manager.process('fr', 'Allume lumière');
console.log(response); // light.turnon
})();
Résultat :
{ utterance: 'Allume lumière',
locale: 'fr',
languageGuessed: false,
localeIso2: 'fr',
language: 'French',
domain: 'default',
classifications:
[ { label: 'light.turnon', value: 1 },
{ label: 'light.turnoff', value: 0 } ],
intent: 'light.turnon',
score: 1,
entities: [],
sentiment:
{ score: 0,
comparative: 0,
vote: 'neutral',
numWords: 2,
numHits: 0,
type: 'pattern',
language: 'fr' },
srcAnswer: 'Lumière allumée !',
answer: 'Lumière allumée !' }
Des cas plus complexe: Slot filling
" Allume la lumière du %ROOM% "
Slot Filling: Exemple
const manager = new NlpManager({ languages: ['fr'] });
const fromEntity = manager.addTrimEntity('room');
fromEntity.addAfterLastCondition('fr', 'du');
manager.slotManager.addSlot('light.turnon', 'room', true, {
fr: 'Quelle pièce dois-je allumer ?'
});
manager.addDocument(
'fr',
'Allume la lumière du %room%',
'light.turnon'
);
await manager.train();
const result = await manager.process('fr', 'Allume la lumière', {});
console.log(result);
{
"utterance": "Allume la lumière",
"locale": "fr",
"languageGuessed": false,
"localeIso2": "fr",
"language": "French",
"domain": "default",
"classifications": [
{
"label": "light.turnon",
"value": 1
}
],
"intent": "light.turnon",
"score": 1,
"entities": [],
"sentiment": {
"score": 0,
"comparative": 0,
"vote": "neutral",
"numWords": 3,
"numHits": 0,
"type": "pattern",
"language": "fr"
},
"slotFill": {
"localeIso2": "fr",
"intent": "light.turnon",
"entities": [],
"currentSlot": "room"
},
"srcAnswer": "Quelle pièce dois-je allumer ?",
"answer": "Quelle pièce dois-je allumer ?"
}
Feature Extraction
Feature Extraction : Exemple
" Réveille moi demain à 8h "
{
"start": 13,
"end": 18,
"len": 6,
"accuracy": 0.95,
"sourceText": "demain",
"utteranceText": "demain",
"entity": "date",
"resolution": {
"type": "date",
"timex": "2019-09-17",
"strValue": "2019-09-17",
"date": "2019-09-17T00:00:00.000Z"
}
},
{
"start": 22,
"end": 23,
"len": 2,
"accuracy": 0.95,
"sourceText": "8h",
"utteranceText": "8h",
"entity": "time",
"resolution": {
"values": [
{
"timex": "T08",
"type": "time",
"value": "08:00:00"
},
{
"timex": "T20",
"type": "time",
"value": "20:00:00"
}
]
}
}
"Demain"
"8h"
Sentiment Analysis
{
"score": -0.45,
"comparative": -0.1125,
"vote": "negative",
"numWords": 4,
"numHits": 2,
"type": "pattern",
"language": "fr"
}
" Mon voisin est stupide "
Le NLP dans Gladys 4
Le NLP dans Gladys 4
Le NLP dans Gladys 4
Le NLP dans Gladys 4
Le Gladys Gateway
Accès à distance, chiffré de bout en bout
Le problème
Le problème
Le problème
Le problème
Le problème
La solution: Le Gladys Gateway
MAIS ?? ET LA VIE PRIVEE ??
Le Gladys Gateway, chiffré de bout en bout
Le protocole
- Génération d'une clé AES-GCM
- Chiffrement du message avec AES-GCM (symétrique)
- Chiffrement de la clé AES avec RSA-OAEP (asymétrique)
- Envoi de la clé chiffrée + du message chiffré
- Déchiffrement de la clé avec RSA-OAEP
- Déchiffrement du message avec AES-GCM
Les WebCrypto API à la rescousse: generateKey
const key = await window.crypto.subtle.generateKey({
name: 'RSA-OAEP',
modulusLength: 2048, // can be 1024, 2048, or 4096
publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
hash: {name: 'SHA-256'},
},
false, // key is extractable?
['encrypt', 'decrypt']
);
// returns a keypair object
console.log(key);
console.log(key.publicKey);
console.log(key.privateKey);
Les WebCrypto API à la rescousse: encrypt
const data = 'Je suis Iron Man';
const encrypted = await window.crypto.subtle.encrypt({
name: 'RSA-OAEP',
},
publicKey, // public key of the recipient
str2ab(data) //ArrayBuffer of data you want to encrypt
);
console.log(encrypted);
Les WebCrypto API à la rescousse : decrypt
const decrypted = await window.crypto.subtle.decrypt({
name: 'RSA-OAEP',
},
privateKey, //Private key of the recipient
encrypted // ArrayBuffer of the data
);
// Affiche "Je suis Iron Man"
console.log(ab2str(decrypted));
Et en Node.js ?
const WebCrypto = require('node-webcrypto-ossl');
Il y a un Polyfill !
Autre avantages du Gateway
Merci !
Des questions ?
gladysassistant.com
Twitter: @pierregillesl, @gladysassistant
Gladys Assistant Talk @ Orléans Tech 2019
By Pierre-Gilles Leymarie
Gladys Assistant Talk @ Orléans Tech 2019
- 270