1. ภาพรวม
แพลตฟอร์มสำหรับนักพัฒนาแอปของ Google Assistant ช่วยให้คุณสร้างซอฟต์แวร์เพื่อขยายฟังก์ชันการทำงานของ Google Assistant ซึ่งเป็นผู้ช่วยส่วนตัวเสมือนจริงในอุปกรณ์กว่า 1 พันล้านเครื่อง ซึ่งรวมถึงลำโพงอัจฉริยะ โทรศัพท์ รถยนต์ ทีวี หูฟัง และอื่นๆ ผู้ใช้จะสนทนากับ Assistant เพื่อทำสิ่งต่างๆ เช่น ซื้อของชำหรือจองรถ ในฐานะนักพัฒนาแอป คุณสามารถใช้แพลตฟอร์มนักพัฒนาแอปของ Assistant เพื่อสร้างและจัดการประสบการณ์การสนทนาที่น่าพึงพอใจและมีประสิทธิภาพระหว่างผู้ใช้กับบริการจัดการคำสั่งซื้อของบุคคลที่สามของคุณเองได้อย่างง่ายดาย
Codelab นี้ครอบคลุมแนวคิดระดับกลางสำหรับการพัฒนาด้วย Google Assistant และต่อยอดจาก Action ที่สร้างขึ้นใน Codelab สร้าง Actions สำหรับ Google Assistant โดยใช้ Actions SDK (ระดับ 1) เราขอแนะนำอย่างยิ่งให้คุณทำ Codelab ระดับ 1 ให้เสร็จก่อนที่จะเริ่มทำ Codelab นี้
Action ที่คุณสร้างในโค้ดแล็บนี้จะบอกโชคชะตาของผู้ใช้ในการผจญภัยในดินแดนแห่งตำนานอย่างกริฟฟินเบิร์ก โดยอิงตามความช่วยเหลือที่ผู้ใช้เลือก
สิ่งที่คุณจะสร้าง
ในโค้ดแล็บนี้ คุณจะได้สร้างแอ็กชันการสนทนาที่ซับซ้อนซึ่งมีฟังก์ชันต่อไปนี้
- รวบรวมข้อมูลจากผู้ใช้ และแก้ไขพรอมต์การสนทนาตามค่า
- ตอบคำถามติดตามเพื่อสานต่อการสนทนา
- สร้างลูปเกมเพื่อให้ผู้ใช้โต้ตอบกับแอ็กชันได้อีกครั้งหลังจากได้รับคำทำนาย
ก่อนเริ่มสร้าง คุณสามารถโต้ตอบกับการดำเนินการที่ใช้งานจริงในอุปกรณ์ที่พร้อมใช้งาน Google Assistant ได้โดยพูดว่า "Ok Google คุยกับ Fate and Fortune" เส้นทางเริ่มต้นผ่านการดำเนินการนี้สำหรับผู้ใช้ที่กลับมาจะมีลักษณะเป็นการโต้ตอบต่อไปนี้


สิ่งที่คุณจะได้เรียนรู้
- วิธีใช้ช่องเพื่อรวบรวมข้อมูลจากผู้ใช้
- วิธีใช้เงื่อนไขเพื่อเพิ่มตรรกะลงในฉาก
- วิธีเพิ่ม Game Loop
- วิธีเพิ่มเส้นทางที่สนับสนุน
สิ่งที่คุณต้องมี
ข้อกำหนดเบื้องต้นสำหรับ Codelab นี้มีดังนี้
- IDE/โปรแกรมแก้ไขข้อความที่คุณเลือก
- เทอร์มินัลเพื่อเรียกใช้คำสั่งเชลล์โดยติดตั้ง NodeJS, npm และ git
- เว็บเบราว์เซอร์ เช่น Google Chrome
- โปรเจ็กต์ Actions Codelab ระดับ 1 ที่เสร็จสมบูรณ์
เราขอแนะนำอย่างยิ่งให้มีความคุ้นเคยกับ JavaScript (ES6) เพื่อให้เข้าใจโค้ดการดำเนินการตามคำสั่งสำหรับ Codelab นี้ แม้ว่าจะไม่จำเป็นก็ตาม
ไม่บังคับ: รับโค้ดตัวอย่าง
คุณเลือกรับโค้ดโปรเจ็กต์ระดับ 1 ที่สมบูรณ์ได้จากที่เก็บ GitHub ของ Codelab ระดับ 1 ของ Actions Builder เพื่อให้คุณทำตาม Codelab นี้ได้ นอกจากนี้ คุณยังดูโค้ดโปรเจ็กต์ระดับ 2 ทั้งหมดได้ในที่เก็บ Github นี้
2. สร้างอินเทอร์เฟซแบบสนทนาต่อไป
ใน Codelab แรก คุณได้สร้าง Conversational Action อย่างง่ายที่มีฉากเดียว Start
ใน Codelab นี้ คุณจะได้ขยายการสนทนาของ Action ในส่วนต่อไปนี้ คุณจะกำหนดค่า Action ให้ทำสิ่งต่อไปนี้
- เปลี่ยนไปใช้
Fortuneฉากใหม่เมื่อผู้ใช้ต้องการฟังคำทำนาย - ถามผู้ใช้ว่าต้องการเลือกความช่วยเหลือใดสำหรับการเดินทาง
- แสดงคำทำนายที่ปรับแต่งตามตัวเลือกของผู้ใช้
เปลี่ยนไปใช้และสร้างFortuneฉาก
ในส่วนนี้ คุณจะทำสิ่งต่อไปนี้
- นำพรอมต์ที่มีอยู่ออกจากฉาก
Startซึ่งตอบกลับผู้ใช้และจบการสนทนา - กำหนดการเปลี่ยนจากฉาก
StartไปยังฉากFortune - สร้าง
Fortuneฉาก
หากต้องการแก้ไขStartฉากและเพิ่มทรานซิชันไปยังFortuneฉาก ให้ทำตามขั้นตอนต่อไปนี้
- เปิดโปรเจ็กต์ Actions จากโค้ดแล็บระดับ 1 ในโปรแกรมแก้ไขข้อความ
- เปิดไฟล์
custom/scenes/Start.yaml - อัปเดต
handlerสำหรับเจตนาyesเพื่อให้โค้ดตรงกับข้อมูลโค้ดด้านล่าง
Start.yaml
intentEvents:
- intent: "yes"
transitionToScene: Fortune
- handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: I understand, stranger. Best of luck on your quest! Farewell.
intent: "no"
transitionToScene: actions.scene.END_CONVERSATION
- บันทึกไฟล์
หากต้องการสร้างฉากใหม่ชื่อ Fortune ให้ทำตามขั้นตอนต่อไปนี้
- ไปที่โปรเจ็กต์ Actions ของ Codelab ระดับ 1 ในเทอร์มินัล
- สร้างไฟล์ใหม่ชื่อ
Fortune.yamlในไดเรกทอรีscenes
touch custom/scenes/Fortune.yaml
คุณจะแก้ไขไฟล์นี้ได้ในส่วนถัดไป
กำหนดตรรกะการสนทนาสำหรับฉาก Fortune
ในโค้ดแล็บนี้ คุณจะกำหนดค่าFortuneฉากเพื่อถามผู้ใช้ว่า "คุณจะเลือกอะไรเพื่อช่วยในการผจญภัยของคุณ มังกร นักแปล หรือเข็มทิศ" คุณใช้ความสามารถที่เรียกว่าการป้อนข้อมูลในช่องเพื่อรวบรวมข้อมูลที่จำเป็นจากผู้ใช้ก่อนดำเนินการต่อได้
Action ของคุณจะให้คำทำนายสำหรับเครื่องช่วย 3 อย่าง ได้แก่ มังกร นักแปล และเข็มทิศ หากต้องการกำหนดค่า Action เพื่อระบุตัวเลือกทั้ง 3 นี้ในอินพุตของผู้ใช้ คุณต้องสร้างประเภทใหม่
คุณสามารถใช้ประเภทภายในขั้นตอนการเติมข้อมูลในช่องของฉากเพื่อกำหนดข้อมูลที่ต้องการจากผู้ใช้ เมื่อเครื่องมือ NLU ตรวจพบการจับคู่ช่องในอินพุตของผู้ใช้ ระบบจะดึงข้อมูลช่องเป็นพารามิเตอร์ที่พิมพ์ เพื่อให้คุณใช้ตรรกะกับช่องในฉากได้
สร้างประเภท available_options
ในส่วนนี้ คุณจะสร้างประเภทใหม่ที่ชื่อ available_options ซึ่งจะระบุตัวเลือก 3 รายการที่ผู้ใช้เลือกได้ (มังกร นักแปล และเข็มทิศ) เพื่อตอบกลับพรอมต์ นอกจากนี้ คุณยังกำหนดคำพ้องความหมายสำหรับตัวเลือกเหล่านี้ได้ในกรณีที่ผู้ใช้พูดสิ่งที่คล้ายกัน ในส่วนถัดไป คุณจะเพิ่มavailable_optionsประเภทลงในช่องเพื่อระบุว่าต้องการขอรับความยินยอมของผู้ใช้
หากต้องการสร้างavailable_options ให้ทำตามขั้นตอนต่อไปนี้
- สร้างไดเรกทอรีใหม่ชื่อ
typesโดยทำดังนี้
mkdir custom/types
- สร้างไฟล์ใหม่ชื่อ
available_options.yamlในไดเรกทอรีtypes
touch custom/types/available_options.yaml
- เปิด
custom/types/available_options.yamlในโปรแกรมแก้ไขข้อความ
ระบบจะกำหนดค่าประเภทเป็นคู่คีย์-ค่าของข้อมูล โดยที่คีย์คือชื่อของประเภท และค่าคือคำพ้องความหมายของคีย์นั้น เมื่อคุณกำหนดคีย์ ระบบจะเพิ่มคีย์นั้นเป็นค่าโดยอัตโนมัติ ใน Actions SDK คุณจะแสดงคีย์เป็น entities และค่าเป็น synonyms
หากต้องการเพิ่ม 3 ตัวเลือกที่ผู้ใช้เลือกได้ ให้ทำตามขั้นตอนต่อไปนี้
- เพิ่ม
entitiesและsynonymsต่อไปนี้ในไฟล์available_options.yaml
available_options.yaml
synonym:
entities:
dragon:
synonyms:
- dragon
- hydra
- lizard
translator:
synonyms:
- translator
- communicator
- machine
- decoder
- translate
compass:
synonyms:
- compass
- direction
- guide
- navigator
matchType: EXACT_MATCH
- บันทึกไฟล์
ตอนนี้ Action ของคุณเข้าใจแล้วว่า available_options คือมังกร นักแปล และเข็มทิศ และยังจดจำคำพ้องความหมายที่เกี่ยวข้องได้อีกด้วย
กำหนดค่าการป้อนข้อมูลในช่อง
จากนั้นคุณต้องกำหนดค่าการป้อนข้อมูลช่องในฉาก Fortune หากต้องการกำหนดค่าตรรกะการเติมช่อง ให้ทำตามขั้นตอนต่อไปนี้
- เปิด
custom/scenes/Fortune.yamlในโปรแกรมแก้ไขข้อความ - เพิ่มข้อมูล
slotsต่อไปนี้ลงในไฟล์Fortune.yaml
Fortune.yaml
slots:
- commitBehavior:
writeSessionParam: chosenOptions
name: chosenOptions
promptSettings:
initialPrompt:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: What do you choose to help you on your quest, a dragon, a translator, or a compass?
suggestions:
- title: Dragon
- title: Translator
- title: Compass
required: true
type:
name: available_options
- บันทึกไฟล์
ตอนนี้คุณได้เพิ่มประเภท available_options ลงในช่องแล้ว ซึ่งจะบอก Action ว่าคุณต้องรวบรวมข้อมูลใดจากผู้ใช้ (ตัวเลือกความช่วยเหลือของผู้ใช้) ก่อนดำเนินการต่อ นอกจากนี้ คุณยังกำหนดค่าพรอมต์ภายในช่อง ซึ่งจะเพิ่มลงในคิวพรอมต์เมื่อผู้ใช้ไปถึงขั้นตอนการกรอกข้อมูลในช่องของฉาก
เมื่อตั้งชื่อช่องว่า chosenOptions ระบบจะอัปเดตช่อง writeSessionsParam ด้วยชื่อเดียวกัน ($session.params.chosenOptions) คุณสามารถเข้าถึงพารามิเตอร์นี้ตามชื่อดังกล่าวในพรอมต์และในการดำเนินการตามคำสั่งผ่านคลังของไคลเอ็นต์
เพิ่มเงื่อนไข
ตอนนี้คุณได้เพิ่มช่องที่ต้องให้ผู้ใช้เลือกความช่วยเหลือแล้ว คุณสามารถเพิ่มเงื่อนไขเพื่อตรวจสอบว่าได้รับข้อมูลช่องแล้วก่อนที่ผู้ใช้จะสนทนาต่อได้
ในส่วนนี้ คุณจะเพิ่มเงื่อนไข scene.slots.status == "FINAL" ซึ่งจะตรวจสอบว่าการแสดงโฆษณาในช่องเสร็จสมบูรณ์แล้ว เมื่อช่องทั้งหมดเต็มแล้ว เงื่อนไขจะเพิ่มพรอมต์ (You picked $session.params.chosenOptions.) ลงในคิวพรอมต์
หากต้องการกำหนดค่าเงื่อนไข scene.slots.status == "FINAL" ให้ทำตามขั้นตอนต่อไปนี้
- เปิด
custom/scenes/Fortune.yamlในโปรแกรมแก้ไขข้อความ - เพิ่มข้อมูล
conditionalEventsที่ด้านบนของไฟล์Fortune.yaml
Fortune.yaml
conditionalEvents:
- condition: scene.slots.status == "FINAL"
handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: You picked $session.params.chosenOptions.
- บันทึกไฟล์
ทดสอบ Action ในเครื่องมือจำลอง
ตอนนี้คุณได้กำหนดตัวเลือกที่ผู้ใช้ควรเลือกเพื่อกรอกข้อมูลในช่องแล้ว หลังจากได้รับข้อมูลนี้จากผู้ใช้แล้ว แอ็กชันของคุณควรแสดงข้อความที่อ้างอิงถึงตัวเลือกที่ผู้ใช้เลือก
หากต้องการทดสอบแอ็กชัน ให้ทำตามขั้นตอนต่อไปนี้
- จากนั้นเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล
gactions deploy preview
คุณควรได้รับเอาต์พุตที่มีลักษณะดังนี้
✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
- คัดลอก URL ที่ระบุแล้ววางลงในเบราว์เซอร์
- คลิกหรือพิมพ์
Talk to my test appในช่องอินพุต แล้วกด Enter - พิมพ์
Yesในช่องป้อนข้อมูล แล้วกด Enter หรือจะคลิกชิปคำแนะนำใช่ก็ได้

- คลิก พิมพ์ หรือพูดว่า
dragonคุณควรได้รับข้อความแจ้งว่า "คุณเลือกมังกร"
ในส่วนถัดไป คุณจะปรับแต่งพรอมต์สำหรับความช่วยเหลือแต่ละอย่างที่ผู้ใช้เลือกได้
ปรับแต่งพรอมต์โดยใช้เงื่อนไข
ในส่วนนี้ คุณจะเพิ่มเงื่อนไขสำหรับแต่ละตัวเลือกที่ผู้ใช้เลือกได้ และเพิ่มพรอมต์ที่กำหนดเองสำหรับแต่ละเงื่อนไข
ปรับแต่งคำทำนาย dragon
หากต้องการอัปเดตเงื่อนไขและปรับแต่งพรอมต์เมื่อผู้ใช้เลือก "มังกร" ให้ทำตามขั้นตอนต่อไปนี้
- เปิด
custom/scenes/Fortune.yamlในโปรแกรมแก้ไขข้อความ - แทนที่ข้อมูล
conditionalEventsด้วยข้อมูลโค้ดต่อไปนี้ในไฟล์Fortune.yaml
Fortune.yaml
conditionalEvents:
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "dragon"
handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: The people of Gryffinberg will be awestruck by the beauty and
power of the ancient dragon. Much to your dismay, the townspeople
fall into dispute over who will receive the honor of riding the dragon
first. You return home from your quest without everlasting glory or
a dragon.
- บันทึกไฟล์
ตอนนี้เมื่อผู้ใช้พูดว่า "มังกร" หรือคำที่ฟังคล้ายกัน แอ็กชันของคุณจะให้คำทำนายตามตัวเลือกนั้น จากนั้นให้เพิ่มการเลือกอีก 2 รายการที่เหลือ
ปรับแต่งtranslatorและcompass
หากต้องการเพิ่มเงื่อนไขและปรับแต่งพรอมต์เมื่อผู้ใช้พูดว่า "นักแปล" หรือ "เข็มทิศ" ให้ทำตามขั้นตอนต่อไปนี้
- ในไฟล์
custom/scenes/Fortune.yamlให้เพิ่มอีก 2 เงื่อนไขภายใต้เงื่อนไขdragonดังนี้
Fortune.yaml
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "translator"
handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: With the help of the translator, the rival factions in Gryffinberg
are finally able to communicate with each other and resolve their
disputes. You will complete your quest to restore peace in the town.
The translator will be used on many other journeys across the
earth. After its work is done, it retires honorably to a premier location
in the Gryffinberg History Museum.
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "compass"
handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: The compass will help you find the mystical and ancient Library
of Gryffinberg. Among its infinite stacks of dusty books, you find
one entitled "Wisdom of the Ages". By the time you've read the 50,000-page
tome, the townspeople have forgotten their problems. You will write
a second edition of "Wisdom of the Ages", but have limited commercial
success.
- บันทึกไฟล์
ทดสอบ Action ในเครื่องมือจำลอง
ในขั้นตอนนี้ แอ็กชันควรให้คำทำนายที่ปรับแต่งสำหรับผู้ใช้ตามตัวเลือกที่ผู้ใช้เลือก
หากต้องการทดสอบแอ็กชัน ให้ทำตามขั้นตอนต่อไปนี้
- จากนั้นเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล
gactions deploy preview
คุณควรได้รับเอาต์พุตที่มีลักษณะดังนี้
✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
- คัดลอก URL ที่ระบุแล้ววางลงในเบราว์เซอร์
- พิมพ์
Talk to my test appในช่องป้อนข้อมูล แล้วกด Enter - พิมพ์ "ใช่" ในช่องป้อนข้อมูล แล้วกด Enter หรือคลิกชิปคำแนะนำใช่
- คลิก พิมพ์ หรือพูดว่า
Translator

คุณควรได้รับคำทำนายที่เหมาะสมสำหรับตัวเลือก "นักแปล"
3. เพิ่ม Game Loop
ในส่วนนี้ คุณจะกำหนดค่า Action เพื่อให้ผู้ใช้เลือกตัวเลือกอื่นและฟังคำทำนายอื่นได้หลังจากเลือกแล้ว การเปลี่ยนแปลงนี้คล้ายกับข้อความ "คุณต้องการเล่นอีกครั้งไหม" ที่ท้ายเกม หากต้องการสร้างลูปนี้ คุณสามารถใช้ Intent yes และ no ที่สร้างไว้ก่อนหน้านี้ซ้ำ แล้วเพิ่มลงในฉากใหม่ที่ชื่อ Again
สร้างAgainฉาก
ในส่วนนี้ คุณจะสร้างAgainฉากใหม่และเพิ่มพรอมต์ที่ถามผู้ใช้ว่าต้องการเลือกตัวเลือกอื่นหรือไม่
หากต้องการสร้างและกำหนดค่าฉาก Again ให้ทำตามขั้นตอนต่อไปนี้
- สร้างไฟล์ใหม่ชื่อ
Again.yamlในไดเรกทอรีscenes
touch custom/scenes/Again.yaml
- เปิด
custom/scenes/Again.yamlในโปรแกรมแก้ไขข้อความ - เพิ่มข้อมูล
onEnterต่อไปนี้ลงในAgain.yaml
Again.yaml
onEnter:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: That is what I see for you. Would you like to choose a different option and explore another future?
suggestions:
- title: "Yes"
- title: "No"
- บันทึกไฟล์
เพิ่มการเปลี่ยนจากฉาก Fortune ไปยังฉาก Again
หลังจากที่ผู้ใช้ได้รับคำทำนายแล้ว การสนทนาจะต้องเปลี่ยนไปเป็นฉาก Again ใหม่
หากต้องการเพิ่มทรานซิชันจากฉาก Fortune ไปยังฉาก Again ให้ทำตามขั้นตอนต่อไปนี้
- เปิด
custom/scenes/Fortune.yamlในโปรแกรมแก้ไขข้อความ - เพิ่ม
transitionToScene: Againในแต่ละเงื่อนไข ดังที่แสดงในข้อมูลโค้ดต่อไปนี้
Fortune.yaml
conditionalEvents:
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "dragon"
handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: The people of Gryffinberg will be awestruck by the beauty and
power of the ancient dragon. Much to your dismay, the townspeople
fall into dispute over who will receive the honor of riding the dragon
first. You return home from your quest without everlasting glory or
a dragon.
transitionToScene: Again
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "translator"
handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: With the help of the translator, the rival factions in Gryffinberg
are finally able to communicate with each other and resolve their
disputes. You will complete your quest to restore peace in the town.
The translator will be used on many other journeys across the
earth. After its work is done, it retires honorably to a premier location
in the Gryffinberg History Museum.
transitionToScene: Again
- condition: scene.slots.status == "FINAL" && session.params.chosenOptions == "compass"
handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: The compass will help you find the mystical and ancient Library
of Gryffinberg. Among its infinite stacks of dusty books, you find
one entitled "Wisdom of the Ages". By the time you've read the 50,000-page
tome, the townspeople have forgotten their problems. You will write
a second edition of "Wisdom of the Ages", but have limited commercial
success.
transitionToScene: Again
- บันทึกไฟล์
ทดสอบ Action ในเครื่องมือจำลอง
ในขั้นตอนนี้ แอ็กชันของคุณควรแสดงข้อความแจ้งต่อไปนี้แก่ผู้ใช้หลังจากที่ได้รับคำทำนาย "นั่นคือสิ่งที่ฉันเห็นสำหรับคุณ คุณต้องการเลือกตัวเลือกอื่นและสำรวจอนาคตอีกแบบไหม"
หากต้องการทดสอบแอ็กชัน ให้ทำตามขั้นตอนต่อไปนี้
- จากนั้นเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล
gactions deploy preview
คุณควรได้รับเอาต์พุตที่มีลักษณะดังนี้
✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
- คัดลอก URL ที่ระบุแล้ววางลงในเบราว์เซอร์
- พิมพ์
Talk to my test appในช่องป้อนข้อมูล แล้วกด Enter - พิมพ์
Yesในช่องป้อนข้อมูล แล้วกด Enter หรือคลิกชิปคำแนะนำใช่ - คลิก พิมพ์ หรือพูดว่า
dragon

คุณควรได้รับคำทำนายสำหรับตัวเลือกมังกรและพรอมต์ Again
เพิ่มความตั้งใจและเปลี่ยนไปที่ฉาก Again
ในส่วนนี้ คุณจะเพิ่มเจตนา yes และ no ลงในฉาก Again เพื่อให้ Action เข้าใจว่าผู้ใช้ต้องการเลือกตัวเลือกใหม่หรือไม่ นอกจากนี้ คุณยังเพิ่มทรานซิชันที่เหมาะสมสำหรับความตั้งใจ yes และ no ได้ด้วย เจตนา yes จะเปลี่ยนไปเป็นฉาก Fortune ส่วนเจตนา no จะเปลี่ยนไปเป็นฉากของระบบ End conversation
หากต้องการเพิ่ม Intent และการเปลี่ยนฉากไปยังAgainฉาก ให้ทำตามขั้นตอนต่อไปนี้
- เปิด
custom/scenes/Again.yamlในโปรแกรมแก้ไขข้อความ - เพิ่ม
intentEventsข้อมูลที่ด้านบนของไฟล์Again.yamlเหนือOnEnterดังนี้
Again.yaml
intentEvents:
- intent: "yes"
transitionToScene: Fortune
- handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: It pleases me that you are satisfied with your choice. Best
of luck on your quest. Farewell.
intent: "no"
transitionToScene: actions.scene.END_CONVERSATION
- บันทึกไฟล์
ทดสอบ Action ในเครื่องมือจำลอง
ตอนนี้ Action ของคุณควรเข้าใจแล้วว่าผู้ใช้ต้องการเลือกตัวเลือกใหม่หรือสิ้นสุดการสนทนา
หากต้องการทดสอบ yes เจตนา ให้ทำตามขั้นตอนต่อไปนี้
- จากนั้นเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล
gactions deploy preview
คุณควรได้รับเอาต์พุตที่มีลักษณะดังนี้
✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
- คัดลอก URL ที่ระบุแล้ววางลงในเบราว์เซอร์
- พิมพ์
Talk to my test appในช่องป้อนข้อมูล แล้วกด Enter - พิมพ์
Yesในช่องป้อนข้อมูล แล้วกด Enter หรือคลิกชิปคำแนะนำใช่ - คลิก พิมพ์ หรือพูดตัวเลือกใดตัวเลือกหนึ่ง
- พิมพ์
Yesในช่องป้อนข้อมูล แล้วกด Enter

คุณควรได้รับข้อความแจ้งว่า "คุณจะเลือกอะไรเป็นผู้ช่วยในการผจญภัยครั้งนี้ มังกร นักแปล หรือเข็มทิศ"
หากต้องการทดสอบ no เจตนา ให้ทำตามขั้นตอนต่อไปนี้
- คลิก พิมพ์ หรือพูดตัวเลือกใดตัวเลือกหนึ่ง
- พิมพ์
Noในช่องป้อนข้อมูล แล้วกด Enter
คุณควรได้รับข้อความแจ้ง End conversation: "ฉันยินดีที่คุณพอใจกับตัวเลือกของคุณ ขอให้โชคดีกับการผจญภัย ลาก่อน"
4. เพิ่มเส้นทางที่สนับสนุน
ตอนนี้คุณได้สร้างเส้นทางหลักที่ผู้ใช้ส่วนใหญ่ใช้ใน Action แล้ว อย่างไรก็ตาม ผู้ใช้สามารถตอบกลับพรอมต์จากFortuneฉาก "คุณจะเลือกอะไรเพื่อช่วยในการผจญภัยของคุณ มังกร นักแปล หรือเข็มทิศ" ด้วยตัวเลือกที่ไม่ได้อยู่ในตัวเลือกที่ระบุไว้
ในส่วนนี้ คุณจะกำหนดค่า Action เพื่อให้เข้าใจเมื่อผู้ใช้พูดว่า "magic", "money", "horse" หรือ "phone" และเพื่อแจ้งให้ผู้ใช้เลือกจาก 3 ตัวเลือกเดิมอีกครั้งเมื่อเลือกตัวเลือกเหล่านี้ หากต้องการกำหนดค่าตรรกะนี้ คุณต้องสร้าง type ใหม่ที่มีตัวเลือกอื่นๆ เหล่านี้และเจตนาใหม่ other_option ซึ่งจะตรงกันเมื่อผู้ใช้พูดตัวเลือกใดตัวเลือกหนึ่ง นอกจากนี้ คุณยังต้องใส่คำอธิบายประกอบวลีการฝึกภายในother_optionเจตนาเพื่อระบุและแยกพารามิเตอร์เจตนา
เมื่อเครื่องมือประมวลผลภาษาธรรมชาติของ Assistant ตรวจพบพารามิเตอร์ที่ตรงกันในอินพุตของผู้ใช้ ระบบจะดึงค่าออกมาเป็นพารามิเตอร์ที่พิมพ์เพื่อให้คุณใช้ตรรกะกับค่าดังกล่าวในฉากได้ ในโค้ดแล็บนี้ คุณจะกำหนดค่า Action เพื่อดึงความช่วยเหลือที่ผู้ใช้เลือกและอ้างอิงถึงตัวเลือกนั้นในพรอมต์
สร้างประเภท unavailable_options
ตอนนี้คุณสร้างunavailable_optionsประเภทที่มีตัวเลือกต่างๆ ได้แล้ว เพื่อให้ Action ระบุข้อมูลนั้นในอินพุตของผู้ใช้ได้
หากต้องการสร้างunavailable_options ให้ทำตามขั้นตอนต่อไปนี้
- สร้างไฟล์ใหม่ชื่อ
unavailable_options.yamlในไดเรกทอรีtypes
touch custom/types/unavailable_options.yaml
- เปิด
custom/types/unavailable_options.yamlในโปรแกรมแก้ไขข้อความ - เพิ่มข้อมูล
synonymsต่อไปนี้ลงในไฟล์unavailable_options.yaml
unavailable_options.yaml
synonym:
entities:
money:
synonyms:
- money
- cash
- gold
horse:
synonyms:
- horse
- stallion
- steed
magic:
synonyms:
- magic
- enchanted
- spells
phone:
synonyms:
- phone
- cell
- apps
matchType: EXACT_MATCH
- บันทึกไฟล์
สร้างเจตนา other_option
จากนั้นสร้างความตั้งใจชื่อ other_option แล้วเพิ่มวลีฝึกที่มีตัวเลือกในประเภท unavailable_options ระบบจะจับคู่อินเทนต์นี้เมื่อผู้ใช้เลือกตัวเลือกที่มีอยู่ในunavailable_optionsประเภท
หากต้องการสร้างและกำหนดค่าเจตนา other_option ให้ทำตามขั้นตอนต่อไปนี้
- สร้างไฟล์ใหม่ชื่อ
other_option.yamlในไดเรกทอรีintents
touch custom/intents/other_option.yaml
- เปิด
custom/intents/other_option.yamlในโปรแกรมแก้ไขข้อความ - เพิ่มข้อมูล
parametersและข้อมูลtrainingPhrasesต่อไปนี้ลงในไฟล์other_option.yaml
other_option.yaml
parameters:
- name: chosenUnavailableOption
type:
name: unavailable_options
trainingPhrases:
- I want to use ($chosenUnavailableOption 'spells' auto=true)
- I really really want to use a ($chosenUnavailableOption 'phone' auto=true)
- ($chosenUnavailableOption 'magic' auto=true)!
- ($chosenUnavailableOption 'cash' auto=true)
- I want to ride a ($chosenUnavailableOption 'horse' auto=true)
ในส่วนนี้ คุณจะใส่คำอธิบายประกอบวลีการฝึกด้วยตนเองโดยใช้ตัวเลือกที่ไม่พร้อมใช้งานซึ่งคุณระบุไว้ในส่วนก่อนหน้า พารามิเตอร์ Intent chosenUnavailableOption ช่วยให้คุณดึงชื่อของตัวเลือกและใช้ตัวเลือกนั้นในพรอมต์ได้ ซึ่งคุณจะทำในส่วนต่อไปนี้
- บันทึกไฟล์
เพิ่มความตั้งใจ other_option ไปยังFortune ฉาก
ตอนนี้คุณมี Intent other_option ที่สามารถจัดการกับผู้ใช้ที่ระบุตัวเลือกที่ไม่ใช่ตัวเลือกเดิม ในส่วนนี้ คุณจะเพิ่มความตั้งใจ other_option ลงในฉาก Fortune คุณใช้พารามิเตอร์ความตั้งใจเพื่อปรับแต่งพรอมต์ตามอินพุตของผู้ใช้
หากต้องการเพิ่มเจตนา other_option ลงในฉาก Fortune ให้ทำตามขั้นตอนต่อไปนี้
- เปิด
custom/scenes/Fortune.yamlในโปรแกรมแก้ไขข้อความ - เพิ่ม
intentEventsข้อมูลต่อไปนี้ระหว่างข้อมูลconditionalEventsและข้อมูลslots
Fortune.yaml
intentEvents:
- handler:
staticPrompt:
candidates:
- promptResponse:
firstSimple:
variants:
- speech: I have seen the future and a $intent.params.chosenUnavailableOption.original will not aid you on your journey.
intent: other_option
- บันทึกไฟล์
นิพจน์ $intent.params.chosenUnavailableOption หมายถึงออบเจ็กต์พารามิเตอร์ของ Intent และ $intent.params.chosenUnavailableOption.original หมายถึงค่าของออบเจ็กต์นั้น พร็อพเพอร์ตี้ original หมายถึงอินพุตดิบที่ผู้ใช้ระบุ
เมื่อผู้ใช้พูดตัวเลือกที่แสดงในunavailable_optionsประเภทระหว่างFortuneฉาก ระบบจะจับคู่other_optionเจตนาและเพิ่มพรอมต์ลงในคิวพรอมต์ เนื่องจากไม่ได้ระบุการเปลี่ยนฉากไว้ ลูปการเรียกใช้ฉากจึงดำเนินต่อไปโดยการประเมินขั้นตอนเงื่อนไขอีกครั้ง จากนั้นช่อง chosenOptions จะเพิ่มพรอมต์ลงในคิวพรอมต์ และระบบจะส่งคิวพรอมต์ไปยังผู้ใช้
ทดสอบ Action ในเครื่องมือจำลอง
ตอนนี้ Action ของคุณควรตอบสนองอย่างเหมาะสมเมื่อผู้ใช้เลือกตัวเลือกใดตัวเลือกหนึ่งที่แสดงในunavailable_optionsประเภท และระบุว่าผู้ใช้เลือกความช่วยเหลือใด จากนั้น Action ของคุณควรแจ้งให้ผู้ใช้เลือกตัวเลือกเดิมอีกครั้ง (มังกร นักแปล หรือเข็มทิศ)
หากต้องการทดสอบ Action ในเครื่องจำลอง ให้ทำตามขั้นตอนต่อไปนี้
- จากนั้นเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล
gactions deploy preview
คุณควรได้รับเอาต์พุตที่มีลักษณะดังนี้
✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
- คัดลอก URL ที่ระบุแล้ววางลงในเบราว์เซอร์
- พิมพ์
Talk to my test appในช่องป้อนข้อมูล แล้วกด Enter - พิมพ์
Yesในช่องป้อนข้อมูล แล้วกด Enter หรือคลิกชิปคำแนะนำใช่ - พิมพ์
magicในช่องป้อนข้อมูล แล้วกด Enter

คุณอาจสังเกตเห็นว่าพรอมต์ฟังดูไม่ถูกต้องเมื่อผู้ใช้เลือก "magic" เนื่องจากมีคำนำหน้า "a" อยู่ก่อนหน้า คุณแก้ไขปัญหานี้ได้ในส่วนต่อไปนี้
เพิ่มแฮนเดิล unavailable_options
หากต้องการวางคำนำหน้า "a" ไว้หน้าตัวเลือกที่เหมาะสมจากunavailable_optionsประเภท คุณสามารถกำหนดค่าตัวแฮนเดิลเหตุการณ์ในตรรกะการจำหน่ายเพื่อตรวจสอบว่าตัวเลือกที่ผู้ใช้เลือกต้องมี "a" นำหน้าหรือไม่ ก่อนอื่น คุณต้องกำหนดค่า Action เพื่อเรียกแฮนเดิลจากฉาก Fortune
หากต้องการเพิ่มตัวแฮนเดิล unavailable_options ลงในฉาก Fortune ให้ทำตามขั้นตอนต่อไปนี้
- เปิด
custom/scenes/Fortune.yamlในโปรแกรมแก้ไขข้อความ - อัปเดตไฟล์
Fortune.yamlด้วยข้อมูลintentEventsต่อไปนี้
Fortune.yaml
intentEvents:
- handler:
webhookHandler: unavailable_options
intent: other_option
- บันทึกไฟล์
อัปเดตและติดตั้งใช้งานการดำเนินการตามคำสั่งซื้อ
ตอนนี้คุณได้กำหนดค่า Action ให้เรียกใช้ตัวแฮนเดิลเหตุการณ์ unavailable_options แล้ว คุณสามารถอัปเดตตัวแฮนเดิลในการดำเนินการตามคำสั่งและนำไปใช้งานได้
หากต้องการอัปเดตการปฏิบัติตามข้อกำหนด ให้ทำตามขั้นตอนต่อไปนี้
- เปิด
webhooks/ActionsOnGoogleFulfillment/index.jsในโปรแกรมแก้ไขข้อความ - เพิ่มโค้ดต่อไปนี้ลงใน
index.jsภายในแฮนเดิลgreeting
index.js
app.handle('unavailable_options', conv => {
const option = conv.intent.params.chosenUnavailableOption.original;
const optionKey = conv.intent.params.chosenUnavailableOption.resolved;
let message = 'I have seen the future and ';
if(optionsNeedA.has(optionKey)){
message = message + 'a ';
}
message = message + `${option} will not aid you on your journey. `;
conv.add(message);
});
- เพิ่มโค้ดต่อไปนี้ในส่วน
const app = conversation({debug:true});
index.js
const optionsNeedA = new Set();
optionsNeedA.add('horse').add('phone');
- บันทึกไฟล์
ทำความเข้าใจโค้ด
ตัวแฮนเดิล unavailable_options จะทำสิ่งต่อไปนี้
- รับ
optionจากออบเจ็กต์convและกําหนดoptionให้กับพร็อพเพอร์ตี้originalซึ่งเป็นอินพุตดิบจากผู้ใช้ - กำหนด
optionKeyให้กับพร็อพเพอร์ตี้resolvedซึ่งเป็นคีย์สำหรับประเภทunavailable_options - ตรวจสอบว่า
optionKeyเป็นหนึ่งในตัวเลือกที่ต้องมี "a" หรือไม่ หากใช่ ให้สร้างข้อความโดยเพิ่ม "a" - เพิ่มข้อความผ่าน
conv.add(message)
ตัวแฮนเดิลการอัปเดต
หากต้องการอนุญาตให้ Action ใช้ unavailable_options ให้เพิ่มตัวแฮนเดิล unavailable_options ไปยัง webhooks/ActionsOnGoogleFulfillment.yaml
- เพิ่มชื่อตัวแฮนเดิล
unavailable_optionsลงในActionsOnGoogleFulfillment.yamlโดยทำดังนี้
ActionsOnGoogleFulfillment.yaml
handlers: - name: greeting - name: unavailable_options inlineCloudFunction: executeFunction: ActionsOnGoogleFulfillment
- บันทึกไฟล์
ทดสอบ Action ในเครื่องมือจำลอง
ตอนนี้ Action ของคุณควรปรับพรอมต์ตามว่าตัวเลือกของผู้ใช้จากunavailable_optionsประเภทนั้นต้องมีคำว่า "a" นำหน้าหรือไม่
หากต้องการทดสอบแอ็กชัน ให้ทำตามขั้นตอนต่อไปนี้
- จากนั้นเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล
gactions deploy preview
คุณควรได้รับเอาต์พุตที่มีลักษณะดังนี้
✔ Done. You can now test your changes in Simulator with this URL: http://console.actions.google.com/project/{project-id}/simulator?disableAutoPreview
- คัดลอก URL ที่ระบุแล้ววางลงในเบราว์เซอร์
- คลิกหรือพิมพ์
Talk to my test appในช่องอินพุต แล้วกด Enter - พิมพ์
Yesในช่องป้อนข้อมูล แล้วกด Enter หรือคลิกชิปคำแนะนำใช่ - พิมพ์
magicในช่องป้อนข้อมูล แล้วกด Enter จากนั้นพิมพ์horseในช่องป้อนข้อมูล แล้วกด Enter

Action ของคุณควรเพิ่มคำนำหน้า "a" ก่อนตัวเลือก "ม้า" ขณะสร้างพรอมต์โดยไม่มีคำนำหน้า "a" สำหรับตัวเลือก "เวทมนตร์"
5. แสดงภาพการดำเนินการในคอนโซล Actions
Actions SDK สามารถทำงานร่วมกับ IDE บนเว็บที่เรียกว่า Actions Builder ซึ่งผสานรวมเข้ากับคอนโซล Actions คุณสามารถพุชระบบไฟล์ในเครื่องไปยังฉบับร่างของ Action ในคอนโซลได้ด้วยคำสั่ง gactions push คอนโซล Actions จะแสดงการกำหนดค่าของ Action ในรูปแบบภาพ การเห็นการแมปการดำเนินการในรูปแบบภาพอาจมีประโยชน์ในระหว่างการพัฒนา และไม่ส่งผลต่อเวอร์ชันของ Action ที่แสดงสำหรับการทดสอบ
หากต้องการพุชโปรเจ็กต์ Actions และดูในคอนโซล Actions ให้ทำตามขั้นตอนต่อไปนี้
- ในเทอร์มินัล ให้เรียกใช้คำสั่งต่อไปนี้เพื่อพุชโปรเจ็กต์ไปยังคอนโซล Actions
gactions push
คุณควรได้รับเอาต์พุตที่มีลักษณะดังนี้
✔ Done. Files were pushed to Actions Console, and you can now view your project with this URL: https://console.actions.google.com/project/{project-id}/overview. If you want to test your changes, run "gactions deploy preview", or navigate to the Test section in the Console.
- คัดลอก URL ที่ระบุแล้ววางลงในเบราว์เซอร์
- ในคอนโซล Actions ให้คลิกพัฒนาในแถบนำทางด้านบน
- คลิกลูกศรเมนูแบบเลื่อนลงข้างฉาก แล้วคลิกเริ่ม คุณควรเห็นภาพแทนฉาก
Startของการดำเนินการ ดังที่แสดงในภาพหน้าจอต่อไปนี้

ล้างข้อมูลโปรเจ็กต์ [แนะนำ]
ขอแนะนำให้นำโปรเจ็กต์ที่คุณไม่ได้ตั้งใจจะใช้ออกเพื่อหลีกเลี่ยงค่าใช้จ่ายที่อาจเกิดขึ้น หากต้องการลบโปรเจ็กต์ที่คุณสร้างในโค้ดแล็บนี้ ให้ทำตามขั้นตอนต่อไปนี้
- หากต้องการลบโปรเจ็กต์และทรัพยากรในระบบคลาวด์ ให้ทำตามขั้นตอนที่ระบุไว้ในส่วนการปิด (ลบ) โปรเจ็กต์
- ไม่บังคับ: หากต้องการนำโปรเจ็กต์ออกจาก Actions Console ทันที ให้ทำตามขั้นตอนที่ระบุไว้ในส่วนลบโปรเจ็กต์ หากไม่ทำขั้นตอนนี้ให้เสร็จสมบูรณ์ ระบบจะนำโปรเจ็กต์ของคุณออกโดยอัตโนมัติหลังจากผ่านไปประมาณ 30 วัน
6. ยินดีด้วย
ตอนนี้คุณก็มีความรู้ระดับกลางที่จำเป็นต่อการสร้างการทำงานสำหรับ Google Assistant ด้วย Actions SDK แล้ว
สิ่งที่คุณครอบคลุม
- วิธีพัฒนาการกระทำแบบสนทนาโดยใช้ไลบรารีการจัดการคำขอของ Node.js
- วิธีใช้ช่องเพื่อรวบรวมข้อมูลจากผู้ใช้
- วิธีใช้เงื่อนไขเพื่อเพิ่มตรรกะลงในฉาก
- วิธีเพิ่ม Game Loop
- วิธีเพิ่มเส้นทางที่สนับสนุน
ดูข้อมูลเพิ่มเติม
คุณสามารถสำรวจแหล่งข้อมูลต่อไปนี้เพื่อดูข้อมูลเกี่ยวกับการสร้างการทำงานสำหรับ Google Assistant
- เอกสารประกอบสำหรับการพัฒนาการทำงานสำหรับ Google Assistant
- หน้า GitHub ของ Actions on Google สำหรับโค้ดตัวอย่างและไลบรารี
- ชุมชน Reddit อย่างเป็นทางการสำหรับนักพัฒนาแอปที่ทำงานร่วมกับ Google Assistant
- หลักเกณฑ์การออกแบบการสนทนาสำหรับแนวทางปฏิบัติแนะนำและหลักเกณฑ์เกี่ยวกับ Conversational Action
ติดตามเราบน Twitter ที่ @ActionsOnGoogle เพื่อรับทราบประกาศล่าสุดของเรา และทวีตถึง #AoGDevs เพื่อแชร์สิ่งที่คุณสร้างขึ้น
แบบสำรวจความคิดเห็น
ก่อนจากกัน โปรดกรอกแบบสำรวจสั้นๆ เกี่ยวกับประสบการณ์ของคุณ