04. CITAS AUTOMATICO

Responder a los clientes con ChatGPT

¡Hola nuevamente! Es un placer verte de vuelta en nuestra serie de tutoriales. Hasta ahora, hemos cubierto la instalación de nuestro sistema de citas, cómo recibir mensajes de WhatsApp para programar citas y cómo conectar todo con nuestra base de datos. Ahora, estamos listos para dar un paso importante y emocionante en nuestro viaje: ¡Aprender a responder automáticamente a nuestros clientes!

En este cuarto tutorial del curso, titulado “Responder a los clientes con ChatGPT”, vamos a explorar cómo podemos usar la potencia de la Inteligencia Artificial (IA) para mejorar aún más la eficiencia y la eficacia de nuestro sistema de citas.

Aquí está lo que vamos a cubrir en este tutorial:

  1. Creación del Api ChatGPT: aprenderemos a crear el api ChatGPT para procesar las preguntas y generar una respuesta.
  2. Configuración de ChatGPT: te mostraremos cómo configurar ChatGPT para trabajar con nuestro sistema de citas.
  3. Integración de ChatGPT en nuestro sistema: Descubrirás cómo podemos integrar ChatGPT para responder automáticamente a las solicitudes de los clientes.

Al final de este curso, tendrás un sistema de citas que no sólo puede procesar y crear citas de manera automática, sino también interactuar con los clientes, responder a sus preguntas y guiarlos a través del proceso de programación de citas. Esto mejorará enormemente la experiencia del cliente, liberará tiempo para los empleados y nos permitirá manejar un mayor volumen de citas.

Esperamos que estés emocionado por la posibilidad de incorporar IA a tu sistema de citas. ¡Prepárate para aprender, experimentar y transformar la manera en que interactúas con tus clientes! ¡Nos vemos en el tutorial!

Crear una API Key de ChatGPT

Vamos a https://platform.openai.com/signup Nos registramos ya sea con tu email o con tu cuenta de Google o Microsoft
Damos click en nuestro perfil y despues en “View API Key”

Crear un archivo de configuración config.php

Este archivo contendrá los apis de ChatGPT y WhatsApp pero en este tutorial solo usaremos el API de ChatGPT.

<?php
class Config {
    public $apiKeyChatgpt;
    public $tokenWa;
    public $telefonoIDWa;
    public $remoto;

    public function __construct() {
        $remoto=true;
        if ($remoto) {
            // Coloca estos valores si remoto es true
            $this->apiKeyChatgpt = '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';
            $this->tokenWa = 'EAANIQCCaMQIBAOr1C62wcz0c4cOPxUfNMFTkpHWzp1DcUlaqlWM91tzfyky0oAwxOELgmkp0DPd5I3yHjwyZCUpImpsypk7W5eq39HhtBFtXc1j3j2uzZCZAEZAcbK8jQkikZATKZAKmfckmeKvIEaIvnzRg2ncCZA5jOY6oWAqNkrt4FpKxkAwutuvrNh1BeusIY58smCZB0wZDZD';
            $this->telefonoIDWa = '116907067953774';
        } else {
            // Coloca estos valores si remoto es false
            $this->apiKeyChatgpt = 'otro_valor';
            $this->tokenWa = 'otro_valor';
            $this->telefonoIDWa = 'otro_valor';
        }
    }
}

Archivo chatgpt.php

Este archivo lee el historial de preguntas y respuestas creadas por chatGPT para tener un historial y llevar una coherencia para interactuar con los clientes.

<?php
function preguntaChatgpt($system, $pregunta, $telefonoCliente,$listaCategorias){
    require "config.php";
    $config = new Config();
    $apiKey = $config->apiKeyChatgpt;
    $telefono = str_replace("521", "52", $telefonoCliente);
    //API KEY DE CHATGPT
    global $conn;
    // Consulta SQL para obtener las conversaciones anteriores
    $query = "SELECT mensaje_recibido, mensaje_enviado 
    FROM kimai2_registro 
    WHERE telefono_wa = ? 
    AND fecha_hora > DATE_SUB(NOW(), INTERVAL 2 HOUR)
    -- AND cita_creada = 0
    ORDER BY fecha_hora ASC";
    $stmtMensajes = $conn->prepare($query);
    // Vincula el parámetro "telefono" a la consulta SQL
    $stmtMensajes->bind_param('s', $telefono);
    // Ejecuta la consulta
    $stmtMensajes->execute();
    // Obtiene el resultado
    $result = $stmtMensajes->get_result();
    // Construye el array de mensajes anteriores
    $messages = array();
    while ($row = $result->fetch_assoc()) {
        $messages[] = array("role" => "user", "content" => $row['mensaje_recibido']);
        $messages[] = array("role" => "assistant", "content" => $row['mensaje_enviado']);
    }
    // Agrega el mensaje del sistema y la pregunta actual del usuario
    array_unshift($messages, array("role" => "system", "content" => $system));
    $messages[] = array("role" => "user", "content" => $pregunta);
    //INICIAMOS LA CONSULTA DE CURL
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://api.openai.com/v1/chat/completions');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Authorization: Bearer '.$apiKey,
        'Content-Type: application/json',
    ]);
    curl_setopt($ch, CURLOPT_POSTFIELDS, 
    json_encode(array(
        "model" => "gpt-3.5-turbo",
        "messages" => $messages,
        "temperature" => 0
    )));
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $response = curl_exec($ch);
    // Obtiene información de los encabezados de la respuesta
    $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    $header = substr($response, 0, $headerSize);
    curl_close($ch);
    // Decodificar el JSON
    $data = json_decode($header, true);
    // Obtener el valor de 'total_tokens'
    $totalTokens = $data['usage']['total_tokens'];
    curl_close($ch);
    $decoded_json = json_decode($response, false);
    //RETORNAMOS LA RESPUESTA QUE EXTRAEMOS DEL JSON
    $respuesta=$decoded_json->choices[0]->message->content;
    $respuesta = str_replace('"', '-', $respuesta);
    $respuesta = str_replace('\"', '-', $respuesta);
    $respuesta = str_replace('\\"', '-', $respuesta);
    $respuesta=stripcslashes($respuesta);
    if (strpos($respuesta, '||') !== false) {
        $respuestaDividida = explode('||', $respuesta);
        // Ahora, cada elemento del array $respuestaDividida contiene una parte de la respuesta
        $cliente = trim($respuestaDividida[1]);
        $cliente=$cliente." ".$telefono;
        $edad = trim($respuestaDividida[2]);
        $especialidad = trim($respuestaDividida[3]);
        $especialidad=quitar_acentos($especialidad);
        $listaCategoriasArray = explode(",", $listaCategorias);
        // quitar acentos
        foreach($listaCategoriasArray as $categoria){
            if(strpos($especialidad, $categoria) !== false){
                $especialidad = $categoria;
                break;
            }
        }
        //Si $especialidad esta vacio poner "Diagnostico"
        if($especialidad==""){
            $especialidad="Medico general";
        }
        $sintomas = trim($respuestaDividida[4]);
        require_once('crearCita.php');
        //$fechaCita=creaCita($cliente,$telefono, $edad, $especialidad, $sintomas);
        //actualizarCitaCreada($telefono);
        global $textoCita;
        //a $fechaCita darle formato dia mes año hora y minuto
        
        $fechaCita = strtotime($fechaCita);  // Convierte la fecha en un timestamp de Unix
        setlocale(LC_TIME, 'es_ES.UTF-8');
        $fechaFormateada = strftime("%A %d de %B del %Y a las %H:%M", $fechaCita);
        $fechaFormateada=translateDayInText($fechaFormateada);
        $respuesta = $textoCita." ".$fechaFormateada.", en el transcurso del dia un experto en '".$especialidad."' se pondrá en contacto con usted para confirmar la cita y darle seguimiento.";
        //$respuesta
    }

    //obtener la fecha y hora en string
    $fecha = date("Y-m-d H:i:s");
    file_put_contents('responseChatgpt.txt', $fecha."-".$response."\n".$respuesta);
    return $respuesta;
           
}
function quitar_acentos($cadena){
    $originales = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿ';
    $modificadas = 'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyyby';
    $cadena = utf8_decode($cadena);
    $cadena = strtr($cadena, utf8_decode($originales), $modificadas);
    return utf8_encode($cadena);
}
function translateDayInText($text) {
    // Definir la matriz de traducción
    $translationArray = array(
        "Monday" => "Lunes",
        "Tuesday" => "Martes",
        "Wednesday" => "Miércoles",
        "Thursday" => "Jueves",
        "Friday" => "Viernes",
        "Saturday" => "Sábado",
        "Sunday" => "Domingo"
    );
    
    // Dividir el texto en palabras
    $words = explode(" ", $text);

    // Verificar cada palabra
    foreach ($words as $key => $word) {
        // Si la palabra es un día de la semana en inglés, traducirlo
        if (isset($translationArray[$word])) {
            $words[$key] = $translationArray[$word];
        }
    }
    
    // Unir las palabras de nuevo en un texto
    $text = implode(" ", $words);
    
    return $text;
}

Llamamos ChatGPT desde index.php

Ahora vamos a leer los resultados que nos entrega chatGPT desde index.php

    require_once "chatgpt.php";
    $respuesta = preguntaChatgpt($system, $pregunta, $telefonoCliente,$listaCategorias);
    //ESCRIBIMOS LA RESPUESTA
    file_put_contents("respuesta.txt", $respuesta);

De tal suerte que index.php qudaria asi

<?php
/*
 * VERIFICACION DEL WEBHOOK
*/
//TOQUEN QUE QUERRAMOS PONER 
$token = 'HolaNovato';
//RETO QUE RECIBIREMOS DE FACEBOOK
$palabraReto = $_GET['hub_challenge'];
//TOQUEN DE VERIFICACION QUE RECIBIREMOS DE FACEBOOK
$tokenVerificacion = $_GET['hub_verify_token'];
//SI EL TOKEN QUE GENERAMOS ES EL MISMO QUE NOS ENVIA FACEBOOK RETORNAMOS EL RETO PARA VALIDAR QUE SOMOS NOSOTROS
if ($token === $tokenVerificacion) {
    echo $palabraReto;
    exit;
}
$textoCita="He creado su cita para el dia";
/*
 * RECEPCION DE MENSAJES
 */
//LEEMOS LOS DATOS ENVIADOS POR WHATSAPP
$respuesta = file_get_contents("php://input");
//CONVERTIMOS EL JSON EN ARRAY DE PHP
$respuesta = json_decode($respuesta, true);
//EXTRAEMOS EL MENSAJE DEL ARRAY
$mensaje = $respuesta['entry'][0]['changes'][0]['value']['messages'][0]['text']['body'];
//EXTRAEMOS EL TELEFONO DEL ARRAY
$telefonoCliente = $respuesta['entry'][0]['changes'][0]['value']['messages'][0]['from'];
//EXTRAEMOS EL ID DE WHATSAPP DEL ARRAY
$id = $respuesta['entry'][0]['changes'][0]['value']['messages'][0]['id'];
//EXTRAEMOS EL TIEMPO DE WHATSAPP DEL ARRAY
$timestamp = $respuesta['entry'][0]['changes'][0]['value']['messages'][0]['timestamp'];
//SI HAY UN MENSAJE
if ($mensaje != null) {
    $pregunta = $mensaje;
    require_once("conexion.php");
    // Prepara la consulta SQL
    $queryCompania = 'SELECT company, address, contact FROM kimai2_invoice_templates WHERE id = ?';
    $stmtCompania = $conn->prepare($queryCompania);
    // Vincula el parámetro "id" a la consulta SQL
    $id_inv = 1;
    $stmtCompania->bind_param('i', $id_inv);
    // Ejecuta la consulta
    $stmtCompania->execute();
    // Obtiene el resultado
    $resultCompania = $stmtCompania->get_result();
    // Obtiene los datos del registro
    $rowCompania = $resultCompania->fetch_assoc();
    // Prepara la consulta SQL
    // Crea la consulta SQL
    $queryCategoria = "SELECT alias FROM kimai2_users WHERE enabled = 1 AND id != 1";
    // Prepara la consulta
    $stmtCategoria = $conn->prepare($queryCategoria);
    // Ejecuta la consulta
    $stmtCategoria->execute();
    // Obtiene el resultado
    $resultCategoria = $stmtCategoria->get_result();
    // Crea un array para guardar los alias
    $listaCategorias = "";
    // Recorre los resultados y añade cada alias al array
    while ($row = $resultCategoria->fetch_assoc()) {
        $listaCategorias = $listaCategorias.$row['alias'].",";
    }
    $listaCategorias = rtrim($listaCategorias, ",");
    $system="Hola, soy un asesor de Información de la clínica ".$rowCompania['company'].
    ", no proporciono citas pero genero reportes para que posteriormente un experto agende una cita, no doy recomendaciones para curar, recomiendo solo mi clínica y pido un dato a la vez.".
    " Mis tareas incluyen recibir información, escribir reportes y no hay necesidad de que el paciente lo sepa. Aquí está el procedimiento que sigo: ".
    "1. Primero, pido el nombre. ".
    "2. Luego, pido la edad. ".
    "3. Después, pregunto qué sintomas tiene y en base a las respuestas defino en cuál de estas especialidades cae: ".
    $listaCategorias.".".
    "Si no cae en ninguna especialidad colocarlo en Medico general.".
    "Una vez recolectada la información sobre los síntomas, no programo ninguna cita. En cambio, escribo un reporte con este formato: ".
    "||paciente||etapa_edad||especialidad||sintomas|| (reemplaza el contenido entre || por la información recolectada).".
    //"||cliente||datos_auto||categoria_falla||descripcion_falla|| (reemplaza el contenido entre || por la información recolectada).".
    "Es vital que siempre que detecte sintomas, escriba el reporte en el formato mencionado para que un experto agende una cita. ".
    "Si el paciente me pide una cita le debo escribir el reporte con el formato mencionado. ".
    "Importante: No invento ni añado ninguna información que no se me haya proporcionado. Todo mi trabajo se basa en los datos que recibo.";
    "Solo si me lo piden doy informacion de la empresa, Nombre de la empresa: " . $rowCompania['company'] . ", Ubicación: " . $rowCompania['address'] . " " . $rowCompania['contact'] . ". ";

    require_once "chatgpt.php";
    $respuesta = preguntaChatgpt($system, $pregunta, $telefonoCliente,$listaCategorias);
    //ESCRIBIMOS LA RESPUESTA
    file_put_contents("respuesta.txt", $respuesta);

}

Al envia un mensaje este es procesado via ChatGPT y se crea la respuesta y se guarda en respuesta.txt

Los comentarios están cerrados.

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad
Salir de la versión móvil