Een volledig functionele Weather Chatbot maken – Een technische tutorial


129
129 points

Dit is een voorbeeld van hoe je een weerchatbot op Facebook-platform kunt bouwen met Ruby on Rails en Wit.ai

De gebruikte technologiestack is

  • Backend van de server: Ruby on Rails
  • Natuurlijke taalverwerking platfrom: Wit.ai
  • Implementatie op Facebook Messenger
  • Het Singapore National Environment Agency biedt een leuke API (gratis) die zowel het actuele weer als voorspellingen geeft

Voorbeeld functie:

(1) In staat om de “2 uur Nowcast” terug te geven wanneer de gebruiker om het huidige weer vraagt

Gebruiker: “Hoe is het weer in Changi?”

Bot: “Het weer in Changi is {weather}”

Gebruiker: “Hoe is het weer in Changi?”

Gebruiker: “Regent het in Changi?”

Bot: “Het weer in Changi is {weather}”

Je kunt de weersbot hier uitproberen : WBot By Robusttechhouse

Wit.AI instellen

Ga naar https://wit.ai/home en maak een wit-app voor jou. Lees https://wit.ai/docs/quickstart en volg de stappen daar. Ga vervolgens naar de instellingen in je witte app en ontvang de token-ID.

Integreer rails met Wit

We hebben maar twee, relatief eenvoudige modellen; Bericht en gesprek

In /app/models/message.rb

# Frozen_string_literal: true 
klasse Message 
  omvatten Mongoid :: Document 
  omvatten Mongoid :: Timestamps   veld: lichaam, type: String 
  veld: conversation_id, type: Integer 
  veld: soort, type: String   has_many: quick_replies 
  belongs_to: gesprek   validates_inclusion_of: kind, in:% w (uitgaande inkomende), allow_nil: false 
  valideert: gesprek, aanwezigheid: waar 
einde

In /app/models/conversation.rb

# frozen_string_literal: true 
class Conversatie 
  include Mongoid :: Document 
  include Mongoid :: Timestamps   field: uid, type: String 
  field: context, type: Hash   has_many: messages 
end

WitExtension Singleton

‘wit’ is een heel mooi juweeltje dat onze rails-app ondersteunt om te integreren met wit.ai

edelsteen 'wit'

Maak een nieuw wit_extension.rb-bestand in / extensions . Wat we nu moeten doen, is een WitExtension Singleton-klasse maken en in de initialisatie ervan stellen we een Wit-client in, het access_token en acties.

Dankzij de bovenstaande code kunnen we WitExtension.instance.client overal in onze Rails-toepassing aanroepen en zou hetzelfde exemplaar van WitExtension en dus hetzelfde Wit-clientobject worden geretourneerd.

Houd er rekening mee dat je je access_token of een ander token zoals het gewoon niet in code moet hebben liggen te wachten om in versiebeheer te plaatsen. U moet secrets.yml gebruiken voor ontwikkelings- en omgevingsvariabelen in productie.

Onze acties Hash krijgen het gesprek om de context op het juiste moment met de juiste toetsen bij te werken.

De code in de actie getForecast haalt de entiteiten uit de verzoekparameter van Wit en werkt de sleutels en waarden van context bij op basis van wat nodig is om te werken.

Het is uit de geretourneerde context Hash dat Wit besluit wat te doen op basis van de aanwezigheid en / of afwezigheid van een van de sleutels.

# frozen_string_literal: true 
vereist 'wit' 
vereist 'singleton' klasse WitExtension 
  omvatten Singleton   def initialiseren 
    access_token = ENV ['server_access_token'] 
    acties = { 
      stuur: lambda do | _request, response | 
        put ("[debuz] kreeg antwoord ... # {antwoord ['tekst']}")         message = Message.create (body: response ['text'], soort: 'uitgaand', gesprek: @conversation) 
        bericht. digest 
      einde,       getForecast: 
        lambda do | request | 
          context = verzoek ['context'] 
          entiteiten = verzoek ['entiteiten']           location = first_entity_value (entiteiten, 'locatie') || context [locatie]
          
          if location 
            forecast = search_forecast (locatie) 
            context ['forecast'] = voorspelling 
            new_context = {} 
          anders 
            new_context = context 
          end           @ conversation.update (context: new_context) 
          return context 
        end 
    }     @client = Wit.new (access_token: access_token, actions : acties) 
  einde   attr_reader: client   def set_conversation (conversatie) 
    @conversation = gesprek 
  einde   private   def first_entity_value (entiteiten, entiteit) 
    retourneren nul tenzij entiteiten.key? entiteit
    val = entiteiten [entiteit] [0] ['waarde'] 
    retourneer nul als val.nil? 
    val.is_a? (Hash)? val ['waarde']: val 
  end   def search_forecast (locatie) 
    zet "[debuz] Zoeken naar weer in # {locatie} ..." 
    WeatherExtension.search_forecast (locatie) 
  einde 
einde

Chat-extensie

Deze klasse fungeert als een controller tussen berichten van Facebook en het brein van onze Bot (Wit). Het heeft ook de verantwoordelijkheid om berichten en gesprekken te back-uppen.

# frozen_string_literal: echte 
klasse ChatExtension- 
  klasse << zelf 
    def antwoord (bericht, uid) 
      zet "[debuz] vraagt ​​WIT om ... # {bericht}" 
      find_or_initialize_conversation (uid) 
      create_incoming_message (bericht) 
      WitExtension.instance.client.run_actions (@ conversation.uid, message, @ conversation.context.to_h) 
    end     private     def find_or_initialize_conversation (uid) 
      @conversation = Conversation.find_or_create_by (uid: uid) 
      WitExtension.instance.set_conversation (@conversation) 
    end     def create_incoming_message (bericht) 
      create_message (inkomend) ', bericht) 
    einde    def create_message (kind, bericht) 
      @message = @ conversation.messages.create ( 
        body: bericht, 
        kind: kind 
      ) 
    end 
  end 
end

Integreer Rails-app met Facebook Messenger

Facebook-app instellen

Ga naar de ontwikkelaarsconsole en druk op “Een nieuwe app toevoegen”. Nadat u er een hebt gemaakt, kunt u de snelle start overslaan. Je komt hier terecht.

Vanaf hier wilt u op ‘+ Product toevoegen’ drukken en Messenger toevoegen. Nadat we een webhook hebben geconfigureerd, wil Facebook dat we de URL naar onze applicatie valideren.

App Rails instellen

We zullen het Facebook-messenger- juweel gebruiken. Het is misschien wel de beste Ruby-client voor Facebook Messenger.

Voeg initialisatiecode toe

# frozen_string_literal: true 
# config / initializers / facebook_messenger.rb tenzij Rails.env.production? 
  bot_files = Dir [Rails.root.join ('app', 'bot', '**', '* .rb')] 
  bots_reloader = ActiveSupport :: FileUpdateChecker.new (bot_files) doen 
    bot_files.each {| file | 
  vereist_afhankelijkheidsbestand 

}   einde ActionDispatch :: Callbacks.to_prepare doen     bots_reloader.execute_if_updated   einde   bot_files.each {| file | vereist_afhankelijkheidsbestand} 
einde

Voeg de eerste code toe voor onze bot

# frozen_string_literal: true 
# app / bot / listen.rb vereist 'facebook / messenger' inclusief Facebook :: Messenger Facebook :: Messenger :: Subscriptions.subscribe (access_token: ENV ['ACCESS_TOKEN']) Bot.on: message do | message | 
  # message.id # => 'mid.1457764197618: 41d102a3e1ae206a38' 
  # message.sender # => {'id' => '1008372609250235'} 
  # message.sent_at # => 2016-04-22 21:30:36 +0200 
  # message.text # => 'Hallo bot!'   begin 
    if message.text.nil? 
      message_text = KnownLocation.guess_known_location_by_coordinates (message.attachments.first ['payload'] ['coordinates'].


    zet "[debuz] kreeg van Facebook ... # {message.text}" 
    ChatExtension.response (message_text, message.sender ['id'])   rescue => e 
    zet '[debuz] kreeg een onhandelbaar bericht:' + e. message + ': @:' + message.to_json 
  end 
end

Voeg toe aan config / application.rb zodat rails onze botbestanden kent

# Auto-load / bot en zijn submappen config.paths.add File.join ("app", "bot"), glob: File.join ("**", "*. Rb") 
config.autoload_paths + = Dir [Rails.root.join ("app", "bot", "*")]

Update routes voor / bot

# config / routes.rb Rails.application.routes.draw 
  mount Facebook :: Messenger :: Server, op: "bot" 
einde

Stel de env- variabelen in voor het volgende

ACCESS_TOKEN = 
VERIFY_TOKEN = 
APP_SECRET =

Afronden

Nu we een functionele bot hebben, kunnen we spelen met de UI-elementen die Facebook biedt. Je kunt ze hier bekijken .

Ik hoop dat je met dit bericht een chat-bot voor jezelf kunt bouwen. Dit is een interessante ruimte omdat het vrij nieuw is, veel geluk!


What's Your Reaction?

hate hate
0
hate
confused confused
0
confused
fail fail
0
fail
fun fun
0
fun
geeky geeky
0
geeky
love love
0
love
lol lol
0
lol
omg omg
0
omg
win win
0
win

0 Comments

Your email address will not be published. Required fields are marked *

Choose A Format
Personality quiz
Series of questions that intends to reveal something about the personality
Trivia quiz
Series of questions with right and wrong answers that intends to check knowledge
Poll
Voting to make decisions or determine opinions
Story
Formatted Text with Embeds and Visuals
List
The Classic Internet Listicles
Countdown
The Classic Internet Countdowns
Open List
Submit your own item and vote up for the best submission
Ranked List
Upvote or downvote to decide the best list item
Meme
Upload your own images to make custom memes
Video
Youtube, Vimeo or Vine Embeds
Audio
Soundcloud or Mixcloud Embeds
Image
Photo or GIF
Gif
GIF format