닉 라보이 는 최신 웹 및 모바일 개발 기술을 옹호하는 사람입니다. 자바, 자바스크립트, 골랑, 앵귤러, 네이티브스크립트, 아파치 코르도바 등 다양한 프레임워크에 대한 경험이 있습니다. Nic 웹 및 모바일 개발과 관련된 자신의 개발 경험을 알기 쉽게 풀어쓴 글입니다.
미래가 자동화될 것이라는 것은 의심의 여지가 없습니다. 자동화된 자율주행 차량, 음성 비서, 콜센터 및 텍스트 기반 봇 등 다양한 자동화 기술이 있습니다. 하지만 비즈니스에 자동화를 도입하려면 무엇이 필요할까요?
간단히 말해서 올바른 도구를 사용한다면 표준 애플리케이션을 구축하는 것 이상의 작업이 필요하지 않습니다.
이 튜토리얼에서는 다음을 활용하여 인간 직원의 업무 부담을 덜어줄 수 있는 챗봇을 만드는 방법을 살펴봅니다. Amazon Lex 딥 러닝 및 대화형 인터페이스를 지원합니다, 카우치베이스 NoSQL을 데이터베이스로 사용하고 Node.js 를 사용하여 데이터베이스와 상호 작용할 수 있습니다.
이 튜토리얼의 요구 사항
이 튜토리얼과 프로젝트를 성공적으로 수행하기 위해 충족해야 하는 몇 가지 소프트웨어 요구 사항이 있습니다:
- Couchbase Server 5.0 이상이 설치되어 있고 원격으로 사용할 수 있어야 합니다.
- AWS 계정.
- Docker 또는 가상 머신 소프트웨어.
Lex 및 Lambda와 같은 Amazon 제품을 사용할 것이므로 AWS 계정을 사용할 수 있어야 합니다. 두 제품 모두 종량제이므로 무료 티어로도 충분할 것입니다. Amazon 제품을 사용할 것이므로 이러한 제품은 Couchbase에 액세스해야 합니다. 따라서 로컬 호스트에서 Couchbase를 실행할 수 없으며 원격 어딘가에 설치해야 합니다. 마지막으로, Couchbase Node.js SDK는 기본 종속성을 사용하기 때문에 Lambda가 기대하는 대로 종속성을 Linux로 다운로드하려면 Docker 또는 기타 가상 머신 소프트웨어를 사용할 수 있어야 합니다.
사용자 상호작용을 위한 Amazon Lex 구성
코드에 들어가기 전에 Lex를 구성하는 데 시간을 할애할 수 있습니다. Lambda를 사용하면 봇을 유용하게 만들 수 있지만 Lex를 사용하기 위해 어떤 종류의 백엔드도 필요하지 않습니다.
다음으로 이동 Lex 을 클릭하고 새 사용자 지정 봇을 생성하도록 선택합니다.
텍스트 기반 봇을 만드는 것이므로 출력 음성은 아무것도 없어야 합니다. 다른 모든 것은 기본값이나 가장 적절하다고 생각되는 것을 사용하면 됩니다.
사용자 지정 봇이 만들어지면 첫 번째 단계는 인텐트 생성을 시작하는 것입니다. 이 예제에서는 인텐트를 만들겠습니다. AboutIntent
, 프로필 인텐트 가져오기
그리고 업그레이드 서비스 인텐트
이 중 두 개는 정보에 Couchbase를 사용합니다.
먼저 AboutIntent
.
이 아이디어의 배경이 된 AboutIntent
는 단지 시작을 위한 것입니다. 이 용도로 데이터베이스를 사용하지는 않겠지만 결국에는 람다 함수에 연결될 것입니다. 이 목적은 봇에 대한 정보를 제공하기 위한 것입니다.
의도를 트리거하려면 기본적으로 가능한 문구 목록인 몇 가지 샘플 발화를 정의해야 합니다. 예를 들어 다음을 살펴보겠습니다:
1 2 3 |
누구 만든 이 챗봇 무엇 can 당신 tell me 약 자신 give me 정보 약 이 봇 |
위의 문구는 사용자가 물어볼 수 있는 문구입니다. Lex는 학습 데이터를 통해 학습하고 목록에 없는 질문을 할 경우 부족한 부분을 채울 수 있으므로 많을수록 좋습니다.
지금은 주문 처리 as 클라이언트에 매개변수 반환를 사용하지만 결국 Lambda로 전환할 예정입니다.
다음을 살펴보겠습니다. 프로필 인텐트 가져오기
지금.
이 의도는 약간 다른데, 사용자마다 달라질 수 있는 동적 정보를 사용자로부터 받아 들일 수 있기를 원하기 때문입니다. 슬롯 변수를 통해 동적 정보를 허용할 수 있습니다.
슬롯 변수가 포함된 다음 샘플 발화를 살펴보세요:
1 2 |
i 필요 일부 정보 약 my 계정 get me 일부 정보 약 my 계정 {AccountId} |
모든 샘플 발화에 슬롯 변수를 포함할 필요는 없지만 변수가 중괄호로 묶여 있다는 점에 유의하세요. 사용되는 각 변수는 인텐트 구성 내에서 정의할 수 있습니다. 예를 들어, 우리의 AccountId
는 AMAZON.EmailAddress
를 기본 프롬프트 문구로 사용하세요.
그렇다면 이것은 무엇을 의미할까요?
Lex가 슬롯 변수가 존재한다고 판단할 때는 유효한 이메일 주소여야 합니다. Lex가 우리가 실행하려고 하는 것이 프로필 정보 가져오기
인텐트를 입력했지만 변수가 존재하지 않는 경우 프롬프트 문구를 사용하여 사용자에게 해당 변수 정보를 요청합니다. 이렇게 하면 필요한 데이터를 생략하지 않고도 대화를 유동적으로 진행할 수 있습니다.
마지막으로 다음을 살펴보겠습니다. 업그레이드 서비스 인텐트
.
그리고 업그레이드 서비스 인텐트
은 우리의 프로필 인텐트 가져오기
와 비슷하지만 이번에는 두 가지 슬롯 변수가 있습니다. 다음 샘플 발화를 살펴봅시다:
1 2 |
i서비스}를 원하고 내 계정 정보는 {AccountId}입니다. i'd 같은 에 업그레이드 my 서비스 에 {서비스} |
두 개의 샘플 발화로는 충분하지 않지만 변수를 어떻게 사용할 수 있는지에 대한 아이디어를 얻으셨기를 바랍니다. 이 챗봇과의 대화가 실제 사람처럼 자연스럽게 이루어지기를 원한다면 실제 사람을 봇으로 대체할 수 있기 때문입니다.
하지만 예외가 있습니다. 업그레이드 서비스 인텐트
슬롯 변수. 슬롯 변수는 서비스
변수는 반드시 생성해야 하는 사용자 정의 슬롯입니다.
이 예제에서는 사용자 지정 서비스 슬롯
여기서 이름은 중요하지 않지만 데이터는 중요합니다. 변수 내에 존재할 수 있는 가능한 것들을 정의하고자 합니다. 이 예제에서는 슬롯이 다음 중 어느 것이든 될 수 있다고 말합니다:
- 실버
- 골드
- 궁극의
위의 세 가지 항목이 가능한 서비스라고 가정하고 있습니다. 이는 예시일 뿐이며 고객의 요구 사항은 다를 수 있습니다.
이 시점에서 세 가지 인텐트 각각을 저장하고 봇을 빌드할 수 있습니다.
간단한 JavaScript와 Couchbase로 AWS 람다 로직 개발하기
인텐트, 샘플 발화, 슬롯 변수가 준비되었습니다. 이제 인텐트가 트리거될 때 사용자에게 응답하는 로직을 만들 차례입니다.
이미 Couchbase가 설치, 구성 및 준비되어 있어야 합니다. 이 튜토리얼의 목표는 Couchbase를 설정하는 방법이 아니라 Lex와 함께 사용하는 방법입니다.
카우치베이스 내에서 다음 문서를 버킷에 추가합니다:
1 2 3 4 |
{ "이메일": "test@test.com", "서비스": "실버" } |
위의 문서가 고객이고 현재 '실버' 요금제를 사용 중이라고 가정하겠습니다. 이론적으로 이 예는 전화 또는 채팅 회선이 있는 모든 조직에 유용할 수 있습니다. 예를 들어 인터넷의 경우 Comcast를 생각해 보세요. 봇을 만들면 사용자가 전화를 걸거나 채팅을 통해 계정 변경을 요청할 수 있습니다. 봇은 이를 해석하여 사람이 직접 하지 않고도 변경을 수행할 수 있습니다.
컴퓨터에서 새 디렉터리를 만들고 다음을 실행합니다:
1 2 3 |
npm init -y npm 설치 git+https://github.com/couchbase/couchnode.git#v2.5.1 --save 터치 색인.js |
위의 명령은 새로운 package.json 파일을 설치하고 카우치베이스 SDK. 소스에서 빌드해야 하는 기본 종속성이 있기 때문에 GitHub URL을 사용하고 있습니다. 만약 터치
명령을 사용하여 index.js 파일을 수동으로 생성합니다.
내 index.js 파일에 다음 상용구 코드를 추가합니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
const 카우치베이스 = require("couchbase"); var 클러스터, 버킷; const 디스패처 = 비동기 (이벤트) => { let 응답 = { "dialogAction": { "type": "닫기", "이행 상태": "", "메시지": { "contentType": "일반 텍스트", "content": "" } } }; let cbResult; 스위치(이벤트.currentIntent.이름) { 기본값: 응답.다이얼로그 액션.이행 상태 = "Failed"; 응답.다이얼로그 액션.메시지.콘텐츠 = "요청을 이해할 수 없습니다."; break; } 반환 응답; } const 핸들러 = (이벤트) => { 만약(클러스터 == null || 버킷 == null) { 클러스터 = new 카우치베이스.클러스터("couchbase://COUCHBASE_HOST_HERE"); 클러스터.인증("couchbase_username", "couchbase_password"); 버킷 = 클러스터.오픈버킷("카우치베이스_버킷"); 콘솔.로그(버킷); } 반환 디스패처(이벤트); }; 수출.핸들러 = 핸들러; |
위 코드에는 몇 가지 주의해야 할 사항이 있습니다. 호스트, 사용자 이름, 비밀번호, 버킷에 대한 플레이스홀더 정보만 추가했습니다. 실제 Couchbase 설치의 정보로 대체해야 합니다.
위에서는 디스패처 함수가 있는 Lambda 함수를 만들고 있습니다. Lex가 채팅 메시지를 받으면 Lambda로 전송할 요청 개체를 만듭니다. 이 시나리오에서 Lambda는 데이터베이스에 연결을 설정한 후 요청 객체를 가져와 디스패처로 전달합니다. 디스패처 내부에서 응답 객체가 생성되고 의도가 분석됩니다.
현재로서는 모든 인텐트가 기본 조건에만 도달하기 때문에 나쁜 인텐트입니다. 이를 바꾸려고 합니다.
먼저 우리의 AboutIntent
가장 간단하기 때문입니다:
1 2 3 4 5 6 7 8 9 10 |
스위치(이벤트.currentIntent.이름) { case "AboutIntent": 응답.다이얼로그 액션.이행 상태 = "Fulfilled"; 응답.다이얼로그 액션.메시지.콘텐츠 = "다국어 개발자 닉 라보이 제작"; break; 기본값: 응답.다이얼로그 액션.이행 상태 = "Failed"; 응답.다이얼로그 액션.메시지.콘텐츠 = "요청을 이해할 수 없습니다."; break; } |
Lex가 사용자가 정보를 요청하고 있다고 판단하고 AboutIntent
기본적이지만 적절한 메시지로 응답할 것입니다. 그렇지 않으면 여전히 요청에 실패하게 됩니다.
이제 좀 더 복잡한 의도를 살펴 보겠습니다. 프로필 인텐트 가져오기
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
case "GetProfileIntent": cbResult = 기다림 new 약속((해결, 거부) => { let 문 = "SELECT * FROM lexbot WHERE email = $email"; let 쿼리 = 카우치베이스.N1qlQuery.fromString(문); 버킷.쿼리(쿼리, { 이메일: 이벤트.currentIntent.슬롯.AccountId }, (오류, 결과) => { 만약(오류) { 반환 거부({ 상태: "Failed", 메시지: 오류.메시지 }); } 해결({ 상태: "Fulfilled", 메시지: JSON.문자열화(결과) }); }); }); 응답.다이얼로그 액션.이행 상태 = cbResult.상태; 응답.다이얼로그 액션.메시지.콘텐츠 = cbResult.메시지; break; |
사용자가 자신의 프로필에 대한 정보를 요청하면 문서를 반환해야 한다는 것이 이 의도의 핵심입니다. 우리가 하고 있는 작업은 N1QL 쿼리 를 사용하여 이메일
를 조건으로 설정합니다. 렉스 기억하기 AccountId
변수는 이 예제에서 이메일일 뿐입니다. 그런 다음 해당 쿼리의 결과가 직렬화되어 Lex로 다시 반환되어 사용자에게 표시됩니다.
이제 상황을 조금 더 복잡하게 만들어 보겠습니다. 우리의 업그레이드 서비스 인텐트
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
case "업그레이드서비스인텐트": cbResult = 기다림 new 약속((해결, 거부) => { let 문 = ` 업데이트 렉스봇 SET 서비스 = $서비스 어디 이메일 = $이메일 `; let 쿼리 = 카우치베이스.N1qlQuery.fromString(문); 버킷.쿼리( 쿼리, { 서비스: 이벤트.currentIntent.슬롯.서비스, 이메일: 이벤트.currentIntent.슬롯.AccountId }, (오류, 결과) => { 만약(오류) { 반환 거부({ 상태: "Failed", 메시지: 오류.메시지 }); } 해결({ 상태: "Fulfilled", 메시지: "서비스가 " + 이벤트.currentIntent.슬롯.서비스 + "에 대한 " + 이벤트.currentIntent.슬롯.AccountId }); } ); }); 응답.다이얼로그 액션.이행 상태 = cbResult.상태; 응답.다이얼로그 액션.메시지.콘텐츠 = cbResult.메시지; break; |
또 다른 N1QL 쿼리를 수행하겠지만 이번에는 업데이트
작업을 수행합니다. 사용자가 서비스를 업그레이드하고 싶다고 가정합니다. 사용자가 자신의 계정 정보와 원하는 서비스를 제공하면 람다 로직이 사람의 개입 없이 이를 처리합니다.
데이터 살균을 하고 있지는 않지만 할 수 있습니다.
이 시점에서 람다 기능은 완료되었습니다. Lex와의 자연스러운 인간 채팅을 통해 세 가지 쿼리에 응답할 수 있습니다. 이제 Couchbase SDK는 네이티브 종속성을 사용한다고 언급했습니다. 이 튜토리얼의 초점은 Lambda가 아니므로 이전에 작성한 튜토리얼을 참조하시기 바랍니다, AWS Lambda에 네이티브 Node.js 종속성 배포하기.
Lambda 패키지를 업로드한 후에는 Lex 대시보드로 돌아가서 각 인텐트에 대해 다음을 선택해야 합니다. AWS 람다 함수 로 주문 처리 옵션을 선택합니다. 완료되면 다시 빌드하면 챗봇이 람다 코드에서 데이터를 가져와야 하며, 람다 코드는 카우치베이스에서 데이터를 가져옵니다.
결론
방금 Amazon Lex를 사용하여 간단하지만 잠재적으로 유용한 챗봇을 만드는 방법을 살펴보았습니다. 카우치베이스. 챗봇은 콜센터나 기타 지원 라인에서 사람을 대체하는 데 매우 유용하며 아마도 미래일 것입니다.
프로덕션 시나리오에서는 Lex에서 들어오는 모든 데이터에 대해 데이터 유효성 검사를 수행해야 할 것입니다. 예를 들어 데이터가 존재하는지 확인하거나 더 안전하게 작업을 수행할 수도 있습니다. 이 예에서는 이메일 주소만 제공하면 누구의 서비스도 변경할 수 있습니다. 프로덕션 환경에서는 이를 변경하고 싶을 것입니다.
이 게시물은 카우치베이스에서 제공한 것입니다. 커뮤니티 글쓰기 프로그램