Construção de Chatbots
Compreensão da Linguagem
Motores NLU Externos
o nlu nativo do botpress é executado no local e oferece suporte a um conjunto finito de idiomas se planeja desenvolver chatbots em idiomas que o botpress não suporta ou se deseja usar outra solução nlu, precisará configurar um conector nlu de terceiros para conseguir isso, usaremos o poder dos ganchos do botpress definir idiomas um caso de uso para um nlu de terceiros é oferecer suporte a mais idiomas além daqueles manipulados pelo botpress native nlu para que o botpress continue funcionando corretamente com um idioma adicional (definindo intenções e conteúdo), será necessário informar ao botpress os novos idiomas aos quais deseja oferecer suporte para fazer isso, abra o botpress config json e defina a propiedade de additionallanguages digamos que queremos dar suporte ao sueco e ao norueguês , a configuração ficaria assim { "additionallanguages" \[ { "code" "sv", "name" "swedish" }, { "code" "no", "name" "norwegian" } ] } agora que já terminou, acesse sua página de configuração do chatbot e escolha o(s) idioma(s) que deseja que seu chatbot suporte observe que multilíngue é um recurso de licença do botpress enterprise sincronize dados nlu esta função permite que você use a interface botpress nlu para definir suas intenções, entidades e slots as intenções e as entidades são armazenadas como json no bpfs (anteriormente fantasma) no sistema de arquivos local ou no banco de dados para sincronizar dados, precisamos ouvir todas as alterações de intents ou entidades e persistir os dados em nosso nlu de terceiros (consulte o tutorial de escuta de alterações de arquivos para obter mais informações) dessa forma, quando alguém edita intents ou entidades na interface do usuário nlu, somos notificados podemos fazer isso com um gancho botpress após a montagem do bot é possível utilizar o módulo do editor de código para criar ganchos facilmente veja como o código para o gancho filewatcher se parece async function sync(bp typeof sdk, botid string) { // create a bpfs (ghost) instance for our bot const ghost = bp ghost forbot(botid) // listen on file changes ghost onfilechanged(async file => { console log(file) }) } //those parameters are accessible in the current scope return sync(sdk, botid) onfilechanged é chamado com o nome do arquivo que contém as alterações quando um arquivo é criado, editado ou excluído o que queremos fazer agora é verificar se a alteração é relevante (por exemplo, alteração nas intenções ou entidades) e sincronizar os dados com seu nlu personalizado nosso gancho agora ficará assim const axios = require('axios') async function sync(bp typeof sdk, botid string) { const ghost = bp ghost forbot(botid) ghost onfilechanged(async f => { if (f includes('intents') || f includes('entities')) { // we get all intents const intentnames = await ghost directorylisting('intents', ' json') const intents = await promise all(intentnames map(name => ghost readfileasobject('intents', name))) // we get all entities const entnames = await ghost directorylisting('entities', ' json') const entities = await promise all(entnames map(name => ghost readfileasobject('entities', name))) // todo process intents and entities in the format required by your nlu / here, you would call your own nlu provider by http with processed data await axios post('http //nluprovider/train', {intents, entities}) / } }) aqui está agora ainda é possível usar a interface do usuário do botpress nlu para definir suas intenções e entidades, assim como enviar dados de treinamento para seu motor nlu use seu nlu de terceiros para classificação e extração usaremos uma estratégia semelhante durante o tempo de previsão o que queremos fazer é chamar nosso nlu de terceiros para cada mensagem de usuário recebida usaremos um gancho antes da entrada, executado quando o botpress receber uma mensagem do usuário o código não é complexo caso tenha em mente que o botpress trabalha com uma estrutura de dados precisa, então será necessário mapear os dados de resposta do seu provedor nlu para o formato de dados botpress nlu o gancho terá a seguinte aparência async function hook(bp typeof sdk, event sdk io incomingevent) { / your code starts below / const myhook = async (bp, event) => { const = require('lodash') / returns the detected language (e g 'en', 'fr', 'es', etc) given a string of text / const detectlanguage = async text => { // here, you can use your own service to detect the language given the user's text const response = await axios get('https //langdetect yourdomain com', { input text }) return response data lang } / given an input and its language, returns a nlu compatible object / const predict = async (lang, text) => { // important the result must have this structure in order // for botpress to process it correctly downstream const result = { entities \[], language lang, detectedlanguage lang, ambiguous false, slots {}, intent { name 'none', confidence 1, context 'global' }, intents \[], errored false, includedcontexts \['global'], ms 0 } let response switch (lang) { case 'en' // you response = await axios get('https //en server yourdomain com', { input text }) // you are responsible for mapping the response's data // to the result object, so it conforms with botpress's expected format result intent = response data intent break case 'fr' // we only use intents from this service response = await axios get('https //detect nlpfrancais fr', { input text }) result intents = response data result intentions break case 'es' // this service returns more relevant information we reuse // slots, intents and intent from the service's response response = await axios get('https //nlufrancais anothercompany com', { input text }) result slots = response data slots result intents = response data intents result intent = response data intent break default break } return result } // filter out unwanted events if (event type === 'session reset' || event type === 'visit' || event type === 'bp dialog timeout') { return } // we must disable the native nlu for this even, event setflag(bp io wellknownflags skip native nlu, true) // now, we detect the language from the user's input const detectedlanguage = await detectlanguage(event payload text) // then we process the user's input, knowing the user's language const result = await predict(detectedlanguage, event payload text) // finally, we overwrite the nlu property of the event with our results assign(event, { nlu result }) } return myhook(bp, event) / your code ends here / } agora, o botpress está integrado ao seu nlu de terceiros