챗봇은 사용자와 소통하는 새로운 방법이 될 수 있습니다. 챗봇의 기본 사항을 소개하는 게시물을 작성한 후 서버리스를 작성하고 글쓰기에 대한 게시물도 작성합니다. 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 클래스 ViberIncoming { public 문자열 이벤트 { get; set; } public long 타임스탬프 { get; set; } public ViberSender 발신자 { get; set; } public ViberMessage 메시지 { get; set; } } public 클래스 ViberSender { public 문자열 Id { get; set; } public 문자열 이름 { get; set; } } public 클래스 ViberMessage { public 문자열 텍스트 { get; set; } public 문자열 유형 { get; set; } } |
다음으로, Azure 함수는 원시 HTTP 요청을 ViberIncoming 객체입니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[함수 이름("챗봇")] public 정적 비동기 작업<HttpResponseMessage> 실행( [HttpTrigger(권한 수준.익명, "get", "post", 경로 = null)]HttpRequestMessage req, TraceWriter 로그) { var 수신 = req.콘텐츠.ReadAsAsync<ViberIncoming>().결과; var viber = new ViberProcessor(버킷.가치); viber.프로세스(수신); // 매번 "확인"을 반환합니다. // 이것은 초기 Viber 웹훅 설정에 가장 중요합니다. 반환 req.CreateResponse(HttpStatusCode.확인); } |
그 후, 저는 ViberProcessor 클래스가 있는 프로세스 메서드에서 이 객체를 수신합니다.
|
1 2 3 4 5 6 7 8 |
public void 프로세스(ViberIncoming 수신) { 만약 (수신?.메시지?.유형 == "text") { 로그인(수신); 프로세스 메시지(수신); } } |
Viber 메시지 처리
로그인 는 들어오는 각 요청에 대한 모든 것을 알 수 있도록 (Couchbase에) 레코드를 생성합니다.
프로세스 메시지 는 메시지 텍스트를 분석하여 응답할 내용을 파악합니다. 전체 코드는 다음에서 확인할 수 있습니다. Github에 대한 자세한 내용은 아래에서 확인할 수 있습니다:
|
1 2 3 4 5 6 7 8 |
// 메시지에 "hi", "hello" 등이 포함된 경우 "안녕하세요"라고 말합니다. else 만약 (헬로스트링.모든(수신.메시지.텍스트.ToLower().포함 사항)) SendTextMessage("안녕!", 수신.발신자.Id); // 메시지에 "?"가 포함되어 있으면 포럼으로 링크합니다. else 만약 (수신.메시지.텍스트.포함 사항("?")) SendTextMessage("카우치베이스에 대한 질문이 있으시면 포럼에 질문해 주세요! http://forums.couchbase.com", 수신.발신자.Id); else SendTextMessage("죄송합니다, 무슨 말인지 모르겠습니다. 도움을 요청하려면 'help'를 입력하세요!", 수신.발신자.Id); |
메트릭 가져오기
제 챗봇이 주로 듣는 것 중 하나는 '메트릭'입니다. 메트릭을 요청하면 챗봇이 처리한 수신 메시지의 개수를 알려줍니다. 모든 요청을 Couchbase에 로깅하기 때문에 N1QL 쿼리로 메트릭을 쉽게 쿼리할 수 있습니다.
|
1 2 3 4 5 6 7 8 9 10 11 |
비공개 문자열 GetMetrics() { var n1ql = @"select value count(*) as totalIncoming 에서 바이버챗봇 b where meta(b).id like 'incoming::%';"; var 쿼리 = 쿼리 요청.만들기(n1ql); var 응답 = _버킷.쿼리<int>(쿼리); 만약 (응답.성공) 반환 $"지금까지 {response.Rows.First()} 수신 메시지를 받았습니다!"; 반환 "죄송합니다. 지금 메트릭을 가져오는 데 문제가 있습니다."; } |
메시지 다시 보내기
챗봇은 대화하는 사람과 다시 통신해야 합니다. 앞서 말했듯이 Viber .NET SDK가 없기 때문에 "수동으로" REST 호출을 만들어야 합니다. 이는 다음을 사용하면 충분히 쉽습니다. RestSharp:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
비공개 void SendTextMessage(문자열 메시지, 문자열 senderId) { var 클라이언트 = new RestClient("https://chatapi.viber.com/pa/send_message"); var 요청 = new RestRequest(RestSharp.방법.POST); 요청.AddJsonBody(new { 수신자 = senderId, // 수신자(Viber 고유 사용자 ID, 필수) 유형 = "text", // 유형 (메시지 유형, 필수) 사용 가능한 메시지 유형: 텍스트, 사진 등 텍스트 = 메시지 }); 요청.추가 헤더("X-Viber-Auth-Token", ViberKey); var 응답 = 클라이언트.실행(요청); // 카우치베이스에 로그인 _버킷.삽입("resp::" + Guid.NewGuid(), 응답.콘텐츠); } |
또한 각 응답을 Viber에서 Couchbase로 로깅하고 있다는 점에 유의하세요. 이는 나중에 분석 및/또는 문제 해결을 위해 매우 유용한 정보가 될 수 있습니다. Viber가 응답의 구조와 내용을 변경하기로 결정하면 Couchbase의 데이터는 모두 유연한 JSON 데이터로 저장됩니다. 이 수집 지점에서 예상치 못한 오류나 누락된 데이터가 발생하지 않습니다.
요약
이것이 기본 사항입니다. 챗봇이 수행할 수 있는 전체 작업/작업에 대한 소스 코드를 확인하세요. 저는 챗봇을 테스트하기 위해 제 휴대폰(그리고 공개했을 때 작동하는지 확인하기 위해 제 아내의 휴대폰)에서 Android용 Viber 앱을 사용했습니다.

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