Dialogflow CX ๋ฉ”์‹ ์ €

์ด๋ฒˆ ํ†ตํ•ฉ์€ ์›น์‚ฌ์ดํŠธ์— ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๋งž์ถค์„ค์ • ๊ฐ€๋Šฅํ•œ ์—์ด์ „ํŠธ์šฉ ์ฑ„ํŒ… ๋Œ€ํ™”์ƒ์ž๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Dialogflow ๋ฉ”์‹ ์ € ์Šคํฌ๋ฆฐ์ƒท

์„ค์ •

์ด ํ†ตํ•ฉ์€ ์ธ์ฆ๋˜๊ฑฐ๋‚˜ ์ธ์ฆ๋˜์ง€ ์•Š์€ ์ตœ์ข… ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ ์ฟผ๋ฆฌ ์•ก์„ธ์Šค๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ์ฆ๋˜์ง€ ์•Š์€ ์„ค์ •

Dialogflow CX ๋ฉ”์‹ ์ € ์—์ด์ „ํŠธ์— ๋ฌด๋‹จ ์•ก์„ธ์Šค๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. Dialogflow CX ์ฝ˜์†”๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. Google Cloud ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. ์—์ด์ „ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ด€๋ฆฌ ํƒญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  5. ์™ผ์ชฝ ์‚ฌ์ด๋“œ๋ฐ” ๋ฉ”๋‰ด์—์„œ ํ†ตํ•ฉ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  6. Dialogflow CX ๋ฉ”์‹ ์ €์—์„œ ์—ฐ๊ฒฐ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  7. ๊ตฌ์„ฑ ๋Œ€ํ™”์ƒ์ž๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค.
  8. ์ด์ „์— ์ด ์—์ด์ „ํŠธ์— ๋Œ€ํ•œ ํ†ตํ•ฉ์„ ์„ค์ •ํ•œ ๊ฒฝ์šฐ ์‚ฝ์ž… ๊ฐ€๋Šฅํ•œ HTML ์ฝ”๋“œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ธ์ฆ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ๋Œ€ํ™”์ƒ์ž ํ•˜๋‹จ์—์„œ ์‚ฌ์šฉ ์ค‘์ง€... ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ์„ค์ •์„ ๋‹ค์‹œ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  9. ํ™˜๊ฒฝ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  10. ์ธ์ฆ๋˜์ง€ ์•Š์€ API๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  11. ์Šคํƒ€์ผ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  12. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋„๋ฉ”์ธ ์•ก์„ธ์Šค๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
  13. ์ธ์ฆ๋˜์ง€ ์•Š์€ API ์‚ฌ์šฉ ์„ค์ •์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  14. ๋Œ€ํ™”์ƒ์ž์— ์›น์‚ฌ์ดํŠธ์— ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฝ์ž… ๊ฐ€๋Šฅํ•œ HTML ์ฝ”๋“œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  15. ์™„๋ฃŒ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ๋œ ์„ค์ •

Dialogflow CX ๋ฉ”์‹ ์ € ์—์ด์ „ํŠธ์— ์ธ์ฆ๋œ ์•ก์„ธ์Šค๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. Dialogflow CX ์ฝ˜์†”๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. Google Cloud ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. ์—์ด์ „ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ด€๋ฆฌ ํƒญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  5. ์™ผ์ชฝ ์‚ฌ์ด๋“œ๋ฐ” ๋ฉ”๋‰ด์—์„œ ํ†ตํ•ฉ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  6. Dialogflow CX ๋ฉ”์‹ ์ €์—์„œ ์—ฐ๊ฒฐ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  7. ๊ตฌ์„ฑ ๋Œ€ํ™”์ƒ์ž๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค.
  8. ์ด์ „์— ์ด ์—์ด์ „ํŠธ์— ๋Œ€ํ•œ ํ†ตํ•ฉ์„ ์„ค์ •ํ•œ ๊ฒฝ์šฐ ์‚ฝ์ž… ๊ฐ€๋Šฅํ•œ HTML ์ฝ”๋“œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ธ์ฆ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ๋Œ€ํ™”์ƒ์ž ํ•˜๋‹จ์—์„œ ์‚ฌ์šฉ ์ค‘์ง€... ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ์„ค์ •์„ ๋‹ค์‹œ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  9. ํ™˜๊ฒฝ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  10. ์Šน์ธ๋œ API๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  11. ์Šคํƒ€์ผ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  12. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋„๋ฉ”์ธ ์•ก์„ธ์Šค๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
  13. ์Šน์ธ๋œ API ์‚ฌ์šฉ ์„ค์ •์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  14. ๋Œ€ํ™”์ƒ์ž์— ์›น์‚ฌ์ดํŠธ์— ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฝ์ž… ๊ฐ€๋Šฅํ•œ HTML ์ฝ”๋“œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  15. ์™„๋ฃŒ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  16. OAuth ํด๋ผ์ด์–ธํŠธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    1. ์กฐ์ง์˜ OAuth ๋™์˜ ํ™”๋ฉด์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ•„์ˆ˜ ๋ฒ”์œ„๋กœ https://www.googleapis.com/auth/cloud-platform์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    2. OAuth 2.0 ํด๋ผ์ด์–ธํŠธ ID๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์Šน์ธ๋œ JavaScript ์ถœ์ฒ˜์—์„œ ์—์ด์ „ํŠธ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๊ณ  ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” HTTP ์ถœ์ฒ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด https://your-company.com์ž…๋‹ˆ๋‹ค.
    3. ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ์—์ด์ „ํŠธ๋ฅผ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ตœ์ข… ์‚ฌ์šฉ์ž ๋˜๋Š”๊ทธ๋ฃน์„ Dialogflow API ํด๋ผ์ด์–ธํŠธ ๋ฐ ์„œ๋น„์Šค ์‚ฌ์šฉ๋Ÿ‰ ์†Œ๋น„์ž ์—ญํ• ์ด ์žˆ๋Š” ์ฃผ ๊ตฌ์„ฑ์›์œผ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์‚ฝ์ž…

์œ„์—์„œ ๋ณต์‚ฌํ•œ ์‚ฝ์ž… ์ฝ”๋“œ๋ฅผ ์›น์‚ฌ์ดํŠธ์˜ ์›นํŽ˜์ด์ง€์— ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค. <script> ๋ฐ <df-messenger> HTML ์š”์†Œ๋Š” ํŽ˜์ด์ง€์˜ <body> ์š”์†Œ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ๋œ ํ†ตํ•ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ <df-messenger>์˜ oauth-client-id ์†์„ฑ์„ Oauth ํด๋ผ์ด์–ธํŠธ ID๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ ์ธ์ฆ์— ์ตœ์ข… ์‚ฌ์šฉ์ž์˜ ID๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์›ํ•˜๋Š” ์ด๋ฆ„์œผ๋กœ access-token-name ์†์„ฑ์„ ์„ค์ •ํ•˜์„ธ์š”. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋„๊ตฌ ์ธ์ฆ์— ๊ฐ’์ด $session.params.ACCESS_TOKEN_NAME์ธ Bearer ํ† ํฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ์†์„ฑ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ์„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด <head> ์š”์†Œ์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

<meta name="viewport" content="width=device-width, initial-scale=1">

๋งž์ถค์„ค์ •

์ฑ„ํŒ… ๋Œ€ํ™”์ƒ์ž์˜ ๋ชจ์–‘๊ณผ ๋™์ž‘์— ์˜ํ–ฅ์„ ์ฃผ๊ธฐ ์œ„ํ•ด ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ HTML ๋งž์ถค์„ค์ • ๋ฐ CSS ๋งž์ถค์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.

JavaScript

์ฑ„ํŒ… ๋Œ€ํ™”์ƒ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ JavaScript ์ด๋ฒคํŠธ ๋ฐ JavaScript ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ

๋‹ค์Œ ์˜ˆ์‹œ๋Š” HTML ๋งž์ถค์„ค์ •, CSS ๋งž์ถค์„ค์ •, JavaScript ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
  <meta http-equiv="Pragma" content="no-cache" />
  <meta http-equiv="Expires" content="0" />
  <title>My chat</title>
  <style>
    df-messenger {
      /*
       * Customize as required. df-messenger will fill the
       * space that is provided.
      */
      position: absolute;
      right: 0;
      top: 0;
      bottom: 0;
      width: 320px;
    }
  </style>
  <script src="https://www.gstatic.com/dialogflow-console/fast/df-messenger/prod/v1/df-messenger.js"></script>
</head>
<body>
<df-messenger
    location="global" <!-- TODO: update agent location as needed -->
    project-id="my-project-id" <!-- TODO: update project ID -->
    agent-id="my-agent-id" <!-- TODO: update agent ID -->
    language-code="en" <!-- TODO: update agent language as needed -->
>
  <df-messenger-chat
      chat-title="Agent Name" <!-- TODO: update dialog title as needed -->
  ></df-messenger-chat>
</df-messenger>

<script>
  // An example of handling events: Navigate to the first suggested URL.
  document.addEventListener('df-url-suggested', (event) => {
    if (Array.isArray(event.detail.suggestedUrls) &&
      event.detail.suggestedUrls.length) {
      window.location.href = event.detail.suggestedUrls[0];
  }
});
</script>
</body>
</html>

Fulfillment

์ƒ๋‹ด์‚ฌ ์‘๋‹ต์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ fulfillment response types์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‘๋‹ต ํ”ผ๋“œ๋ฐฑ

๋งŒ์•ฝ ์‘๋‹ต ํ”ผ๋“œ๋ฐฑ์ด ์‚ฌ์šฉ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด, ์ฑ„ํŒ… ๋Œ€ํ™”์ƒ์ž์— ์ข‹์•„์š” ๋ฐ ์‹ซ์–ด์š” ๋ฒ„ํŠผ์ด ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์— ๊ธฐ๋ณธ์œผ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋Œ€ํ™” ์ค‘ ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์ด ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์—์ด์ „ํŠธ ์‘๋‹ต์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์‹ซ์–ด์š”๋ฅผ ์„ ํƒํ•  ๋•Œ๋Š” ๋ถ€์ •์ ์ธ ์˜๊ฒฌ์„ ๋ณด๋‚ด๋Š” ์ด์œ ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ํ”ผ๋“œ๋ฐฑ ๊ตฌ์„ฑ์š”์†Œ

์ปค์Šคํ…€ ํ”ผ๋“œ๋ฐฑ ์š”์†Œ๋ฅผ ์ง€์ •ํ•˜๋ ค๋ฉด ์›น์‚ฌ์ดํŠธ์— ์ƒˆ ์ปค์Šคํ…€ ์š”์†Œ๋ฅผ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ์„ ์ œ์ถœํ•˜๋ ค๋ฉด ์š”์†Œ๊ฐ€ df-custom-submit-feedback-clicked ์ด๋ฒคํŠธ๋ฅผ ๋‚ด๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํฌํ•จ๋œ detail ํ•„๋“œ๋Š” ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

class CustomFeedbackElement extends HTMLElement {
  constructor() {
    super();
    // It is not strictly required but recommended to contain the custom
    // element in a shadow root.
    this.renderRoot = this.attachShadow({mode: 'open'});
  }

  // Web component Lifecycle method.
  connectedCallback() {
    const wrapper = document.createElement('div');

    // Build the component as required.
    const button = document.createElement('button');
    button.innerText = 'Submit';
    button.addEventListener('click', () => {
      this._onSubmitClick();
    });
    wrapper.appendChild(button);

    this.renderRoot.appendChild(wrapper);
  }

  // Called when Submit button is clicked.
  _onSubmitClick() {
    const event = new CustomEvent("df-custom-submit-feedback-clicked", {
      // `detail` may be any string,
      // this will be sent to the backend to be stored.
      detail: JSON.stringify({
        "usefulness": 2,
        "accuracy": 3,
      }),
      // Required to propagate up the DOM tree
      // https://developer.mozilla.org/en-US/docs/Web/API/Event/bubbles
      bubbles: true,
      // Required to propagate across ShadowDOM
      // https://developer.mozilla.org/en-US/docs/Web/API/Event/composed
      composed: true,
   });
   this.dispatchEvent(event);
  }
}

(function() {
  // Registers the element. This name must be "df-external-custom-feedback".
  customElements.define('df-external-custom-feedback', CustomFeedbackElement);
})();

๋””๋ฒ„๊น…

Dialogflow ๋ฉ”์‹ ์ €๋กœ ์—์ด์ „ํŠธ๋ฅผ ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  • ์œ„ ์„ค๋ช…์ฒ˜๋Ÿผ ํŽ˜์ด์ง€์— Dialogflow ๋ฉ”์‹ ์ € ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • ํŠน์ • ํฌํŠธ๋กœ ํŽ˜์ด์ง€์˜ ๋กœ์ปฌ HTTP ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • http://localhost:port_number์—์„œ ํŽ˜์ด์ง€์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.