{"id":3354,"date":"2025-10-06T16:11:06","date_gmt":"2025-10-06T14:11:06","guid":{"rendered":"https:\/\/tecnologia.euroinnova.com\/como-crear-un-asistente-virtual-con-python-y-chatgpt-guia-practica\/"},"modified":"2025-10-07T14:50:06","modified_gmt":"2025-10-07T12:50:06","slug":"como-crear-asistente-virtual-python-chatgpt","status":"publish","type":"post","link":"https:\/\/tecnologia.euroinnova.com\/fr\/como-crear-asistente-virtual-python-chatgpt","title":{"rendered":"Comment cr\u00e9er un assistant virtuel avec Python et ChatGPT : Guide pratique"},"content":{"rendered":"<p>Crear tu propio asistente virtual con inteligencia artificial ya no es una tarea reservada a grandes empresas. Gracias a herramientas como <span class=\"notion-enable-hover\" data-token-index=\"1\"><strong>Python<\/strong><\/span> y las APIs de <span class=\"notion-enable-hover\" data-token-index=\"3\"><strong>ChatGPT<\/strong><\/span>, hoy es posible construir un asistente funcional, personalizado y conectado a internet con solo unos pocos bloques de c\u00f3digo. Esta gu\u00eda te muestra c\u00f3mo hacerlo paso a paso, sin necesidad de arquitecturas complejas ni conocimientos avanzados de machine learning.<\/p>\n<p>Vamos a crear un asistente que pueda mantener una conversaci\u00f3n, responder preguntas, realizar tareas simples y conectarse a servicios externos si lo deseas. A lo largo de esta gu\u00eda aprender\u00e1s a:<\/p>\n<ul>\n<li>Configurar tu entorno de desarrollo.<\/li>\n<li>Utilizar la API de OpenAI con Python.<\/li>\n<li>Dise\u00f1ar un bucle conversacional b\u00e1sico.<\/li>\n<li>A\u00f1adir funcionalidades adicionales.<\/li>\n<\/ul>\n<p>El objetivo es que termines con un asistente completamente funcional y extensible. Vamos all\u00e1.<\/p>\n<h2 id=\"paso-1-instalacion-del-entorno-y-dependencias\"><strong>Paso 1: Instalaci\u00f3n del entorno y dependencias<\/strong><\/h2>\n<p>Para comenzar, aseg\u00farate de tener <strong>Python 3.8 o superior<\/strong> instalado en tu sistema. Puedes comprobarlo ejecutando:<\/p>\n<p>python &#8211;version<\/p>\n<p>Es recomendable crear un <strong>entorno virtual<\/strong> para aislar las dependencias del proyecto. Abre una terminal, crea y activa el entorno:<\/p>\n<p>python -m venv asistente-env<\/p>\n<p>source asistente-env\/bin\/activate\u00a0 # En Linux o macOS<\/p>\n<p>En Windows usa:<\/p>\n<p>asistente-envScriptsactivate<\/p>\n<p>A continuaci\u00f3n, instala las librer\u00edas necesarias:<\/p>\n<p>pip install openai python-dotenv<\/p>\n<p>Por \u00faltimo, necesitar\u00e1s una <strong>clave de API de OpenAI<\/strong> para interactuar con ChatGPT. Crea un archivo .env en la ra\u00edz del proyecto y guarda all\u00ed tu clave:<\/p>\n<p>OPENAI_API_KEY=tu_clave_aqui<\/p>\n<h2 id=\"paso-2-preparar-el-entorno-de-trabajo\"><strong>Paso 2: Preparar el entorno de trabajo<\/strong><\/h2>\n<p>Para comenzar a desarrollar tu asistente virtual, necesitas un entorno limpio y controlado. En este paso vamos a crear una carpeta de proyecto, activar un entorno virtual de Python, instalar las bibliotecas necesarias y a\u00f1adir un archivo .env para gestionar tu clave de API de forma segura.<\/p>\n<p>Primero, crea la carpeta del proyecto y activa un entorno virtual:<\/p>\n<p>mkdir asistente-chatgpt<\/p>\n<p>cd asistente-chatgpt<\/p>\n<p>python -m venv venv<\/p>\n<p>source venv\/bin\/activate\u00a0 # En Windows: venvScriptsactivate<\/p>\n<p>A continuaci\u00f3n, instala las dependencias principales (openai para acceder a la API y python-dotenv para manejar configuraciones):<\/p>\n<p>pip install openai python-dotenv<\/p>\n<p>Despu\u00e9s, crea el archivo .env en la ra\u00edz del proyecto y a\u00f1ade tu clave de OpenAI (puedes obtenerla en <a href=\"https:\/\/platform.openai.com\/api-keys\" target=\"_blank\" rel=\"noopener\">https:\/\/platform.openai.com\/api-keys:<\/a><\/p>\n<p>OPENAI_API_KEY=tu_clave_aqui<\/p>\n<p>Por \u00faltimo, recuerda excluir el archivo .env del repositorio si usas Git:<\/p>\n<p>echo \u00ab.env\u00bb &gt;&gt; .gitignore<\/p>\n<h2 id=\"paso-3-crear-el-archivo-base-y-cargar-la-clave-de-api\"><strong>Paso 3: Crear el archivo base y cargar la clave de API<\/strong><\/h2>\n<p>Con el entorno preparado y la clave de OpenAI almacenada de forma segura, el siguiente paso es construir la estructura base del asistente. Empezaremos creando el archivo principal de ejecuci\u00f3n y escribiendo el c\u00f3digo necesario para conectarnos con la API de ChatGPT.<\/p>\n<ul>\n<li>Crea un archivo llamado <a href=\"http:\/\/asistente.py\" target=\"_blank\" rel=\"noopener\">asistente.py<\/a> en la ra\u00edz del proyecto.<\/li>\n<li>Importa las bibliotecas necesarias: openai, os y dotenv.<\/li>\n<li>Carga la clave desde el archivo .env para inicializar la API.<\/li>\n<\/ul>\n<p>import os<\/p>\n<p>import openai<\/p>\n<p>from dotenv import load_dotenv<\/p>\n<p>Cargar las variables de entorno<\/p>\n<p>load_dotenv()<\/p>\n<p>openai.api_key = os.getenv(\u00abOPENAI_API_KEY\u00bb)<\/p>\n<h2 id=\"paso-4-crear-la-funcion-principal-del-asistente\"><strong>Paso 4: Crear la funci\u00f3n principal del asistente<\/strong><\/h2>\n<p>Ahora vamos a crear la funci\u00f3n que se encargar\u00e1 de enviar el mensaje del usuario a la API de ChatGPT y devolver la respuesta. Esta ser\u00e1 la base del funcionamiento del asistente virtual.<\/p>\n<ul>\n<li>Define una funci\u00f3n llamada consultar_chatgpt(mensaje) que reciba un mensaje como par\u00e1metro.<\/li>\n<li>Utiliza el modelo gpt-3.5-turbo y configura la estructura del mensaje como una conversaci\u00f3n.<\/li>\n<li>Devuelve la respuesta generada por la IA como texto plano para mostrarla al usuario.<\/li>\n<\/ul>\n<p>Este enfoque b\u00e1sico permite tener ya una interacci\u00f3n funcional con el modelo. M\u00e1s adelante a\u00f1adiremos mejoras como control de errores y gesti\u00f3n de contexto.<\/p>\n<p>def consultar_chatgpt(mensaje):<\/p>\n<p>respuesta = openai.ChatCompletion.create(<\/p>\n<p>model=\u00bbgpt-3.5-turbo\u00bb,<\/p>\n<p>messages=[<\/p>\n<p>{\u00abrole\u00bb: \u00abuser\u00bb, \u00abcontent\u00bb: mensaje}<\/p>\n<p>]<\/p>\n<p>)<\/p>\n<p>return respuesta[\u00abchoices\u00bb][0][\u00abmessage\u00bb][\u00abcontent\u00bb]<\/p>\n<h2 id=\"paso-5-ejecutar-el-asistente-en-bucle-desde-la-terminal\"><strong>Paso 5: Ejecutar el asistente en bucle desde la terminal<\/strong><\/h2>\n<p>Una vez definida la funci\u00f3n principal, podemos crear un peque\u00f1o bucle que permita al usuario interactuar con el asistente desde la l\u00ednea de comandos. Esto convierte tu script en una herramienta funcional, lista para probar desde consola.<\/p>\n<ul>\n<li>A\u00f1ade un bloque if <strong>name<\/strong> == \u00ab<strong>main<\/strong>\u00bb para ejecutar el asistente cuando se llame el script directamente.<\/li>\n<li>Dentro, crea un bucle while que reciba la entrada del usuario, llame a la funci\u00f3n consultar_chatgpt() y muestre la respuesta.<\/li>\n<li>Permite salir del programa escribiendo \u00absalir\u00bb, \u00abexit\u00bb o \u00abquit\u00bb.<\/li>\n<\/ul>\n<p>Este modo conversacional es la forma m\u00e1s sencilla de empezar a usar tu asistente. M\u00e1s adelante podr\u00e1s ampliar esta l\u00f3gica para integrarla en interfaces gr\u00e1ficas o web.<\/p>\n<p>if <strong>name<\/strong> == \u00ab<strong>main<\/strong>\u00ab:<\/p>\n<p>print(\u00abEscribe tu mensaje o &#8216;salir&#8217; para terminar.\u00bb)<\/p>\n<p>while True:<\/p>\n<p>entrada = input(\u00abT\u00fa: \u00ab)<\/p>\n<p>if entrada.lower() in [\u00absalir\u00bb, \u00abexit\u00bb, \u00abquit\u00bb]:<\/p>\n<p>break<\/p>\n<p>salida = consultar_chatgpt(entrada)<\/p>\n<p>print(\u00abAsistente:\u00bb, salida)<\/p>\n<h2 id=\"paso-6-personalizar-el-comportamiento-del-asistente\"><strong>Paso 6: Personalizar el comportamiento del asistente<\/strong><\/h2>\n<p>Puedes modificar la personalidad y el rol del asistente utilizando un mensaje de tipo system, que se env\u00eda al modelo antes de iniciar la conversaci\u00f3n. Esto influye en c\u00f3mo responde, su tono y su especializaci\u00f3n.<\/p>\n<ul>\n<li>Define una lista mensajes que incluya un mensaje inicial del tipo \u00absystem\u00bb.<\/li>\n<li>A partir de ah\u00ed, cada mensaje del usuario se a\u00f1ade con el rol \u00abuser\u00bb y cada respuesta del modelo se almacena con el rol \u00abassistant\u00bb.<\/li>\n<li>Esta estructura permite mantener un historial conversacional y que el asistente recuerde lo que se ha dicho antes durante la sesi\u00f3n.<\/li>\n<\/ul>\n<p>Por ejemplo, puedes hacer que el asistente act\u00fae como un tutor especializado, un gu\u00eda tur\u00edstico o un agente de soporte t\u00e9cnico, seg\u00fan tus necesidades.<\/p>\n<p>mensajes = [<\/p>\n<p>{\u00abrole\u00bb: \u00absystem\u00bb, \u00abcontent\u00bb: \u00abEres un asistente \u00fatil especializado en Python. Responde de forma clara y concisa.\u00bb}<\/p>\n<p>]<\/p>\n<p>def consultar_chatgpt(mensaje):<\/p>\n<p>try:<\/p>\n<p>mensajes.append({\u00abrole\u00bb: \u00abuser\u00bb, \u00abcontent\u00bb: mensaje})<\/p>\n<p>respuesta = openai.ChatCompletion.create(<\/p>\n<p>model=\u00bbgpt-3.5-turbo\u00bb,<\/p>\n<p>messages=mensajes<\/p>\n<p>)<\/p>\n<p>contenido = respuesta[\u00abchoices\u00bb][0][\u00abmessage\u00bb][\u00abcontent\u00bb]<\/p>\n<p>mensajes.append({\u00abrole\u00bb: \u00abassistant\u00bb, \u00abcontent\u00bb: contenido})<\/p>\n<p>return contenido.strip()<\/p>\n<p>except Exception as e:<\/p>\n<p>return f\u00bbOcurri\u00f3 un error: {str(e)}\u00bb<\/p>\n<h2 id=\"paso-7-anadir-entrada-de-voz-para-interactuar-por-microfono\"><strong>Paso 7: A\u00f1adir entrada de voz para interactuar por micr\u00f3fono<\/strong><\/h2>\n<p>Para que la interacci\u00f3n con tu asistente sea m\u00e1s natural, puedes permitir que el usuario hable en lugar de escribir. En este paso vamos a integrar reconocimiento de voz en tiempo real usando la biblioteca SpeechRecognition.<\/p>\n<p>Este m\u00f3dulo permite capturar audio desde el micr\u00f3fono y transcribirlo a texto con servicios como la API de Google Speech, que es gratuita y no requiere clave para usos b\u00e1sicos.<\/p>\n<p>Antes de empezar, instala las siguientes dependencias desde la terminal:<\/p>\n<p>pip install SpeechRecognition pyaudio<\/p>\n<p>Luego, crea una funci\u00f3n reconocer_voz() que escuche desde el micr\u00f3fono y devuelva el texto reconocido. Podr\u00e1s usar esta funci\u00f3n como sustituto del input() en tu asistente.<\/p>\n<p>import speech_recognition as sr<\/p>\n<p>def reconocer_voz():<\/p>\n<p>r = sr.Recognizer()<\/p>\n<p>with sr.Microphone() as source:<\/p>\n<p>print(\u00abHabla ahora&#8230;\u00bb)<\/p>\n<p>audio = r.listen(source)<\/p>\n<p>try:<\/p>\n<p>texto = r.recognize_google(audio, language=\u00bbes-ES\u00bb)<\/p>\n<p>print(\u00abHas dicho:\u00bb, texto)<\/p>\n<p>return texto<\/p>\n<p>except sr.UnknownValueError:<\/p>\n<p>print(\u00abNo se entendi\u00f3 el audio\u00bb)<\/p>\n<p>return None<\/p>\n<p>except sr.RequestError as e:<\/p>\n<p>print(\u00abError al conectar con el servicio de reconocimiento:\u00bb, e)<\/p>\n<p>return None<\/p>\n<h2 id=\"paso-7-anadir-entrada-de-voz-para-interactuar-por-microfono\"><strong>Paso 7: A\u00f1adir entrada de voz para interactuar por micr\u00f3fono<\/strong><\/h2>\n<p>Para que la interacci\u00f3n con tu asistente sea m\u00e1s natural, puedes permitir que el usuario hable en lugar de escribir. En este paso vamos a integrar reconocimiento de voz en tiempo real usando la biblioteca SpeechRecognition.<\/p>\n<p>Este m\u00f3dulo permite capturar audio desde el micr\u00f3fono y transcribirlo a texto con servicios como la API de Google Speech, que es gratuita y no requiere clave para usos b\u00e1sicos.<\/p>\n<p>Antes de empezar, instala las siguientes dependencias desde la terminal:<\/p>\n<p>pip install SpeechRecognition pyaudio<\/p>\n<p>Luego, crea una funci\u00f3n reconocer_voz() que escuche desde el micr\u00f3fono y devuelva el texto reconocido. Podr\u00e1s usar esta funci\u00f3n como sustituto del input() en tu asistente.<\/p>\n<p>import speech_recognition as sr<\/p>\n<p>def reconocer_voz():<\/p>\n<p>r = sr.Recognizer()<\/p>\n<p>with sr.Microphone() as source:<\/p>\n<p>print(\u00abHabla ahora&#8230;\u00bb)<\/p>\n<p>audio = r.listen(source)<\/p>\n<p>try:<\/p>\n<p>texto = r.recognize_google(audio, language=\u00bbes-ES\u00bb)<\/p>\n<p>print(\u00abHas dicho:\u00bb, texto)<\/p>\n<p>return texto<\/p>\n<p>except sr.UnknownValueError:<\/p>\n<p>print(\u00abNo se entendi\u00f3 el audio\u00bb)<\/p>\n<p>return None<\/p>\n<p>except sr.RequestError as e:<\/p>\n<p>print(\u00abError al conectar con el servicio de reconocimiento:\u00bb, e)<\/p>\n<p>return None<\/p>\n<h2 id=\"paso-8-guardar-el-historial-de-conversacion-en-un-archivo\"><strong>Paso 8: Guardar el historial de conversaci\u00f3n en un archivo<\/strong><\/h2>\n<p>Para mejorar la experiencia del usuario y permitir seguimiento de las conversaciones, es \u00fatil guardar cada interacci\u00f3n en un archivo local. As\u00ed podr\u00e1s revisar despu\u00e9s lo que el usuario pregunt\u00f3 y c\u00f3mo respondi\u00f3 el asistente.<\/p>\n<p>Vamos a crear dos funciones: una para <strong>guardar cada mensaje<\/strong> en un archivo .txt y otra para <strong>recuperar el historial<\/strong> al inicio del programa, si lo deseas.<\/p>\n<p>Primero definimos la funci\u00f3n guardar_en_historial() para registrar cada mensaje en un archivo de texto:<\/p>\n<p>def guardar_en_historial(usuario, asistente, archivo=&#8217;chat_log.txt&#8217;):<\/p>\n<p>with open(archivo, &#8216;a&#8217;, encoding=&#8217;utf-8&#8242;) as f:<\/p>\n<p>f.write(f&#8217;Usuario: {usuario}n&#8217;)<\/p>\n<p>f.write(f&#8217;Asistente: {asistente}nn&#8217;)<\/p>\n<p>Y a continuaci\u00f3n, cargar_historial() que permite leer ese historial desde disco y usarlo si se quiere para continuar la conversaci\u00f3n:<\/p>\n<p>def cargar_historial(archivo=&#8217;chat_log.txt&#8217;):<\/p>\n<p>try:<\/p>\n<p>with open(archivo, &#8216;r&#8217;, encoding=&#8217;utf-8&#8242;) as f:<\/p>\n<p>return f.read()<\/p>\n<p>except FileNotFoundError:<\/p>\n<p>return \u00ab\u00bb<\/p>\n<p>Despu\u00e9s, modifica ligeramente el bucle principal del asistente para que llame a estas funciones tras cada intercambio.<\/p>\n<p>if <strong>name<\/strong> == \u00ab<strong>main<\/strong>\u00ab:<\/p>\n<p>historial = cargar_historial()<\/p>\n<p>print(\u00abEscribe tu mensaje o &#8216;salir&#8217; para terminar.\u00bb)<\/p>\n<p>while True:<\/p>\n<p>entrada = input(\u00abT\u00fa: \u00ab)<\/p>\n<p>if entrada.lower() in [\u00absalir\u00bb, \u00abexit\u00bb, \u00abquit\u00bb]:<\/p>\n<p>break<\/p>\n<p>salida = consultar_chatgpt(entrada)<\/p>\n<p>print(\u00abAsistente:\u00bb, salida)<\/p>\n<p>guardar_en_historial(entrada, salida)<\/p>\n<h2 id=\"paso-9-anadir-instrucciones-al-sistema-para-personalizar-el-comportamiento\"><strong>Paso 9: A\u00f1adir instrucciones al sistema para personalizar el comportamiento<\/strong><\/h2>\n<p>El modelo de ChatGPT permite definir un mensaje de sistema inicial para condicionar el comportamiento del asistente durante toda la sesi\u00f3n. Este mensaje se env\u00eda de forma oculta al modelo y sirve como directriz: puedes usarlo para darle una personalidad concreta, limitar su \u00e1mbito de respuesta o ajustar su estilo.<\/p>\n<p>Vamos a modificar nuestro c\u00f3digo para incluir un mensaje de sistema que indique, por ejemplo, que el asistente es experto en Python y debe responder de forma clara y concisa. Para ello, cambiaremos la forma en que se construyen los mensajes enviados al modelo.<\/p>\n<p>Primero, crea una lista inicial de mensajes que incluya el mensaje de sistema:<\/p>\n<p>mensajes = [<\/p>\n<p>{\u00abrole\u00bb: \u00absystem\u00bb, \u00abcontent\u00bb: \u00abEres un asistente \u00fatil especializado en Python. Responde de forma clara y concisa.\u00bb}<\/p>\n<p>]<\/p>\n<p>Luego modifica la funci\u00f3n consultar_chatgpt() para que esta lista crezca con cada nuevo intercambio y se mantenga el historial conversacional:<\/p>\n<p>def consultar_chatgpt(mensaje):<\/p>\n<p>try:<\/p>\n<p>mensajes.append({\u00abrole\u00bb: \u00abuser\u00bb, \u00abcontent\u00bb: mensaje})<\/p>\n<p>respuesta = openai.ChatCompletion.create(<\/p>\n<p>model=\u00bbgpt-3.5-turbo\u00bb,<\/p>\n<p>messages=mensajes<\/p>\n<p>)<\/p>\n<p>contenido = respuesta[\u00abchoices\u00bb][0][\u00abmessage\u00bb][\u00abcontent\u00bb]<\/p>\n<p>mensajes.append({\u00abrole\u00bb: \u00abassistant\u00bb, \u00abcontent\u00bb: contenido})<\/p>\n<p>return contenido.strip()<\/p>\n<p>except Exception as e:<\/p>\n<p>return f\u00bbOcurri\u00f3 un error: {str(e)}\u00bb<\/p>\n<p>Con esto lograr\u00e1s que el asistente mantenga una coherencia de estilo, tono y \u00e1mbito durante toda la conversaci\u00f3n, lo que resulta especialmente \u00fatil en proyectos tem\u00e1ticos, educativos o especializados.<\/p>\n<h2 id=\"paso-10-anadir-entrada-por-voz-desde-el-microfono\"><strong>Paso 10: A\u00f1adir entrada por voz desde el micr\u00f3fono<\/strong><\/h2>\n<p>Una forma m\u00e1s natural de interactuar con tu asistente es mediante comandos por voz. En este paso vamos a integrar reconocimiento de voz en tiempo real, para que puedas hablar al asistente y recibir respuestas sin usar el teclado.<\/p>\n<p>Para lograrlo, utilizaremos la biblioteca SpeechRecognition, que permite capturar audio del micr\u00f3fono y transcribirlo a texto usando la API de Google. Tambi\u00e9n usaremos PyAudio como motor de acceso al hardware de entrada.<\/p>\n<p>Primero, instala las dependencias necesarias:<\/p>\n<p>pip install SpeechRecognition pyaudio<\/p>\n<p>Luego, crea una funci\u00f3n reconocer_voz() que active el micr\u00f3fono, escuche tu voz y devuelva la transcripci\u00f3n:<\/p>\n<p>import speech_recognition as sr<\/p>\n<p>def reconocer_voz():<\/p>\n<p>r = sr.Recognizer()<\/p>\n<p>with sr.Microphone() as source:<\/p>\n<p>print(\u00abHabla ahora&#8230;\u00bb)<\/p>\n<p>audio = r.listen(source)<\/p>\n<p>try:<\/p>\n<p>texto = r.recognize_google(audio, language=\u00bbes-ES\u00bb)<\/p>\n<p>print(\u00abHas dicho:\u00bb, texto)<\/p>\n<p>return texto<\/p>\n<p>except sr.UnknownValueError:<\/p>\n<p>print(\u00abNo se entendi\u00f3 el audio\u00bb)<\/p>\n<p>except sr.RequestError as e:<\/p>\n<p>print(\u00abError al conectar con el servicio de reconocimiento:\u00bb, e)<\/p>\n<p>Puedes integrar esta funci\u00f3n dentro del flujo principal del asistente para ofrecer la opci\u00f3n de hablar en lugar de escribir. Por ejemplo, puedes mostrar un men\u00fa al usuario para elegir entre texto o voz, y en funci\u00f3n de la elecci\u00f3n, llamar a input() o a reconocer_voz().<\/p>\n<p>Este tipo de interacci\u00f3n es especialmente \u00fatil para asistentes personales en m\u00f3viles, kioscos o interfaces accesibles para personas con limitaciones de escritura.<\/p>\n<h2 id=\"paso-11-anadir-persistencia-basica-del-historial-con-archivos\"><strong>Paso 11: A\u00f1adir persistencia b\u00e1sica del historial con archivos<\/strong><\/h2>\n<p>Para dotar al asistente de una m\u00ednima memoria de conversaci\u00f3n, puedes guardar los mensajes en un archivo local. De este modo, el asistente podr\u00e1 recuperar interacciones anteriores y generar respuestas con un poco m\u00e1s de contexto.<\/p>\n<p>En este paso aprender\u00e1s a registrar cada mensaje del usuario y del asistente en un archivo de texto (historial.txt) y a cargar ese contenido cuando inicies el programa. Aunque no ser\u00e1 una memoria estructurada como una base de datos, permite retener informaci\u00f3n entre sesiones.<\/p>\n<p>Primero, define una funci\u00f3n para guardar cada intercambio en el historial:<\/p>\n<p>def guardar_historial(usuario, asistente, archivo=&#8217;historial.txt&#8217;):<\/p>\n<p>with open(archivo, &#8216;a&#8217;, encoding=&#8217;utf-8&#8242;) as f:<\/p>\n<p>f.write(f\u00bbT\u00fa: {usuario}n\u00bb)<\/p>\n<p>f.write(f\u00bbAsistente: {asistente}nn\u00bb)<\/p>\n<p>Despu\u00e9s, otra funci\u00f3n para cargar el historial desde el archivo al iniciar el programa:<\/p>\n<p>def cargar_historial(archivo=&#8217;historial.txt&#8217;):<\/p>\n<p>try:<\/p>\n<p>with open(archivo, &#8216;r&#8217;, encoding=&#8217;utf-8&#8242;) as f:<\/p>\n<p>return f.read()<\/p>\n<p>except FileNotFoundError:<\/p>\n<p>return \u00ab\u00bb<\/p>\n<p>Finalmente, modifica el flujo principal del asistente para recuperar el historial, usarlo como parte del contexto (si as\u00ed lo deseas), y actualizar el archivo despu\u00e9s de cada respuesta.<\/p>\n<p>if <strong>name<\/strong> == \u00ab<strong>main<\/strong>\u00ab:<\/p>\n<p>historial = cargar_historial()<\/p>\n<p>print(\u00abEscribe tu mensaje o &#8216;salir&#8217; para terminar.\u00bb)<\/p>\n<p>while True:<\/p>\n<p>entrada = input(\u00abT\u00fa: \u00ab)<\/p>\n<p>if entrada.lower() in [\u00absalir\u00bb, \u00abexit\u00bb, \u00abquit\u00bb]:<\/p>\n<p>break<\/p>\n<p>salida = consultar_chatgpt(entrada)<\/p>\n<p>print(\u00abAsistente:\u00bb, salida)<\/p>\n<p>guardar_historial(entrada, salida)<\/p>\n<p>Este enfoque te permite mantener un registro simple y persistente de las conversaciones sin complicaciones t\u00e9cnicas. M\u00e1s adelante podr\u00e1s evolucionarlo a JSON o una base de datos relacional si lo necesitas.<\/p>\n<h2 id=\"paso-12-anadir-memoria-conversacional-a-corto-plazo\"><strong>Paso 12: A\u00f1adir memoria conversacional a corto plazo<\/strong><\/h2>\n<p>Aunque guardar las conversaciones en un archivo es \u00fatil, no mejora las respuestas del asistente en tiempo real. Para lograr un comportamiento m\u00e1s natural, puedes implementar una <strong>memoria de corto plazo<\/strong> dentro de la misma sesi\u00f3n.<\/p>\n<p>En este paso, aprender\u00e1s a mantener en memoria los \u00faltimos mensajes intercambiados con el asistente, envi\u00e1ndolos como contexto junto a cada nueva consulta. Esto permite que ChatGPT entienda mejor el flujo conversacional sin necesidad de acceso a archivos externos o bases de datos.<\/p>\n<p>Primero, crea una lista global que actuar\u00e1 como historial temporal durante la ejecuci\u00f3n del programa:<\/p>\n<p>historial_conversacion = [<\/p>\n<p>{\u00abrole\u00bb: \u00absystem\u00bb, \u00abcontent\u00bb: \u00abEres un asistente \u00fatil especializado en programaci\u00f3n y Python. Responde de forma clara y breve.\u00bb}<\/p>\n<p>]<\/p>\n<p>Luego, ajusta la funci\u00f3n consultar_chatgpt() para incluir esa lista de mensajes, con un l\u00edmite de elementos para no saturar el contexto:<\/p>\n<p>def consultar_chatgpt(mensaje):<\/p>\n<p>try:<\/p>\n<p>historial_conversacion.append({\u00abrole\u00bb: \u00abuser\u00bb, \u00abcontent\u00bb: mensaje})<\/p>\n<p>respuesta = openai.ChatCompletion.create(<\/p>\n<p>model=\u00bbgpt-3.5-turbo\u00bb,<\/p>\n<p>messages=historial_conversacion[-6:]\u00a0 # limitar a las \u00faltimas 6 interacciones<\/p>\n<p>)<\/p>\n<p>contenido = respuesta[\u00abchoices\u00bb][0][\u00abmessage\u00bb][\u00abcontent\u00bb]<\/p>\n<p>historial_conversacion.append({\u00abrole\u00bb: \u00abassistant\u00bb, \u00abcontent\u00bb: contenido})<\/p>\n<p>return contenido.strip()<\/p>\n<p>except Exception as e:<\/p>\n<p>return f\u00bbOcurri\u00f3 un error: {str(e)}\u00bb<\/p>\n<p>Finalmente, actualiza el bloque principal para mantener el flujo conversacional y actualizar la memoria de sesi\u00f3n:<\/p>\n<p>if <strong>name<\/strong> == \u00ab<strong>main<\/strong>\u00ab:<\/p>\n<p>print(\u00abEscribe tu mensaje o &#8216;salir&#8217; para terminar.\u00bb)<\/p>\n<p>while True:<\/p>\n<p>entrada = input(\u00abT\u00fa: \u00ab)<\/p>\n<p>if entrada.lower() in [\u00absalir\u00bb, \u00abexit\u00bb, \u00abquit\u00bb]:<\/p>\n<p>break<\/p>\n<p>salida = consultar_chatgpt(entrada)<\/p>\n<p>print(\u00abAsistente:\u00bb, salida)<\/p>\n<p>Esta memoria se borra al cerrar el programa, pero mejora mucho la calidad de la conversaci\u00f3n mientras est\u00e9 activa.<\/p>\n<h2 id=\"paso-13-guardar-el-historial-de-conversacion-en-un-archivo-local\"><strong>Paso 13: Guardar el historial de conversaci\u00f3n en un archivo local<\/strong><\/h2>\n<p>Si quieres conservar las conversaciones entre sesiones, puedes guardar el historial en un archivo de texto. Esto te permitir\u00e1 registrar lo que se ha dicho y usar esa informaci\u00f3n para an\u00e1lisis, depuraci\u00f3n o entrenamiento posterior.<\/p>\n<p>En este paso, a\u00f1adiremos dos funciones: una para guardar cada turno de conversaci\u00f3n en un archivo y otra para cargar el historial completo si se desea reutilizar.<\/p>\n<p>Primero, define la funci\u00f3n que guarda los mensajes en un archivo de texto plano llamado chat_log.txt:<\/p>\n<p>def guardar_en_historial(usuario, asistente, archivo=&#8217;chat_log.txt&#8217;):<\/p>\n<p>with open(archivo, &#8216;a&#8217;, encoding=&#8217;utf-8&#8242;) as f:<\/p>\n<p>f.write(f&#8217;Usuario: {usuario}n&#8217;)<\/p>\n<p>f.write(f&#8217;Asistente: {asistente}nn&#8217;)<\/p>\n<p>A continuaci\u00f3n, puedes definir una funci\u00f3n opcional para cargar el contenido completo del historial si necesitas consultarlo o usarlo como contexto:<\/p>\n<p>def cargar_historial(archivo=&#8217;chat_log.txt&#8217;):<\/p>\n<p>try:<\/p>\n<p>with open(archivo, &#8216;r&#8217;, encoding=&#8217;utf-8&#8242;) as f:<\/p>\n<p>return f.read()<\/p>\n<p>except FileNotFoundError:<\/p>\n<p>return \u00ab\u00bb<\/p>\n<p>Estas funciones son especialmente \u00fatiles si quieres analizar conversaciones largas, auditar interacciones o construir una memoria persistente.<\/p>\n<h2 id=\"paso-14-anadir-una-interfaz-por-voz-usando-speechrecognition\"><strong>Paso 14: A\u00f1adir una interfaz por voz usando SpeechRecognition<\/strong><\/h2>\n<p>Una forma de hacer m\u00e1s natural la interacci\u00f3n con tu asistente es habilitar el reconocimiento de voz. Para ello, utilizaremos la librer\u00eda SpeechRecognition, que permite capturar audio desde el micr\u00f3fono y convertirlo a texto usando servicios como Google Speech API.<\/p>\n<p>Primero, aseg\u00farate de tener instaladas las dependencias necesarias:<\/p>\n<p>pip install SpeechRecognition pyaudio<\/p>\n<p>A continuaci\u00f3n, define una funci\u00f3n reconocer_voz() que escuche por el micr\u00f3fono y devuelva el texto transcrito. A\u00f1adiremos control de errores para mejorar la robustez del asistente:<\/p>\n<p>import speech_recognition as sr<\/p>\n<p>def reconocer_voz():<\/p>\n<p>r = sr.Recognizer()<\/p>\n<p>with sr.Microphone() as source:<\/p>\n<p>print(\u00abHabla ahora&#8230;\u00bb)<\/p>\n<p>audio = r.listen(source)<\/p>\n<p>try:<\/p>\n<p>texto = r.recognize_google(audio, language=\u00bbes-ES\u00bb)<\/p>\n<p>print(\u00abHas dicho:\u00bb, texto)<\/p>\n<p>return texto<\/p>\n<p>except sr.UnknownValueError:<\/p>\n<p>print(\u00abNo se entendi\u00f3 el audio\u00bb)<\/p>\n<p>return None<\/p>\n<p>except sr.RequestError as e:<\/p>\n<p>print(\u00abError al conectar con el servicio de reconocimiento:\u00bb, e)<\/p>\n<p>return None<\/p>\n<p>Puedes integrar esta funci\u00f3n con tu bucle conversacional para que, en lugar de teclear, el usuario pueda hablarle al asistente directamente.<\/p>\n<h2 id=\"paso-15-anadir-persistencia-basica-de-conversacion-con-archivo-de-texto\"><strong>Paso 15: A\u00f1adir persistencia b\u00e1sica de conversaci\u00f3n con archivo de texto<\/strong><\/h2>\n<p>Si quieres que tu asistente recuerde los mensajes anteriores durante la sesi\u00f3n o incluso entre ejecuciones, puedes implementar una persistencia b\u00e1sica utilizando archivos de texto. Esto permite almacenar el historial de conversaci\u00f3n localmente y simular una memoria del asistente.<\/p>\n<p>Vamos a crear dos funciones:<\/p>\n<ul>\n<li>guardar_en_historial(): guarda cada turno de conversaci\u00f3n en un archivo.<\/li>\n<li>cargar_historial(): lee el contenido completo del historial para recuperarlo al iniciar.<\/li>\n<\/ul>\n<p>Estas funciones permiten guardar lo que dice el usuario y el asistente, lo cual es \u00fatil para mantener el contexto o revisar sesiones anteriores.<\/p>\n<p>def guardar_en_historial(usuario, asistente, archivo=&#8217;chat_log.txt&#8217;):<\/p>\n<p>with open(archivo, &#8216;a&#8217;, encoding=&#8217;utf-8&#8242;) as f:<\/p>\n<p>f.write(f&#8217;Usuario: {usuario}n&#8217;)<\/p>\n<p>f.write(f&#8217;Asistente: {asistente}nn&#8217;)<\/p>\n<p>def cargar_historial(archivo=&#8217;chat_log.txt&#8217;):<\/p>\n<p>try:<\/p>\n<p>with open(archivo, &#8216;r&#8217;, encoding=&#8217;utf-8&#8242;) as f:<\/p>\n<p>return f.read()<\/p>\n<p>except FileNotFoundError:<\/p>\n<p>return \u00ab\u00bb<\/p>\n<p>Despu\u00e9s, puedes usar este historial como base de entrada para ChatGPT. Por ejemplo, puedes leer el historial antes de enviar la nueva consulta:<\/p>\n<p>def ejecutar_asistente():<\/p>\n<p>historial = cargar_historial()<\/p>\n<p>while True:<\/p>\n<p>prompt = input(\u00abT\u00fa: \u00ab)<\/p>\n<p>if prompt.lower() in [&#8216;salir&#8217;, &#8216;exit&#8217;]:<\/p>\n<p>break<\/p>\n<p>entrada = f\u00bb{historial}Usuario: {prompt}nAsistente:\u00bb<\/p>\n<p>respuesta = obtener_respuesta(entrada)<\/p>\n<p>print(\u00abAsistente:\u00bb, respuesta)<\/p>\n<p>guardar_en_historial(prompt, respuesta)<\/p>\n<p>historial += f\u00bbUsuario: {prompt}nAsistente: {respuesta}nn\u00bb<\/p>\n<p>Este sistema de persistencia es simple pero muy eficaz para proyectos personales, y puede evolucionar f\u00e1cilmente hacia almacenamiento en JSON o bases de datos si lo necesitas m\u00e1s adelante.<\/p>\n<h2 id=\"paso-16-anadir-persistencia-con-archivos-json-para-conservar-el-historial-estructurado\"><strong>Paso 16: A\u00f1adir persistencia con archivos JSON para conservar el historial estructurado<\/strong><\/h2>\n<p>Aunque guardar el historial en un archivo de texto plano es funcional, usar un archivo JSON ofrece una forma m\u00e1s estructurada de conservar los mensajes. Esto facilita operaciones como filtrar, ordenar o migrar el historial a otros formatos (como bases de datos).<\/p>\n<p>Vamos a usar un archivo historial.json que almacenar\u00e1 una lista de diccionarios con los turnos de conversaci\u00f3n. Cada mensaje tendr\u00e1 al menos dos claves: role (usuario o asistente) y content (contenido del mensaje).<\/p>\n<p>Primero, definimos dos funciones:<\/p>\n<ul>\n<li>guardar_historial_json(): guarda el historial completo en el archivo.<\/li>\n<li>cargar_historial_json(): carga el historial desde el archivo si existe, o lo inicializa si no.<\/li>\n<\/ul>\n<p>import json<\/p>\n<p>import os<\/p>\n<p>HISTORIAL_JSON = \u00abhistorial.json\u00bb<\/p>\n<p>def guardar_historial_json(historial, archivo=HISTORIAL_JSON):<\/p>\n<p>with open(archivo, \u00abw\u00bb, encoding=\u00bbutf-8&#8243;) as f:<\/p>\n<p>json.dump(historial, f, ensure_ascii=False, indent=2)<\/p>\n<p>def cargar_historial_json(archivo=HISTORIAL_JSON):<\/p>\n<p>if os.path.exists(archivo):<\/p>\n<p>with open(archivo, \u00abr\u00bb, encoding=\u00bbutf-8&#8243;) as f:<\/p>\n<p>return json.load(f)<\/p>\n<p>return []<\/p>\n<p>Luego, al ejecutar el asistente, actualizamos el historial en memoria y lo guardamos tras cada interacci\u00f3n. Tambi\u00e9n enviamos los \u00faltimos mensajes a la API para mantener el contexto.<\/p>\n<p>def ejecutar_asistente_json():<\/p>\n<p>historial = cargar_historial_json()<\/p>\n<p>while True:<\/p>\n<p>prompt = input(\u00abT\u00fa: \u00ab)<\/p>\n<p>if prompt.lower() in [&#8216;salir&#8217;, &#8216;exit&#8217;]:<\/p>\n<p>break<\/p>\n<p>historial.append({\u00abrole\u00bb: \u00abuser\u00bb, \u00abcontent\u00bb: prompt})<\/p>\n<p>respuesta = openai.ChatCompletion.create(<\/p>\n<p>model=\u00bbgpt-3.5-turbo\u00bb,<\/p>\n<p>messages=historial[-6:]\u00a0 # Solo enviamos las \u00faltimas 6 interacciones<\/p>\n<p>)<\/p>\n<p>content = respuesta[&#8216;choices&#8217;][0][&#8216;message&#8217;][&#8216;content&#8217;]<\/p>\n<p>historial.append({\u00abrole\u00bb: \u00abassistant\u00bb, \u00abcontent\u00bb: content})<\/p>\n<p>guardar_historial_json(historial)<\/p>\n<p>print(\u00abAsistente:\u00bb, content)<\/p>\n<p>Este enfoque permite conservar el historial entre sesiones, mantener el formato compatible con la API de OpenAI y escalar f\u00e1cilmente hacia una base de datos o un sistema m\u00e1s avanzado en el futuro.<\/p>\n<h2 id=\"paso-17-anadir-interfaz-web-con-gradio-para-facilitar-el-uso\"><strong>Paso 17: A\u00f1adir interfaz web con Gradio para facilitar el uso<\/strong><\/h2>\n<p>Para que cualquier persona pueda interactuar f\u00e1cilmente con tu asistente, puedes a\u00f1adir una interfaz web b\u00e1sica usando <strong>Gradio<\/strong>. Esta librer\u00eda permite construir interfaces visuales en pocos pasos, sin necesidad de HTML o JavaScript.<\/p>\n<p>Vamos a crear una interfaz sencilla que permita introducir texto, enviar la consulta al asistente y mostrar la respuesta. Para ello:<\/p>\n<ul>\n<li>Instala Gradio con pip install gradio.<\/li>\n<li>Define una funci\u00f3n que reciba el input del usuario y devuelva la respuesta generada.<\/li>\n<li>Lanza una interfaz con gr.Interface.<\/li>\n<\/ul>\n<p>import gradio as gr<\/p>\n<p>import openai<\/p>\n<p>import os<\/p>\n<p>from dotenv import load_dotenv<\/p>\n<p>load_dotenv()<\/p>\n<p>openai.api_key = os.getenv(\u00abOPENAI_API_KEY\u00bb)<\/p>\n<p>Memoria simple de la conversaci\u00f3n<\/p>\n<p>historial = []<\/p>\n<p>def responder_gradio(mensaje):<\/p>\n<p>historial.append({\u00abrole\u00bb: \u00abuser\u00bb, \u00abcontent\u00bb: mensaje})<\/p>\n<p>mensajes_recientes = historial[-6:]<\/p>\n<p>respuesta = openai.ChatCompletion.create(<\/p>\n<p>model=\u00bbgpt-3.5-turbo\u00bb,<\/p>\n<p>messages=mensajes_recientes<\/p>\n<p>)<\/p>\n<p>contenido = respuesta[\u00abchoices\u00bb][0][\u00abmessage\u00bb][\u00abcontent\u00bb]<\/p>\n<p>historial.append({\u00abrole\u00bb: \u00abassistant\u00bb, \u00abcontent\u00bb: contenido})<\/p>\n<p>return contenido<\/p>\n<p>Si quieres que la conversaci\u00f3n tenga algo de contexto, puedes almacenar los \u00faltimos turnos de di\u00e1logo en una lista compartida, que Gradio actualizar\u00e1 en cada llamada.<\/p>\n<p>Este enfoque resulta ideal para demos, asistentes personales o herramientas internas, y se puede combinar con despliegue en local o en la nube.<\/p>\n<h2 id=\"paso-18-anadir-entrada-de-voz-con-gradio-y-reconocimiento-de-audio\"><strong>Paso 18: A\u00f1adir entrada de voz con Gradio y reconocimiento de audio<\/strong><\/h2>\n<p>Adem\u00e1s de una interfaz escrita, puedes incorporar entrada de voz a tu asistente web usando <strong>Gradio<\/strong> junto con la librer\u00eda SpeechRecognition. Esto permite hablarle directamente al asistente usando el micr\u00f3fono, lo que mejora la accesibilidad y la naturalidad del uso.<\/p>\n<p>Para implementarlo:<\/p>\n<ul>\n<li>Aseg\u00farate de tener instalada la librer\u00eda SpeechRecognition y sus dependencias.<\/li>\n<li>Configura una funci\u00f3n que tome como entrada audio y lo transcriba a texto.<\/li>\n<li>Usa ese texto como input para consultar al asistente.<\/li>\n<li>Devuelve la respuesta generada y opcionalmente la transcripci\u00f3n.<\/li>\n<\/ul>\n<p>Primero instala las dependencias necesarias:<\/p>\n<p>pip install SpeechRecognition<\/p>\n<p>pip install pydub<\/p>\n<p>Luego crea una funci\u00f3n de transcripci\u00f3n:<\/p>\n<p>import speech_recognition as sr<\/p>\n<p>def transcribir_audio(audio):<\/p>\n<p>recognizer = sr.Recognizer()<\/p>\n<p>with sr.AudioFile(audio) as source:<\/p>\n<p>audio_data = recognizer.record(source)<\/p>\n<p>try:<\/p>\n<p>texto = recognizer.recognize_google(audio_data, language=\u00bbes-ES\u00bb)<\/p>\n<p>return texto<\/p>\n<p>except sr.UnknownValueError:<\/p>\n<p>return \u00abNo se entendi\u00f3 el audio.\u00bb<\/p>\n<p>except sr.RequestError:<\/p>\n<p>return \u00abError al conectar con el servicio de reconocimiento.\u00bb<\/p>\n<h3 id=\"crea-una-funcion-que-use-esa-transcripcion-como-entrada-al-asistente\"><strong>Crea una funci\u00f3n que use esa transcripci\u00f3n como entrada al asistente:<\/strong><\/h3>\n<p>def responder_desde_audio(audio):<\/p>\n<p>texto = transcribir_audio(audio)<\/p>\n<p>if texto.startswith(\u00abError\u00bb) or texto.startswith(\u00abNo se\u00bb):<\/p>\n<p>return texto<\/p>\n<p>historial.append({\u00abrole\u00bb: \u00abuser\u00bb, \u00abcontent\u00bb: texto})<\/p>\n<p>mensajes_recientes = historial[-6:]<\/p>\n<p>respuesta = openai.ChatCompletion.create(<\/p>\n<p>model=\u00bbgpt-3.5-turbo\u00bb,<\/p>\n<p>messages=mensajes_recientes<\/p>\n<p>)<\/p>\n<p>contenido = respuesta[\u00abchoices\u00bb][0][\u00abmessage\u00bb][\u00abcontent\u00bb]<\/p>\n<p>historial.append({\u00abrole\u00bb: \u00abassistant\u00bb, \u00abcontent\u00bb: contenido})<\/p>\n<p>return f\u00bbT\u00fa dijiste: {texto}nnAsistente: {contenido}\u00bb<\/p>\n<p>Y finalmente, genera la interfaz con Gradio para capturar audio desde el micr\u00f3fono:<\/p>\n<p>Interfaz por voz en Gradio<\/p>\n<p>gr.Interface(<\/p>\n<p>fn=responder_desde_audio,<\/p>\n<p>inputs=gr.Audio(source=\u00bbmicrophone\u00bb, type=\u00bbfilepath\u00bb),<\/p>\n<p>outputs=\u00bbtext\u00bb,<\/p>\n<p>title=\u00bbAsistente Virtual por Voz\u00bb,<\/p>\n<p>description=\u00bbHabla al asistente y recibe una respuesta basada en ChatGPT.\u00bb<\/p>\n<p>).launch()<\/p>\n<p>Este tipo de funcionalidad es \u00fatil en entornos educativos, asistentes accesibles o interfaces m\u00f3viles. Puedes extenderlo a\u00fan m\u00e1s incorporando s\u00edntesis de voz para que el asistente tambi\u00e9n hable.<\/p>\n<h2 id=\"paso-19-anadir-comandos-personalizados-al-asistente\"><strong>Paso 19: A\u00f1adir comandos personalizados al asistente<\/strong><\/h2>\n<p>Una forma sencilla de extender las capacidades de tu asistente es incorporar <strong>comandos personalizados<\/strong> que reconozca y ejecute antes de enviar la petici\u00f3n al modelo de lenguaje. Esto permite crear atajos, ejecutar funciones espec\u00edficas o integrar utilidades propias.<\/p>\n<p>En este ejemplo, implementaremos un sistema que detecta si el usuario escribe un comando como \/hora o \/saludo, y responde directamente desde el c\u00f3digo sin necesidad de consultar a ChatGPT. Solo si no se trata de un comando, se enviar\u00e1 el mensaje al modelo.<\/p>\n<p>A\u00f1ade un bloque de l\u00f3gica previa que detecte estas \u00f3rdenes especiales y genere una respuesta inmediata. Puedes adaptar este sistema a tus propias necesidades o incluir comandos m\u00e1s avanzados conectados a APIs externas, sensores u otros servicios.<\/p>\n<p>import datetime<\/p>\n<p>def procesar_comando(mensaje):<\/p>\n<p>if mensaje.startswith(\u00ab\/hora\u00bb):<\/p>\n<p>return f\u00bbLa hora actual es {datetime.datetime.now().strftime(&#8216;%H:%M:%S&#8217;)}\u00bb<\/p>\n<p>elif mensaje.startswith(\u00ab\/saludo\u00bb):<\/p>\n<p>return \u00ab\u00a1Hola! \u00bfEn qu\u00e9 puedo ayudarte hoy?\u00bb<\/p>\n<p>else:<\/p>\n<p>return None<\/p>\n<p>Uso combinado dentro del bucle principal<\/p>\n<p>entrada = input(\u00abT\u00fa: \u00ab)<\/p>\n<p>respuesta = procesar_comando(entrada)<\/p>\n<p>if respuesta is None:<\/p>\n<p>respuesta = consultar_chatgpt(entrada)<\/p>\n<p>print(\u00abAsistente:\u00bb, respuesta)<\/p>\n<p>Este enfoque ofrece una forma eficaz de ampliar funcionalidades sin necesidad de sobrecargar el modelo con tareas que puedes resolver directamente desde el c\u00f3digo. Adem\u00e1s, mejora el tiempo de respuesta y aporta una experiencia m\u00e1s natural para el usuario.<\/p>\n<h2 id=\"paso-20-anadir-soporte-multilenguaje-al-asistente\"><strong>Paso 20: A\u00f1adir soporte multilenguaje al asistente<\/strong><\/h2>\n<p>Una funcionalidad muy \u00fatil en asistentes conversacionales es la capacidad de operar en varios idiomas. Esto permite que el mismo asistente sea \u00fatil para usuarios de diferentes regiones o que se adapte autom\u00e1ticamente al idioma detectado en cada mensaje de entrada.<\/p>\n<p>En este paso, implementaremos una funci\u00f3n sencilla que detecta el idioma del mensaje del usuario utilizando la biblioteca langdetect. A partir de ese resultado, modificaremos din\u00e1micamente el mensaje del sistema para que el modelo responda en el mismo idioma, manteniendo la coherencia en la conversaci\u00f3n.<\/p>\n<p>Antes de nada, aseg\u00farate de<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Crear tu propio asistente virtual con inteligencia artificial ya no es una tarea reservada a grandes empresas. Gracias a herramientas [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":1060,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-3354","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sin-categorizar"],"acf":[],"_links":{"self":[{"href":"https:\/\/tecnologia.euroinnova.com\/fr\/wp-json\/wp\/v2\/posts\/3354","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tecnologia.euroinnova.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tecnologia.euroinnova.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tecnologia.euroinnova.com\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tecnologia.euroinnova.com\/fr\/wp-json\/wp\/v2\/comments?post=3354"}],"version-history":[{"count":0,"href":"https:\/\/tecnologia.euroinnova.com\/fr\/wp-json\/wp\/v2\/posts\/3354\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tecnologia.euroinnova.com\/fr\/wp-json\/wp\/v2\/media\/1060"}],"wp:attachment":[{"href":"https:\/\/tecnologia.euroinnova.com\/fr\/wp-json\/wp\/v2\/media?parent=3354"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tecnologia.euroinnova.com\/fr\/wp-json\/wp\/v2\/categories?post=3354"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tecnologia.euroinnova.com\/fr\/wp-json\/wp\/v2\/tags?post=3354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}