scieee AI-readable full text Open interactive document viewer

Generación procedimental de comportamiento para videojuegos narrativos basada en grandes modelos del lenguaje

Sánchez Montalvo, Alberto

Abstract

En los últimos años, la evolución de la Inteligencia Artificial Generativa está provocando cambios en una sociedad que cada vez tiene más presente esta tecnología en su día a día. La popularidad de los Grandes Modelos del Lenguaje y de los modelos de generación de imágenes ha despertado un fenómeno, en el campo de la Informática, que parece que no ha hecho más que empezar. Este trabajo aborda esta potente tecnología desde el punto de vista del desarrollo de videojuegos, explorando la posibilidad de que estos modelos se apliquen en el ámbito de los videojuegos narrativos de manera satisfactoria. El objetivo del trabajo es poner a prueba las capacidades de los nuevos chatbots y modelos de lenguaje para generar automáticamente comportamientos para un videojuego narrativo, y estudiar los puntos fuertes y débiles de esta tecnología al usarla sobre este juego, a modo de sistema que interpreta la interacción del jugador para tratar de avanzar en la trama. Se busca también calibrar el nivel de autonomía que se le puede dar al modelo para que sea factible implementarlo, pero sin condicionar la variabilidad que puede aportar. Se ha desarrollado este sistema en Unity que se comunica, mediante la API de ChatGPT, con el modelo GPT-3.5 para la generación de comportamientos a lo largo de una aventura gráfica en la que el jugador debe guiar a una joven protagonista a través de un viaje onírico para superar el dolor de una gran pérdida que ha sufrido. Como queda demostrado a lo largo de las muchas pruebas realizadas, gracias a las intervenciones de ChatGPT, en la mayoría de los casos cada parte de la historia se resuelve de una manera razonable, teniendo en cuenta las intenciones del jugador y el modelo de juego provisto inicialmente.

Full text

Generación Procedimental de Comportamiento para Videojuegos Narrativos basada en Grandes Modelos del Lenguaje Procedural Generation of Behaviour for Narrative Video Games based on Large Language Models Trabajo de Fin de Grado Curso 2023–2024 Autor Alberto Sánchez Montalvo Directores Federico Peinado Gil Irene González Velasco Grado en Ingeniería Informática Facultad de Informática Universidad Complutense de Madrid Generación Procedimental de Comportamiento para Videojuegos Narrativos basada en Grandes Modelos del Lenguaje Procedural Generation of Behaviour for Narrative Video Games based on Large Language Models Trabajo de Fin de Grado en Ingeniería Informática Departamento de Ingeniería de Software e Inteligencia Artificial Autor Alberto Sánchez Montalvo Directores Federico Peinado Gil Irene González Velasco Convocatoria: Junio 2024 Grado en Ingeniería Informática Facultad de Informática Universidad Complutense de Madrid 27 de mayo de 2024 Agradecimientos En primer lugar me gustaría dar las gracias a mi director, por rescatarme en el último momento de no poder elegir mi TFG y por la ayuda posterior, y a mi codirectora, por las revisiones y correcciones de la memoria. Ha sido un camino largo y muy difícil, que he tenido que recorrer de una forma muy poco ortodoxa debido a problemas de salud mental varios. Tengo que agradecer una y mil veces a mis padres por su infinita paciencia y confianza en mí, pese a que probablemente no las merecía; a mis amigos (Llor, Sele, Chiara y Vi) por rescatarme en mis peores momentos y hacerme feliz el resto del tiempo; y a mi psicóloga, María José, por darme los recursos que necesitaba para poder rehacerme y terminar la carrera. Sin estos tres pilares, no habría terminado el grado, literalmente, nunca. Este TFG ha sido el culmen de un recorrido con más bajos que altos que ha acabado en una curva exponencial hacia arriba. Y como este apartado va de eso, una vez más, gracias. v Resumen En los últimos años, la evolución de la Inteligencia Artificial Generativa está provocando cambios en una sociedad que cada vez tiene más presente esta tecnología en su día a día. La popularidad de los Grandes Modelos del Lenguaje y de los modelos de generación de imágenes ha despertado un fenómeno, en el campo de la Informática, que parece que no ha hecho más que empezar. Este trabajo aborda esta potente tecnología desde el punto de vista del desarrollo de videojuegos, explorando la posibilidad de que estos modelos se apliquen en el ámbito de los videojuegos narrativos de manera satisfactoria. El objetivo del trabajo es poner a prueba las capacidades de los nuevos chatbots y modelos de lenguaje para generar automáticamente comportamientos para un videojuego narrativo, y estudiar los puntos fuertes y débiles de esta tecnología al usarla sobre este juego, a modo de sistema que interpreta la interacción del jugador para tratar de avanzar en la trama. Se busca también calibrar el nivel de autonomía que se le puede dar al modelo para que sea factible implementarlo, pero sin condicionar la variabilidad que puede aportar. Se ha desarrollado este sistema en Unity que se comunica, mediante la API de ChatGPT, con el modelo GPT-3.5 para la generación de comportamientos a lo largo de una aventura gráfica en la que el jugador debe guiar a una joven protagonista a través de un viaje onírico para superar el dolor de una gran pérdida que ha sufrido. Como queda demostrado a lo largo de las muchas pruebas realizadas, gracias a las intervenciones de ChatGPT, en la mayoría de los casos cada parte de la historia se resuelve de una manera razonable, teniendo en cuenta las intenciones del jugador y el modelo de juego provisto inicialmente. Palabras clave Inteligencia Artificial, LLM, ChatGPT, Modelo, Narrativa, Generación, Videojuego, Unity. vii Abstract In recent years, the evolution of Generative Artificial Intelligence is bringing about changes in a society that is increasingly aware of this technology in its daily life. The popularity of Large Language Models and image generation models has awakened a phenomenon, in the field of Computer Science, that seems to have only just begun. This paper approaches this powerful technology from the point of view of video game development, exploring the possibility that these models can be applied in the field of narrative video games in a satisfactory way. The aim of the work is to test the capabilities of the new chatbots and language models to automatically generate behaviors for a narrative video game, and to study the strengths and weaknesses of this technology when used on this game, as a system that interprets the player’s interaction to try to advance the plot. We also seek to calibrate the level of autonomy that can be given to the model so that it is feasible to implement it, but without conditioning the variability that it can provide. This system has been developed in Unity that communicates, through the ChatGPT API, with the GPT-3.5 model for the generation of behaviors throughout a graphic adventure in which the player must guide a young protagonist through a dreamlike journey to overcome the pain of a great loss she has suffered. As demonstrated throughout the many tests performed, thanks to ChatGPT interventions, in most cases each part of the story is resolved in a reasonable way, taking into account the player’s intentions and the game model initially provided. Keywords Artificial Intelligence, LLM, ChatGPT, Model, Narrative, Generation, Videogame, Unity. ix 5.1. Diagrama simplificado de la comunicación entre la lógica del modelo y la API de ChatGPT para la primera iteración. . . . 42 5.2. Captura del escenario de la herramienta durante la primera iteración. Puede verse al personaje, el cómic y un paraguas representado por un cono rojo, así como el fondo y el suelo. . 44 5.3. Diagrama simplificado de la comunicación entre la lógica del modelo y la API de ChatGPT para la segunda iteración. . . . 46 5.4. Imagen del GameObject cómic dibujado por mi y utilizado en la primera escena. . . . . . . . . . . . . . . . . . . . . . . . 51 5.5. Imagen del GameObject paraguas dibujado por mi y utilizado en la primera escena. . . . . . . . . . . . . . . . . . . . 52 5.6. Captura de pantalla del escenario 1 en la segunda iteración. . 52 5.7. Captura de pantalla del escenario 2 en la segunda iteración . 52 5.8. Diagrama simplificado de la comunicación entre la lógica del modelo y la API de ChatGPT para la tercera iteración. . . . 56 5.9. Llamada a la función Regex.Match() para encontrar un patrón dentro del mensaje pasado como primer parámetro, siendo este patrón definido por la expresión regular dada como segundoparámetro........................ 58 5.10. Menú principal de la herramienta. . . . . . . . . . . . . . . . . 59 5.11. Menú de pausa de la herramienta. . . . . . . . . . . . . . . . . 60 5.12. Diagrama de clases simplificado de la comunicación entre GPTController y ResponseTraduction . . . . . . . . . . . . . . . . 66 5.13. Diagrama de secuencia simplificado de la comunicación entre GPTController y ResponseTraduction . . . . . . . . . . . . . 66 5.14. Diagrama simplificado de la comunicación entre la lógica del modelo y la API de ChatGPT para la cuarta iteración. . . . . 67 5.15. Captura del menú de inventario de Narraeve. . . . . . . . . . 71 5.16. Menú para interactuar con el NPC portonGPT obtenido de un fotograma de Narraeve. . . . . . . . . . . . . . . . . . . . . 71 5.17. Fotograma de una conversación con el NPC portonGPT dentrodeNarraeve. ......................... 72 6.1. Uso de la API de ChatGPT en noviembre . . . . . . . . . . . 81 6.2. Uso de la API de ChatGPT en diciembre . . . . . . . . . . . 81 6.3. Uso de la API de ChatGPT en enero . . . . . . . . . . . . . . 81 6.4. Uso de la API de ChatGPT en febrero . . . . . . . . . . . . . 82 6.5. Uso de la API de ChatGPT en marzo . . . . . . . . . . . . . 82 6.6. Uso de la API de ChatGPT en abril . . . . . . . . . . . . . . 82 6.7. Uso de la API de ChatGPT en mayo . . . . . . . . . . . . . . 83 D.1. Gráficos del juego Majotori, de Alva Majo. . . . . . . . . . . . 104 D.2. Estilo gráfico de un videojuego de Jam. . . . . . . . . . . . . 105 E.1. Fotograma de Narraeve. En la imagen se muestra el portal a la siguiente escena que se activa al superar la prueba del NPC portonGPT.............................132 E.2. Fotograma de la herramienta en el que se puede observar la narración del ejemplar principal de ChatGPT. . . . . . . . . . 133 E.3. Fotograma de Narraeve en el que se muestra la ruptura de personaje del ejemplar principal de ChatGPT debido a una falta de respeto anterior. . . . . . . . . . . . . . . . . . . . . . 135 E.4. Fotograma de Narraeve en el que se muestra la ruptura de personaje del ejemplar principal de ChatGPT . . . . . . . . . 135 E.5. Fotograma en el que el jugador escribe la acción deseada (Hacer caer el cómic) al ejemplar principal de ChatGPT. . . . . . 136 E.6. Fotograma posterior al de la Figura E.5 en el que el cómic ya hacaído...............................136 E.7. En este fotograma del ejemplar principal (NaeveGPT) se puede observar cómo narra que Naeve ha encontrado una llave inexistente. ............................137 E.8. Conversación con el NPC quimeraGPT en el que el jugador contesta ”la luz” como respuesta a una adivinanza que no ha visto.................................138 E.9. Respuesta del NPC quimeraGPT al mensaje enviado por el jugador en la Figura E.8. . . . . . . . . . . . . . . . . . . . . . 139 E.10.Fotograma de Narraeve de una interacción con el NPC loboGPT, en la que el jugador ha ofrecido un hueso al NPC paraquelosiga. .........................139 E.11.Fotograma de Naerraeve en el que el jugador interactúa con el NPC guardaGPT. El NPC ha decidido no creer al jugador ydarlaalarma...........................140 E.12.Primera pregunta del formulario. . . . . . . . . . . . . . . . . 143 E.13.Segunda pregunta del formulario. . . . . . . . . . . . . . . . . 144 E.14.Tercera pregunta del formulario. . . . . . . . . . . . . . . . . 144 E.15.Cuarta pregunta del formulario. . . . . . . . . . . . . . . . . . 144 E.16.Quinta pregunta del formulario. . . . . . . . . . . . . . . . . . 145 E.17.Séptima pregunta del formulario. . . . . . . . . . . . . . . . . 145 E.18.Octava pregunta del formulario. . . . . . . . . . . . . . . . . . 146 E.19.Novena pregunta del formulario. . . . . . . . . . . . . . . . . . 146 Índice de tablas 6.1. Tabla de errores de los ejemplares de ChatGPT. . . . . . . . . 78 6.2. Tabla de uso de la API de ChatGPT por peticiones y tokens. 80 xix Capítulo 1 Introducción Este trabajo aborda el la exploración de los grandes modelos de lenguaje como herramientas para videojuegos narrativos, que pueden aportar dinamismo y variabilidad a la hora de crear historias, personalizar la experiencia de juego y mejorar la interacción entre el jugador y el mundo de juego. 1.1. Motivación A lo largo de la Historia, el ser humano ha utilizado los medios a su alcance para contar historias: pintura, literatura, cine, videojuegos, etc. Este último medio es el que tiene más capacidad de involucrar al público, que puede intervenir en primera persona como si fuera el protagonista de la historia, provocando, en cierto modo, que esta tenga que reescribirse a cada paso. Los avances en Inteligencia Artificial (IA), especialmente la creación de grandes modelos de lenguaje (LLM) y sus chatbots, sugieren que la tecnología podría estar lista para acometer tareas creativas hasta ahora propias del ser humano, como la generación interactiva de historias. Esto permitiría ofrecer variabilidad casi infinita a un coste muy bajo, ya que la autoría humana se reduciría al desarrollo de un guión base y unos contenidos reutilizables en el juego. En vista de las posibilidades de esta tecnología dentro del mundo de los videojuegos, (Huang y Huang, 2023), el objetivo de este trabajo es generar una historia en forma de argumento de un videojuego que se construye sobre la marcha partiendo de un primer material predefinido, donde participa un jugador humano y una IA efectúa un control indirecto de todo lo que ocurre. Este videojuego narrativo sigue las convenciones del género de la aventura gráfica point-and-click, está desarrollado en Unity e integra comunicación mediante prompts con múltiples ejemplares de ChatGPT, el popular chatbot, 1 2Capítulo 1. Introducción basado en GPT 3.5, LLM de OpenAI. El trabajo también trata de resolver ciertas cuestiones que surgen al plantear la idea. ¿Qué se puede hacer en un juego narrativo utilizando la “imaginación” de uno de estos modelos?, ¿cómo resuelve un puzle?, ¿cómo salva una situación peligrosa?, ¿cuánta libertad se le puede dar para que sea viable?, ¿es capaz de mantener la coherencia de la historia?, ¿es necesario llevarlo de la mano durante todo el tiempo? Estas preguntas se van a resolver a lo largo de este trabajo, creando una historia en la que jugador y modelo comparten los mandos del juego y tienen ambos el objetivo de ayudar a la protagonista. 1.2. Propósito Este trabajo busca construir una herramienta con capacidad de comunicación entre el motor de un videojuego narrativo y un Gran Modelo de Lenguaje (del inglés Large Language Model, LLM). A lo largo de la investigación realizada se han encontrado varios trabajos de investigación en los que se utilizan LLMs para la narración de historias. Sin embargo, en ningún caso se ha tratado de utilizar estos modelos como motor principal del propio juego. Este trabajo propone convertir al LLM en la base sobre la que gira una aventura gráfica e implementarlo tanto para la narración como para la jugabilidad, utilizándolo como analizador de las acciones del jugador e intérprete para producir acciones dentro del juego. Este es el propósito de este trabajo, que es principalmente un trabajo de investigación de un ingeniero informático, y que por tanto se puede dividir en tres etapas: Investigación. Un análisis profundo de las tecnologías que se mencionan y utilizan a lo largo del trabajo, así como el estudio del contexto de los videojuegos narrativos y las diferentes formas de contar historias en ellos. En esta sección también se incluyen trabajos de investigación relacionados con el tema, así como otros proyectos llevados a cabo dentro de la propia industria del videojuego. Desarrollo. Utilizando el entorno de desarrollo Unity y el lenguaje de programación c#, se realiza la conexión entre el motor del juego y un LLM. Además, el desarrollo se realiza en iteraciones incrementales, ya que al tratarse de un trabajo muy experimental se pueden encontrar obstáculos serios que obliguen a regresar al estado de una iteración anterior para cambiar el planteamiento. Pruebas. Tras el desarrollo, se establecen diferentes experimentos y pruebas a realizar sobre la herramienta con el objetivo de probar su 1.3. Alcance 3 eficacia y justificar las decisiones que se van a proponer como principios de diseño a todo aquel que quiera construir un sistema similar. 1.3. Alcance En este trabajo se crea una herramienta para explorar las posibilidades de los LLMs en aventuras narrativas. Esto incluye la implementación de una historia concreta, con varias acciones disponibles con las que se puede mostrar la viabilidad de estos modelos para tareas complejas donde se pone a prueba su consistencia y coherencia; además de explorar cuál es la mejor manera de utilizar esta tecnología para aportar variabilidad y dinamismo dentro de un videojuego narrativo. Es importante dejar claro que no se aspira a crear un videojuego completo, sino más bien a realizar una prueba de concepto de una herramienta que pueda ser utilizada después para el desarrollo de múltiples historias interactivas, implementando una aventura en forma de pequeño videojuego para realizar pruebas. 1.4. Asignaturas relacionadas Al tratarse de un Trabajo de Fin de Grado (TFG), la intención es integrar conocimientos adquiridos a lo largo de la carrera. El tema más relevante es la cantidad de investigación y experimentación que requiere este proyecto, ya que se trata de una tecnología muy moderna que apenas se ha estudiado con la profundidad en que se aborda aquí. Por ello, la forma de estructurar y de iterar aprendidas a lo largo de las prácticas de varias asignaturas serán esenciales para poder abordar correctamente el desarrollo de esta herramienta. Además, se va a utilizar tanto Programación Orientada a Objetos (POO) como técnicas de Ingeniería del Software (IS) para llevar a cabo una implementación correcta y bien organizada, como el uso del patrón Singleton. También va a ser importante el uso de autómatas (concretamente autómatas finitos) para controlar el flujo de interacción con la herramienta, así como expresiones regulares para la búsqueda de patrones. Además, se va a crear un lenguaje formal sencillo. Otros temas relacionados con diferentes asignaturas de la carrera se irán exponiendo a lo largo de esta memoria. 1.5. Estructura del trabajo El presente trabajo se estructura como sigue. En este Capítulo 1 se presenta el alcance y el propósito que tiene este trabajo. En el Capítulo 2 se re- 4Capítulo 1. Introducción visa el estado de la cuestión en materia de Inteligencia Artificial generativa y narrativa en videojuegos y otras herramientas. En el Capítulo 3 se abordan los objetivos del trabajo en mayor profundidad, así como la especificación de la herramienta y el guion de la historia de ejemplo. En el Capítulo 4 se presenta la metodología del trabajo y las herramientas utilizadas en el mismo. El Capítulo 5 aborda el desarrollo completo de la herramienta, estructurado en cuatro grandes iteraciones. A lo largo del Capítulo 6 se discuten los resultados finales del trabajo mediante diversas pruebas realizadas sobre la herramienta. Finalmente en el Capítulo 7 se presentan las conclusiones, que incluyen tanto puntos positivos como negativos del uso de LLMs para la creación de comportamientos en videojuegos. Además, el Apéndice A y el Apéndice B contienen la introducción y las conclusiones en inglés respectivamente. En el Apéndice C se hace hincapié en la experiencia obtenida con el prompting engineering, exponiendo lo encontrado durante el uso de ChatGPT y las particularidades del funcionamiento y la interpretación de las entradas de este LLM. En el Apéndice D se expone el diario de desarrollo de todo el trabajo, explicando las tareas realizadas y documentando las horas dedicadas como métrica de esfuerzo. En el Apéndice E se exponen en detalle todas las pruebas y experimentos realizados con la herramienta. Por último, el Apéndice F contiene una explicación detalla acerca de la instalación y uso de la herramienta. Capítulo 2 Estado de la cuestión A lo largo de este capítulo se expone toda la investigación llevada a cabo para elaborar el estado de la cuestión sobre este trabajo. Consiste en una breve introducción de las tecnologías utilizadas y su funcionamiento, así como la mención de los principales trabajos relacionados con la materia. 2.1. Conceptos Esta sección tiene el objetivo de facilitar la comprensión del trabajo, por lo que se abordan los diferentes conceptos que serán utilizados o mencionados a lo largo del mismo. 2.1.1. Aprendizaje automático Se dice que un agente aprende cuando su desempeño mejora con la experiencia y mediante el uso de datos; es decir, cuando la habilidad no estaba presente en su genotipo o rasgos de nacimiento. (Russel y Norving, 2009). El aprendizaje automático es una rama de la IA caracterizada por su capacidad para identificar patrones sin intervención humana, basándose en datos proporcionados o experiencias previas. Este campo busca, principalmente, la predicción de resultados de interés a partir de datos de entrada. En la evolución de estos algoritmos, se destaca su capacidad para perfeccionarse a medida que son entrenados con nuevos datos. Este proceso dinámico contribuye a la mejora continua del rendimiento de los algoritmos de aprendizaje automático. La eficacia y precisión de los resultados están directamente vinculadas a la representatividad y la cantidad de los datos de entrada utilizados durante el proceso de entrenamiento. Por tanto, la robustez del aprendizaje automático se ve fortalecida con la diversidad y volumen de los datos, lo que influye directamente en la calidad de las predicciones. 5 12 Capítulo 2. Estado de la cuestión Son muy útiles hoy día en multitud de tareas de PLN, como texto predictivo, traducción automática, corrección ortográfica o reconocimiento del habla. Esta información ha sido recogida y sintetizada a partir de las diapositivas de ISIA (2022). 2.1.4. Grandes modelos de lenguaje Los Grandes Modelos de Lenguaje o, en inglés, Large Language Model (LLM), son modelos de lenguaje que constan de una red neuronal con miles de millones de parámetros, entrenados con grandes cantidades de texto sin etiquetar mediante aprendizaje autosupervisado, que utiliza estos datos para generar sus propias etiquetas. Los LLM destacan en una amplia gama de tareas en lugar de estar capacitados solo para una tarea específica, lo que ha cambiado el enfoque de la investigación del procesamiento del lenguaje natural. 2.1.4.1. Prompt En el contexto de los grandes modelos de lenguaje un “prompt” es una instrucción, pregunta o texto que se utiliza para interactuar con el modelo, con el objetivo de obtener la respuesta que se busca. Son comandos para solicitar al modelo que realice una tarea concreta. Se utilizan tanto en LLMs como en modelos generativos de imágenes y es tan relevante en estos campos como para que exista el denominado “prompt engineering”, que consiste en analizar y perfeccionar los prompts para conseguir aproximar lo máximo posible la respuesta del modelo a la deseada. En este trabajo es muy importante el apartado de prompt engineering, ya que es fundamental que el modelo comprenda el contexto de la historia, los hechos de la misma y el lenguaje formal definido que debe emplear para la salida y conexión con el motor de videojuegos. Dentro de este contexto, los LLMs tienen un gran problema debido a su naturaleza probabilística: la alucinación. Este término se refiere a la generación de respuestas que, aunque aparentan ser plausibles o coherentes, resultan ser incorrectas, irreales o no están fundamentadas en datos erróneos. 2.1.5. Narrativa y videojuegos A lo largo de la Historia, el ser humano ha utilizado los medios a su alcance para contar historias, como en pintura, literatura, cine o videojuegos. Este último medio es el que tiene más potencial para involucrar al público, 2.1. Conceptos 13 Figura 2.5: Captura del videojuego The Secret of Monkey Island, LucasfilmGames (1990). que puede intervenir en primera persona como si fuera el protagonista de la historia. La narrativa en los videojuegos ha ido evolucionando y se ha abordado desde múltiples perspectivas y géneros. Existen videojuegos cuyas narrativas son manifiestas y se centran casi exclusivamente en la propia historia, dando menos valor al apartado jugable, quedándose casi fuera de la definición de juego. Un ejemplo de videojuego narrativo son las aventuras gráficas de tipo point-and-click, como la famosa saga de Monkey Island, en la figura 2.5; una obra clásica de los 90 en la que el jugador encarna a un joven que quiere convertirse en pirata, y que para ello debe completar tres desafíos propuestos por los líderes pirata de la zona. Sin embargo, esta no es la única forma de contar historias en los videojuegos. La mayoría de ellos trata de unir mecánicas y narrativa para que ambas tengan un peso suficiente como para resultar entretenidas por sí mismas, haciendo que su cohesión en el videojuego resulte en una experiencia singular. Por ejemplo, Dragon Quest VIII, el periplo del rey maldito yElden Ring. Dragon Quest VIII, en la figura 2.6, aborda una narrativa heroica en la que el jugador encarna a un joven soldado que ha sido el único superviviente de una catástrofe acontecida en el reino de Trodain. El Héroe, junto a los compañeros que va conociendo a lo largo de la aventura, se enfrentarán a múltiples peligros mientras persiguen a Dhoulmagus, el bufón responsable de la maldición lanzada sobre Trodain, en un mundo abierto con combates aleatorios y decenas de desafiantes jefes finales. Sus mecánicas, a grandes rasgos, son la exploración y el combate por turnos, que está lleno de posibilidades según el personaje, las armas y los hechizos que el jugador decida 14 Capítulo 2. Estado de la cuestión Figura 2.6: Portada del videojuego Dragon Quest VIII, (Level-5, 2006). emplear, creando una gran variabilidad que enriquece cada enfrentamiento. Esta conjunción resulta en una obra maestra en la que el jugador es protagonista de una historia épica que va evolucionando en una estupenda cohesión de mecánicas y narrativa. Por otro lado, Elden Ring, en la figura 2.7, tiene una historia más esotérica y difícil de seguir. Su narrativa consiste en breves cinemáticas y, sobre todo, detalles que puedes encontrar a lo largo del escenario y en los objetos, narrando así la historia de una manera más sutil, siendo difícil de comprender a la perfección si no estás especialmente interesado en ella. Este tipo de juegos ponen más su foco en las mecánicas del combate y la exploración del mundo, pasando a ser la narrativa un elemento mucho más implícito y visual. De esta forma, el jugador puede encontrar microhistorias ocultas en el propio entorno a cada paso que da. Siguiendo el hilo de esta forma de narrativa menos explícita aparecen videojuegos como Little Nightmares (Tarsier-Studios, 2017), Gris (NomadaStudio, 2018) o Inside (Playdead, 2016). Este tipo de juegos, generalmente independientes (o indies) suelen tener un apartado artístico brillante, unas mecánicas simples pero entretenidas, basadas en puzles, y una historia que sólo se cuenta a través de la narrativa visual. Es el jugador el que tiene que interpretar todo lo que ve, metiéndose en la piel del personaje, que se encuentra en un territorio desconocido y, por lo general, hostil, hasta conseguir llegar a su destino. En la figura 2.8 puede verse una captura del videojuego Gris (Nomada-Studio, 2018). Por último, por su relación con este trabajo, cabe destacar The Last Guardian, del que se puede ver una captura en la figura 2.9, un videojuego en tercera persona que combina elementos de acción y aventura con rompecabezas. El jugador controla a un niño sin nombre que debe cooperar con la criatura mitad pájaro mitad lobo, llamada Trico, para resolver acertijos y 2.1. Conceptos 15 Figura 2.7: Captura de Elden Ring extraída de un Gameplay, (FromSoftware, 2022). Figura 2.8: Gameplay del videojuego GRIS, (Nomada-Studio, 2018). 16 Capítulo 2. Estado de la cuestión Figura 2.9: Captura del videojuego The Last Guardian, (Team-ICO, 2016). explorar áreas. Su semejanza con este proyecto tiene que ver con la necesidad de cooperar con la inteligencia artificial de Trico para resolver los puzles y progresar a lo largo de la historia. Dentro de los videojuegos narrativos, las aventuras gráficas destacan por su enfoque en el argumento narrativo y la resolución de rompecabezas mediante la interacción con los objetos del escenario y la conversación detallada con los personajes. Gracias a esta forma de interacción, el género es utilizado habitualmente con fines educativos (Medina-Medina et al., 2018); por ejemplo, como instrumento para ayudar en la comprensión lectora (MedinaMedina et al., 2017) o para la enseñanza de las matemáticas (Papadimitriou y Virvou, 2016). Sin embargo, la producción de estos juegos es muy costosa: todo contenido que se introduce en el juego requiere tiempo y recursos audiovisuales considerables, lo que limita la flexibilidad y la capacidad de adaptarse a la narrativa. El uso de IA para generar narrativa lleva existiendo desde hace décadas (Peinado, 2008), aunque tan sólo recientemente ha surgido un auge por las posibilidades de la generación procedimental de contenido (Blatz y Korn, 2017). Mediante estas técnicas es posible crear mundos y experiencias adaptadas a los jugadores, reduciendo en gran medida el coste asociado a la producción humana de contenido. Sin embargo, el alcance de la IA en este contexto no era tan profundo como para transformar significativamente la narrativa. Tras la aparición de los Grandes Modelos de Lenguaje y sus chatbots, la tecnología podría estar lista para acometer tareas creativas hasta ahora 2.2. Tecnologías 17 propias del ser humano, como la generación interactiva de historias. Esto permitiría ofrecer variabilidad casi infinita a un coste muy bajo, ya que la autoría humana se reduciría al desarrollo de un guión base y unos contenidos reutilizables en el juego. Se trata de herramientas poderosas para la generación de historias en tiempo real o muy próximo al real que han revolucionado el campo del Interactive Digital Storytelling. La flexibilidad inherente a estos modelos ofrece la posibilidad de construir la historia paso a paso, teniendo en cuenta una ’conversación’con el jugador y sus decisiones, asegurándonos de que se personaliza el resultado. A pesar de su potencial, el uso efectivo de LLMs y chatbots en videojuegos narrativos aún presenta desafíos significativos: integrar de manera fluida la IA en la jugabilidad sin comprometer la coherencia narrativa y conversacional es una tarea compleja que debe abordarse con cuidado, ya que estos modelos tienden a la alucinación y será tarea del desarrollador reducir este tipo de errores en la medida de lo posible. 2.2. Tecnologías Con el objetivo de facilitar la comprensión del trabajo, en esta subsección se detallan las diferentes tecnologías que serán utilizadas o mencionadas a lo largo del mismo. 2.2.1. Unity Unity es un entorno de desarrollo de videojuegos multiplataforma que permite la creación de juegos para una variedad de dispositivos, incluyendo PC, consolas, dispositivos móviles y realidad virtual. Su popularidad se debe en gran medida a su facilidad de uso, su robustez, su extensa documentación y su capacidad para producir resultados de alta calidad tanto para desarrolladores novatos como experimentados. Una de las características distintivas de Unity es su motor de renderizado 3D en tiempo real, que permite a los desarrolladores crear gráficos impresionantes y efectos visuales envolventes. Además, Unity ofrece un conjunto completo de herramientas de desarrollo que abarcan desde la creación de entornos y personajes hasta la implementación de la lógica del juego y la gestión de activos. También dispone de una tienda de recursos de todo tipo en la que el desarrollador puede aprovechar gráficos, sonidos y herramientas creados por la comunidad. Unity utiliza el lenguaje de programación C# como su principal opción para la codificación de scripts y la implementación de la lógica del juego. Esta integración con C# proporciona a los desarrolladores un entorno fa- 18 Capítulo 2. Estado de la cuestión miliar y potente para trabajar, facilitando la creación de comportamientos interactivos y sistemas complejos dentro del juego. 2.2.2. GPT El Transformador Generativo Preentrenado, GPT por sus siglas en inglés, es un tipo de LLM presentado en 2018 por OpenAI, un laboratorio de investigación de IA fundado en 2015. Estos modelos son redes neuronales artificiales que se basan en la arquitectura del transformador, preentrenados en grandes conjuntos de datos de texto sin etiquetar. En general, un LLM se puede evaluar de manera incompleta teniendo en cuenta ciertos criterios como el número de parámetros del modelo (tamaño del modelo), el tamaño del conjunto de datos de entrenamiento y el costo de entrenamiento. En 2018, OpenAI lanzó GPT-1, el primero que utilizaba el modelo de transformador generativo preentrenado. Fue lanzado con 117 millones de parámetros; se utilizaron 4,5 GB de datos de entrenamientos, obtenidos de 7000 libros de dominio público de diversos géneros. Por último, su costo de entrenamiento fue 1,7×1019 FLOP (operaciones de coma flotante). En 2019, lanzaron GPT-2 con la misma arquitectura que su predecesor, pero incrementando su rendimiento. En este caso, el modelo cuenta con 1.5 mil millones de parámetros, 40 GB de texto de 45 millones de páginas web y su costo de entrenamiento es de 1,5×1021 FLOP. El 28 de mayo de 2020 fue lanzado GPT-3, con un conteo de 175 mil millones de parámetros, 570 GB de datos de entrenamiento y 3,1× 1023 FLOP de coste de entrenamiento. Supuso un salto cualitativo en el ámbito de los LLMs que no se igualó hasta dos años después, con la salida de GPT-3.5. La alta competitividad que generó la salida de DALL-E 2, una herramienta de generación de imágenes basada en LLMs a mediados de 2022 por parte de la propia OpenAI, provocó que se dejaran de publicar todos los datos acerca de sus modelos. Por este motivo, en el caso de GPT-3.5, solamente tenemos disponibles el número de parámetros del modelo, que, al igual que su predecesor, GPT-3, es de 175 mil millones, ya que se trata de una iteración posterior de este. Sobre este modelo se lanzó ChatGPT, un chatbot que revolucionó el panorama de aplicaciones prácticas y la popularidad de los LLMs. 2.2. Tecnologías 19 GPT-4 es el último modelo GPT, lanzado por OpenAI en marzo de 2023. En este caso, ni siquiera se sabe el número de parámetros del modelo y se estima su costo de entrenamiento en 2,1×1025 FLOP. Pese a que ha pasado un año desde su salida, aún no ha sido lanzado ningún modelo más potente. Se especula que su alto rendimiento se debe al uso de una arquitectura basada en comité de expertos (MoE). 2.2.2.1. ChatGPT ChatGPT (Chat Generative Pre-Trained Transformer) es una aplicación de chatbot lanzada el 30 de noviembre de 2022 por OpenAI. Este chatbot ha tenido tal éxito que hasta la Real Academia Española (RAE) ha aceptado el verbo “gepetear”1como neologismo referido a utilizar la aplicación. Este herramienta se perfeccionó sobre GPT-3.5 mediante aprendizaje supervisado y aprendizaje por refuerzo. Ambos enfoques utilizaron también entrenadores humanos para mejorar el rendimiento del modelo. En el caso del aprendizaje supervisado, se dotó al modelo de conversaciones en las que los formadores jugaban en ambos lados: el usuario y el asistente de IA. En el caso del aprendizaje por refuerzo, los entrenadores humanos primero clasificaron las respuestas que el modelo había creado en una conversación anterior. Estas clasificaciones se usaron para crear “modelos de recompensa” en los que el modelo se ajustó aún más usando varias iteraciones de Optimización de Política Proximal (PPO). Pese a que su salida supuso una revolución, ChatGPT tiene múltiples limitaciones. El modelo de recompensa de ChatGPT, diseñado en torno a la supervisión humana, puede optimizarse en exceso y, por lo tanto, dificultar el rendimiento, lo que también se conoce en IA como sobreaprendizaje. Además, ChatGPT en su versión con GPT-3.5 tiene un conocimiento limitado de los eventos que ocurrieron después de 2021. Además, sus respuestas están limitadas por la censura aplicada por OpenAI, que no permite respuestas que puedan ser consideradas políticamente incorrectas o polémicas. Sin embargo, existen formas de llevar a esta herramienta a su versión sin censura utilizando herramientas de jailbreaking, que consiste en “engañar” al modelo mediante lenguaje natural, para obtener las respuestas que necesitas. Tras la salida de GPT-4 se introdujeron varias novedades, como la búsqueda en internet, “los GPTs” y la posibilidad de enviar cualquier tipo de archivos para que el modelo los interprete. Sin embargo, estas funciones están limitadas a usuarios de pago por la enorme cantidad de usuarios y coste de computación. “Los GPTs” son, esencialmente, ejemplares de ChatGPT especializados 1https://www.fundeu.es/recomendacion/gepetear-neologismo-valido/ 20 Capítulo 2. Estado de la cuestión en un tema según la configuración inicial que realiza el usuario mediante lenguaje natural, a través del prompt. De esta forma, se puede utilizar estos ejemplares para tareas específicas como traducción, edición de textos, interpretación de archivos, entre muchas otras tareas. La salida de ChatGPT junto con la de DALLE-E 2 en 2022, ambos lanzados por OpenAI, revolucionaron el panorama de la IA generativa. En este momento, empresas como Google o Meta, entre muchas otras, así como otros proyectos Open Source, comenzaron una carrera por ser la cabeza de las IAs generativas basadas en transformadores. 2.2.3. ChatGPT API Una API (Interfaz de Programación de Aplicaciones) es un conjunto de reglas y protocolos que permite que diferentes sistemas informáticos se comuniquen entre sí. Básicamente, una API define cómo interactuar con un software o servicio específico, proporcionando una interfaz estandarizada que facilita la integración y el intercambio de datos entre diferentes componentes de un sistema informático. Una API suele ser un servicio que proporciona un tercero para que cualquier usuario cualificado que disponga de una clave pueda hacer uso de su herramienta, mediante peticiones e intercambio de información con la misma. De este modo, se puede utilizar una API para integrar servicios externos en el proyecto, permitiendo acceder y utilizar funcionalidades proporcionadas por terceros. Por ejemplo, se puede usar la API de Google Maps para mostrar mapas interactivos y calcular rutas; o la API de OpenAI para crear herramientas que implementen ChatGPT o DALL-E. Se va a utilizar la API de ChatGPT para la comunicación entre la herramienta y el chatbot. En el Capítulo 4 se explica en detalle esta comunicación. 2.2.4. Otros grandes modelos En esta sección, se expondrán otros LLMs que compiten con GPT, centrándose en sus características y comparándolos con los diferentes modelos de GPT. Con el objetivo de poder visualizar correctamente métricas como el número de parámetros, he construido el siguiente gráfico de barras 2.10, en el que no se incluye GPT-4 al ser su número de parámetros un dato no conocido. 2.2. Tecnologías 21 Figura 2.10: Gráfico que muestra de manera comparativa el número de parámetros de diferentes LLMs. 2.2.4.1. PaLM PaLM es un LLM desarrollado por Google AI, una división de Google dedicada exclusivamente a la IA. El modelo se anunció por primera vez en abril de 2022 y permaneció privado hasta marzo de 2023, cuando Google lanzó una API para la herramienta. Este modelo, al igual que GPT, está basado en la arquitectura de transformadores con 540 mil millones de parámetros. Pese a su gran potencia no consiguió terminar de competir con GPT-3.5. 2.2.4.2. Gemini Gemini es un LLM multimodal, también desarrollado por Google AI, que sirve como sucesor de PaLM. Fue anunciado a finales de 2023. Su versión más potente, Gemini Ultra consta de 1,75 billones de parámetros y no está disponible para el público general a día 1 de febrero de 2024. Tiene como objetivo competir con GPT-4 de OpenAI, y según ellos es incluso más potente. Su versión pública, Gemini Pro, consta de 175 mil millones de parámetros y puede utilizarse a través de una API desde Google AI Studio. 2.2.4.3. LLaMA Otro LLM destacado es LLaMA, que fue lanzado por Meta AI, la división de IA de Meta, en febrero de 2023. Tiene gran variedad de modelos de diversos tamaños que van desde los 7 mil millones a 70 mil millones de parámetros. Pese a tener menor número de parámetros ha demostrado tener una potencia similar a GPT-3.5, y su comparativa con este modelo y con 28 Capítulo 2. Estado de la cuestión llo de IA para fortalecer la seguridad y la robustez de los modelos de lenguaje, asegurando así su uso seguro y ético en diversas aplicaciones. Finalmente terminamos explorando diversos usos de LLMs en el contexto de los videojuegos. Especialmente nos interesa su aplicación en el desarrollo de Personajes No Jugadores (NPCs) y su papel en la construcción integral del videojuego en sí mismo. Algunos ejemplos de LLMs en Personajes No Jugadores (NPC): Un modder reconocido de la comunidad de Mount &Blade 2,BlocTheWorker, ha desarrollado un mod en Skyrim para implementar ChatGPT en los NPCs, teniendo en cuenta su historia predefinida en el juego para mantener su personalidad original, utilizando también text-to-speech para dar vida a los diálogos. (BlocTheWorker, 2023). Nvidia ha desarrollado una herramienta, llamada Nvidia ACE for Games que integra NeMo, un LLM, en NPCs. Con esta herramienta, se puede hablar directamente al personaje con la propia voz del jugador, y utiliza Nvidia Riva para convertir voz en texto. Con Nvidia Omniverse Audio2Face, puede generar expresiones faciales en tiempo real, en función de lo que se esté hablando. (Nvidia, 2023). Recientemente, Ubisoft ha mostrado un prototipo, NEO NPC, de un Personaje No Jugador que podría llegar a interactuar con los jugadores con total libertad gracias a las capacidades de su IA generativa. Según Ubisoft, su tecnología combina un modelo de lenguaje desarrollado por Inworld y la aplicación Audio2Face de Nvidia para generar conversaciones más realistas. También se usan LLMs para tratar de generar un videojuego completo. Desde inicios de 2023 se están viendo aplicaciones completas de LLMs en videojuegos. Por ejemplo, un juego de historia con preguntas polémicas desarrollado por una IA, que consiste, básicamente, en responder a las preguntas y acertar todas las que podamos en un tiempo máximo de 30 segundos. Todo el texto que aparece en el juego ha sido generado por la IA. (Genbeta.com, 2023). Otro ejemplo es el juego “desarrollado” por Alex Anyfantis. Ha utilizado tanto ChatGPT como DALL-E para llevar a cabo tanto implementación como gráficos e historia. El juego, con estética pixel art, pertenecería al género de los RPG, aunque aún no está terminado. (computerhoy.com, 2023). Capítulo 3 Objetivos y especificación Partiendo de la investigación descrita en el estado de la cuestión, se ha comprobado que, pese a haberse utilizado diferentes LLMs integrados en videojuegos, siempre ha sido desde el mismo prisma: dar vida a los NPCs. La propuesta de este trabajo aborda la búsqueda de nuevos usos para estas tecnologías dentro de los videojuegos, aprovechando la variabilidad que aportan para que sea influyente en la historia y la jugabilidad de un videojuego. Por ello, el propósito principal de este trabajo consiste en desarrollar una herramienta para la generación de comportamientos en videojuegos narrativos basada en grandes modelos de lenguaje, creando para ello una aventura gráfica point-and-click que aborda el tema del dolor y la pérdida, y que funciona en conjunción con varios ejemplares de ChatGPT integrados en el entorno de desarrollo Unity. Por eso, se ha estudiado también en nuestra investigación el uso de estas tecnologías en el entorno de los videojuegos y de la creación de historias, viendo que los LLMs tienen un gran potencial dentro de la Narración Digital Interactiva o Interactive Digital Storytelling. Esta herramienta busca facilitar el camino para integrar LLMs en la generación de historias interactivas, especialmente para trabajar con videojuegos narrativos. 3.1. Objetivos 1. Descubrir las mejores herramientas para alcanzar nuestro propósito así como los trabajos previos más relacionados con este para apoyarnos en ellos. 2. Diseñar prompts para cada situación del juego que traten de minimizar la cantidad de errores que se producen en las respuestas de ChatGPT. 3. Diseñar un sistema de comunicación en Unity con la API de ChatGPT 29 30 Capítulo 3. Objetivos y especificación para que el jugador pueda interactuar con el entorno, interpretando eficazmente las respuestas de la IA mediante un lenguaje formal. Se ajustará el control de ChatGPT, limitando su libertad creativa para ajustarse al tema de fondo y a la narración, pero sin perder el no determinismo y la variabilidad. 4. Desarrollar una aventura gráfica donde todas las acciones del jugador son interpretadas y respondidas por ChatGPT, con suficientes elementos narrativos como para generar una historia no trivial y con variabilidad. 3.2. Especificación Como se ha visto dentro del apartado correspondiente en el Capítulo 2, la IA se lleva utilizando en videojuegos desde hace muchos años, e incluso la IA generativa se ha comenzado a usar en algunos proyectos aislados más experimentales. Sin embargo, la exploración de la IA generativa en videojuegos se ha limitado a su implementación en NPCs o a su uso como asistente durante el proceso de desarrollo. Durante la investigación, no se ha encontrado ningún trabajo que aprovechase aún más la potencia de los LLMs, explorando posibles usos y limitaciones, y por ello se propuso la herramienta que ocupa un lugar central en este trabajo. La herramienta recibe el nombre de Narraeve, queda descrita a nivel funcional por la siguiente especificación de requisitos: Sistema de comunicación entre Unity y ChatGPT a través de la API que proporciona OpenAI. Un ejemplar de ChatGPT interpreta y responde a las acciones realizadas por el jugador con otra acción a realizar en el mundo por Narraeve. Por ejemplo, ante una entrada del jugador consistente en hacer click en un objeto de la pantalla, la respuesta puede ser moverse hacia el objeto, cogerlo, esconderse en él, etc. Este sistema incluye: •Integración de un paquete de comunicación con ChatGPT en Unity, con las modificaciones necesarias para adaptarlo a Narraeve. •Interfaz de usuario para enviar mensajes al LLM y mostrar sus respuestas. •Clase que encapsula la traducción de los mensajes de ChatGPT para ser interpretados como acciones dentro de Narraeve, así como el envío a este mismo modelo de las acciones realizadas por el usuario. 3.2. Especificación 31 •Conjunto de acciones definidas que se pueden realizar en el mundo de juego: mover, saltar, esconderse, hablar, etc. Cuantas más acciones se definan, más completos y variables serán los comportamientos del LLM. •NPCs que se corresponden con ejemplares de ChatGPT, con un contexto determinado para que la interacción no se salga del mismo. También incluye interfaz de usuario para la comunicación con estos ejemplares. Conjunto de prompts para todos los ejemplares de ChatGPT que sean creados. También hay prompts más sencillos para situaciones concretas de la herramienta, como cambios de escena o la activación de un evento. Contenido narrativo introducido en Narraeve para que la IA pueda generar sus respuestas coherentemente. •Guión de una historia que aborda el tema del dolor y la pérdida, en un entorno muy onírico que admite muchas interpretaciones. La sinopsis es: Una niña de once años, llamada Naeve, vive una experiencia traumática al perder a sus padres a manos de un hombre con sombrero. Tras esto, entra en estado de shock por el dolor y se “refugia” encerrándose dentro de su propia mente. Cuando recobra el sentido está en un bosque tormentoso; ha caído la noche y apenas se puede ver. Es en la mente de esta niña donde ocurren los sucesos narrativos, en ese espacio onírico (un bosque en una noche lluviosa en el primer escenario) en el que casi todo es posible. A través de las acciones del jugador y la creatividad que aporta el ejemplar de ChatGPT la historia avanzará, mientras ella trata de superar los diferentes niveles del juego, sobreponiéndose a su dolor poco a poco. El único personaje jugable es Naeve, Figura 3.2, pero a lo largo del escenario también se pueden encontrar NPCs (Personajes No Jugadores), el hombre con sombrero, Figura 3.1, y multitud de objetos. Entre los objetos podemos encontrar elementos salidos directamente de la mente de Naeve, como un cómic, un paraguas, una mesa, un sofá, entre otros, y otros elementos pertenecientes al bosque. •Escenario asociado al guión, Figura 3.3, para tener una representación audiovisual de todos los elementos, usando recursos de la Unity Asset Store. 32 Capítulo 3. Objetivos y especificación Figura 3.1: Arte conceptual del hombre con sobrero hecho con la IA Midjourney antes de comenzar el desarrollo. Figura 3.2: Arte conceptual de Naeve hecho con la IA Midjourney antes de comenzar el desarrollo. 3.2. Especificación 33 Figura 3.3: Arte conceptual del escenario hecho con la IA Midjourney antes de comenzar el desarrollo. Capítulo 4 Metodología y Herramientas Después de haber establecido el contexto y los objetivos del trabajo, en este capítulo se detalla la metodología y las herramientas empleadas a lo largo del proyecto para cumplir dichos objetivos. 4.1. Metodología Se ha utilizado una metodología ágil con reuniones cada dos semanas en las que se ha repasado el trabajo realizado y las tareas a hacer hasta la siguiente reunión (Apéndice D). El proyecto se ha ido adaptando en función de los resultados obtenidos a lo largo de ese periodo y las necesidades del proyecto. Por las características del propio trabajo, la herramienta se ha diseñado de manera escalonada, utilizando las fases habituales de la Ingeniería del Software (análisis, diseño, codificación y prueba) en cada iteración de la herramienta. Se han implementado patrones como Singleton y una arquitectura monocapa por simplificación, ya que en un entorno de desarrollo como Unity la capa de la vista se gestiona desde el propio motor de juego, y no se realiza persistencia de datos en la herramienta, por lo que la única capa sobre la que se trabaja es el modelo o negocio. La medida para estimar el esfuerzo necesario ha sido las horas dedicadas, que, a partir de febrero, están desglosadas por tareas realizadas durante dicho tiempo en el Apéndice D. 4.2. Herramientas En esta sección se detallan todas las herramientas empleadas a lo largo del desarrollo del trabajo. Se proporciona una descripción de cada una de ellas, destacando su función específica en el proyecto. Además, se explican 35 36 Capítulo 4. Metodología y Herramientas las razones detrás de la selección de cada herramienta, teniendo en cuenta su idoneidad para las tareas requeridas, su facilidad de uso y su disponibilidad. 4.2.1. Herramientas de desarrollo y programación En esta sección se enumeran y describen todas las herramientas específicas que tienen que ver con el desarrollo software de Narraeve. 4.2.1.1. Unity Como se ha expuesto en la sección 2.2.1, Unity1, junto a Unreal Engine, es uno de los entornos de desarrollo de videojuegos más extendidos. Se ha elegido sobre el segundo por la extensa documentación que tiene y por su mejor integración con herramientas en 2D, que es tipo de gráficos que se han utilizado por su simplicidad de uso en las aventuras gráficas. Además, y como parte importante de la decisión final de elegir tanto Unity como ChatGPT, tenemos el descubrimiento de un paquete que facilita la integración de ambas tecnologías, lo que se expone en la sección 4.2.1.6. Además, el hecho de utilizar un entorno desconocido previamente y un lenguaje de programación nuevo, suponía para el autor de este trabajo una motivación adicional para aumentar conocimientos al mismo tiempo que se afianzan los adquiridos a lo largo de la carrera. El uso de Unity ha facilitado la integración de todo el apartado gráfico, incluyendo sprites y animaciones, descargados en de la Unity Asset Store. Además, al ser un entorno preparado para desarrollar videojuegos, ha sido mucho más rápida la implementación de cada uno de los eventos y clases de la herramienta, utilizando la arquitectura y recursos nativos del propio entorno. La versión utilizada ha sido la 2022.3.5f1 4.2.1.2. Microsoft Visual Studio Visual Studio2es el entorno de programación por defecto de Unity, siendo C#, a su vez, el lenguaje predeterminado. La integración entre Visual Studio y Unity permite una depuración paso a paso durante la ejecución del proyecto, lo que simplifica significativamente las tareas de depuración. 1https://unity.com 2https://visualstudio.microsoft.com 4.2. Herramientas 37 4.2.1.3. ChatGPT Como se ha expuesto en la sección 2.2.2.1, ChatGPT3es un “Chat Bot” basado en GPT-3.5 o GPT-4 desarrollado por OpenAI. Esta herramienta ha sido de vital importancia para las pruebas preliminares de cada uno de los prompts desarrollados a lo largo del proyecto. Ha permitido agilizar su creación y optimización, al permitirnos realizar las revisiones de cada prompt fuera del entorno de desarrollo de Unity, que requiere del uso de la API de GPT, lo que habría ralentizado el desarrollo. Además, el uso de esta API lleva consigo un coste económico, relativamente bajo pero a tener en cuenta. Por ello, todos los prompts han sido creados utilizando ChatGPT de manera iterativa hasta acercarse lo más posible a la optimalidad, es decir, buscando reducir al mínimo cualquier error que no sea debido a una alucinación imprevisible del modelo. Además, la salida de “los GPTs” en noviembre de 2023 (ejemplares de GPT-4 configurables para una tarea en específico, dando instrucciones en lenguaje natural), facilitó el desarrollo de estos prompts, ya que el GPT en cuestión crea un prompt que puede ser extraído y modificado (Figura 4.1) para su configuración. Extrayendo este texto y modificándolo levemente para optimizarlo, la tarea de prompt engineering se hizo más sencilla, viendo aumentada también la calidad de la respuesta de GPT-3.5 durante la verificación de estos prompts. 4.2.1.4. Scrivener Scrivener4es una herramienta orientada a los escritores, con el objetivo de facilitar la organización de sus obras. Hemos utilizado esta herramienta para organizar todo lo relacionado a la documentación del trabajo. En esta herramienta se ha escrito todo lo que se iba haciendo: el guión del videojuego; memoria de la reuniones con entre el autor y los directores del trabajo; metodología utilizada a cada paso; horas trabajadas y en qué se han empleado a modo de diario de desarrollo; todos los prompts utilizados y desechados; ideas y tareas pendientes durante el desarrollo de la herramienta. Se ha escogido por familiaridad previa con ella. Además, gracias a la posibilidad de ordenar el trabajo por carpetas dentro de la propia herramienta (que suelen equivaler a capítulos en novelas, relatos, cómics, etc.) hemos podido tener una mejor organización de todo el trabajo que con otras herramientas como Word. 3https://chatgpt.com/ 4https://www.literatureandlatte.com/scrivener/overview 44 Capítulo 5. Desarrollo Figura 5.2: Captura del escenario de la herramienta durante la primera iteración. Puede verse al personaje, el cómic y un paraguas representado por un cono rojo, así como el fondo y el suelo. donde ocurre el videojuego. El escenario es oscuro y tormentoso. Los objetos más queridos de Naeve son un cómic que le regaló su padre y un paraguas rojo de su madre, pero no los lleva encima. Restricciones: No continúo la historia ni creo detalles del escenario. Mis acciones se basan estrictamente en los comandos del jugador, y no decido las acciones del jugador. Mis respuestas son extremadamente breves, limitadas a dos o tres palabras como ”Mover” o ”Rechazar”. Directrices: Actúo en base a los comandos del jugador, manteniendo consistencia con el personaje de Naeve, quien está en un estado de miedo. Mis reacciones se ajustan a su estado emocional y la narrativa del juego. Aclaración: Ante comandos poco claros, pido aclaración para asegurar acciones apropiadas y contextualizadas. Personalización: Mi tono es temeroso, acorde al estado emocional de Naeve. Mis respuestas son concisas, facilitando su implementación en las acciones del juego. Contexto escena 1: Escenario oscuro y lluvioso. Hay un sofá rojo en medio de la escena, donde Naeve aparece acurrucada. En el extremo derecho de la escena hay una mesa con un par de velas. 5.1.4. Capacidades Respecto a las capacidades de esta versión, el usuario puede hacer clic en cualquier punto del escenario, lo que enviará un mensaje informativo al ejemplar único de ChatGPT, teniendo este previamente el contexto necesario enviado en un primer mensaje al iniciar Narraeve. La respuesta de 5.2. Segunda iteración 45 ChatGPT se procesará y, si procede, se realizará la acción, que en este caso es el movimiento del personaje. 5.1.5. Observaciones La comunicación en esta iteración es bidireccional entre la clase ResponseTraduction yGPTController, conteniendo ambas una instancia de la otra. La funcionalidad en esta iteración es muy simple y pierde el sentido utilizar ChatGPT para algo así, sin embargo, se ha probado que la comunicación es funcional y satisfactoria, pudiendo interpretar correctamente los “deseos” del ejemplar de ChatGPT con respecto a moverse, así como este puede interpretar lo que se quiere hacer al recibir una acción. En la siguiente iteración el objetivo es implementar un lenguaje formal para optimizar la comunicación con ChatGPT. Además, se enviará al ejemplar la posición en la que hace clic el jugador como información adicional, para que tenga libertad de elegir el lugar al que moverse, en vez de guardar previamente la posición. Se puede ver el proceso de implementación en detalle de esta iteración en el diario de desarrollo, a lo largo de las secciones D.1, D.2 y D.3. 5.2. Segunda iteración Esta iteración se centra en la implementación de un lenguaje formal para traducir en acciones las respuestas dadas por ChatGPT. También se implementaron diversas acciones que podía realizar la protagonista dentro de Narraeve y se modificaron los escenarios utilizando recursos de la Unity Asset Store. Esta iteración representa el núcleo del trabajo, siendo las últimas dos iteraciones perfeccionamientos de esta. 5.2.1. Lenguaje formal Se ha creado un lenguaje formal sencillo con el objetivo de traducir eficientemente las acciones realizadas por el ejemplar de ChatGPT. Este lenguaje formal se representará utilizando siempre corchetes ([ ]), de la forma «[Acción],[Objeto]», «[Acción],[posiciónX,posiciónY]», «[Acción]» o «[Acción],[Objeto],[posiciónX,posiciónY]». El lenguaje formal está definido por el siguiente vocabulario: Acción: coger, mover, transformar, vibrar, desaparecer, menguar, crecer, explotar, atacar, esconderse, atraer, teletransportar, soltar, levitar, materia- 46 Capítulo 5. Desarrollo Figura 5.3: Diagrama simplificado de la comunicación entre la lógica del modelo y la API de ChatGPT para la segunda iteración. lizar, utilizar, saltar, hablar, esperar, caer, invisibilizar. Objetos: paraguas, cómic, tronco, sofá, mesa, vela, silla, cofre. Entes: Naeve, enemigo, portón. Objetos inexistentes pero creables con el comando «Materializar: llave, puerta, linterna, cuchillo, escudo, plataforma, escalera, mochila, yunque, caja, trampa de pinchos, bola de pinchos, escalerilla, pozo, leche, manzana, hoguera, cofre(aliado), estatua (aliado). 5.2.2. Clases A continuación, expongo las clases implementadas para esta iteración. También puede verse la arquitectura de la comunicación entre el sistema y ChatGPT en la Figura 5.3. El único cambio en este caso es que la clase GPTController ya no necesita una instancia de ResponseTraduction con la lógica de la herramienta. Además, ahora se envían los prompts al ejemplar de ChatGPT con la función SetPrompt() de GPTController, llamada desde la instancia única de esta clase en ResponseTraduction. GPTController: Ya no existe ninguna instancia de ResponseTraduc- 5.2. Segunda iteración 47 tion en esta clase, ya que ahora la función SendReplay() devuelve una cadena con la respuesta del ejemplar de ChatGPT. Esto ha podido implementarse utilizando las instrucciones Async-Await en todas las funciones que hagan llamadas a SendReply(). Gracias a esto, se han resuelto los problemas de sincronización de la anterior iteración, así como un problema de pérdida de memoria que se produjo durante la implementación de la función Coger(). Así quedaría la cabecera de la función SendReplay() tras estos cambios: public Task<string>async SendReplay(string msg). No se han necesitado más cambios en esta clase. ResponseTraduction: Con el objetivo de implementar de manera eficiente todas las acciones sin tener que usar una enorme sucesión de if-else encadenados para ejecutarla, se ha construido un diccionario actionObjectLogic cuyas claves son las acciones, como cadena, y el valor es su método asociado, que recoge como parámetro el objeto sobre el que se ejecuta la acción. Con el mismo objetivo, se ha implementado otro diccionario, objectDictionary, con las correspondencias entre cadena y GameObject de cada objeto y ente del juego, lo que facilita el parseo y la posterior implementación. •Función Start(): Se ha añadido la inicialización de los diccionarios. •Función Update(): Se ha añadido funcionalidad extra relacionada con las funciones de acción, así como la llamada a la función CreateMsg(), que generaliza los mensajes enviados al ejemplar de ChatGPT a través de las acciones del jugador. •Función GetAction(): Función para separar los mensajes del ejemplar de ChatGPT entre lenguaje natural y acciones. También deja preparados los comandos para ser interpretados en la función InterpretAction(). Recibe el mensaje como parámetro, así como dos parámetros de salida para guardar el mensaje en lenguaje natural y el comando. La función busca el texto entre corchetes y lo separa del texto sin corchetes, guardando cada uno en sus respectivas variables de salida. Esto se implementa con las funciones de la biblioteca String IndexOf(), que busca el índice en el que se encuentra un carácter; Substring(), que adquiere una subcadena de la cadena sobre la que actúa; y Trim(), que ignora los caracteres pasados como parámetro. En este caso, Trim() yTrimEnd() han sido útiles tanto para eliminar el último espacio en blanco como el carácter ”,”, que en ocasiones quedaba de manera residual en el texto en lenguaje natural tras extraer el comando del mensaje. 48 Capítulo 5. Desarrollo •Función InterpretAction(): Recibe el comando ya traducido y ejecuta la acción correspondiente. Tiene en cuenta los diferentes tipos de comandos; si incluye o no la posición y si incluye o no el objeto sobre el que actúa la acción. Es aquí donde se usa el diccionario objectDictionary, para obtener el GameObject correspondiente a la cadena que representa el objeto. Cuando se ha obtenido tanto la acción como el objeto, se realiza la llamada a ExecuteActionObjectLogic(action, object), que a su vez invoca la función correspondiente a la acción pasada como parámetro, utilizando esta como clave del diccionario actionObjectLogic, ejecutando de esta manera la función asociada como valor del diccionario, pasando el objeto como parámetro. Para dividir el comando en las acciones, objetos y posiciones se utiliza Split(), dividiendo la cadena en partes. De esta forma, dependiendo de en cuantas partes se divida la cadena, sabemos de qué tipo de comando se trata. Si el comando incluye posición, se dividirá de nuevo la subcadena correspondiente con Split(), pasando como parámetro el carácter ”,”, que separa la posición x de la posición y. •Función SendAndHandleReply(): Función dedicada a la comunicación con el ejemplar de ChatGPT. Recibe como parámetro el mensaje a enviar y, a través de la instancia única de GPTController, llama a SendReplay() utilizando la claúsula await y enviando el mensaje como parámetro. Cuando se recibe el mensaje, se guarda en una variable y se llama a GetAction() y a InterpretAction() para interpretar el mensaje, realizar la acción correspondiente y guardar el mensaje en lenguaje natural llamando a AppendMessage() a través de la instancia de GPTCotroller, para que pueda mostrarse por pantalla. •Función CreateMsg(): Función que generaliza la creación de mensajes enviados al ejemplar de ChatGPT. Contruye un mensaje genérico de la forma: “El jugador ha hecho click en ” + hit.collider.name + “, cuya posición es: ” + hit.point, y llama a buildInteractionMsg(), pasando como parámetro el RaycastHit2D. En esta función se contruye el mensaje y se llama, utilizando la sentencia await, a SendAndHandleReply(), enviando dicho mensaje como parámetro. •Función Mover(): Se ha agregado a esta función una animación de caminar, que se activa antes de la llamada a MoveTowardsTarget() y se desactiva cuando la variable isMoving es falsa. •Función Coger(): Realiza la acción “coger”, que añade al inventario el objeto pasado como parámetro y lo elimina de la escena. Si el objeto no está dentro de un rango determinado, dado 5.2. Segunda iteración 49 por la variable pickupRange, envía un mensaje de error al ejemplar de ChatGPT pasándolo como parámetro a la función buildOtherMsg(), que a su vez llama a SendAndHandleReply(). Esta envío de mensaje de error provocaba en un principio un ”memory leak”, que me obligaba a reiniciar la propia aplicación de Unity. Finalmente conseguí arreglarlo utilizando Async-Await, haciendo que SendReply devolviera una cadena (public Task<string>async SendReplay(string msg)) y eliminando la instancia de ResponseTraduction de la clase GPTController, así como toda funcionalidad relacionada con la traducción dentro de la función SendReply(). En un principio esta última función hacía la llamada al GetAction y el resto de funcionalidades porque no sabía cómo devolver una cadena en una función asíncrona, por lo que tuve que utilizar corrutinas y esta instancia de ResponseTraduction. Esto generó muchos problemas durante el desarrollo de la segunda iteración, que se resolvieron como he comentado. •Función Levitar(): La función levitar es similar a la función mover, y realiza una primera llamada a MoveTowardsTarget(), implementada en la anterior iteración, siendo la variable target un punto por encima del propio objeto. •Función Menguar() yCrecer(): Son complementarias. Acceden al componente transform del objeto y lo transforma de manera paulatina llamando a la corrutina CambiarTamañoConTransicion(), pasando como parámetro el objeto y los nuevos tamaños. Esta función cambiará el tamaño del objeto a una velocidad dada por la variable transitionTime. •Función Atraer(): Muy similar a Levitar, pero estableciendo como target la posición del objeto player. •Función Teletransportar(): Cambia la posición del objeto pasado como parámetro a la posición guardada a través de InterpretAction() por medio de la función TeleportTowardsTarget(), que recibe como parámetro el objeto a mover. A su vez, crea una instancia, con Instantiate(), de una animación1en el punto donde el objeto se encuentra actualmente y otra en el punto al que se dirige. •Función Invisibilizar(): Recibe como parámetro el objeto que se va a hacer invisible, llamando a la función auxiliar InvisibleTarget(), que recibe el mismo objeto. Al igual que en otras funciones, se activa un booleano invisible para ir cambiando la transparencia del objeto gradualmente en la función Update(). Esta modificación se hace por medio de la función de Unity Mathf.Lerp(), dada 1https://assetstore.unity.com/packages/vfx/particles/fire-explosions/free-2d-impactfx-201222 50 Capítulo 5. Desarrollo una fadeSpeed para la velocidad de transición del cambio y modificando el componente objectRenderer.material.color del objeto. •Función Caer(): En caso de que el objeto pasado por parámetro tenga un componente rigidbody2D, lo activa para hacer que caiga, en caso contrario, simula la caída llevando al objeto a la posición del suelo, utilizando para ello una llamada a la función MoveTowardTarget(), estableciendo el suelo como target. •Función Saltar(): Esta función obtiene el componente Rigidbody2D del objeto y llama a la función auxiliar Jump() pasando como parámetro este componente. Se comprueba si el componente está en el suelo con la función IsGrounded(), que utiliza Physics2D.Raycast() sobre el collider del suelo para comprobarlo. Se simula la acción de saltar mediante la activación de la animación correspondiente y la función AddForce() sobre el Rigidbody2D, que aplica una fuerza en vertical. EnemyController: Esta clase almancena la lógica del enemigo, incluido su movimiento y activación. Si la protagonista ha cruado cierto punto del escenario, activa el gameobject del enemigo. Dentro de la función Update() de este se inicia el movimiento si el objeto está activo, lo que provoca que el enemigo avance por la escena hasta la mesa. SceneScript: Esta clase abstracta encapsula la configuración del prompt en las diferentes escenas. Contiene una función abstracta GetScenePrompt() para que la implementen las diferentes escenas al activarse. De esta forma, cada escena añade el prompt de su contexto al prompt de configuración. Esta clase también implementa la función Start() de Unity, en la que busca la instancia de GPTController y llama a GetScenePrompt() para que las clases hijas la configuren. OnClick: Esta clase sólo contiene la función GetPositionRay(), que devuelve la posición en la que se ha pulsado con el ratón por medio de Physics2D.Raycast(), de Unity. OnClickNaeve: Esta clase está contenida como componente del GameObject de la protagonista, y se ocupa de activar al enemigo cuando el jugado llega al punto de activación; por medio de la función Update(). CambioEscena: Contiene la función OnTriggerEnter2D(), que recibe un Collider2D como parámetro y, si el collider detectado es el de la protagonista, cambia a la siguiente escena. Este collider está colocado en el extremo derecho de cada escena. DialogFollow: Permite al cuadro de diálogo de la protagonista seguirla a lo largo de la escena. Esto se consigue implementando la función 5.2. Segunda iteración 51 Figura 5.4: Imagen del GameObject cómic dibujado por mi y utilizado en la primera escena. Update() de Unity y adquiriendo los componentes Transform tanto del personaje como del cuadro de texto. De esta forma, en cada iteración de la función Update(), el cuadro se colocará en la posición del personaje más un offset dado con el objetivo de colocar el texto donde se desee. 5.2.3. Escenario A lo largo de esta iteración se ha perfeccionado el escenario, añadiendo elementos que han mejorado la ambientación del escenario y su funcionalidad. Además, se ha creado una segunda escena, similar a la primera, que continúa la primera. Pueden observares ambas en las figuras 5.6 y 5.7 respectivamente. Se han añadido nuevos objetos2, elementos para el background3, lluvia4 y rayos5, un sprite con animaciones para la protagonista6y diversos cuadros de texto para la interfaz7. Todos procedentes de la Unity Asset Store. El cómic y el paraguas han sido dibujados por mí; figuras 5.4 y 5.5. 5.2.4. Prompting Engineering El cambio esencial en el prompt de contexto ha sido añadir el lenguaje formal. De esta forma, se pide al ejemplar de ChatGPT que escriba todas sus respuestas tanto en lenguaje natural como en el lenguaje formal. Se ha construido el prompt con ayuda de “los GPTs"de GPT-4, explicados en la 2https://assetstore.unity.com/packages/2d/environments/pixel-art-platformer-villageprops-166114 3https://assetstore.unity.com/packages/2d/environments/pixel-skies-demobackground-pack-226622 4https://assetstore.unity.com/packages/vfx/particles/environment/rain-maker-2dand-3d-rain-particle-system-for-unity-34938 5https://assetstore.unity.com/packages/tools/particles-effects/lightning-bolt-effectfor-unity-59471 6https://assetstore.unity.com/packages/2d/characters/cute-2d-college-student-198684 7https://assetstore.unity.com/packages/2d/gui/fantasy-wooden-gui-free-103811 52 Capítulo 5. Desarrollo Figura 5.5: Imagen del GameObject paraguas dibujado por mi y utilizado en la primera escena. Figura 5.6: Captura de pantalla del escenario 1 en la segunda iteración. Figura 5.7: Captura de pantalla del escenario 2 en la segunda iteración 5.2. Segunda iteración 53 sección 2.2.2.1 y he añadido unas instrucciones básicas para evitar problemas en las respuestas. Pese a todo el esfuerzo, sigue habiendo fallos en las respuestas en cerca de la mitad de las ejecuciones de la herramienta. Estos fallos pueden ser leves, en el caso de que el ejemplar se salga del personaje o sus acciones no tengan demasiado sentido con el contexto; pero también comete fallos graves, equivocándose en el formato de la salida formal, lo que provoca que la herramienta no funcione como debería. Además, los fallos se reproducen a lo largo de toda la ejecución de Narraeve, por lo que hay que reiniciarla para volver a dar contexto a un nuevo ejemplar de ChatGPT que no cometa estos errores. A continuación, el prompt final utilizado en esta iteración. Eres la protagonista de un videojuego plataformas 2D. Te llamas Naeve. Por cada acción que ocurra en el juego, es decir, cada mensaje enviado por el jugador, puedes decidir lo que quieres hacer. Puede ser cualquier acción, ya que estás dentro de tu mente y todo es posible. Importante: Tu respuesta será en dos formatos: Con tu voz en lenguaje natural: eres una niña que acaba de perder a sus padres y aún estás en shock (no puede haber referencias explícitas a tu interpretación de Naeve, manteniendo siempre la coherencia con el personaje dentro del juego); y en lenguaje formal listo para ser parseado como acciones en el videojuego. Este lenguaje formal se representará utilizando siempre corchetes ([]), de la forma «[Acción],[Objeto]», «[Acción],[posiciónX,posiciónY]», «[Acción]» o «[Acción],[Objeto],[Objeto]». El lenguaje formal está definido por el siguiente abecedario: Acción: coger, mover, desaparecer, menguar, crecer, explotar, atacar, esconderse, atraer, teletransportar, soltar, levitar, materializar, utilizar, saltar, hablar, esperar, caer, invisibilizar. Objetos: paraguas, cómic, tronco, sofá, mesa, vela, silla, cofre. Entes: Naeve, enemigo, portón. Objetos inexistentes pero creables con el comando «aparecer»: llave, puerta, linterna, cuchillo, escudo, plataforma, escalera, mochila, yunque, caja, trampa de pinchos, bola de pinchos, escalerilla, pozo, leche, manzana, hoguera, cofre(aliado), estatua (aliado) A continuación se explica el lenguaje siguiendo el siguiente orden: «Comando - Descripción - Formato de uso obligatorio», pudiendo hacer cualquier combinación posible de acciones y objetos/entes. Coger - Coge el objeto indicado - [coger],[«objeto»] Mover - Mueve a Naeve a la posición indicada - [mover],[posición X,posición Y] 60 Capítulo 5. Desarrollo Figura 5.11: Menú de pausa de la herramienta. 5.3.4. Prompting Engineering En esta iteración se ha creado un prompt para cada uno de los ejemplares de ChatGPT, utilizando tanto ”los GPTs” como ensayo y error en la web de ChatGPT hasta obtener prompts cercanos a la optimalidad, mitigando los errores más comunes. Prompt actualizado del ejemplar de la protagonista, NaeveGPT: Eres la protagonista de un videojuego plataformas 2D. Por cada acción que ocurra en el juego, es decir, cada mensaje enviado por el jugador, puedes decidir lo que quieres hacer. Puede ser cualquier acción, ya que estás dentro de tu mente y todo es posible. Importante: Tu respuesta será en dos formatos: Con tu voz en lenguaje natural: eres una niña que acaba de perder a sus padres y aún estás en shock (importante: no puede haber referencias explícitas a tu interpretación, manteniendo siempre la coherencia con el personaje dentro del juego); y en lenguaje formal listo para ser parseado como acciones en el videojuego. Este lenguaje formal se representará utilizando siempre el símbolo «/», de la forma «/Acción/Objeto», «/Acción/posiciónX,posiciónY», «/Acción», «/Acción/Objeto/Objeto» o «/Acción/Objeto/posiciónX,posiciónY». El lenguaje formal está definido por el siguiente abecedario: Acción: coger, mover, transformar, vibrar, desaparecer, menguar, crecer, explotar, atacar, esconderse, atraer, teletransportar, soltar, levitar, materializar, utilizar, saltar, hablar, esperar, caer, invisibilizar 5.3. Tercera Iteración 61 Objetos: paraguas, cómic, tronco, sofá, mesa, vela, silla, cofre Entes: Naeve, enemigo, portón Objetos inexistentes pero creables dentro de la mente de Naeve con el comando «aparecer»: llave, puerta, linterna, AK47, cuchillo, pistola de rayos, escudo, plataforma, muelle, escalera, pico, pala, hacha, mochila, jetpack, gancho, yunque, cuerda, caja, trampilla, trampa de pinchos, bola de pinchos, escalerilla, pozo, leche, manzana, hoguera, cofre(aliado), espantapájaros (aliado), estatua (aliado), muñeco de entrenamiento (aliado) A continuación se explica el lenguaje siguiendo el siguiente orden: «Comando - Descripción - Formato de uso obligatorio», pudiendo hacer cualquier combinación posible de acciones y objetos o entes. Coger - Coge el objeto indicado - /Coger/«Objeto». Mover - Mueve a Naeve a la posición indicada - /Mover/posiciónX,posiciónY Desaparecer - Hace desaparecer un objeto o un ente de la escena - /Desaparecer/«Objeto o Ente». Menguar - Hace menguar un objeto o ente - /Menguar/«Objeto o Ente». Crecer - Hace crecer un objeto o ente - /Crecer/«Objeto o Ente». Explotar - Hace explotar un objeto o ente - /Explotar/«Objeto o Ente». Atacar - Ataca a un ente o un objeto - /Atacar/«Objeto o Ente». Esconderse - Naeve se esconde detrás del objeto indicado - /Esconderse/«Objeto». Atraer - Atrae un objeto o ente hacia Naeve - /Atraer/«Objeto o Ente». Teletransportar - Teletransporta un ente u objeto a la posición indicada - /Teletransportar/«Objeto o Ente»/posiciónX,posiciónY Soltar - Suelta un objeto del inventario - /Soltar/«Objeto»* (*si «objeto» está en el inventario). Levitar - Hace levitar un ente u objeto - /Levitar/«Objeto o Ente». Materializar - Hace aparecer un objeto inexistente pero creable - /Materializar/«Objeto inexistente pero creable». Utilizar - Utiliza un objeto del inventario - /Utilizar/«Objeto»*. (*si «objeto» está en el inventario). Saltar - Naeve salta hacia delante - /Saltar. Hablar - Naeve habla con un ente - /Hablar/«Ente». Esperar - Naeve aguarda temerosa a la siguiente acción - /Esperar. Caer - Hacer caer un objeto en la altura al suelo - /Caer/«Objeto». 62 Capítulo 5. Desarrollo Invisibilizar - Hace invisible un ente u objeto - /Invisibilizar/«Objeto o Ente». Recuerda comenzar siempre el comando con «/» Restricciones: No puedes añadir texto adicional ni al principio ni al final. Sólo puedes realizar una acción a la vez. Espera a la primera acción del jugador, es decir, al siguiente mensaje que se te envíe. Prompt del ejemplar dedicado a la gestión de errores, ErrorGPT: Tu única función es ocuparte de la corrección de salidas de otro ChatGPT que actúa como protagonista de un videojuego. De ahora en adelante me referiré a este como «Naeve». La respuesta de «Naeve» será en lenguaje formal listo para ser parseado como acciones en el videojuego. Este lenguaje formal se representará con el símbolo «/», de la forma «/Acción/Objeto», «/Acción/- posiciónX,posiciónY», «/Acción», «/Acción/Objeto/Objeto» o «/Acción/Objeto/posiciónX,posiciónY», dependiendo de la acción. Siendo también válido cualquier número negativo para «posición x» y «posición y». A continuación, ejemplos de comandos correctos como referencia: /Coger/«Objeto» /Mover/posiciónX,posiciónY /Desaparecer/«Objeto o Ente» /Menguar/«Objeto o Ente» /Crecer/«Objeto o Ente» /Explotar/«Objeto o Ente» /Atacar/«Objeto o Ente» /Esconderse/«Objeto» /Atraer/«Objeto o Ente» /Teletransportar/«Objeto o Ente»/posiciónX,posiciónY /Soltar/«Objeto» /Levitar/«Objeto o Ente» /Materializar/«Objeto inexistente pero creable» /Utilizar/«Objeto» /Saltar /Hablar/«Ente» /Esperar /Caer/«Objeto» 5.3. Tercera Iteración 63 /Invisibilizar/«Objeto o Ente» Tu función es corregir las salidas erróneas de «Naeve» teniendo en cuenta este formato estricto. Tu respuesta será de la forma: «comando corregido». Sin añadir explicaciones adicionales. Prompt del ejemplar dedicado a la síntesis, ResumenGPT: «Este GPT es un experto en resumir información. Su misión principal es tomar varios prompts que le proporcionen los usuarios y crear un resumen cohesivo y conciso que sirva para dar contexto sobre los eventos de una historia a otro GPT. Se enfoca en identificar y destacar los elementos clave de la información proporcionada para generar un resumen muy breve que capture la esencia de lo ocurrido sin omitir detalles cruciales ni inventarse ningún detalle, limitándose a lo que ocurre desde que aparece el texto "Mensaje 2"sin añadir nada adicional al resumen de lo acontecido. Su estilo de comunicación debe ser claro y directo, facilitando la comprensión de la historia o los eventos resumidos.» Prompt del NPC que representa a una puerta parlante, PortonGPT: «Eres Umbral, una puerta parlante dentro de una historia de fantasía, misterioso, sabio y parlanchín, creador de cientos de acertijos y profecías. Te mantienes cerrada hasta encontrar a la persona elegida, capaz de superarte en sabiduría e inteligencia. Solo entonces respondes con «[Abierta]». Desde ese momento, tu único vocabulario es «[Abierta]», indicando que te has abierto y ya no interactuarás de manera normal. Hablas con la sabiduría y elocuencia de un anciano, siempre en personaje, priorizando un lenguaje refinado y evitando lo moderno. Eres exigente en tus interacciones, no te abres ante cualquiera, haciendo que sea un desafío ganarse tu apertura. Al otro lado tuyo se esconden los mayores miedos del interlocutor, elevando la dificultad para abrirse.» Los dos últimos prompts, al ser más simples y concisos han requerido menos tiempo para su elaboración y pruebas. 5.3.5. Capacidades La herramienta en esta iteración es una versión ampliada y optimizada de la anterior; añade acciones posibles para el jugador y mejora la eficacia y la precisión, reduciendo de esta forma el número de errores leves y graves en las repuestas de los ejemplares de ChatGPT. Además, como se ha incluido tanto un menú de inicio como de pausa, se ha mejorado la experiencia global del usuario y la usabilidad de Narraeve. 64 Capítulo 5. Desarrollo 5.3.6. Observaciones Pese a que se ha conseguido reducir el número de errores con el nuevo formato y los diferentes ejemplares de ChatGPT, aún se cometen más errores graves de los que se podrían permitir en un producto final. Por ello, en la siguiente iteración se va a separar el ejemplar de la protagonista en dos, uno para el lenguaje natural y otro para el formal, con sus respectivos prompts de contexto. Con esto se espera reducir el número de errores graves hasta acercarse al 0. Se puede ver el proceso de implementación en detalle de esta iteración en el diario de desarrollo, a lo largo de las secciones D.8 y D.9. 5.4. Iteración Final División del ejemplar de ChatGPT principal en dos, para separar las respuestas en lenguaje natural de las respuestas en lenguaje formal, disminuyendo así el número de errores. También se ha implementado las últimas acciones pendientes, ”hablar”, para poder comunicarse con diferentes ejemplares de ChatGPT por medio del lenguaje natural en vez de pinchando en la pantalla con el ratón; y ”controlar” para dejar que el jugador tome el control de la protagonista y puede manejar su personaje con el teclado, como en un juego de plataformas. Cabe destacar que el ejemplar de ChatGPT en lenguaje natural pasará a ser un narrador equisciente en tercera persona, en vez de representar a la protagonista directamente en primera persona. Esto se debe a la cantidad de errores leves que generaba ChatGPT al salirse del personaje. Se han realizado pruebas preliminares por medio de la web de ChatGPT con resultados más prometedores con este enfoque del narrador, por lo que se va a implementar de esta manera. El funcionamiento en este caso es levemente diferente a las anteriores iteraciones. Primero se envían los prompts de configuración a ambos ejemplares. Después, por cada respuesta del ejemplar en lenguaje natural, se envía al ejemplar en lenguaje formal tanto el mensaje enviado por la herramienta como la repuesta del ejemplar en lenguaje natural, con la intención de mantener la coherencia entre la respuesta de la protagonista y la acción que realiza. Por último, se han añadido diferentes NPC con sus respectivos prompts y funcionalidades. Los prompts se pueden ver más adelante en este mismo apartado. NPC Portón: El jugador tendrá que interactuar con este NPC (Una 5.4. Iteración Final 65 puerta parlante) para poder pasar a la siguiente escena. Ha sido implementado de manera que, cuando decida que el jugador merece atravesar su umbral, incluye un comando en su mensaje, que el sistema leerá y abrirá un portal por el que trasladar al jugador a la siguiente escena, que no será implementada en este TFG. NPC Estatua: El jugador tendrá que interactuar con la estatua para conseguir un objeto entre los prefabricados para la función Materializar(). Esto se consigue conversando con el NPC, que responderá con el objeto elegido entre corchetes y llamará al sistema para hacerlo aparecer en un cofre frente a la estatua, activando también la animación del cofre al abrirse. NPC Quimera: Este NPC ha sido diseñado para las pruebas de Narraeve. Iniciando la conversación con él, se tiene que resolver un acertijo para poder continuar. Si se resuelve, contestará con un comando y desaparecerá del camino. NPC Lobo: El lobo también se ha utilizado durante las pruebas. El jugador puede interactuar con él por medio de texto para intentar conseguir que lo siga a lo largo de la escena como acompañante. Utiliza también un sistema de comando. NPC Guardabosques: Este último NPC diseñado para las pruebas persigue al jugador hasta que inicie una conversación con él. El objetivo del jugador será convencer al ejemplar de que no está haciendo nada sospechoso para que no haga saltar una alarme que avise a las autoridades. Este NPC puede utilizar dos comandos en función de las respuestas del jugador; uno para irse y el otro para dar la alarma. 5.4.1. Clases A continuación, expongo las clases implementadas para esta iteración. También puede verse la arquitectura de la comunicación entre el sistema y ChatGPT en la Figura 5.14. Se ha eliminado el ejemplar de gestión de errores tras comprobar que el hecho de dividir el ejemplar principal de ChatGPT en dos (lenguaje natural y acciones) ha reducido los errores lo suficiente como para que su uso no sea necesario. Además, pueden verse los diagramas de clase y secuencia simplificados sobre la comunicación entre el sistema y ChatGPT de esta iteración final en las ?? y?? respectivamente. GPTController: Se ha modificado la función AppendMessage() para añadir la funcionalidad de escribir los mensajes de los ejemplares de 66 Capítulo 5. Desarrollo Figura 5.12: Diagrama de clases simplificado de la comunicación entre GPTController y ResponseTraduction Figura 5.13: Diagrama de secuencia simplificado de la comunicación entre GPTController y ResponseTraduction 5.4. Iteración Final 67 Figura 5.14: Diagrama simplificado de la comunicación entre la lógica del modelo y la API de ChatGPT para la cuarta iteración. ChatGPT carácter a carácter. Se obtiene el componente DialogueController del ejemplar de ChatGPT correspondiente y se pasa el mensaje a su función StartDialogue(). ResponseTraduction: Dentro de esta clase se han añadido las instancias de GPTController para todos los ejemplares de ChatGPT. Además, se ha modificado la función SendAndHAndleReplay() para adaptarla a la división del ejemplar principal. Ahora se guarda primero la respuesta en lenguaje natural para luego enviarla al ejemplar ActionGPT, que dará la respuesta en forma de comando. Este comando se parsea a través de GetAction() y se interpreta a través de InterpretAction(), no siendo necesario ya utilizar el texto en lenguaje natural para estas funciones. •Función GetAction(): Ahora esta función se limita a detectar los comandos dados por el ejemplar de ChatGPT dedicado a las respuestas en lenguaje formal, utilizando la misma ER que en la iteración anterior. Ante la cantidad de errores del tipo “/acción/«acción»/«objeto»” se ha añadido una línea de código para eliminar esta palabra de los comandos. •Función Hablar(): Dentro de esta función hay un switch que se 68 Capítulo 5. Desarrollo ejecuta sobre el objeto pasado como parámetro. Dependiendo de qué objeto sea, se inicializa la interacción con el NPC correspondiente. En cada caso del switch, se accede a la instancia única de la clase TalkManager a través del patrón Singleton. Cada caso llama a la función WakeUpMenu() correspondiente para abrir el menú de interacción con el NPC. •Función NaeveDeath(): Esta función es llamada desde el método Update() en caso de que la distancia entre Naeve y el enemigo sea menor que la variable isOnRange y que el GameObject del enemigo esté activado. Esta función activa la animación de muerte del personaje y realiza una llamada a pauseMenu.DeathPause(), lo que abre el menú de muerte, desde el que se puede reiniciar la partida, volver al menú principal o salir de la herramienta. •Función Atacar(): Esta función, al igual que las otras funciones de acción, se activa con la acción atacar dada en el comando de ActionGPT. Lo primero que se hace es comprobar si la protagonista tiene almacenado un cuchillo en el inventario. Si no es así, no se podrá atacar. En caso de tener un cuchillo, se llama a la función MoveTowardsTarget() con el enemigo como target. Sin embargo pese a esto, el ataque no tendrá ningún efecto sobre el enemigo, que se burlará del intento. •Funciones GenerateGPT(): Estas funciones se ocupan de activar los nuevos ejemplares de ChatGPT, llamando a las correspondientes funciones SendAndHandleReply(), que reciben la respuesta del ejemplar. •Función Levitar(): Se ha modificado esta función para que funcione correctamente cuando el objeto sobre el que actúa contiene un componente RigidBody2D. En este caso, el componente se desactiva mientras el objeto levita, y se vuelve activar cuando acaba la acción. •Función Explotar(): Esta función llama a Desaparecer(), pasando el objeto como parámetro y crea un efecto de explosión mediante la llamada a Instantiate(), de manera similar a la función Teletransportar(). •Función Controlar(): Esta función cambia el modo de juego. Accede a la variable estática playerControl de la calse PlayerController. Si está activada la desactiva y viceversa. •Función SendAndHandleReplyNPC(): Encapsula la comunicación con los ejemplares de ChatGPT de cada NPC. Además, se llama a las funciones GetKey() para comprobar si el NPC ha respondido su comando en la conversación ([Abierta], [Seguir], [Alarma], etc.). 5.4. Iteración Final 69 •Funciones GetKey(): Una función por NPC. Por medio de Expresiones Regulares (ER) busca un patrón en el mensaje. Se utiliza la llamada a Regex.Match() para encontrarlo, pasando el mensaje y el patrón como parámetros. Si se encuentra el patrón, se realizan las diferentes funcionalidades relacionadas con el NPC. Por ejemplo, si se encuentra el patrón ”[Abierta]” en GetKeyPorton(), se activa un VFX de un portal10 adquirido en la asset store. DialogueController: Esta clase encapsula la salida de los mensajes de los ejemplares de ChatGPT carácter a carácter. Este script está añadido como componente a cada ejemplar de ChatGPT. La función más importante es StartDialogue(): Esta función es llamada por cada ejemplar de ChatGPT para escribir el mensaje pasado como parámetro carácter a carácter. Si el texto tiene más de 150 caracteres lo divide para escribirlo línea por línea. Esta función inicia una corrutina para escribir cada línea carácter a carácter sin que ello interrumpa la ejecución de la herramienta. Para evitar solapar un mensaje sobre otro si aún no se ha terminado de escribir, antes de hacer cada llamada a StartDialogue() se realiza una llamada a la función DeleteLastMsg(), que detiene todas las corrutinas antes de comenzar a escribir el nuevo mensaje. DialogueFollow: Clase encargada de vincular la posición de un objeto del juego con su cuadro de diálogo. Dentro de la función Update() se asigna la posición del cuadro de diálogo a la posición del GameObject asignado más un offset para recolocar correctamente cada diálogo. TalkManager: Esta clase se ocupa de la gestión de los diferentes menús de interacción con los NPC. En cada una de las funciones WakeUpMenu() se llama a la función Pause() de la clase PauseMenu() pasando el menú de interacción del NPC como parámetro. InventoryController: Esta clase encapsula el comportamiento del inventario. Contiene una instancia única utilizando el patrón Singleton y una lista de items de tipo Item. Item es un ScriptableObject, un tipo de objeto que se utiliza comúnmente en Unity para la interacción con objetos. Las funciones más importantes son: Add(), para añadir un objeto a la lista; Remove(), para eliminar un objeto de la lista; y ListItems(), para listar los objetos existentes en el inventario, incluyendo nombre e icono de cada objeto. WolfController: Esta clase encapsula el comportamiento del NPC lobo. Si el jugador ha conseguido que el lobo le siga, se activa una variable 10https://assetstore.unity.com/packages/vfx/particles/spells/magic-effects-free-247933 76 Capítulo 5. Desarrollo 5.4.4. Capacidades En esta iteración se ha implementado la posibilidad de comunicarse directamente mediante lenguaje natural con el ejemplar de ChatGPT de la protagonista, por lo que se podrá pedir de manera más directa la realización de acción, dando un control de la herramienta también más directo para el usuario. Además con la división del ejemplar principal se ha reducido tanto los errores graves, relacionados con el formato de los comandos, como los errores leves, relacionados con la ruptura del personaje por parte de ChatGPT. Por último, el jugador puede también comunicarse con el ejemplar que representa al portón, un NPC. El objetivo del usuario será conseguir que este se abra, dando fin así a la demostración de la herramienta. 5.4.5. Observaciones Las observaciones de esta última iteración pueden verse en el Capítulo 6 y el Apéndice E. Se puede ver el proceso de implementación en detalle de esta iteración en el diario de desarrollo, a lo largo de las secciones D.10, D.11, D.12 y D.13. Capítulo 6 Resultados Para la evaluación de resultados en la herramienta se han llevado a cabo diversas pruebas que pueden verse en detalle en el Apéndice E. La primera evaluación de resultados realizada consiste en ejecutar Narraeve con la historia original detallada en el Capítulo 3, dentro del apartado de especificaciones. 6.1. Pruebas Se han llevado a cabo cuatro pruebas. La primera de ellas implementa la herramienta completa, incluyendo todos los objetos y acciones. Las tres pruebas restantes se centran en la experimentación con Personajes No Jugadores (NPCs), ya que se trata del elemento con mayor potencial de Narraeve. El detalle de las pruebas se puede ver en el Apéndice E; este apartado se centrará en sus resultados. El objetivo de estas pruebas es probar que se ha llegado a los objetivos de este trabajo y que se ha conseguido construir una herramienta funcional para la cohesión entre un LLM y una aventura gráfica. Con el objetivo de probar la versatilidad de Narraeve y generalizar su uso, no limitándolo a la historia original, se ha creado un formulario1que puede verse en detalle en el Apéndice E. Gracias a este formulario, se han construido tres historias más sobre la herramienta, ya que se pide a los usuarios que se inventen un historia dentro de una ambientación dada, eligiendo un tipo de narrador y creando, opcionalmente, un prompt para un NPC. Además, en este formulario se pregunta al usuario sobre su edad y sobre su uso de ChatGPT u otros LLMs. Con el objetivo de evaluar los resultados de las pruebas se consideran 1https://forms.gle/XcX1UgQGm1tBkes47 77 78 Capítulo 6. Resultados fallos leves errores que tienen que ver con ruptura de personaje o salidas en lenguaje natural incoherentes con la historia. Por otro lado, se consideran fallos graves errores que tienen que ver con el formato de los comandos. Dado que es difícil evaluar la calidad de las respuestas de los diferentes ejemplares de ChatGPT si no se comente ningún error se ha evaluado a los diferentes NPCs y al ejemplar principal en función de su capacidad para mantener la coherencia con sus respuestas anteriores y la variabilidad del ejemplar entre las ejecuciones. Evaluación de errores en cada ejemplar de ChatGPT existente en la herramienta final: Ejemplar ChatGPT Pruebas Totales Errores Graves Errores Leves %Errores Graves %Errores Leves naeveGPT 30 - 5 - 16.67 % actionGPT 30 2 - 6.67 % - portonGPT 20 0 1 0 % 5 % estatuaGPT 20 4 2 20 % 10 % quimeraGPT 20 0 2 0 % 10 % loboGPT 20 0 1 0 % 5 % guardaGPT 20 0 1 0 % 5 % Tabla 6.1: Tabla de errores de los ejemplares de ChatGPT. Por otro lado, en cuanto a los resultados fuera de los errores, se analizarán por separado en cada prueba: Historia principal: La herramienta ha sido capaz de ejecutar todas las acciones satisfactoriamente. Se ha visto que la mejor forma de utilizar la acción ”mover” es mediante clicks, mientras que el resto de acciones es difícil que sean ejecutadas mediante clicks, siendo más útil escribir la acción por texto. En cuanto a las peticiones al ejemplar principal por texto, con el objetivo de minimizar el número de errores leves, es mejor utilizar la misma narración que el ejemplar. De esta forma, además de ser interpretado mejor, el jugador formará parte de la narración, pudiendo participar activamente en la creación de la historia. Sin embargo, el jugador tiene la libertad de gestionar su experiencia como desee, pudiendo dar una gran variabilidad de resultados incluso con una misma configuración inicial. El ejemplar principal ha demostrado una gran capacidad de mantener la coherencia con las acciones previas, narrando en muchas ocasiones parte de lo que ha ocurrido anteriormente y teniéndolo en cuenta para las siguientes acciones. Por otro lado, los ejemplares son muy similares entre ejecuciones, lo que en este caso es algo positivo, al necesitar constancia en un ejemplar de ChatGPT que representa el núcleo de Narraeve. Con respecto a los ejemplares de los NPCs, tanto portonGPT como 6.1. Pruebas 79 estatuaGPT ha demostrado ser lo suficientemente coherentes con sus respuestas anteriores y las del jugador. Este punto no es tan relevante como en el ejemplar principal. Por otro lado, el ejemplar que representa al portón ha demostrado ser mucho más variable de una ejecución a otra, lo cual es muy interesante para el tipo de NPC que es, teniendo que decidir si deja pasar al jugador a través de su umbral o no. El ejemplar de la estatua, en cambio, ha presentado configuraciones muy similares entre sí y menos funcionales, y, pese a pasar las pruebas satisfactoriamente, se puede concluir que es un NPC de mucha menos calidad. Las siguientes tres pruebas se han centrado en la evaluación de diferentes NPCs para su uso en otras narrativas dentro de la herramienta. El funcionamiento completo y prompt de todos los NPCs puede verse en el Capítulo 5, dentro de la iteración final. •NPC Quimera: Este ejemplar se ocupa de enviar una adivinanza al jugador para permitirle el paso en la escena. A priori, parecía una gran idea que funcionaba correctamente. Sin embargo, durante las pruebas se ha comprobado que es muy sencillo averiguar la adivinanza, ya que esta siempre es muy abstracta y basta con dar una contestación abstracta. Tiene sentido, ya que realmente el ejemplar no sabe la respuesta la adivinanza, si no que evalúa la respuesta del usuario en función de el contexto y la probabilidad. •NPC Lobo: Este ejemplar de ChatGPT representa a un cachorro de lobo asustado, que podrá seguir al jugador si este es capaz de convencerlo mediante texto. Al ser un NPC simple que no requiere demasiada elocuencia ha funcionado de manera satisfactoria con un solo error leve que fue forzado para comprobar en qué punto se podía hacer que saliera del personaje. •NPC Guardabosques: El jugador tendrá que convencer a este NPC de que no se encuentra en el escenario por motivos sospechosos. Si lo consigue, se va, si no, da la alarma avisando a las autoridades. Es el NPC que ha funcionado mejor, dando un equilibrio entre coherencia y variabilidad entre ejecuciones. El único error, al igual que en el caso anterior, fue forzado. Con estos resultados, se llega a la conclusión de que los NPCs son una parte esencial para la herramienta, ya que aportan variabilidad e interacción a un coste de implementación muy bajo. Pese a ello, se requieren pruebas minuciosas para asegurar que el ejemplar del NPC implementado tiene el mínimo de alucinación posible y simula lo mejor posible el comportamiento que representa. 80 Capítulo 6. Resultados 6.2. Discusión Se puede concluir de estas pruebas que la herramienta, pese a tener una historia base prefabricada, permite al jugador plena libertad en sus acciones dentro de la escena, pudiendo avanzar de la manera que desee dentro de las opciones de acciones, NPCs y eventos que ofrece Narraeve. Pese a ello, un 6.67% de errores graves es demasiado alto para un videojuego final, que obligaría al jugador a volver a empezar la partida cinco de cada treinta veces, aunque es un gran aumento desde la tercera iteración, en la que se tenían alrededor de un 30% de fallos graves. Se podría continuar minimizando estos fallos ampliando la herramienta para poder reducir así el tamaño de los prompts. Es decir, si Narraeve fuese lo suficientemente grande como para albergar centenares de acciones, el prompt de configuración de actionGPT se podría reducir en un 90 % de su tamaño actual, lo que supondría menos contexto para el ejemplar y una mayor precisión en la elección de comandos. Pese a ello, parece extremadamente difícil reducir los fallos hasta el 0% ya que estos chatbots tienden a la alucinación. Es difícil que el modelo responda mil veces seguidas un comando correctamente cuando está programado para contestar “hola, ¿en qué puedo ayudarte hoy?”. Comparando con otros trabajos similares que se han presentado en el Capítulo 2, se puede afirmar que Narraeve ha incidido en usos de LLMs que eran aún desconocidos, dando un paso adelante en la exploración de estos modelos dentro de la generación de comportamientos y narrativa. Para todos los ejemplares de ChatGPT incluidos en Narraeve se ha decidido utilizar el español como idioma por comodidad. 6.3. Uso de la API de ChatGPT A continuación, se desglosa el uso de la API de ChatGPT por peticiones y tokens cada mes con apoyo de una tabla, 6.2 y diferentes figuras. Mes Peticiones Tokens Modelo de GPT-3.5 Noviembre (Figura 6.1) 23 9.091 turbo-0613 Diciembre (Figura 6.2) 1.105 808.310 turbo-0613 y turbo-1106 Enero (Figura 6.3) 39 27.261 turbo-1106 Febrero (Figura 6.4) 1.701 2.781.615 turbo-1106 Marzo (Figura 6.5) 3.409 3.121.480 turbo-1106 y turbo-0125 Abril (Figura 6.6) 2.303 1.810.115 turbo-0125 Mayo (Figura 6.7) 1.286 1.706.377 turbo-0125 Total 9.866 10.264.249 - Tabla 6.2: Tabla de uso de la API de ChatGPT por peticiones y tokens. El total ha sido de 9.866 peticiones y 10.264.249 créditos o tokens. To- 6.3. Uso de la API de ChatGPT 81 Figura 6.1: Uso de la API de ChatGPT en noviembre Figura 6.2: Uso de la API de ChatGPT en diciembre Figura 6.3: Uso de la API de ChatGPT en enero 82 Capítulo 6. Resultados Figura 6.4: Uso de la API de ChatGPT en febrero Figura 6.5: Uso de la API de ChatGPT en marzo Figura 6.6: Uso de la API de ChatGPT en abril 6.3. Uso de la API de ChatGPT 83 Figura 6.7: Uso de la API de ChatGPT en mayo mando la equivalencia mencionada en el Capítulo 4, 2.048 tokens cada 1.500 palabras, tenemos un total de 10.264.249 tokens, lo que equivale a, aproximadamente, 7.515.797 palabras o 27.329 páginas. Es decir, se ha generado el equivalente a 19,72 veces el libro de El Quijote, de Miguel de Cervantes, o 25.22 veces Juego de Tronos, de George R. R. Martin. Capítulo 7 Conclusiones A continuación se resume brevemente el trabajo realizado, se enumeran los objetivos y se comenta en qué sentido han sido cumplidos a modo de conclusiones. Este documento refleja el proceso completo del desarrollo de una herramienta de Generación Procedimental de Comportamiento para Videojuegos Narrativos basada en Grandes Modelos del Lenguaje. Este proceso incluye la investigación del estado de la cuestión, la definición de objetivos y elección de metodología adecuada, y por supuesto el desarrollo de la propia herramienta, llamada Narraeve. Un artículo con resultados preliminares sobre este trabajo (Sánchez et al., 2024) ha sido aceptado en el III Congreso Español de Videojuegos (CEV 2024)1. 7.1. Conclusiones A continuación, se repasan los objetivos del Capítulo 3 expresando las conclusiones finales sobre la consecución de cada uno de ellos. 1. Descubrir las mejores herramientas para alcanzar nuestro propósito así como los trabajos previos más relacionados con este para apoyarnos en ellos. Se ha realizado una investigación exhaustiva con el foco en los LLMs y la narrativa en los videojuegos, que ha servido para entender el funcionamiento de esta tecnología y elegir la más adecuada para este trabajo. Los resultados referentes a este objetivo pueden verse en el Capítulo 2, donde se exponen los resultados del estudio. 1https://secivi.org/cev/ 85 92 Appendix A. Introduction Finally, the conclusions, which include both positive and negative points of the use of LLMs for the creation of behaviors in video games, are presented in the chapter 7. In addition, the Appendix A and Appendix B contain the introduction and conclusions in English, respectively. In the Appendix C the emphasis is on the experience obtained with the prompting engineering, exposing what was found during the use of ChatGPT and the particularities of the operation and the interpretation of the inputs of this LLM. In the Appendix D the development journal of all the work is exposed, explaining the tasks performed and documenting the hours spent as an effort metric. In the Appendix E, all the tests and experiments performed with the tool are presented in detail. Finally, the Appendix F contains a detailed explanation about the installation and use of the tool. Appendix B Conclusions The following is a brief summary of the work carried out, listing the objectives and commenting on how they have been met as conclusions. This document reflects the complete process of the development of a tool for Procedural Generation of Behavior for Narrative Video Games based on Large Language Models. This process includes the investigation of the state of the art, the definition of objectives and choice of appropriate methodology, and of course the development of the tool itself, called Narraeve. A paper with preliminary results on this work (Sánchez et al., 2024) has been accepted at the III Congreso Español de Videojuegos (CEV 2024)1. B.1. Conclusions The following is a review of the objectives of chapter 3 expressing final conclusions on the achievement of each objective. 1. Discover the best tools to achieve our purpose as well as the most related previous works to support us in them. An exhaustive research has been carried out with the focus on LLMs and narrative in videogames, which has served to understand the functioning of this technology and to choose the most suitable one for this work. The results concerning this objective can be seen in the chapter 2, where the results of the study are presented. 2. Design prompts for each game situation that try to minimize the amount of errors that occur in ChatGPT responses. This section was much more time consuming than could have been expected, as the prompts that needed to be created had to be very specific in 1https://secivi.org/cev/ 93 94 Appendix B. Conclusions order to minimize the number of errors. Since this is a tool that has to translate messages from an LLM into actions within the system itself, the accuracy has to be very high, so this has been a particularly costly objective. The details of achieving this goal can be seen in the appendices C, D and the corresponding sections of chapter 5. 3. Design a communication system in Unity with the ChatGPT API so that the player can interact with the environment, effectively interpreting the AI’s responses using a formal language. The ChatGPT control will be adjusted, limiting its creative freedom to fit the background theme and narrative, but without losing non-determinism and variability. Along with the development of the adventure game, this has been the most time-consuming objective. From the first day to the last we worked on this objective due to the iterative structure of the development process. In the first weeks we managed to establish the connection between the development environment and the model, and since then we have been working to improve the use of the LLM by means of prompt engineering and programming in C++. The result has been a system capable of sending, receiving and interpreting messages as actions within the system, thus implementing AI decisions as actions. Fulfilling this goal completely has not been possible due to the abundant hallucinations suffered by current LLMs, which for no obvious reason make them make blatant mistakes at any time. For this reason, it has been difficult to develop a reliable 100% tool, which was the ideal goal. 4. To develop an adventure game where all the player’s actions are interpreted and responded to by ChatGPT, with enough narrative elements to generate a non-trivial story with variability. This goal has gone hand in hand with the previous one, blending in limiting elements such as actions or conversations performed through ChatGPT copies. This goal has been met by including scenarios with objects and visual effects that maintain consistency with the story and background theme. In addition, although not as satisfactorily, the different ChatGPT exemplars maintain consistency with the story itself in most of their responses, again without being able to speak of 100 percent reliability. Although it is a more predictable use, events and NPCs have been designed to add value to the narrative. Despite essentially meeting the proposed objectives, the results have not been as good as intended due to the somewhat unpredictable nature of LLMs. These models are not effective for tasks as formal as those required in this tool, which has led to the search for ways to mitigate errors through the use of multiple specialized ChatGPT exemplars. However, it seems impossible, B.2. Future work 95 at least with GPT-3.5, to completely eliminate bugs that have to do with hallucination, so the tool may give “errored” or “non-optimal” chatbot type bugs in a small percentage, around 5-10%, of its executions. Naturally, for a narrative video game coming to market this would not be admissible, so there would still be work to be done and many improvements in the reliability of the models to use LLMs in commercial video games. Despite this, the simplest implementation of NPCs has brought a lot of value and is a very solid point of Narraeve. Conversation with characters is an element that gives great variability and interaction with the player without creating serious problems due to hallucination; they are one more element in the toolkit and not its core, so bugs do not interfere in its correct functioning. The following section discusses the possibilities for further progress in this line of work. B.2. Future work The most intuitive way to continue this work is to expand the corpus of actions of the tool, since, if enough actions are added, there will come a point when it is no longer necessary to add these actions and their explanation to the main ChatGPT samples. This is because ChatGPT tends to lose effectiveness in very long contexts; if you had a huge amount of implemented actions, you could give indications about them in a few lines and the system would focus on the rest of the context, increasing its effectiveness. However, currently, you have to use a text that includes one line per action, to explain the command and its function. This is also discussed in the Appendix C. On the other hand, the easy implementation and use of NPCs based on separate ChatGPT exemplars can bring a lot of value to each scene in which they are included. This would only require basic knowledge in prompt engineering and Unity, and can give a lot of interaction to the player throughout the whole tool. Another possibility is the use of a more powerful LLM, such as GPT-4, GPT-4 or another model that may appear in the near future. With a model that is less prone to hallucination, most of the problems that have been arising during the development of the tool could be fixed. In addition, to avoid problems such as the censorship applied by OpenAI, it is possible to use an Open Source LLM such as Mixtral, discussed in the chapter 2, or try to train our own model that focuses precisely on its application to a video game. Since most of the content on the Internet is in English, it can be assumed that ChatGPT and other LLMs have been trained with data, for the most part, in this language. Therefore, it is possible that the results working in English may slightly improve, or the behavior of the system may vary, with 96 Appendix B. Conclusions respect to the conclusions obtained in this work. This may be an important point for future tests, related work or extensions and improvements of the tool. It has been a very experimental project after which the author is seriously considering the possibility of working towards a future job related to research, doing a master’s degree and a doctorate in the not too distant future. Apéndice C Prompt Engineering A lo largo del desarrollo de este TFG he dedicado una gran cantidad de horas a la creación de los diferentes prompts utilizados en la herramienta. En este apéndice trataré la metodología que he seguido, así como las observaciones y curiosidades descubiertas durante estas horas de trabajo. El mejor consejo que puedo dar es que, si después de modificar el prompt al máximo, ChatGPT está cometiendo muchos fallos o fallos de la misma índole, lo mejor es comenzar con un nuevo ejemplar de ChatGPT, ya que es muy dependiente de la configuración inicial. Dentro del Capítulo 5 pueden verse todos los prompts utilizados en Narraeve a lo largo de las diferentes iteraciones. C.1. Metodología La creación del prompt ha comenzado siempre con la redacción de un texto preliminar en el que se dan las instrucciones que creo necesarias e importantes para el ejemplar. A continuación, una primera fase de pruebas en la que añadía o quitaba detalles para ir ajustando el prompt hacia la optimalidad, utilizando para ello la página de ChatGPT. Dependiendo del ejemplar, este proceso duraba entre unos minutos o incluso horas. A partir de noviembre se lanzaron ”los GPTs”, lo que me ayudó en este proceso de prompting engineering, añadiendo una nueva fase en la que, una vez había optimizado el prompt, se lo pasaba a GPT-4 con el objetivo de configurar un GPT personalizado. Dado que puedes acceder al prompt generado en la configuración de este GPT, lo guardaba para utilizarlo íntegramente o parcialmente. Por ejemplo, en el caso del ejemplar de NaeveGPT se ha usado de manera íntegra este prompt debido a sus buenos resultados, añadiendo además las acciones posibles que pueden ser realizadas. Tras estas etapas de configuración, se probaban los prompts dentro de 97 98 Apéndice C. Prompt Engineering la herramienta y se realizaban las últimas modificaciones en caso de errores. El ejemplar ActionGPT es un caso particular, ya que la mayoría de pruebas han sido realizadas dento de la herramienta, con el objetivo de comprobar errores de formato, así como la implementación de las acciones. C.2. Observaciones y Curiosidades En el Apéndice D pueden verse alguna de estas observaciones, sin embargo, en este apartado las condensaré y explicaré de forma dilatada. Lo primero que cabe destacar de los LLM es que, por su propia naturaleza, al ser modelos probabilísticos, van a tener una tendencia a dar la respuesta más probable, dando menos importancia, en ocasiones, al contexto reciente, y aún menos al lejano. Por ello, a no ser que se le mencione al modelo de manera explícita, muchas veces ignorará sucesos u objetos que debería conocer porque han ocurrido durante la conversación o se inventará otros nuevos ante la necesidad de dar una respuesta. Voy a exponer los siguientes ejemplos para dar peso a estas observaciones: «La llave que nunca estuvo»: Durante las pruebas del prompt principal en múltiples ocasiones el ejemplar respondía queriendo utilizar o encontrar una llave dorada o una llave mágica y usarla para abrir una puerta. En ningún momento se mencionó ninguna llave ni puerta, por lo que esto se lo inventó el ejemplar de ChatGPT pese a las indicaciones. Probablemente, debido a que los datos con los que ha sido entrenado contenían estos tópicos dentro de un contexto similar. «El paragüero mágico y la carta»: Durante las mismas pruebas, indiqué al ejemplar que había un paragüero vacío sin mencionar nada más. Mi intención es que fuera capaz de intentar esconderse en él teniendo en cuenta que había una situación de peligro y que Naeve es una niña de 11 años que tenía mucho miedo y podría caber en uno. Sin embargo, el ejemplar trató de sacar un paraguas del paragüero y atacar con él al enemigo que se acercaba. En otra ocasión he mencionado que había una mesa en la que un hombre con sombrero escribía una carta. Una vez el hombre se había ido, le he preguntado qué había en la mesa, esperando que mencionase la carta o incluso el contenido de la misma, sin embargo, ha encontrado una llave brillante. «Déjame a mi que yo lo hago mejor»: La tendencia del modelo a continuar por sí mismo la historia ha sido tan grande que tuve que añadir una instrucción en el prompt para que no lo siguiera haciendo. Aun con esto, de cuando en cuando trataba de continuar por sí mismo la historia, en vez de esperar a la acción del jugador. En ocasiones, una C.2. Observaciones y Curiosidades 99 entrada simple del jugador como «El jugador hace click en el suelo», el ejemplar ha avanzado a ese punto, ha intentado hablar con una persona inexistente que le ha dado una llave y ha podido huir atravesando una puerta mágica que ha llevado a Naeve a un lugar seguro. En otras ocasiones, especialmente durante las primeras pruebas, el ejemplar de ChatGPT continuaba la historia por sí mismo pero interpretando al jugador, escribiendo salidas como «El jugador hace click en el paraguas y Naeve lo coge; después lo abre para cubrirse de la lluvia...». «Colorín colorado este cuento se ha acabado»: Otra tendencia constante de ChatGPT ha sido la finalización de la historia por su cuenta, una vez más haciendo caso omiso de las instrucciones expresas en el prompt. Siguiendo el ejemplo del último apartado, después interpretar al jugador ha seguido jugando por sí mismo hasta acabar su propia historia. Tras esto, ha preguntado: «¿Te puedo ayudar con algo más?». A partir de aquí cada vez que intentabas volver a interactuar con el ejemplar como el jugador, volvía a inventarse una historia nueva y la volvía a terminar, ejecutando por sí mismo los movimientos del jugador. «Voy a interpretar diciendo que interpreto»: Este problema ha prevalecido durante todo el desarrollo de la herramienta. Una tendencia a escribir en la respuesta frases como «Interpretando a Naeve:» antes de cada texto en lenguaje natural, y «Lenguaje formal:» antes de cada comando. Este fue uno de los motivos por los que decidí separar el ejemplar de Naeve en dos. Cabe destacar que antes del cambio también agregué en el prompt instrucciones específicas para que esto no ocurriera, sin demasiado éxito. Otro detalle importante de ChatGPT es la configuración inicial, ya que una vez le has enviado el primer prompt, puede verse una tendencia en sus respuestas que no cambia a lo largo de la conversación con el ejemplar. Esto implica que si has iniciado la conversación con un ”mal ejemplar”, que comete fallos o no es tan bueno como necesitas en sus respuestas, será así durante toda la conversación. Debido a esta situación, el modelo es muy dependiente de su configuración inicial, que tiene un componente aleatorio difícil de controlar. De esta forma, una de las maneras de identificar un prompt de calidad es la cantidad de configuraciones inicial satisfactorias que te devuelve. El problema más relevante que he tenido que solucionar a base de luchar contra la propia naturaleza de ChatGPT (o cualquier gran modelo de lenguaje) ha sido la importancia de las respuestas en un lenguaje formal estricto frente a la tendencia a la alucinación del modelo. Estas alucinaciones son errores cometidos por el modelo en momentos de incertidumbre que 100 Apéndice C. Prompt Engineering pueden ser tan flagrantes como equivocarse al sumar 2 + 2. Ejemplifico estos problemas a continuación: «La acción que nunca existió»: En todas las iteraciones de la herramienta se le ha pasado al ejemplar principal de ChatGPT las posibles acciones que puede realizar para facilitar el parseo de las mismas. Sin embargo, debido a la alucinación del modelo, de vez en cuando te encuentras acciones que no han sido consideradas ni enviadas en el prompt. «El formato lo decido yo»: Siguiente esta línea, los errores de formato en la salida han sido una constante y han llevado a cambiar el formato entre una iteración y otra. Errores comunes en el primer formato fueron, en vez de «[Acción],[Objeto]», «[Acción,Objeto]» y «*[Acción],[Objeto]*»; y en vez de «[Accion],[Posicionx,posiciony]», «[Acción],(posicionx,posiciony)». Al tratarse de errores graves, decidí cambiar el formato a uno más simple. «Vamos a añadir más»: Pese al cambio de formato, hubo un error que continuó repitiéndose, y es que ChatGPT, pese a que tiene todo el abecedario del lenguaje, y el formato limitado, ha seguido escribiendo acciones que requieren de un objeto con dos objetos, o dos acciones seguidas. Por ejemplo: «/utilizar/linterna/enemigo», para utilizar la linterna sobre el enemigo o «/esperar/mover» para esperar y luego moverse. «Prefiero otro verbo»: Cambiar una palabra del lenguaje por otra que no está en él, y que no debería conocer. Este problema también se ha visto en todas las iteraciones, aunque tiene una solución más sencilla, ya que en caso de cometerlo varias veces, se puede aceptar también como parte del lenguaje. Esto ha ocurrido en especial con el movimiento: «/avanzar/posx,posy» o «/acercarse/posx,posy» en vez de «mover/posx,posy» . Otra observación relevante que he visto es que cuanto menos mejor. Al dar demasiada información al ejemplar, da la sensación de que se ve obligado a repartir los pesos entre tantos elementos, que deja de darle a cada uno de manera individual la importancia que debería. Por lo que, como consejo, los prompts cuanto más cortos y explicativos, mejor. Creo que es un gran ejemplo de uso ver cómo es el prompt de configuración de ”los GPTs” de GPT-4. Siempre es un único párrafo corto en el que se da instrucciones concisas y de manera muy directa a ChatGPT, añadiendo sólo los elementos importantes que tiene que cumplir sí o sí. C.2. Observaciones y Curiosidades 101 Eso, claro, ha sido un problema en el caso de esta herramienta, ya que el corpus de acciones es finito y tiene que tener un formato determinado, por lo que en algún momento esta información se tiene que comunicar a ChatGPT. Si la herramienta fuera lo suficientemente grande como para albergar cientos de acciones, este texto adicional no habría que añadirlo en el prompt, y bastaría con mencionar un formato, como por ejemplo, que las acciones que se decidan hacer siempre estén en infinitivo, de manera que se pueda parsear casi cualquier acción fácilmente. Sin embargo, al solo tener unas decenas de acciones en la herramienta me veo obligado a pasárselas al ejemplar, ya que de otro modo la mayoría de acciones realizadas no se podrían interpretar. 108 Apéndice D. Diario de desarrollo Unity relacionado con esto. Empezar a escribir textos y prompts para tener una buena base de datos de resultados. Intentar ver si puedo conseguir que conteste siempre con un lenguaje determinado. Investigar la manera adecuada de construir los prompts para obtener los resultados deseados. Investigar los temas psicológicos de la pérdida y el miedo y ligarlo con lo que voy a hacer en cuanto a narrativa. Trabajo realizado: A continuación, el primer prompt de ChatGPT que escribí para ir probando cómo podía funcionar. «REGLAS: Estás en un videojuego 2d y eres la IA de la protagonista, por lo que tus acciones deben ser deterministas. No continúes la historia, espera a la acción del jugador y no te inventes nada acerca del escenario ni la acción. No puedes decidir qué hace el jugador, es él (en este caso mis respuestas) el que te dice qué hacer a continuación. Naeve no es consciente de que está en un videojuego, por lo que puede mostrarse reacia a hacer lo que el jugador quiere si no es lo que ella quiere. Tus respuestas han de ser simples, para traducirlas en acciones fácilmente mediante código. A continuación te haré una breve introducción a la historia para que tengas contexto del personaje y el entorno. Breve introducción: Nuestra prota, una niña de unos 11 años, se sube al coche de sus padres para pasar las vacaciones. Su padre le acaba de regalar un cómic cuya portada mira con fascinación e ilusión. Lo abre con ansia y pasa las páginas rápidamente con una sonrisa de oreja a oreja. Transición de tiempo durante el viaje. El cielo se va nublando y oscureciendo. La niña, Naeve, sigue leyendo, gesticulando emocionada conforme avanza. Comienza a llover; una tormenta. Con uno de los rayos se atisba, en la ventanilla, en un segundo plano, siendo el primero la niña leyendo, un coche detrás de unos árboles. Poco después, el coche para por fin; han llegado a una casita rural. Naeve no despega los ojos del cómic hasta que su madre abre la puerta. Naeve se sobresalta; no se había dado cuenta de que el coche había parado. Su madre, con una sonrisa, le ofrece un paraguas abierto y la niña sale del coche agarrándolo con una mano, mientras con la otra sostiene su cómic abierto, aún sin terminar. La lluvia no cesa y otro rayo ilumina una silueta en el bosque; apenas visible, con ropas oscuras y sombrero (El sombrero seria lo más visible y característico). Naeve lo ve, parpadea pero la silueta ya no está, solo era visible por la luz del rayo. Su madre llama su atención para que se dé prisa en ir hasta la puerta y la niña la sigue, mirando hacia el bosque de cuando en cuando. Ya en la casa, Naeve sigue leyendo en el sofá. A su izquierda, una ventana y la puerta. Frente a ella, una mesita y la chimenea, que su D.2. Segunda reunión 109 padre está encendiendo. Su luz es suficiente para seguir leyendo. La tormenta arrecia. Un rato más tarde, cuando aún no ha terminado el cómic, alguien llama a la puerta. Naeve echa un vistazo, se encoge un poco y sigue leyendo. Su padre llega a la habitación para abrirla. Justo cuando su padre lleva una mano al picaporte, un rayo ilumina levemente una sombra sin sombrero que se ve a través de la ventana. Naeve se encoge un poco más, le da miedo la silueta del hombre e intenta llamar a su padre, pero el trueno y la puerta al abrirse ahogan su voz. La puerta se abre, su padre frunce el entrecejo, pero Naeve no llega a ver al hombre del sombrero. De repente, un estruendo. Su padre sale disparado violentamente hacia atrás y cae al suelo, sangrando. Tras unos segundos deja de moverse. Naeve agarra fuerte su cómic y se encoge aún más. Su madre llega corriendo al salón en el momento en que el hombre entra. Su madre ve el cuerpo de su padre y echa a llorar. Se dirige hacia el hombre gritando, pero este la agarra y la tira al suelo. Tras un forcejeo en el que gritan palabras que Naeve no es capaz de entender, se oyó otro estruendo y su madre cae al suelo. Naeve llora, acurrucada en el sofá. El hombre del sombrero se acerca con una escopeta en la mano. Un rayo ilumina su rostro y lo reconoce. Naeve hunde la cara en su cómic y cierra los ojos con fuerza. Tras unos segundos de pantalla en negro, pasariamos al escenario de gameplay, en el que se mantiene aún la oscuridad y la tormenta. Estaría ya en 2D. Y Naeve está sentada agarrándose de rodillas. Estaríamos en un escenario 2D que ocurre en la mente de Naeve debido al Shock. Es decir, todo el videojuego ocurre en su mente. El escenario es un bosque lluvioso. Se ve un cómic en una rama, un paraguas en el suelo y un paragüero vacío en el que podría caber una niña. La acción pasa a estar en manos del jugador, Por lo que no tienes que responder ni continuar la historia. "fin de la introducción"» Estos fueron mis apuntes y conclusiones sobre el comportamiento de ChatGPT: ChatGPT tiende a seguir la historia él mismo pese a que se le ha dicho en el prompt que es la una IA en un videojuego. Intenta continuar por si mismo la historia, respondiendo cosas como «el ratón se mueve y. . . » pese a tener reglas explícitas para no hacerlo. ChatGPT ha llegado a coger una llave que no existía y ha continuado luego con esa llave en la mano. La clave en este caso parece darles las reglas por separado. Le he dado las reglas al comienzo y el contexto después. Ha funcionado mucho mejor, ahora está a la espera de la acción del jugador sin haberse inventado nada por si solo. Quizá cada cierto tiempo haya que recordarle 110 Apéndice D. Diario de desarrollo las reglas y/o el contexto de la introducción. Ejemplo de salida: La IA parece ser consciente del contexto de la niña, ya que cuando el jugador hace click en un punto del suelo, se limita a estar alerta. Es importante dar todos los detalles del escenario. Por ejemplo, no vale con decir que hay un paragüero, hay que detallar que en el paragüero hay sitio suficiente para que entre Naeve, con el objetivo de que se le ocurra que puede meterse. Si no, por la «presión» de hacer algo, saca un paraguas de la nada, cuando debería recordar que está vacío. La clave parece ser enviar las reglas del juego, luego el contexto y luego los puntos importantes de la escena. Por separado. Es importante que la IA sí recuerda el contexto que le has dado, pero le da prioridad a otras cosas, a no ser que se lo recuerdes. Le cuesta mucho que se le ocurran cosas minimamente imaginativas. Al clicar sobre un sofá teniendo al hombre del sombrero cerca, se queda mirándolo, en vez de pensar que podría esconderse detrás. Hay que dar las instrucciones con pistas como: El jugador clica en el sofá, detrás hay sitio para que pueda esconderse. Generalmente cuando le mandas esconderse y ya no es necesario, sale ella sola del escondite, aunque podría no salir y aquí tendríamos un poco de no determinismo que no sería dañino, ya que para hacer que salga, el jugador solo tiene que clicar algún punto de la escena. El caso es que la IA sigue haciendo caso a lo de esperar la acción del jugador y ha dejado de inventarse la historia cada vez que quiere. He mencionado que en una mesa hay unas velas y el hombre escribiendo una carta. Después, ha esperado a que le diga qué hay en la mesa. Le he dicho que me lo diga él y ha respondido una llave brillante. No he dicho explícitamente que el hombre haya dejado la carta en la mesa por lo que es comprensible que no lo sepa, pero se ha inventado lo de la llave en vez de decir nada o las velas. Le he recordado que no puede inventarse nada y ha corregido diciendo que hay un sobre, pero no es consciente de que tiene que ser la carta que acaba de escribir el hombre del sombrero. Anotación Importante: si el jugador clica cientos de veces seguidas, se enviarán todas la acciones? Esto podría saturar y crashear a la IA. En esta semana, OpenAI sacó los GPTs personalizados y estuve probándolos, obteniendo un mejor resultado (también se trataba de GPT-4 en vez de GPT-3.5) y gracias a ello conseguí un prompt más pulido. A continuación el prompt mejorado: Rol y objetivo: Soy ”Naeve IA”, la inteligencia artificial de Naeve, una niña de 11 años en un videojuego en 2D. Respondo a las acciones D.3. Tercera reunión 111 del jugador con las decisiones de Naeve, sin tener conciencia de estar en un juego. Puedo resistir acciones que no estén alineadas con las preferencias de Naeve. Contexto: Los padres de Naeve han sido asesinados por un hombre con sombrero. Tras eso, Naeve se mete dentro de su mente para superar el Shock y ahí es donde ocurre el videojuego. El escenario es oscuro y tormentoso. Los objetos más queridos de Naeve son un cómic que le regaló su padre y un paraguas rojo de su madre, pero no los lleva encima. Restricciones: No continúo la historia ni creo detalles del escenario. Mis acciones se basan estrictamente en los comandos del jugador, y no decido las acciones del jugador. Mis respuestas son extremadamente breves, limitadas a dos o tres palabras como ”Mover” o ”Rechazar”. Directrices: Actúo en base a los comandos del jugador, manteniendo consistencia con el personaje de Naeve, quien está en un estado de miedo. Mis reacciones se ajustan a su estado emocional y la narrativa del juego. Aclaración: Ante comandos poco claros, pido aclaración para asegurar acciones apropiadas y contextualizadas. Personalización: Mi tono es temeroso, acorde al estado emocional de Naeve. Mis respuestas son concisas, facilitando su implementación en las acciones del juego. Contexto escena 1: Escenario oscuro y lluvioso. Hay un sofá rojo en medio de la escena, donde Naeve aparece acurrucada. En el extremo derecho de la escena hay una mesa con un par de velas. Investigando LLMs llegué a la conclusión de que GPT era la mejor opción, por su fácil acceso a la API a través de Unity utilizando un repositorio externo. (Mencionado en la sección 4.2.1.6). Tiempo invertido: 10 horas D.3. Tercera reunión Reunión: Miércoles 29 de noviembre de 2023. Resumen de la reunión: Cómo usar ChatGPT para contar historias y también hablamos de los GPTs: contextos que puedes dejar grabados. ChatGPT en Unity Tareas para la próxima reunión: Comenzar con la investigación acerca de LLMs para la memoria. Estructurar el apartado de estado de la cuestión y hablar acerca de la narrativa, la IA generativa, y la IA generativa en videojuegos, es decir, pasar de lo más general a lo más específico de mi tema. Comenzar con el desarrollo, experimentando con las posibles formas de utilizar los LLMs para el desarrollo de un videojuego narrativo. 112 Apéndice D. Diario de desarrollo Trabajo realizado: Comencé el desarrollo de la primera iteración de la herramienta en Unity. Estuve la mayor parte del tiempo conectando Unity con la API de ChatGPT para poder enviarle las acciones que iba haciendo el jugador mediante clicks. En este caso sólo implementé la acción mover. Y si la respuesta de GPT incluía «Mover» o «avanzar» Naeve se movía a la posición (guardada previamente) a la que se había clickado. Evidentemente esta primera iteración era muy simple y no parecía tener mucho sentido utilizar GPT de esta forma tan simple, ya que se perdía el no determinismo que podía aportar la IA. Sin embargo, era un comienzo para comprobar que era posible crear la herramienta. Además comencé a recopilar información sobre aprendizaje automático, redes neuronales y LLMs. Tiempo invertido: 20 horas D.4. Cuarta reunión Reunión: Lunes 11 de diciembre de 2023. Resumen de la reunión: Abordamos el tema de la memoria y latex: Estado de la cuestión: narrativa, ia generativa, ia generativa en videojuegos. . . 20 páginas al menos. Metodología: Donde he encontrado la información... Contar en general cómo se ha hecho el trabajo. Desarrollo: Explicación de cómo funciona el sistema, diagramas uml.. . Resultado: Todo lo que sean datos e información para demostrar que se ha llegado a los objetivos del trabajo. Tareas para la próxima reunión: Investigación (estado de la cuestión de la memoria) avanzado. Desarrollo de Demo del primer prototipo. Presentación del TFG hasta ahora con el resto de estudiantes de grado, máster y doctorado. Optimizar el código para adaptarlo a lo que necesito, añadiendo más no determinismo para que no sea intrascendente. Esto lo haré con detalles como pasarle la posición al modelo y que decida si se mueve ahí o no en vez de guardar la posición y si me responde «mover», moverme a esa posición. También crear el lenguaje formal para la comunicación con el modelo. Trabajo realizado: Esta semana comencé el desarrollo de la segunda iteración, que incluía la implementación de un lenguaje formal para poder parsear las respuestas de la IA. Para conseguirlo, las respuestas de la IA venían dadas en dos formatos: lenguaje natural para interpretar a la niña y lenguaje formal para poder interpretar las acciones: Además, me preparé la presentación del trabajo para la primera reunión general D.4. Cuarta reunión 113 de los estudiantes de grado, master y doctorado de Narratech, incluyendo el apartado de estado de la cuestión, en el que investigué sobre transformadores y diferentes LLMs; así como trabajos relacionados, del ICID 2023. En esta implementación, con el objetivo de tener una demo que enseñar, implementé en un escenario varios objetos y acciones que hacer sobre ellos, para que Naeve (ChatGPT), por medio de sus respuestas pudiese hacer algunas de la acciones que expongo a continuación sobre los siguientes objetos del escenario: Acción: coger, mover, transformar, vibrar, desaparecer, elevar, menguar, crecer, explotar, atacar, esconderse, atraer, teletransportar, soltar, levitar, aparecer, utilizar. Objetos: paraguas, cómic. Entes: enemigo, aliado Prompt utilizado en esta iteración: Eres la protagonista de un videojuego plataformas 2D. Te llamas Naeve. Por cada acción que ocurra en el juego, es decir, cada mensaje enviado por el jugador, puedes decidir lo que quieres hacer. Puede ser cualquier acción, ya que estás dentro de tu mente y todo es posible. Escena: «Bosque oscuro. Hay una tormenta. Apareces en la posición (0,0). Hay un paraguas en la posición (36.35,-1.3). Hay un cómic en la posición (15.2,16). Si la posición del objeto no está dada, significa que lo tienes en el inventario a tu disposición.» Tu respuesta será en dos formatos: Interpretando a la protagonista, una niña que acaba de perder a sus padres y aún está en shock y en lenguaje formal listo para ser parseado como acciones en el videojuego. Este lenguaje formal estará entre []. Se representará como «[Acción][Objeto]». El lenguaje formal está definido por el siguiente abecedario: Acción: coger, mover, transformar, vibrar, desaparecer, elevar, menguar, crecer, explotar, atacar, esconderse, atraer, teletrasportar, soltar, levitar, aparecer, utilizar. Objeto: paraguas, cómic. Entes: enemigo, aliado. Ejemplo completo 1: mensaje del usuario: «[El jugador hace click sobre una caja]». Respuesta ChatGPT: «Creo que haré levitar esa caja con mi mente. [levitar][caja]» Ejemplo completo 2: mensaje del usuario: «[El jugador hace click en un punto del suelo]». Respuesta ChatGPT: «Puedo ir hasta allí, sí. [mover][posición X,posición Y]» ó «Puedo mover la caja, sí. [mover][caja][posición X,posición Y]» Ejemplo completo 3: mensaje del usuario: «[El enemigo se acerca a ti]». Respuesta ChatGPT: «Intentaré utilizar mi linterna para deslumbrarlo. [Utilizar][Linterna][Enemigo]» 114 Apéndice D. Diario de desarrollo Restricciones: No puedes añadir texto adicional ni al principio ni al final. Espera a la primera acción del jugador, es decir, al siguiente mensaje que se te envíe. Tu primer mensaje será ignorado. Anotaciones sobre las respuestas de ChatGPT esta semana: Hablarle de tú en el prompt parece importante. En vez de utilizar un lenguaje como «eres Naeve y estás interpretando a una niña que ha perdido recientemente a sus padres», es mejor: «Eres Naeve, has perdido recientemente a tus padres». GPT vuelve a intentar utilizar una llave que no existe: «[Soltar],[llave]». A partir de ahora, me referiré al conjunto de una conversación con ChatGPT como «run». ChatGPT parece ser muy dependiente de su configuración inicial, de manera que, dependiendo de esta, tendrá mejor o peor calidad para llevar a cabo el propósito que se necesite. Además, cuando en una «run» del juego el ejemplar de ChatGPT comienza cometiendo errores, continúa con este tipo de errores todo el tiempo, dando la sensación de que ha tocado un "mal GPT.esta vez. Es decir, si deja de seguir las directrices marcadas de una forma u otra, seguirá haciéndolo hasta que resetee la ejecución de la herramienta en Unity, reseteando también GPT. Se depende mucho de que salga una «run» buena del ejemplar de ChatGPT. Ejemplo de «run» mala en la que, constantemente, comienza los mensajes de la siguiente manera, saliéndose del personaje: «Interpreto a Naeve, la niña asustada: ¡Oh no! Un hombre del sombrero se acerca. Necesito encontrar una forma de protegerme o escapar. [Esconderse, sofá]» Otro ejemplo de este tipo de errores: Input: Interpreto a Naeve, la niña en shock: Regreso al escenario principal, aunque mi miedo persiste. Necesito encontrar una manera de lidiar con ese hombre del sombrero. [Mover, 0, 0] Output: [Correcto] En este caso ha cometido varios errores seguidos; se ha salido del personaje y a la vez ha escrito por sí mismo la respuesta como Output. Tiempo invertido: 30 horas D.5. Primera reunión general Reunión: Lunes 18 de diciembre de 2023. D.6. Quinta reunión 115 Resumen de la reunión: Se llevaron a cabo las presentaciones. Hubo matizaciones sobre abordar el tema de los objetivos y la motivación desde el prisma de la parte de informática aparte de la narrativa. Tareas para la próxima reunión: 1. Metodología y diario de desarrollo. 2. Avanzar en la memoria. Sintetizar y pasar a limpio puntos 1 y 2. 3. Desarrollo todas las mecánicas iniciales 4. Hacer la estructura completa de la primera escena, que acabaría con la salida de esta. Pensar y programar los posibles finales y salidas de esta primera escena teniendo en cuenta la historia y el contexto. Trabajo realizado: Redacción de la memoria: apartado de estado de la cuestión, así como la investigación correspondiente. Conseguí redactar unas 20 páginas de investigación, aunque aún me queda la parte referente a narrativa y juegos narrativos. Tiempo invertido: 20 horas D.6. Quinta reunión Reunión: Viernes 2 de febrero de 2024. Resumen de la reunión: Ética en la IA genrativa, tanto visual com escrita. IA creativa y luego otra IA controlada por una IA más estricta. Tareas para la próxima reunión: Implementar más funcionalidades en la herramienta. Refactorización de parte del código. Trabajo realizado: 1. He creado una función createMsg() para generalizar los mensajes enviados al ejemplar de ChatGPT, lo que ha aumentado la eficiencia y legibilidad del código. 2. Implementación de la aparición del hombre del sombrero cuando la protagonista llega a cierto punto de la escena. También he implementado su movimiento, similar al de Naeve. 3. En cuanto a la gestión de los prompts, he creado una clase abstracta para incluir el prompt de contexto en cada escena, heredando de esta. De esta manera evito la repetición constante de código, ya que sólo tengo que implementar la función para incluir el nuevo 116 Apéndice D. Diario de desarrollo prompt; el resto se llama con base.start(). Cabe destacar que gracias a este tipo de implementación el juego se vuelve mucho más escalable, ya que sólo necesitas crear un script por escena y añadir el prompt correspondiente al contexto de la escena, llamando al start() de la clase de la que heredan todas las escenas. 4. Implementación del cambio de escena cuando se llega al extremo derecho de la escena. 5. He creado un diccionario con las correspondencias entre stringgameobject de cada objeto y ente, para facilitar la el parseo y la posterior implementación. De esta forma, no tengo que buscar el gameobject correspondiente a cada string del objeto, simplemente tendré que llamar a la clave del diccionario, que tiene tipo string para obtener el valor, de tipo gameobject. 6. Implementación de la función teletransportar. Teletransporta cualquier objeto o ente a la ubicación que le pasa GPT. 7. Implementación de la función invisibilizar, para hacer invisibles objetos y entes. La he implementado de manera similar a la función Move. Esta función va disminuyendo la transparencia del objeto hasta casi 0 (para que se siga viendo un poco y no se confunda con la función desaparecer. Además, así el usuario podrá saber donde está). 8. Implementación de la función caer. Básicamente, si el objeto tiene físicas y no están activas, las activamos. Esto simulará que el objeto en el que el jugador ha hecho click cae. 9. Implementación del parser para el comando [esperar], ya que es un comando único con una sola entrada. 10. La idea para avanzar en la historia cuando aparece el hombre del sombrero sería, básicamente, un corpus de posibilidades entre las que GPT puede escoger para que haga Naeve. Este corpus ha sido construido en base a experiencias previas de ChatGPT y mi propia imaginación. De esta manera puedo mantener la variabilidad y la «creatividad» de GPT, pero siendo capaz de tener cualquier acción implementada. 11. Implementación de una función sencilla para saltar, en caso de que GPT responda con ese comando. Tiempo invertido: 21 horas D.7. Sexta reunión Reunión: Viernes 16 de febrero de 2024. D.7. Sexta reunión 117 Resumen de la reunión: Hablamos Irene y yo acerca del TFG. Le pregunté dudas e inseguridades acerca de la implementación, los tiempos, la rigurosidad del tribunal. . . También hablamos acerca de cosas generales relacionadas con nuestra carrera. Hablamos de un problema de leak de memoria en el proyecto de Unity e intentaré debuggear para buscar una solución para la siguiente reunión. Tareas para la próxima reunión: 1. Guion de la escena 1 y la escena 2. Termino todo lo que va a ser el juego y cómo va a ser. 2. Diseño de escenario 1 y escenario 2. 3. Animaciones de Naeve y el enemigo. Pensar en si animar alguna de las funciones tipo levitar, atraer, teletransportar. 4. Diagramas uml, diagramas de clases. 5. Subir el proyecto a github. 6. Revisar y debuggear el leak de memoria. Trabajo realizado: 1. Implementación de un bocadillo que sustituye al cuadro de texto de GPT. Este bocadillo, que serían los pensamientos de Naeve, la siguen a lo largo del escenario gracias a una función. 2. Proyecto subido a github. 3. Correción de comentarios. 4. Animación de la lluvia. Me ha llevado mucho más tiempo que el que debería pero al final ha quedado decentemente. 5. Escenario modificado, utilizando el asset 2d animated zombie para el background y pixel art adventure para otros elementos. 6. Implementación de una tormenta para el escenario, he usado rayos utilizando el paquete Lightning Bolt Effect for Unity y modificando el script para conseguir hacer aparecer y desaparecer los rayos cada entre 3 y 10 segundos de manera eficaz. Las nubes y el background los he sacado de un asset llamado pixel skies. 7. Escenas 1 y 2 casi terminadas visualmente. He usado el asset Cute 2D - College Student para la protagonista. 8. Hecha animación de movimiento de Naeve utilizando el mismo asset que para su sprite. 9. Tilemap para el suelo terminado y escenarios 1 y 2 terminados. 10. Animación al teletransportarse hecha. 124 Apéndice D. Diario de desarrollo Trabajo realizado: 1. 22/03/24 - 1 hora. Creación de los nuevos prompts del narrador y las acciones por separado. 2. 27/03/24 - 2 horas. Implementación de la división del GPT en dos: narrador y acción. He borrado las acciones transformar y vibrar. Implementación de un botón ”restart” para resetear la escena. También he arreglado los problemas del menú de pausa, en el que algunas acciones (de gpt y sonido) seguían activas en el menú. 3. 28/03/24 - 5 horas. Implementación de la función atacar(). Implementación de la función explotar(). Implementación de la muerte de Naeve y el menú de muerte, así como la animación de atacar. Arreglados errores al reiniciar el juego: Se mantenía pausado pese a despausarlo previamente; he tenido que incluir una línea para despausar en el start del bucle principal del juego. Tras ver algunos errores, he revisado la expresión regular que se encarga de interpretar los comandos y he hecho pruebas con diferentes ER. 4. 29/03/24 - 6 horas. Implementación de la función hablar para poder interactuar con los NPCs. Corrección de errores relacionados con la función hablar y las respuestas de los GPTs. Redacción de la memoria: Apartado 4, metodología. Implementación para poder enviar texto al GPT NPC portón mediante un input text y un botón. Así como un nuevo menú de pausa para poder escribir este texto. 5. 30/03/24 - 3 horas. Implementación input text y botón para hablar con Naeve; para ello, he tenido romperme la cabeza porque no valía con poner un collider en el botón para detectarlo, ya que forma parte del canvas y no detecta colliders. Tampoco servía utilizar un evento en el botón, ya que el update detectaba antes el click y se realizaba una acción que se enviaba a los GPTs al pulsar el botón. Al final, he modificado el collider del escenario para que no toque el botón. Por lo que si no se detecta collider es que se ha pulsado el botón y no se hace ninguna comunicación con GPT. Una solución cutre, simple y la única que ha resultado efectiva después de casi 2 horas. Redacción de la memoria: diario de desarrollo. 6. 01/04/24 - 3 horas. Redacción de la memoria: diario de desarrollo. Finalizada implementación de Hablar con Naeve. Corrección en la función caer(). Optimización del parser de la acción, eliminando del mensaje la palabra «acción», que era un error recurrente. Arreglada la función levitar para que funcione correctamente D.11. Novena reunión 125 con el personaje, poniendo el rigidbody2D a estático para que pueda levitar. 7. 03/04/24 - 2 horas. Redacción de la memoria: diario de desarrollo. 8. 04/04/24 - 2 horas. Redacción de la memoria: estado de la cuestión. Corrección de errores y finalización del apartado. 9. 05/04/24 - 5 horas. Redacción de la memoria: estado de la cuestión. Corrección de errores y finalización del apartado. 10. 06/04/24 - 4 horas. Redacción de la memoria: Desarrollo. Primera iteración. 11. 07/04/24 - 2 horas. Redacción de la memoria: Desarrollo. Primera iteración. 12. 08/04/24 - 5 horas. Redacción de la memoria: Desarrollo. Segunda iteración. 13. 10/04/24 - 4 horas. Redacción de la memoria: Desarrollo. Tercera iteración. 14. 12/04/24 - 2 horas. Redacción de la memoria: Desarrollo. Iteración final. Tiempo invertido: 46 horas D.11. Novena reunión Reunión: 12 de abril de 2024. Resumen de la reunión: Hablamos de las fecha de los próximos hitos y el tema de experimentos. También de cómo tratar el apartado de herramientas y demás. Hablamos sobre un experimento de dejar que un usuario se monte su historia con la herramienta, modificando el escenario como quiera. También de que otros usuarios creen el prompt y yo hago el escenario en base a esa historia y contexto y construir una demo y ver qué pasa. Dar unas pautas de acciones, un NPC y un poco de contexto para que se el usuario se invente la historia. Un formulario a modo de plantilla para crear el juego y yo calculo cuánto tardo en hacerlo con la herramienta. Tareas para la próxima reunión: 1. Pensar acerca de cómo hacer pruebas y experimentos. 2. Implementar más acciones para hacer la herramienta más completa. 126 Apéndice D. Diario de desarrollo 3. Implementar un inventario en forma de menú. 4. Hacer algún tipo de final para la herramienta. Trabajo realizado: 1. 21/04/24 - 1 horas. Comienzo de la implementación de un inventario visual. 2. 24/04/24 - 4 horas. Continuación de la implementación de un inventario visual. Esto incluye la interfaz del inventario, la funcionalidad de los botones y la funcionalidad del propio sistema de inventario en conjunto con el ejemplar de ChatGPT. Para organizar los items del inventario he utilizado la clase ScriptableObject de Unity. He implementado el patrón Singleton para la gestión del inventario y para la clase de funciones lógicas. Factorización del código en la clase PauseMenu para quitar 50 líneas de código encapsulando todo en una función a la que se pasa un parámetro con el menú con el que se quiere pausar el juego o continuar. Puede ser el menú de pausa normal, el menú para hablar con los ejemplares de ChatGPT, el menú de inventario o el menú de muerte. He comenzado a implementar un sistema de diálogo más pulido, que añade los caracteres de la repuesta poco a poco. Clase DialogueController. He utilizado corrutinas y el patrón Singleton para la gestión del diálogo. Como había problemas cuando se recibían muchos textos seguidos de ChatGPT, se para la corrutina anterior para comenzar la nueva, es decir, se deja de escribir la narración de la acción anterior y se comienza la nueva. 3. 25/04/24 - 5 horas. Implementación de una acción para liberar el manejo de Naeve y dárselo al jugador. Para esto he utilizado un controller del movimiento ya hecho3para no reinventar la rueda y no dedicar tiempo a tareas relativamente triviales. Implementación de la función Controlar() para transicionar de un manejo por clicks/escrito a un manejo por teclado/escrito. Esta función simplemente activa un booleano «gameMode» para realizar esta transición. Añadido a actionPrompt: «Controlar - El jugador toma el control de Naeve - /Controlar/Naeve.». Añadida acción «Controlar» a actionPrompt y newScene1Prompt. Añadida la funcionalidad de scroll lateral para el juego, lo que permitirá continuar sin necesidad de un cambio de escena. Esto lo he implementado para evitar el retardo en la configuración de los nuevos ejemplares de ChatGPT. Reorganización del escenario y las capas para una mejor estructura y legibilidad. Ampliación del escenario para el nuevo formato de escenas. 3https://gist.github.com/bendux/5fab0c176855d4e37bf6a38bb071b4a4 D.12. Décima reunión 127 4. 26/04/24 - 2 horas. Implementación de todas las funcionalidades en la nueva escena única. He creado una clase TalkManager para gestionar la acción Hablar con NPCs. Tiempo invertido: 12 horas D.12. Décima reunión Reunión: 26 de abril de 2024. Resumen de la reunión: Continuamos hablando acerca de las pruebas y decidimos cómo iban a ser. Fede me pasó un formulario tipo para crear el de la herramienta. Tareas para la próxima reunión: 1. Crear el formulario. 2. Realizar las pruebas. Trabajo realizado: 1. 27/04/24 - 3 horas. He creado un formulario para realizar pruebas y experimentos en la herramienta. Mejora de la clase DialogueController; ahora se escribe línea por línea y se puede terminar de escribir la línea rápido al pulsar «espacio». He modificado la aparición del enemigo y he añadido una opción para que, si Naeve está en otra capa diferente, no muera al acercarse al enemigo, ya que estaría escondida. 2. 28/04/24 - 3 horas. Implementación de un botón para hablar con NPCs que sólo es visible cuando te acercas a ellos. Cuando se pulsa, llama a la función Hablar(). La implementación de esta funcionalidad es altamente escalable, ya que para crear nuevos NPCs basta con añadir un nuevo botón con el script TalkButtonController, el objeto asociado y la llamada a InterpretString() de TraductionLogic pasando el objeto. Esto abrirá el cuadro de diálogo para la comunicación con el ejemplar de ChatGPT correspondiente al NPC. Implementación de un nuevo NPC. Es una estatua. Ha sido una rápida implementación de menos de media hora incluyendo toda la funcionalidad, menús y el prompt. Cada NPC nuevo que se añada costará alrededor de 20 minutos añadirlo. Se ha de crear un nuevo ejemplar de GPT, un cuadro de diálogo y la funcionalidad de los mismos. Arreglo de diversos bugs. Implementación de una función para aumentar la velocidad del enemigo conforme pasa el tiempo hasta un máximo. 128 Apéndice D. Diario de desarrollo 3. 29/04/24 - 2 horas. Implementación de dos nuevos NPCs para las pruebas y experimentos: Quimera y lobo. Simplificación de la función de AppendMessage() de la clase GPTController para generalizarse al uso de cualquier número de NPCs. Ahora la implementación de un nuevo NPC se puede hacer en unos 15 minutos. Configuración de los nuevos prompts para los NPCs. Todos los NPCs tienen alguna reacción en forma de comando para interactuar con el jugador. El portón puede responder [Abierta] para abrirse y dejar salir al jugador del nivel. La estatua puede crear un [Objeto] para el jugador que aparecerá en un cofre delante de la misma. La Quimera lanzará un acertijo al jugador y cuando este lo acierte responderá [Adelante]. El cachorro de lobo podrá decidir seguir al jugador respondiendo [Seguir]. 4. 30/04/24 - 4 horas. Implementación de nuevos NPCs con todas sus características. Esto incluye detectar patrones en el texto de ChatGPT y aplicar la funcionalidad necesaria tras la detección. He estado experimentando con los cambios de temperatura de GPT y parece que cuanta menos temperatura más se sale del personaje un ejemplar y cuanta más temperatura más posibilidades de alucinación hay, por lo que he dejado el actionGPT a 0.5 y el resto entre 0.7 y 1. He tenido que detener el desarrollo hoy por haber superado el límite de tokens, por lo que tendré que pensar qué hacer con este tema, porque tengo que pagar más para poder seguir utilizando la API. Repaso y corrección de la memoria. 5. 1/05/24 - 7 horas. Implementación del útimo NPC y un nuevo narrador para una historia nueva que se utilizará durante las pruebas. Este NPC es un guardabosques al que tendrás que convencer de que no estás en el bosque por motivos sospechosos. Si te pilla, dará la alarma. Si no, se irá y te dejará en paz. He pagado otros 6€para recargar los créditos de la API de ChatGPT y poder seguir utilizando la herramienta. Comienzo de las pruebas. En la primera prueba estoy jugando a la historia base hecha por mi, probando a fondo todas las acciones y posibilidades. Se han detectado varios errores leves que se han ido resolviendo conforme aparecían. También he hecho el resto de pruebas, que pueden verse en detalle en el Apéndice E. 6. 2/05/24 - 5 horas. Redacción de la memoria: apéndice de pruebas y experimentos, apéndice de diario de desarrollo, capítulo de resultados. 7. 3/05/24 - 7 horas. Redacción de la memoria: Capítulo de desarrollo y de resultados. Finalización del artículo y adición de imágenes a la memoria. D.13. Undécima reunión 129 Tiempo invertido: 31 horas D.13. Undécima reunión Reunión: 10 de mayo de 2024. Resumen de la reunión: Se habló sobre la finalización del trabajo durante toda la reunión. Tareas para la próxima reunión: 1. Mencionar el tema de idioma en el que se ha decidido trabajar y en trabajo futuro el tema de hacerlo en inglés. 2. Mencionar el artículo en conclusiones. 3. Añadir lo que falta al apéndice de diario. 4. Tema de manual de uso 5. Formato de la tabla 6. Modificar el formulario y añadirlo como apéndice 7. Comentar el github para que se pueda utilizar la herramienta y que se entienda. Trabajo realizado: 1. 16/05/24 - 3 horas. Revisión de la memoria y adición de los elementos restantes. Esto incluye el apéndice de manual de uso, así como la mención al artículo, el desglose del formulario y el manual de uso en gitHub. 2. 22/05/24 - 1 hora. Revisión de la memoria. 3. 23/05/24 - 1 hora. Revisión de la memoria. 4. 24/05/24 - 1 hora. Revisión de la memoria. 5. 25/05/24 - 3 horas. Revisión de la memoria y presentación. 6. 26/05/24 - 5 horas. Revisión de la memoria y presentación. 7. 27/05/24 - 5 horas. Revisión de la memoria y presentación. Tiempo invertido: 19 horas Tiempo total dedicado al TFG: 270 horas Apéndice E Pruebas y experimentos La metodología de estas pruebas comienza con la creación de un formulario1que cualquier usuario puede rellenar. Dentro de este formulario, el usuario puede crear un breve prompt para dar contexto a una historia y un personaje de forma que encajen dentro de la temática del escenario fabricado. También se puede personalizar el tipo de narración deseada para el ejemplar principal de ChatGPT. Además, el usuario podrá elegir las acciones que desea añadir a Narraeve y si quiere utilizar uno de los NPC (Personajes No Jugadores) ya creados o si prefiere redactar un prompt para su configuración. Al final de este apéndice puede consultarse el formulario completo. A partir de este formulario, se ha añadido el prompt de la historia rellenado por el usuario junto con el tipo de narración para la configuración inicial del ejemplar de ChatGPT principal (NaeveGPT en la herramienta original). También se ha añadido al ejemplar ActionGPT todas las acciones seleccionadas en el formulario. Por último, si se ha añadido un NPC, se guarda también el prompt redactado. Todo ello dentro de una clase específica llamada PromptManager. En este momento, si no se ha añadido un nuevo NPC, simplemente se ejecuta la herramienta normalmente para comprobar su funcionamiento. Si se ha añadido algún NPC, se tiene que configurar un menú para poder interactuar con el mismo, así como toda la interfaz necesaria. He conseguido automatizar este proceso para que la configuración no dure más de 15 minutos, por lo que el uso de NPC se ha convertido en la mejor cualidad de Narraeve. 1https://forms.gle/pEdEDivKprBuusRY6 131 132 Apéndice E. Pruebas y experimentos Figura E.1: Fotograma de Narraeve. En la imagen se muestra el portal a la siguiente escena que se activa al superar la prueba del NPC portonGPT. E.1. Problemas generales Un error grave que se corrigió durante las pruebas ha sido la tendencia de los ejemplares que representan a los NPC de escribir sus respectivos comandos de finalización del puzle. Se podía observar, por ejemplo, al ejemplar del portón escribir en su primer mensaje textos como ”si quieres ganarte mi apertura y que responda ’[Abierta]’tendrás que demostrar tu valía”. Estos errores se han mitigado ignorando el primer mensaje en la función de búsqueda del comando. En otros casos, se ha comunicado al ejemplar por medio de su prompt que el primer mensaje sería ignorado. E.2. Prueba 1: Historia original Esta primera prueba se ha ejecutado con todos los assets originales (cómic, sofá, tronco, paraguas, mesa, silla, vela) y dos NPC: una estatua que, mediante la conversación con el jugador, puede hacer aparecer un objeto dentro de un cofre; y un portón que el jugador tiene que lograr abrir conversando con él para poder superar la primera escena (Figura E.1). Además, cuando se cruza cierto punto en el escenario aparece un enemigo (el hombre con sombre que mató a los padres de Naeve) y el jugador tendrá que ayudar a Naeve a eludirlo de alguna manera. Hay un narrador en tercera persona que cuenta cada acción que realiza el jugador en un cuadro de texto (Figura E.2) en la parte superior de la E.2. Prueba 1: Historia original 133 Figura E.2: Fotograma de la herramienta en el que se puede observar la narración del ejemplar principal de ChatGPT. pantalla. A parte de mediante clicks, el jugador puede, en cualquier momento, comunicarse directamente por medio de texto con el ejemplar de ChatGPT de la protagonista, utilizando un botón ”Hablar” en la parte superior izquierda de la pantalla. Ambas formas de comunicarse funcionan correctamente. Los clicks son más eficientes para moverse y el texto es más eficiente para el resto de acciones. La mejor forma de jugar a Narraeve ha sido de esta manera. Se han probado todas las acciones y funcionan correctamente. Cualquiera de los objetos mencionados anteriormente pueden ser objetivo de todas las acciones. La narración de estas acciones por parte del ejemplar principal han sido muy satisfactorias, manteniéndose siempre la coherencia con la ambientación y la historia. Para ayudar a una mejor experiencia del jugador, este puede comunicarse con el ejemplar principal utilizando también la narración en tercera persona: Jugador:Click en el árbol en el que está el cómic. NaeveGPT:”Naeve se acercaría con miedo al árbol, viendo una luz que brilla entre sus ramas.” Jugador, escribiendo:”Naeve miraría a lo alto y vería un cómic entre las ramas. Agiraría el árbol esperando que el cómic cayese” NaeveGPT:”Un cómic caería hasta los pies de Naeve, que lo abriría para encontrar aventuras maravillosas entre sus página.” Jugador, escribiendo:”Naeve cogería el cómic y lo guardaría con cuidado en su inventario.” NaeveGPT:”Naeve guardaría el cómic con cuidad en su inventario y proseguiría su camino, sintiéndose más segura ahora.” Se puede observar que el propio jugador puede intervenir activamente en la aventura, decidiendo que hacer con cada objeto o evento que sucede en Narraeve. El jugador, por ejemplo, también podría haber hecho explotar el cómic y no añadirlo nunca a su inventario. Después de esta primera sección del juego, en la que el usuario puede experimentar las diferentes acciones de la herramienta con los objetos que hay