본문 바로가기
개발

Dialogflow에 Firebase 연동하기

by dev-mong2 2025. 3. 31.

 

특정 질문에 대해 정확한 답변을 해주는 커스텀 Q&A 챗봇을 만들 일이 생겼다.
기왕 만드는 김에 단순한 텍스트 응답이 아니라

Firebase와 json 파일을 연동 후 질문에 자동 응답하는 챗봇을 구현해봤다.

(firebase란... https://codingapple.com/unit/why-use-firebase/)

Dialogflow Fulfillment Firebase Functions로 연결하고,
내가 원하는 질문-답변 JSON 파일로 챗봇을 동작시키는 전체 과정을 단계별로 정리하려 함.

 

🧠 목표

  • Dialogflow 콘솔에서 Intent를 만들고
  • Firebase Functions로 Fulfillment를 연결
  • dataset.json에 내가 정의한 질문과 답변을 담아두고
  • 사용자가 질문하면 해당 답을 반환하는 챗봇

 

🧱 프로젝트 구조

dialogflow_project/
├── firebase.json
├── .firebaserc
└── functions/
    ├── index.js         ← Fulfillment 처리
    ├── package.json     ← 종속성 관리
    └── dataset.json     ← 질문-답변 데이터

 

 


 

1. Firebase Functions 프로젝트 구성

✅ Firebase CLI 설치 및 초기화

 
npm install -g firebase-tools
firebase login
firebase init functions

 

선택사항 >>

  • 언어: JavaScript
  • ESLint: ❌ 사용 안 함
  • Functions 디렉터리: functions

✅ package.json 설정

"dependencies": {
  "dialogflow-fulfillment": "^0.6.1",
  "firebase-admin": "^11.10.1",
  "firebase-functions": "^4.4.1"
}

 

이후 npm install로 종속성 설치

 

2. dataset.json 구성

[
  {
    "question": "소비효율이 뭐야?",
    "answer": "소비효율은 전기 제품의 에너지 사용 효율을 의미합니다."
  },
  {
    "question": "최저소비효율기준은?",
    "answer": "제품이 반드시 충족해야 할 최소한의 소비효율 기준입니다."
  }
] ...

 

질문과 답변만 json 배열로 넣어줌. 해당 json 파일을 기반으로 챗봇이 동작할 예정

 

3. Fulfillment 코드 작성 (index.js)

사용자의 입력과 dataset의 질문을 비교하고, 일치하는 항목이 있다면 해당 답변을 agent.add()로 리턴하는 구조로 작성

const functions = require("firebase-functions");
const { WebhookClient } = require("dialogflow-fulfillment");
const dataset = require("./dataset.json");

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });

  function answerIntent(agent) {
    const userInput = agent.query.trim().replace(/\s/g, "");

    const match = dataset.find(entry =>
      userInput.includes(entry.question.trim().replace(/\s/g, ""))
    );

    if (match) {
      agent.add(match.answer);
    } else {
      agent.add("죄송해요, 해당 정보를 찾을 수 없어요.");
    }
  }

  let intentMap = new Map();
  intentMap.set("equipment", answerIntent);
  intentMap.set("Default Fallback Intent", answerIntent); 
  // default fallback 답변에서도 dataset.json에 접근하도록 작성
  agent.handleRequest(intentMap);
});

 

 

equipment 인텐트 외에 Default Fallback Intent 에서도 무조건 Webhook이 호출되게 설정

>> 이렇게 하면 질문이 Intents에 등록되어있지 않아도 dataset.json에 있다면 응답 가능함

 

4. Firebase Functions 배포

cd functions
npm install
cd ..
firebase deploy --only functions

 

배포 후 로그를 확인해보면...

https://us-central1-myproject.cloudfunctions.net/dialogflowWebhook

 

 

이렇게 생긴 url을 확인할 수 있는데,

 

5. Dialogflow 설정

✅ Fulfillment

  • Fulfillment 메뉴에서 Webhook 활성화 후 URL을 넣고 save

✅ Intents 설정

  • equipment 인텐트를 만들고 Webhook 활성화
  • Default Fallback Intent도 반드시 Webhook 활성화

 

 

 

json 파일과 dialogflow 연동 끝!

그러나 현재는 json 파일에 존재하는 질문만 dialogflow가 처리할 수 있음.

이제 텐서플로우를 사용한 유사어 처리를 하려고 함...