챗봇은 사용자와 소통하는 새로운 방법이 될 수 있습니다. 챗봇의 기본 사항을 소개하는 게시물을 작성한 후 서버리스를 작성하고 글쓰기에 대한 게시물도 작성합니다. Azure 기능저는 "안녕하세요, 세상"보다 조금 더 실용적인 것을 만들어보기로 결심했습니다.
챗봇에 서버리스 아키텍처를 사용하는 것이 합리적입니다. 챗봇 사용은 산발적일 수 있습니다. 하루 중 다양한 시간대에 사용량이 정점을 찍었다가 떨어질 수 있습니다. 서버리스를 사용하면 필요한 리소스와 시간만큼만 비용을 지불하면 됩니다.
이 블로그 게시물의 모든 소스 코드는 다음과 같습니다. 깃허브에서 사용 가능.
Viber 챗봇
챗봇을 만들 수 있는 다양한 플랫폼을 선택할 수 있었습니다: 페이스북 메신저, 스카이프, 왓츠앱 등 다양한 플랫폼을 선택할 수 있었습니다. 하지만 저는 Viber.
미국에서는 Viber의 사용자 수가 많지 않은 것 같지만 저는 많이 사용하고 있습니다. 아내와 채팅하고, 사진, 재미있는 GIF 등을 보낼 때 매우 편리한 수단입니다. 특히 사진 전송에 있어서는 SMS보다 더 안정적이고 빠르다는 것을 알게 되었습니다. 가족 모두가 사용하고 있으면 좋겠어요! 또한 Viber는 카우치베이스의 고객입니다.. 증가하는 데이터 요구 사항을 지원하기 위해 MongoDb에서 전환했습니다.
또한, Viber의 REST API 은 간단하고 잘 문서화되어 있습니다. 서버리스 아키텍처와 Viber의 API를 사용하면서 0에서 챗봇으로 전환하는 속도가 얼마나 빨랐는지 믿을 수 없었습니다.
설정
먼저 다음과 같이 시작해야 합니다. Viber에서 봇 만들기 (언젠가는 Viber 계정이 필요합니다). Viber는 다음과 같은 API 키를 제공합니다. 30a6470a1c67d66f-4207550bd0f024fa-c4cacb89afc04094. HTTP 헤더에서 이를 사용하여 Viber API에 인증하게 됩니다.
저는 C#를 사용하여 Azure 함수를 작성하기로 결정했습니다. 안타깝게도 (제가 아는 한) Viber용 .NET SDK는 없으므로 REST API를 직접 사용해야 합니다. 큰 문제는 아닙니다. RestSharp. 하지만 원하는 경우 NodeJS 또는 PythonViber는 해당 언어에 대한 SDK를 제공합니다.
코딩을 시작하기 전에 먼저 웹훅. 이것은 단순히 수신 메시지를 보낼 위치를 Viber에 알려주는 방법입니다. 이 작업은 처음에만 수행하면 됩니다. 저는 먼저 200을 반환하는 베어본 Azure 함수를 배포하여 이 작업을 수행했습니다. 초기 웹훅을 설정하기 위해 Postman을 사용했습니다.

마지막으로 Azure에 Couchbase 클러스터를 설정했습니다. 쉽고 무료로 CouchBase 및 Azure 시작하기. ('테스트 드라이브' 버튼을 사용하여 Azure 크레딧을 사용하지 않고도 3시간의 Couchbase Server를 사용할 수 있습니다). "viberchatbot"이라는 단일 사용자를 만들고, "ViberChatBot"이라는 버킷을 만들고, "travel-sample" 버킷을 로드했습니다.
Azure 기능
이 애플리케이션에서는 "안녕하세요, 세상"보다 조금 더 실질적인 챗봇을 만들고 싶었고, 약간의 재미도 주고 싶었습니다. 챗봇이 이해했으면 하는 명령은 다음과 같습니다:
-
"안녕"(또는 안녕하세요 등)이라고 말하면 "안녕!"이라고 응답합니다.
-
'메트릭'을 요청하면 지금까지 처리한 메시지 수를 알려줍니다.
-
'트위터'를 언급하면 팔로우할 사람을 추천해 줍니다.
-
CMH에서 ATL(또는 다른 공항)로 가는 항공편을 요청하면 현재 몇 개의 항공편이 있는지 알려줍니다( 여행용 샘플 버킷 를 입력하세요.)
-
"도와줘"라고 말하면 위의 명령어 목록이 표시됩니다.
챗봇 코드
먼저 Viber가 서버리스 엔드포인트로 전송할 데이터의 구조를 표현하기 위해 몇 가지 C# 클래스를 만들었습니다.
Viber 클래스
이것은 Viber의 기능을 모두 보여주는 것은 아니지만 기본적인 문자 메시지 수신을 시작하기에 충분합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class ViberIncoming { public string Event { get; set; } public long Timestamp { get; set; } public ViberSender Sender { get; set; } public ViberMessage Message { get; set; } } public class ViberSender { public string Id { get; set; } public string Name { get; set; } } public class ViberMessage { public string Text { get; set; } public string Type { get; set; } } |
다음으로, Azure 함수는 원시 HTTP 요청을 ViberIncoming 객체입니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[FunctionName("Chatbot")] public static async Task<HttpResponseMessage> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log) { var incoming = req.Content.ReadAsAsync<ViberIncoming>().Result; var viber = new ViberProcessor(Bucket.Value); viber.Process(incoming); // return "OK" each time // this is most important for the initial Viber webhook setup return req.CreateResponse(HttpStatusCode.OK); } |
그 후, 저는 ViberProcessor 클래스가 있는 프로세스 메서드에서 이 객체를 수신합니다.
|
1 2 3 4 5 6 7 8 |
public void Process(ViberIncoming incoming) { if (incoming?.Message?.Type == "text") { LogIncoming(incoming); ProcessMessage(incoming); } } |
Viber 메시지 처리
로그인 는 들어오는 각 요청에 대한 모든 것을 알 수 있도록 (Couchbase에) 레코드를 생성합니다.
프로세스 메시지 는 메시지 텍스트를 분석하여 응답할 내용을 파악합니다. 전체 코드는 다음에서 확인할 수 있습니다. Github에 대한 자세한 내용은 아래에서 확인할 수 있습니다:
|
1 2 3 4 5 6 7 8 |
// if the message contains "hi", "hello", etc say "howdy" else if (HelloStrings.Any(incoming.Message.Text.ToLower().Contains)) SendTextMessage("Howdy!", incoming.Sender.Id); // if message contains "?" then link to the forums else if (incoming.Message.Text.Contains("?")) SendTextMessage("If you have a Couchbase question, please ask on the forums! https://forums.couchbase.com", incoming.Sender.Id); else SendTextMessage("I'm sorry, I don't understand you. Type 'help' for help!", incoming.Sender.Id); |
메트릭 가져오기
제 챗봇이 주로 듣는 것 중 하나는 '메트릭'입니다. 메트릭을 요청하면 챗봇이 처리한 수신 메시지의 개수를 알려줍니다. 모든 요청을 Couchbase에 로깅하기 때문에 N1QL 쿼리로 메트릭을 쉽게 쿼리할 수 있습니다.
|
1 2 3 4 5 6 7 8 9 10 11 |
private string GetMetrics() { var n1ql = @"select value count(*) as totalIncoming from ViberChatBot b where meta(b).id like 'incoming::%';"; var query = QueryRequest.Create(n1ql); var response = _bucket.Query<int>(query); if (response.Success) return $"I have received {response.Rows.First()} incoming messages so far!"; return "Sorry, I'm having trouble getting metrics right now."; } |
메시지 다시 보내기
챗봇은 대화하는 사람과 다시 통신해야 합니다. 앞서 말했듯이 Viber .NET SDK가 없기 때문에 "수동으로" REST 호출을 만들어야 합니다. 이는 다음을 사용하면 충분히 쉽습니다. RestSharp:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
private void SendTextMessage(string message, string senderId) { var client = new RestClient("https://chatapi.viber.com/pa/send_message"); var request = new RestRequest(RestSharp.Method.POST); request.AddJsonBody(new { receiver = senderId, // receiver (Unique Viber user id, required) type = "text", // type (Message type, required) Available message types: text, picture, etc text = message }); request.AddHeader("X-Viber-Auth-Token", ViberKey); var response = client.Execute(request); // log to Couchbase _bucket.Insert("resp::" + Guid.NewGuid(), response.Content); } |
또한 각 응답을 Viber에서 Couchbase로 로깅하고 있다는 점에 유의하세요. 이는 나중에 분석 및/또는 문제 해결을 위해 매우 유용한 정보가 될 수 있습니다. Viber가 응답의 구조와 내용을 변경하기로 결정하면 Couchbase의 데이터는 모두 유연한 JSON 데이터로 저장됩니다. 이 수집 지점에서 예상치 못한 오류나 누락된 데이터가 발생하지 않습니다.
요약
이것이 기본 사항입니다. 챗봇이 수행할 수 있는 전체 작업/작업에 대한 소스 코드를 확인하세요. 저는 챗봇을 테스트하기 위해 제 휴대폰(그리고 공개했을 때 작동하는지 확인하기 위해 제 아내의 휴대폰)에서 Android용 Viber 앱을 사용했습니다.

주의: 이 글을 읽을 때쯤이면 제가 만든 챗봇은 이미 오프라인 상태가 되어 있을 것입니다. 제가 아닌 다른 사람이 '카우치베이스 봇'을 만들었으니까요!
다음은 챗봇을 만들 때 이러한 접근 방식의 이점을 요약한 것입니다:
-
그리고 서버리스 접근 방식 은 챗봇의 비용을 관리할 수 있는 좋은 방법입니다. Viber든 다른 메시징 플랫폼이든 간에 산발적이고 주기적으로 사용될 가능성이 있습니다.
-
Viber의 REST API 는 JSON을 활용하기 때문에 추적/저장/쿼리에 Couchbase가 자연스럽게 적합합니다.
-
카우치베이스의 손쉬운 확장성 및 다음과의 파트너십 Microsoft (그리고 아마존과 구글)은 챗봇 백엔드를 위한 훌륭한 선택입니다.
이 새로운 챗봇은 정말 재미있었고, 저는 이 새로운 챗봇을 가지고 놀면서 정말 흥분할 수 있었습니다. 이미지 분석, 농담, 모든 종류의 정보 검색, 제품 및 서비스 판매 등 다양한 유용한 작업을 수행할 수 있었습니다.
챗봇으로 무엇을 하고 계신지 듣고 싶습니다! 댓글을 남기거나 다음 주소로 문의해 주세요. 트위터 @mgroves.