꿈을 바구니에 담아 간직하다 보면!!

지금 참 힘들죠? 근데 내일은 지금보다 덜 힘들거예요

힘든 건 오늘만이 아니다. 내일도, 그리고 그 다음 날도 계속될 것이다.

PHP Tip

DB 없이 chatbot 간단하게 만들기

duaidot 2025. 12. 20. 14:08

DB  없이 chatbot  간단하게 만들기

chatbot.php 이름으로 파일 만들기

<?php
// 브라우저나 클라이언트에게 "지금부터 JSON을 UTF-8로 보낼 거야"라고 알려주는 헤더 설정
header('Content-Type: application/json; charset=utf-8');

// 1) JSON 입력 받기
// php://input 은 HTTP 요청의 raw body를 그대로 읽어오는 스트림
// file_get_contents('php://input') 로 body를 읽고, json_decode 로 PHP 배열로 변환
$input = json_decode(file_get_contents('php://input'), true);

// 입력이 없거나(message 필드가 없으면) => 에러 응답
if (!$input || !isset($input['message'])) {
    // HTTP 상태 코드 400 (Bad Request)로 설정
    http_response_code(400);
    // 에러 내용을 JSON으로 반환
    echo json_encode(['error' => '잘못된 요청']);
    // 여기서 스크립트 종료 (더 이상 아래 코드 실행 안 함)
    exit;
}

// 클라이언트가 보낸 message 값을 꺼내서 앞뒤 공백 제거
$userMsg = trim($input['message']);

// 2) 의도 감지 함수
// 사용자가 보낸 텍스트에서 "의도(intent)"를 추측하는 함수
function detect_intent($text) {
    // mb_strtolower: 멀티바이트 문자열(한글 포함)을 모두 소문자로 변환
    $t = mb_strtolower($text, 'UTF-8');

    // '안녕' 이라는 단어가 들어있으면 인사 의도로 판단
    if (strpos($t, '안녕') !== false) return 'greeting';
    // '고마워' 또는 '감사'가 들어있으면 감사 의도
    if (strpos($t, '고마워') !== false || strpos($t, '감사') !== false) return 'thanks';
    // '불안' 또는 '스트레스'가 들어있으면 스트레스 관련 의도
    if (strpos($t, '불안') !== false || strpos($t, '스트레스') !== false) return 'stress';
    // '끝' 또는 '잘 있어' 가 들어있으면 인사 종료(이별) 의도
    if (strpos($t, '끝') !== false || strpos($t, '잘 있어') !== false) return 'bye';

    // 위에 해당 안 되면 일반적인 대화로 처리
    return 'general';
}

// 위에서 만든 함수로 사용자 메시지의 의도를 판별
$intent = detect_intent($userMsg);

// 3) 의도별 답변 생성
// 의도(intent)에 따라 어떤 답변을 줄지 결정하는 함수
function respond($intent) {
    // switch문으로 의도 값에 따라 다른 문장 반환
    switch ($intent) {
        // 인사 의도일 때
        case 'greeting':
            return "안녕하세요 🙂 지금 어떤 감정이 드나요?";
        // 감사 의도일 때
        case 'thanks':
            return "저도 고마워요. 마음이 조금은 편해졌으면 좋겠어요.";
        // 스트레스/불안 관련 의도일 때
        case 'stress':
            return "스트레스를 느끼고 있군요. 잠깐 천천히 숨을 들이쉬고 내쉬어보는 건 어떨까요?";
        // 대화를 끝내려는 의도일 때
        case 'bye':
            return "좋아요. 여기서 잠시 쉬어가도 괜찮아요.";
        // 어떤 의도에도 딱 안 맞을 때 (기본 응답)
        default:
            return "지금 마음속에서 가장 먼저 떠오르는 생각을 말해줄래요?";
    }
}

// 위에서 판별한 intent를 가지고 실제 답변 문장을 얻음
$reply = respond($intent);

// 4) JSON 응답 반환
// 클라이언트에게 reply(답변)와 intent(감지된 의도)를 JSON으로 돌려줌
echo json_encode([
    'reply' => $reply,   // 챗봇의 답변 문장
    'intent' => $intent  // 감지된 의도 값 (greeting, thanks, stress, bye, general)
], JSON_UNESCAPED_UNICODE); // 한글이 \uXXXX로 깨지지 않도록 그대로 출력 옵션
?>

 

chatbot_main.php 파일 만들기

 

<!doctype html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <title>상담 챗봇</title>
</head>
<body>
  <h1>상담 챗봇</h1>
  <div id="log"></div>
  <input id="msg" placeholder="메시지를 입력하세요" />
  <button id="send">보내기</button>

  <script>
    const log = document.getElementById('log');
    const msg = document.getElementById('msg');

    document.getElementById('send').onclick = async () => {
      const text = msg.value.trim();
      if (!text) return;

      log.innerHTML += `<p><b>나:</b> ${text}</p>`;

      const res = await fetch('chatbot.php', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ message: text })
      });

      const data = await res.json();
      log.innerHTML += `<p><b>봇:</b> ${data.reply}</p>`;
      msg.value = '';
    };
  </script>
</body>
</html>