1. 소개
이 실습에서는 Dialogflow를 사용하여 간단한 작업을 빌드하고 Google 어시스턴트와 이를 통합하는 방법을 알아봅니다.
이 실습은 일반적인 클라우드 개발자 경험을 반영하여 순서대로 진행됩니다.
- Dialogflow v2 에이전트 만들기
- 항목 만들기
- 인텐트 만들기
- GCP Cloud Functions로 웹훅 설정
- 기술 자료를 사용하여 FAQ 가져오기
- 챗봇 테스트
- Google 어시스턴트 통합 사용 설정
빌드할 항목
Women in Voice 모임 그룹을 위한 Google 어시스턴트 앱을 개발할 예정입니다. 다음 모임이 언제인지 물어볼 수 있습니다. 모임 그룹에 대한 팁이나 일반적인 질문을 예약할 수 있습니다. |
학습할 내용
- Dialogflow v2로 챗봇을 만드는 방법
- Dialogflow로 선형 대화를 만드는 방법
- 항목 활용 방법
- 기술 자료 활용 방법
- Dialogflow 및 GCP 함수로 웹훅 처리를 설정하는 방법
- Actions on Google을 통해 애플리케이션을 Google 어시스턴트로 가져오는 방법
기본 요건
- Dialogflow 에이전트를 만들려면 Google ID / Gmail 주소가 필요합니다.
- GCP Cloud Functions 사용에 대한 GCP Cloud 크레딧이 제공됩니다.
- 에이전트 데이터를 가져오려면 이 공개 Google 시트에 액세스해야 합니다.
- 새 탭에서 열기: https://docs.google.com/spreadsheets/d/1UWx3WYVCrqz0D4uJ_pO56WeqEPa9rQDG1cfc_H11kgY/edit?usp=sharing
- 자바스크립트에 관한 기본 지식은 필요하지 않지만 웹훅 처리 코드를 변경하려는 경우 유용할 수 있습니다.
2. 설정
브라우저에서 웹 활동 사용 설정
- 웹 및 앱 활동이 사용 설정된 경우:
Dialogflow 에이전트 만들기
- 왼쪽 표시줄의 로고 바로 아래에서 'Create New Agent'를 선택합니다. 기존 에이전트가 있는 경우 먼저 드롭다운을 클릭합니다.
- 에이전트 이름 지정:
yourname-wiv
(사용자 이름 사용) - 기본 언어로 English - en을 선택합니다.
- 기본 시간대로 가장 가까운 시간대를 선택합니다.
- 메가 에이전트를 선택하지 마세요. (이 기능을 사용하면 'sub' 에이전트 간에 조정할 수 있는 중요한 에이전트를 만들 수 있습니다. 지금은 필요하지 않습니다.)
- 만들기를 클릭합니다.
Dialogflow 구성
- 왼쪽 메뉴에서 프로젝트 이름 옆에 있는 톱니바퀴 아이콘을 클릭합니다.
- 상담사 설명을 Women in Voice Agent로 입력합니다.
- 베타 기능까지 아래로 스크롤한 다음 스위치를 전환하여 베타 기능을 사용 설정합니다.
- 로그 설정까지 아래로 스크롤하고 두 스위치를 모두 전환하여 Dialogflow의 상호작용을 로깅하고 모든 상호작용을 Google Cloud Stackdriver에 로깅합니다. 나중에 작업을 디버그할 때 필요합니다.
- 저장을 클릭합니다.
- 완료를 클릭합니다.
Actions on Google 구성
- 오른쪽 패널의 Google 어시스턴트에서 어떻게 작동하는지 알아보기에서 Google 어시스턴트 링크를 클릭합니다.
그러면 http://console.actions.google.com이 열립니다.
참고: Dialogflow에서와 동일한 Google 계정으로 로그인했는지 확인하세요.
Actions on Google을 처음 사용하는 경우 먼저 다음 양식을 작성해야 합니다.
- 프로젝트 이름을 클릭하여 시뮬레이터**에서 작업을 열어봅니다.**
- 메뉴 바에서 개발을 선택합니다.
사용자의 언어 설정 일치를 선택 해제합니다. 어시스턴트 기본 언어로 인해 텍스트 음성 변환 합성기가 무효화되지 않도록 하기 위해
- 저장을 클릭합니다.
- 메뉴 바에서 테스트를 선택합니다.
- 시뮬레이터가 English로 설정되어 있는지 확인하고 Talk to my test-app을 클릭합니다.
기본적인 Dialogflow 기본 인텐트와 함께 작업이 시작됩니다. 이는 Action on Google과의 통합 설정이 완료되었다는 의미입니다.
Google Cloud 구성
이 튜토리얼에서는 결제 계정이 있는 GCP 계정이 필요합니다. 아직 계정이 없는 경우 다음 단계에 따라 계정을 만들 수 있습니다.
일반적으로 결제 계정에는 신용카드와 같은 결제 수단이 필요합니다. 이 워크숍에는 이 절차를 건너뛸 수 있는 워크숍 크레딧을 사용할 수 있습니다.
- 이 URL로 이동하여 로그인합니다.
- 다음을 클릭합니다. 여기를 클릭하여 크레딧에 액세스
- 수락 및 클릭 계속
설정이 완료되었습니다. 25달러로 결제 계정을 만들었으며, 이는 Cloud Functions를 오랫동안 사용하기에 충분한 금액입니다.
Google Sheets API 사용 설정
에이전트에 정적 인텐트 응답 이상이 필요한 경우 (예: 웹 서비스, 데이터베이스 또는 시트에서 데이터 가져오기) fulfillment를 사용하여 웹 서비스를 에이전트에 연결해야 합니다. 웹 서비스를 연결하면 사용자 표현에 따라 조치를 취하고 사용자에게 동적 응답을 보낼 수 있습니다.
예를 들어, 사용자가 블로그나 도서 도움말을 수신하기를 원하는 경우, 웹 서비스는 데이터베이스를 체크인하고 읽을 기사로 사용자에게 응답할 수 있습니다.
이 튜토리얼에서는 데이터베이스 대신 Google 시트를 사용합니다. 시트가 업데이트되면 Google 어시스턴트 작업도 업데이트됩니다. 간단합니다.
- 이 Google 시트를 아직 열지 않았다면 새 브라우저 탭에서 엽니다.
- https://docs.google.com/spreadsheets/d/1UWx3WYVCrqz0D4uJ_pO56WeqEPa9rQDG1cfc_H11kgY/edit#gid=1240329448
- 중요: 이 시트의 사본을 만드세요. 파일 > 사본 만들기
- 시트가 복사되면 공유를 클릭합니다.
- Dialogflow 서비스 계정에 수정 권한을 부여해야 합니다. 이렇게 하려면 Dialogflow > 설정 (톱니바퀴)
- 아래로 스크롤하여 Google 프로젝트를 찾습니다.
- 서비스 계정 (이메일) 주소를 복사합니다. 다음과 같아야 합니다. dialogflow-<someid>@<my-gcp-project>.iam.gserviceaccount.com
- Google Sheets의 공유 팝업에 이 서비스 계정을 붙여넣고 수정 권한을 부여합니다.
- 다음으로 현재 작업 중인 시트 ID를 기억해야 합니다.
The Sheets URL will look something like this:
https://docs.google.com/spreadsheets/d/1fPd8b_z19U7ZzAaY327QhYoogn6q8c1rpGSNF8KIR_o/edit#gid=1240329448
But we are only interested in the Sheet id, which is the part between:
https://docs.google.com/spreadsheets/d/ 및 /edit#gid=1240329448 (슬래시 제외)
So it will look something like this: **1fPd8b_z19U7ZzAaY327QhYoogn6q8c1rpGSNF8KIR_o**
**Write this Sheet ID down**, or copy it to Notepad. In the Webhook steps we will use this again.
- 다른 브라우저 탭에서 열기 http://console.cloud.google.com. Google Cloud 프로젝트가 더 있는 경우 새 Dialogflow 프로젝트인 yourname-wiv를 활성화합니다. - 검색창에서 Google Sheets API를 검색합니다.
- 이것을 클릭한 다음 상단의 Google Sheets API 사용 설정 버튼을 클릭합니다.
3. 커스텀 개체
항목이란 앱 또는 기기에서 작업을 수행하는 객체입니다. 이를 매개변수 / 변수로 생각하세요. 이 과정에서 우리는 다음과 같은 질문을 하게 됩니다.
"
챗봇
/
음성*"*
챗봇, 음성 또는 둘 다와 관계없이 이러한 정보는 웹 서비스에 대한 요청의 매개변수로 사용되는 커스텀 항목에서 수집됩니다.
여기에서 Dialogflow 항목에 대해 자세히 알아보세요.
채널 항목 만들기
- Dialogflow 콘솔의 메뉴 항목에서 Entities(항목)를 클릭합니다.
- 항목 만들기를 클릭합니다.
- 항목 이름:
tech
(모두 소문자여야 함) - 동의어를 사용하여 옵션을 지정합니다. (인터페이스를 탭할 수 있습니다.)
Chatbots - Chatbots, Chat, Web
Voice - Voice, Voicebots, Voice Assistants
Both - Both, All
5**.** 파란색 저장 버튼 옆에 있는 메뉴 버튼을 클릭하여 **Raw Edit** 모드로 전환합니다.
- 모든 항목을 CSV 형식으로 입력했을 수도 있습니다. 이 기능은 생성해야 하는 항목이 많을 때 편리할 수 있습니다.
"Chatbots","Chatbots","Chat","Web"
"Voice","Voice","Voicebots","Voice Assistants"
"Both","Both","All"
- 저장을 클릭합니다.
4. 인텐트
Dialogflow는 인텐트를 사용하여 사용자의 의도를 분류합니다. 인텐트에는 사용자가 에이전트에게 할 수 있는 말의 예시인 학습 문구가 있습니다.
예를 들어 누가 다음 이벤트가 언제인지 알고 싶어하는 사용자는 다음과 같이 질문할 수 있습니다.
"다음 모임은 언제야?"
사용자가 무언가를 쓰거나 말하면(사용자 표현이라고 함) Dialogflow는 사용자 표현을 에이전트에서 가장 유사한 인텐트와 일치시킵니다. 인텐트 일치를 인텐트 분류라고도 합니다.
기본 시작 인텐트 수정
새 Dialogflow 에이전트를 만들면 기본 인텐트 두 개가 자동으로 생성됩니다. 기본 시작 인텐트는 에이전트와 대화를 시작할 때 가장 먼저 접하게 되는 흐름입니다. 기본 대체 인텐트는 에이전트가 사용자를 이해할 수 없거나 인텐트를 방금 말한 내용과 일치시킬 수 없을 때 받게 되는 흐름입니다.
- 인텐트 > 기본 시작 인텐트
Google 어시스턴트의 경우 기본 시작 인텐트로 자동 시작됩니다. 이는 Dialogflow가 환영 이벤트를 수신 대기하기 때문입니다. 그러나 입력된 학습 문구 중 하나를 말하여 인텐트를 호출할 수도 있습니다.
다음은 기본 시작 인텐트의 환영 메시지입니다.
사용자 | 에이전트 |
"Ok Google, <이름>에게 말해 줘 -WIV" | "안녕하세요, 저는 Women in Voice의 가상 에이전트인 애나입니다.""모임, Women in Voice에 관한 정보 또는 독서 팁을 요청하실 수 있습니다. "무엇을 알고 싶으신가요?" |
- 응답까지 아래로 스크롤합니다.
- 모든 텍스트 응답을 삭제합니다.
- 기본 탭에서 다음 3가지 응답을 만듭니다. (새로운 줄마다 응답 추가 > 텍스트 또는 SSML 응답을 클릭합니다.)
- 안녕하세요, 저는 Women in Voice의 가상 에이전트인 애나입니다
- 모임이나 Women in Voice에 관한 정보나 독서 팁을 요청하실 수 있습니다.
- 무엇을 알고 싶으신가요?
구성은 이 스크린샷과 비슷해야 합니다.
- 이전 출력은 챗봇에 사용되었으며, Google 어시스턴트용으로 출력을 약간 수정할 수 있습니다. SSML (음성 합성 마크업 언어)을 사용해 문장에서 잠시 멈추고 내용을 빌드하겠습니다. Google 어시스턴트 탭을 클릭합니다.
- 챗봇 메시지를 다시 사용하지 않으므로 기본값 전환 버튼을 사용 설정하지 마세요.
- 응답 추가 > 간단한 응답
- 다음 텍스트 버전을 추가합니다.
Hey there, I'm Anna, the virtual agent of Women in Voice.
You can ask me for information about meetups, Women in Voice or a reading tip. What would you like to know?
- 그런 다음 오디오 출력 맞춤설정을 클릭합니다.
- 다음 SSML 버전을 추가합니다.
<speak><p><s>Hey there, I'm Anna, the virtual agent of Women in Voice.</s><s>
You can ask me for information about meetups, Women in Voice or a reading tip.</s></p><break time="500ms"/><p><s>
What would you like to know?</s></p></speak>
구성은 이 스크린샷과 비슷해야 합니다.
- 저장을 클릭합니다.
여기에서 Actions on Google용 SSML에 대한 자세한 내용을 확인할 수 있습니다.
- 이 인텐트를 테스트해 보겠습니다. 먼저 Dialogflow 시뮬레이터에서 테스트할 수 있습니다.
Hello를 입력합니다. 그러면 이 메시지가 반환됩니다.
- 이제 Actions on Google 콘솔로 다시 전환합니다.
다른 탭에 보관해 두는 것이 좋습니다.
'테스트 앱에 연결해 줘'를 클릭합니다. 새 환영 메시지를 듣습니다.
기본 대체 인텐트 수정
- 인텐트 > 기본 대체 인텐트
- 응답까지 아래로 스크롤합니다.
- 모든 텍스트 응답을 삭제합니다.
- 기본 탭에서 다음 옵션을 새 줄에 하나씩 작성하여 다음 옵션을 번갈아 표시합니다.
Sorry, can you repeat this?
I didn't understand you. You can ask me questions about Women in Voice, a book or article tip or when the next meetup will be.
- 저장을 클릭합니다.
Google 어시스턴트 출력을 입력하지 않으면 기본값이 사용됩니다.
중지 인텐트 만들기
- 인텐트 메뉴 항목을 클릭합니다.
- 인텐트 만들기를 클릭합니다.
- 인텐트 이름(
Stop Intent
)을 입력합니다. - 학습 문구 추가를 클릭합니다.
No
That's it
Bye
I don't want that
Goodbye
It's ok for now
Quit
I want to stop
Close this
End the conversation
- 응답까지 아래로 스크롤합니다.> 응답 추가
- 다음 텍스트 옵션을 추가합니다.
Alright! Hopefully we will see you at one of our meetups!
No problem. See you at one of our meetups!
- 이 인텐트를 대화의 종료문으로 설정합니다. 이렇게 하면 인텐트가 일치되면 Google 어시스턴트 작업이 종료됩니다.
- 저장을 클릭합니다.
모임 인텐트 만들기
모임 의도에는 대화의 다음 부분이 포함됩니다.
사용자 | 에이전트 |
"다음 모임은 언제야?" | "다음 모임은 <date>에 열립니다. <time> 위치: <location> 주제는 <topic>입니다. 스피커는 <speakers>입니다. 뉴스레터를 통해 등록하실 수 있습니다." |
- 인텐트 메뉴 항목을 클릭합니다.
- 인텐트 만들기를 클릭합니다.
- 인텐트 이름
Meetup Intent
을 입력합니다. (대문자 M과 대문자 I를 사용해야 합니다. - 인텐트의 철자를 다르게 입력하면 백엔드 서비스가 작동하지 않습니다.) - 학습 문구 추가를 클릭합니다.
When is the next meetup?
Do you have any events?
Which events are in the planning?
Are there meetup events soon?
I would love to attend a meetup
Can I join a virtual meetup?
When will you get together?
Can I join?
What does your calendar look like?
- 처리 > Fulfillment 사용 설정
- 이 인텐트에 웹훅 호출 사용 설정 스위치를 전환합니다.
- 저장을 클릭합니다.
팁 인텐트 만들기
팁 인텐트에는 대화의 다음 부분이 포함됩니다.
사용자 | 에이전트 |
"읽기 도움말이 필요합니다." | "챗봇, 음성 또는 둘 다에 관해 자세히 알아보고 싶으신가요?" |
"음성" | "알겠습니다. 오늘의 팁을 알려드리겠습니다. <type> <title> 저자: <author> 다른 도서나 기사 팁을 원하시나요? 또한 모임이나 저희의 활동에 대해 자세히 알려드릴 수 있습니다. 무엇을 도와드릴까요?" |
- 인텐트 메뉴 항목을 다시 클릭합니다.
- 인텐트 만들기를 클릭합니다.
- 인텐트 이름
Tip Intent
을 입력합니다. (대문자 L과 대문자 I를 사용해야 합니다. - 인텐트의 철자를 다르게 입력하면 백엔드 서비스가 작동하지 않습니다.) - 학습 문구 추가를 클릭하고 다음을 추가합니다.
Can I get a tip for an article?
I would like to receive a reading tip
Any book tips?
What's nice to read?
I want to learn more about Chatbots, what should I read?
What are nice blogs?
Do you have book suggestions?
I want to receive information about Both
Can I have Chatbots reading tip
I would like to read more about Voice
Voice please
Both are okay.
Reading tip
Tip
Blog
Article
Book
Book suggestions
Yes
Yeah
Another tip
Yes one more
- 작업 및 매개변수까지 아래로 스크롤합니다.
- 기술을 필요함으로 표시
프롬프트 정의를 클릭하고 다음을 입력합니다.
Do you want to read more about Chatbots, Voice or Both?
- 처리 > Fulfillment 사용 설정
이번에는 응답을 하드코딩하지 않습니다. Cloud 함수에서 응답을 제공합니다. 따라서 이 인텐트의 웹훅 호출 사용 설정 스위치를 전환합니다.
처리 > Fulfillment 사용 설정
- 이 인텐트에 웹훅 호출 사용 설정 스위치를 전환합니다.
- 저장을 클릭합니다.
5. 지식 커넥터
지식 커넥터는 정의된 인텐트를 보완하며, 자동화된 응답을 찾기 위해 기술 문서를 파싱합니다. (예: FAQ 또는 CSV 파일, 온라인 웹사이트 또는 PDF 파일의 문서) 지식 문서를 구성하려면 기술 문서 모음인 하나 이상의 기술 자료를 정의해야 합니다.
한 번 시도해 보겠습니다.
- en 태그를 선택하여 상단 메뉴에서 영어를 선택합니다.
- 메뉴에서 지식 (베타)을 선택합니다.
- 오른쪽 파란색 버튼(기술 자료 만들기)을 클릭합니다.
- 기술 자료 이름으로 입력합니다. Voice의 여성을 클릭하고 저장을 누릅니다.
- 첫 번째 항목 만들기 링크를 클릭합니다.
- 그러면 창이 열립니다.
다음 구성을 사용합니다.
문서 이름: Voice FAQ 시트의 여성 사용자
지식 유형: FAQ
MIME 유형: CSV
- 이 시트의 데이터가 필요합니다. 데이터 시트가 열려 있는지 확인한 후 FAQ 탭을 선택하세요.
- 파일 > 다운로드 > CSV
- Dialogflow로 돌아가서 Upload File from Computer(컴퓨터에서 파일 업로드)를 클릭하고 다운로드한 CSV 파일을 선택합니다. 만들기를 클릭합니다.
기술 자료가 생성되었습니다.
- 응답 추가를 클릭합니다.
다음 답변을 작성하고 저장을 누릅니다.
$Knowledge.Answer[1]
- 세부정보 보기를 클릭합니다.
그러면 Dialogflow에 구현한 모든 FAQ가 표시됩니다.
쉽네!
FAQ가 있는 온라인 HTML 웹사이트로 이동하여 에이전트로 FAQ를 가져올 수도 있습니다. 텍스트 블록이 포함된 PDF를 업로드할 수도 있으며 Dialogflow가 질문을 스스로 생성합니다.
- Dialogflow 메뉴에서 지식 (베타)을 클릭하여 모든 기술 자료 커넥터로 돌아갑니다.
- 기술 자료의 강점과 약점을 변경할 수 있습니다. 이는 FAQ가 본인의 의도로 승소하거나 패배하고 있다는 생각이 있을 때 타당합니다. 인텐트가 많지 않으므로 기술 자료를 좀 더 강화해 보겠습니다. 배율을 -0.2로 변경합니다. 슬라이더를 드래그하면 값이 자동으로 저장됩니다.
이제 FAQ는 '추가'로 표시되어야 합니다. 에이전트에 추가할 수 있습니다. 기술 자료 FAQ로는 모델을 학습시킬 수 없습니다. 완전히 다른 방식으로 질문을 하면 자연어 이해 (머신러닝 모델)를 사용하지 않으므로 매칭되지 않을 수 있습니다. 이러한 이유로 FAQ를 인텐트로 변환하는 것이 좋습니다.
6. 웹훅 fulfillment
Google Cloud 함수 만들기
- 다른 브라우저 탭에서 http://console.cloud.google.com으로 이동합니다.
- 왼쪽 메뉴에서 Cloud Functions를 선택합니다.
- 함수 만들기를 클릭합니다.
- 다음 구성을 지정합니다.
- 이름:
dialogflow
- 할당 메모리: 256MiB
- 트리거: HTTP
- 클립보드에 URL을 복사합니다.
- 인라인 편집기 선택
- 런타임: NodeJS 8
- 실행할 함수:
dialogflow
- 이 인증 체크박스가 선택되어 있는지 확인합니다.
- package.json의 내용은 다음과 같습니다. 이를 복사하여 편집기의 package.json 탭에 붙여넣습니다.
이 코드는 올바른 npm 라이브러리를 Google Cloud에 로드합니다.
{
"name": "dialogflow",
"description": "Cloud Functions",
"engines": {
"node": "8"
},
"dependencies": {
"request": "^2.85.0",
"request-promise": "^4.2.5",
"dialogflow-fulfillment": "^0.6.1",
"actions-on-google": "^2.2.0",
"googleapis": "^48.0.0",
"moment": "^2.24.0"
},
"devDependencies": {
"eslint": "^5.12.0",
"eslint-plugin-promise": "^4.0.1",
"ngrok": "^3.2.7"
},
"private": true
}
- index.js의 콘텐츠는 다음과 같습니다. 이를 복사하여 편집기의 index.js 탭에 붙여넣습니다.
이 코드는 googleapis 라이브러리와 통합되어 Google 시트에서 데이터를 가져옵니다. actions-on-google 라이브러리를 사용하여 Google 어시스턴트 기기에 카드를 표시합니다. 라이브러리 dialogflow-fulfillment를 사용하여 Dialogflow 인텐트를 분류합니다. 또한 라이브러리 moment를 사용하여 날짜 및 시간 객체를 처리합니다.
/* jshint esversion: 8 */
'use strict';
process.env.DEBUG = 'dialogflow:debug';
const ACCOUNTS_SHEET_ID = '1UWx3WYVCrqz0D4uJ_pO56WeqEPa9rQDG1cfc_H11kgY';
const {
BasicCard,
Button,
} = require('actions-on-google');
const {google} = require('googleapis');
const moment = require('moment');
moment.locale('nl');
const { WebhookClient } = require('dialogflow-fulfillment');
var books;
var meetups;
const SHEETS_SCOPE = 'https://www.googleapis.com/auth/spreadsheets.readonly';
/**
* Authenticates the Sheets API client for read-only access.
*
* @return {Object} sheets client
*/
async function getSheetsClient() {
// Should change this to file.only probably
const auth = await google.auth.getClient({
scopes: [SHEETS_SCOPE],
});
return google.sheets({version: 'v4', auth});
}
/**
* Return a natural spoken date
* @param {string} date in 'YYYY-MM-DD' format
* @returns {string}
*/
var getSpokenDate = function(date){
let datetime = moment(date, 'YYYY-MM-DD');
return `${datetime.format('D MMMM')}`;
};
/* When the tipIntent Intent gets invoked. */
function tipIntent(agent) {
var par = agent.parameters.tech;
var selection = [];
//console.log(par);
//console.log(books);
for(var i = 0; i<books.length; i++){
if(books[i][2].toLowerCase() == par.toLowerCase()) {
selection.push(books[i]);
}
}
var random = Math.floor(Math.random() * selection.length);
var booktip = selection[random];
//console.log(selection[random]);
let spokenText = `<p><s>Alright, here's the tip of the day!</s></p><p>The ${booktip[6]} ${booktip[0]} of ${booktip[1]}.</p>`;
let writtenText = `Alright, here's the tip of the day! The ${booktip[6]} ${booktip[0]} of ${booktip[1]}.`;
//console.log(booktip[8]);
if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
let conv = agent.conv();
conv.ask(`<speak>${spokenText}</speak>`);
conv.ask(new BasicCard({
title: `Tip of the day!`,
subtitle: `${par}`,
text: `The ${booktip[6]} ${booktip[0]} of ${booktip[1]}.`,
buttons: new Button({
title: 'Read',
url: `${booktip[8]}`,
})
}));
conv.ask(`<speak><p><s>Do you want another book or article tip? Also, I can tell you more about meetups or what we do. How can I help?</s></p></speak>`);
// Add Actions on Google library responses to your agent's response
agent.add(conv);
} else {
agent.add(writtenText + ' Do you want another book or article tip? Also, I can tell you more about meetups or what we do. How can I help?');
}
}
function meetupIntent(agent) {
let conv = agent.conv();
let record;
console.log(meetups);
for(var i = 0; i<meetups.length; i++){
let d = moment(meetups[i][0], 'YYYY-MM-DD');
let today = moment(new Date());
if(moment(d).isSameOrAfter(today)) {
// the i event is not in the past
record = meetups[i];
console.log(record);
break;
}
}
let date = getSpokenDate(record[0]);
let spokenText1 = `The next meetup will be ${date} at ${record[1]} in ${record[3]}.`;
let spokenText2 = `The topic will be <emphasis level="moderate">${record[2]}.</emphasis>`;
let spokenText3 = `You can register via our newsletter.`;
let writtenText = `${spokenText1} The topic will be ${record[2]}. ${spokenText3}`;
if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
conv.ask(`<speak>${spokenText1} ${spokenText2} ${spokenText3}</speak>`);
conv.ask(new BasicCard({
title: `Meetup`,
subtitle: `${record[2]}`,
text: `${record[0]} ${record[1]} - ${record[3]}`,
buttons: new Button({
title: 'Register',
url: `http://www.meetup.com`
})
}));
conv.ask('<speak><p><s>Is there anything else I can help you with?</s></p></speak>');
agent.add(conv);
} else {
agent.add(`${writtenText} Is there anything else I can help you with?`);
}
}
exports.dialogflow = async (request, response) => {
var agent = new WebhookClient({ request, response });
console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
const client = await getSheetsClient();
const allBooks = await client.spreadsheets.values.get({
spreadsheetId: ACCOUNTS_SHEET_ID,
range: 'Books&Blogs!A:I',
});
const allEvents = await client.spreadsheets.values.get({
spreadsheetId: ACCOUNTS_SHEET_ID,
range: 'Meetups!A:D',
});
books = allBooks.data.values;
meetups = allEvents.data.values;
books.shift();
meetups.shift();
var intentMap = new Map();
intentMap.set('Tip Intent', tipIntent);
intentMap.set('Meetup Intent', meetupIntent);
agent.handleRequest(intentMap);
};
- 환경 변수, 네트워킹, 제한 시간 등 링크를 클릭합니다.
- Dialogflow 통합 서비스 계정을 선택합니다.
(기본적으로 GAE App Engine 서비스 계정을 사용하지만 이 튜토리얼의 첫 번째 단계에서 Google Sheets 내에서 공유한 것과 동일한 서비스 계정이어야 합니다.)
- Cloud 함수를 배포하기 전에 index.js 탭의 코드에서 한 줄을 변경합니다. 세 번째 코드 줄:
const
ACCOUNTS_SHEET_ID = '1Yo_E8KONgSiUm00ZmTOqtjXCwULmc2JuI3sjxRyvrkE';
첫 번째 단계 중 하나에서 이 키를 메모장에 적어 두었습니다. 이 ID를 복사하여 코드에 붙여넣으세요.
- 이제 준비가 되었습니다. 만들기 버튼을 클릭합니다. 서버리스 함수를 배포하기 때문에 잠시만 기다려 주세요.
Dialogflow에서 fulfillment 사용 설정
- Dialogflow로 다시 전환
- 기본 메뉴에서 Fulfillment를 클릭합니다.
- 웹훅 스위치를 사용 설정합니다.
- 클립보드에 복사한 Cloud 함수의 URL을 입력합니다.
예: https://us-central1-leeboonstra-wiv-uhtefa.cloudfunctions.net/dialogflow
- 저장을 클릭합니다.
- 웹훅을 테스트하여 코드가 작동하는지 확인하고 Dialogflow 시뮬레이터에서 직접 흐름을 테스트해 보겠습니다.
7. Actions on Google
Actions on Google은 Google 어시스턴트용 개발 플랫폼입니다. 이를 통해 서드 파티에서 확장된 기능을 제공하는 Google 어시스턴트용 애플릿인 '작업'을 개발할 수 있습니다.
Google에 앱을 열거나 대화하도록 요청하여 Google 작업을 호출해야 합니다.
그러면 작업이 열리고 음성이 변경되며 '기본' Google 어시스턴트 범위 즉, 이 시점에서 에이전트에 요청하는 모든 항목은 개발자가 만들어야 합니다. 원하는 경우 작업을 할 때 Google 어시스턴트에 Google 날씨 정보를 갑자기 요청할 수 없습니다. 먼저 현재 작업 (앱)의 범위를 떠나야 합니다 (닫기).
Google 어시스턴트 시뮬레이터에서 작업 테스트하기
다음 대화를 테스트해 보겠습니다.
사용자 | Google 어시스턴트 |
"Hey Google, 테스트 앱과 대화해 줘." | "앱의 테스트 버전 다운로드" |
사용자 | 내 이름-WIV |
- | "안녕하세요, 저는 Women in Voice의 가상 에이전트인 애나입니다. 모임, Women in Voice에 관한 정보 또는 독서 방법에 관한 정보를 요청하실 수 있습니다. 무엇을 알고 싶으신가요?" |
블로그에 대한 팁을 받을 수 있나요? | "챗봇, 음성 또는 둘 다에 관해 자세히 알아보고 싶으신가요?" |
챗봇 | "알겠습니다. 오늘의 팁을 알려드리겠습니다. 기사 챗봇과 코버스 그레이링의 보이지 않는 어포던스 문제에 대한 과제.다른 책이나 기사 팁을 원하시나요? 또한 모임이나 저희의 활동에 대해 자세히 알려드릴 수 있습니다. 무엇을 도와드릴까요?" |
다음 모임은 언제야? | "다음 모임은 4월 29일 오후 6시에 가상 행아웃에서 열릴 예정입니다. 이번 주제는 '온라인 워크숍: Dialogflow로 Google 작업 만들기'입니다. 뉴스레터를 통해 등록할 수 있습니다.도움이 더 필요한 사항은 없으신가요?" |
웹사이트의 URL을 입력하세요. | "www.womeninvoice.com을 통해 문의하실 수 있습니다. 도움이 더 필요한 사항은 없으신가요?” |
아니요, 괜찮습니다. | "알겠습니다. 정기 모임에서 뵙기를 기대하겠습니다." |
- Google 어시스턴트 시뮬레이터로 다시 전환
열기: https://console.actions.google.com
- 마이크 아이콘을 클릭하고 다음과 같이 질문하세요.
Talk to my test app.
- 이제 다음을 질문해 보겠습니다.
Can I have a tip for a blog?
이는 다음을 반환해야 합니다.
"챗봇, 음성 또는 둘 다에 관해 자세히 알아보고 싶으신가요?"
Chatbots
"알겠습니다. 오늘의 팁을 알려드리겠습니다. The Article 챗봇s And The Challenge Of Invisible Affordances of Cobus Greyling(코버스 그레이링의 보이지 않는 어포던스 문제 해결).
다른 도서나 기사 팁을 원하시나요? 또한 모임이나 저희의 활동에 대해 자세히 알려드릴 수 있습니다. 무엇을 도와드릴까요?"
- 같은 질문을 다른 버전으로 해 봅시다.
"Yes, I want to read more about Voice"
"알겠습니다. 오늘의 팁을 알려드리겠습니다. The Book Designing Voice 사용자 인터페이스: 대화형 환경의 원칙. ... 캐시 펄
다른 도서나 기사 팁을 원하시나요? 또한 모임이나 저희의 활동에 대해 자세히 알려드릴 수 있습니다. 무엇을 도와드릴까요?"
전에 Dialogflow에서 이 학습 문구를 사용한 적이 없다는 것을 알 수 있습니다. 바로 올바른 의도와 일치했습니다.
또한 Dialogflow를 계속 진행하기에 충분한 정보를 제공했으므로 후속 질문을 받지 못했습니다.
- 다음 문구를 사용하여 Dialogflow를 계속 진행합니다.
What's the URL for your website
Bye
오류, 로그를 확인하세요.
Cloud 함수 코드에서 console.log()
를 사용할 때마다 데이터가 GCP 로그 (Stackdriver)에 기록됩니다. Cloud 콘솔 > 로깅.
첫 번째 드롭다운에서 Cloud 함수 > 대화상자 플로우를 사용하여 로그를 필터링합니다.
8. 축하합니다
Dialogflow를 사용하여 첫 번째 Google 어시스턴트 작업을 만들었습니다. 수고하셨습니다.
눈치채셨겠지만 작업은 Google 계정에 연결된 테스트 모드에서 실행되었습니다. Nest 기기 또는 iOS나 Android 휴대전화의 Google 어시스턴트 앱에 동일한 계정으로 로그인하는 경우 작업을 테스트할 수도 있습니다.
이것은 워크숍 데모입니다. 하지만 실제로 Google 어시스턴트용 애플리케이션을 빌드하는 경우 승인을 위해 작업을 제출할 수 있습니다. 자세한 내용은 이 가이드를 읽어보세요.
학습한 내용
- Dialogflow v2로 챗봇을 만드는 방법
- Dialogflow로 커스텀 항목을 만드는 방법
- Dialogflow로 선형 대화를 만드는 방법
- Dialogflow 및 Google Cloud Functions로 웹훅 처리를 설정하는 방법
- Actions on Google을 통해 애플리케이션을 Google 어시스턴트로 가져오는 방법
다음 단계
이 Codelab에 만족하셨나요? 멋진 실습을 살펴보세요.