100 LoC 미만의 모든 도시에 대한 일기 예보를 알려주는 챗봇 만들기

챗봇 플랫폼을 개방형 데이터 소스와 결합하는 것은 사용자에게 유용한 정보를 제공하는 채팅 인터페이스를 쉽게 만드는 가장 강력한 방법 중 하나입니다. 이것이 우리가 부르는 것입니다Open Data chatbots..

특히 오늘은 Xatkit을 쿼리하는 OpenWeather 챗봇을 생성하여 세계 어느 도시의 일기 예보를 제공하는지 보여줍니다. 이 모든 것이 100줄 미만의 코드로 이루어집니다. examples repository에 봇의 전체 코드가 있지만 이 게시물에서 모든 주요 구성 요소를 볼 수 있습니다.

일기예보 의도 선언



첫 번째 단계는 일기 예보 의도에 대한 요청을 정의하는 것입니다. 이것이 Xatkit에서 수행하는 방법입니다.

        val howIsTheWeather = intent("HowIsTheWeather")
                .trainingSentence("How is the weather today in CITY?")
                .trainingSentence("What is the forecast for today in CITY?")
                .parameter("cityName").fromFragment("CITY").entity(city());


의도의 일부로 원하는 도시의 이름을 수집하는 방법에 유의하십시오. 또한 NLP 엔진을 돕기 위해 우리는 도시 이름이 세계의 모든 (주요) 도시 목록을 구성하는 미리 정의된 도시 엔터티의 일부여야 함을 선언합니다. Xatkit은 이를 인기 있는 모든 의도 인식 공급자에서 사용할 수 있는 해당 도시 엔터티에 매핑합니다. 따라서 DialogFlow 또는 Nlp.js 과 함께 사용할 봇을 구성해야 합니다(선택한 NLP 엔진은 봇 코드에만 영향을 미치는 것이 아니라 property file ).

일기예보 요청에 대한 반응



의도가 일치하면 봇은 요청된 도시를 매개변수로 전달하여 OpenWeather의 REST API를 호출해야 합니다.

먼저 봇의 초기 상태에서 인텐트가 일치할 때까지 기다립니다.

      awaitingInput
                .next()
                .when(intentIs(howIsTheWeather)).moveTo(printWeather);


일치가 발생하면 printWeather 상태로 전환되어 실제로 요청을 처리합니다. 아래에서 이 상태의 전체 코드를 참조하십시오.

Xatkit에는 외부 REST API의 쿼리 및 응답 처리를 단순화하는 데 사용할 수 있는 REST platform abstraction이 함께 제공됩니다. 따라서 getJsonRequest는 API로 보낼 정확한 URL 요청을 작성하고 쿼리의 성공 상태를 확인하고 반환된 정보에 쉽게 액세스하는 데 사용할 수 있는 response 개체에서 응답을 수집하는 데 도움이 됩니다.

성공하면 이 응답 개체에서 응답을 작성하여 사용자에게 다시 인쇄합니다. 그리고 사용자가 다른 도시를 요청하려는 경우 초기 상태로 돌아갑니다.

     printWeather
                .body(context -> {
                    String cityName = (String) context.getIntent().getValue("cityName");
                    Map<String, Object> queryParameters = new HashMap<>();
                    queryParameters.put("q", cityName);
                    ApiResponse<JsonElement> response = restPlatform.getJsonRequest(context, "http://api" +
                                    ".openweathermap.org/data/2.5/weather", queryParameters, Collections.emptyMap(),
                            Collections.emptyMap());
                    if (response.getStatus() == 200) {
                        long temp = Math.round(response.getBody().getAsJsonObject().get("main").getAsJsonObject().get(
                                "temp").getAsDouble());
                        long tempMin =
                                Math.round(response.getBody().getAsJsonObject().get("main").getAsJsonObject().get(
                                        "temp_min").getAsDouble());
                        long tempMax =
                                Math.round(response.getBody().getAsJsonObject().get("main").getAsJsonObject().get(
                                        "temp_max").getAsDouble());
                        String weather =
                                response.getBody().getAsJsonObject().get("weather").getAsJsonArray().get(0).getAsJsonObject().get("description").getAsString();
                        String weatherIcon =
                                "http://openweathermap.org/img/wn/" + response.getBody().getAsJsonObject().get(
                                        "weather").getAsJsonArray().get(0).getAsJsonObject().get("icon").getAsString() + ".png";
                        reactPlatform.reply(context, MessageFormat.format("The current weather is {0} &deg;C with " +
                                        "{1} ![{1}]({2}) with a high of {3} &deg;C and a low of {4} &deg;C", temp,
                                weather,
                                weatherIcon, tempMax, tempMin));
                    } else if (response.getStatus() == 400) {
                        reactPlatform.reply(context, "Oops, I couldn't find this city");
                    } else {
                        reactPlatform.reply(context, "Sorry, an error " +  response.getStatus() + " " + response.getStatusText() + " occurred when accessing the openweathermap service");
                    }

                })
                .next()
                .moveTo(awaitingInput);



일기예보 챗봇



여기에서 결과 봇이 작동하는 것을 볼 수 있습니다.



이 경우 DialogFlow 커넥터를 NLP 공급자로 사용하므로 봇은 훈련 문장과 정확히 일치하지 않더라도 사용자 질문을 이해할 수 있습니다. 봇은 또한 바르셀로나에 라이브로 와야 할 좋은 이유를 제공합니다 :-).

분명히 이것은 대화를 확장하거나 추가 정보를 제공하기 위해 구축할 수 있는 최소한의 예입니다. 당신은 our Fluent API and state machine semantics 당신을 백업할 수 있는 모든 힘을 가지고 있습니다!.

사진 제공: Wim van 't Einde on Unsplash

좋은 웹페이지 즐겨찾기