【Linebot】권총과 자연스러운 대화를 할 수 있는 bot를 만든 이야기 【초보자용】

16660 단어 경 6linebotNode.js

개요



조금 전에 매일 일기 예보를 통보하거나 결혼 기념일 등 특정 날짜에 메시지를 보내는 bot를 만들었습니다.
이번은 이 bot을 개량해, 자연스러운 대화를 할 수 있도록 해 보았습니다.
(참고)
htps : // 코 m / 코 _ 세이 / / ms / 66cb d520 0530 cdf

대화의 로직 자체는 자작이 아니라 A3RT의 Small Talk API라는 리크루트가 개발하고 있는 API 서비스를 활용합니다.
이용에 돈은 들지 않고, API 키의 발행만으로 좋기 때문에 매우 간편합니다. 데모 환경도 있으므로 흥미있는 분은 시험해라.
(참고)
htps : // 아 3rt. Rec 루이 t - ch. 이. jp/p 로즈 ct/타오피/

Heroku 환경 구축 및 Line 계정 준비에 대해



이후 상기 날을 통지해 주는 bot를 만들었을 때를 이하의 기사에 정리하고 있습니다.
여기를 참조하십시오.
htps : // 코 m / 코 _ 세이 / / ms / 66cb d520 0530 cdf

회신할 부분의 논리에 대해



webhook을 통해 회신하는 부분을 Index.js
smallTalk API를 사용하는 부분을 smalltalk.js
로 파일을 분리한다.

각 소스는 다음과 같습니다.

이하의 사이트를 참고로 했습니다.
(참고)
htps : // 이 m / 한 ly / ms / 350d6631495 에 f8 어 652

index.js

// -----------------------------------------------------------------------------
// モジュールのインポート
const server = require("express")();
const line = require("@line/bot-sdk"); // Messaging APIのSDKをインポート
var request = require('request');
const smallTalk = require('./smalltalk'); // smallTalk.js 後述

// -----------------------------------------------------------------------------
// パラメータ設定
const line_config = {
    channelAccessToken: process.env.LINE_ACCESS_TOKEN, // 環境変数からアクセストークンをセットしています
    channelSecret: process.env.LINE_CHANNEL_SECRET // 環境変数からChannel Secretをセットしています
};
const actoken = process.env.LINE_ACCESS_TOKEN;

// -----------------------------------------------------------------------------
// Webサーバー設定
server.listen(process.env.PORT || 3000);
// -----------------------------------------------------------------------------

// APIコールのためのクライアントインスタンスを作成
const bot = new line.Client(line_config);

// ルーター設定
server.post('/bot/webhook', line.middleware(line_config), (req, res, next) => {
    // 先行してLINE側にステータスコード200でレスポンスする。
    res.sendStatus(200);

    Promise
      .all(req.body.events.map(handleEvent))
      .then((result) => res.json(result));
});

//イベント処理関数
function handleEvent(event){
  if (event.type !== 'message' || event.message.type !== 'text') {
    return bot.replyMessage(event.replyToken, {
        type: "text",
        text: "ちょっと何をいっているかわからないです"
    });

  }else if (event.type == "message" && event.message.type == "text") {
    console.log(event.message.text);

    //返信処理
    const userText = event.message.text; // ユーザーの送ってくれたテキスト
    smallTalk(userText) //ユーザが送ったテキストを引数にいれてsmallTalkを呼ぶ
      .then((smallTalkRes) => {
        return bot.replyMessage(event.replyToken, {
            type: "text",
            text: smallTalkRes
        });
      })
      .catch((err) => {
        return bot.replyMessage(event.replyToken, {
            type: "text",
            text: 'err'
        });
      })
  }else{
    return bot.replyMessage(event.replyToken, {
        type: "text",
        text: "ちょっと何をいっているかわからないです"
    });
  }
}


index.js
// パッケージのインポート
const request = require('request');


// Talk APIを利用するためにPOSTするURLとAPI Key
const smallTalkApiKey     = '******';
const smallTalkRequestUrl = 'https://api.a3rt.recruit-tech.co.jp/talk/v1/smalltalk';


// 以下のfunctionをモジュール化
// 引数はユーザーからのテキスト
module.exports = function(userText){

  // Talk APIが受け付けるリクエスト情報
  const smallTalkRequestOption = {
    url: smallTalkRequestUrl,
    form: {
      apikey: smallTalkApiKey,
      query: userText
    }
  };

  // Promiseを返す
  return new Promise((resolve, reject) => {
    // POST リクエストを送信する
    request.post(smallTalkRequestOption, function(err, res, body){
      if(err){
        reject(err);
      }

      // Talk APIから受け取ったstring型のレスポンスをJavaScript Objectにする
      const bodyObj = JSON.parse(body);

      // .results[0].replyはTalk APIからの返信
      if(bodyObj.results[0].reply){
        resolve(bodyObj.results[0].reply);          // 返信がある場合はそれをresolve
      } else {
        reject('Invalid response from smallTalk');  // ない場合はreject
      }
    });
  });
}


이것뿐입니다. 초절 간단하네요.

완성된 것



Line의 아이콘은 개인적으로 좋아하는 조조 5부보다 권총을 채용.



조금 후반의 대화는 이상한 공기가 되어 버렸습니다만, 아무튼 자연스러운 대화가 되어 있는 것 같네요.
권총이 상당히 예의 바른 아이가 되어 버린 것은 위화감 있습니다만, 거기는 애교라고 하는 것으로. . .

요약



자연언어 처리를 활용한 bot라고 만들기 전에는 굉장히 어려운 것 같은 이미지를 가지고 있었습니다만, 막상 해 보면 매우 간단했습니다.
회화를 실시하는 기계 학습의 부분을 자작하면 좀 더 힘들겠지만, 어느 정도의 레벨이면 적절하게 외부 서비스를 이용하는 편이 코스파가 좋네요.
덧붙여서 API의 처리상 어쩔 수 없습니다만, 화상이나 스탬프등에서는 반응할 수 없고, 영어에서도 대화라고 하는 대화는 할 수 없습니다.
그중 멀티 언어 대응한 모델도 널리 보급되는 것일까.

좋은 웹페이지 즐겨찾기