Git Product home page Git Product logo

unap-chatbot's Introduction

UNAP Chatbot 馃

Desarrollo de chatbot consciente de documentos y reglamentos pertinentes a la universidad Arturo Prat y la carrera de Ingenieria Civil en Computacion e Informatica.

Disponible en: https://unap-chatbot.streamlit.app/

Links

Agente: https://unap-chatbot.streamlit.app/ Modelo de chat: https://unap-chatbot-llm.streamlit.app/ Visualizadora de data: https://unap-chatbot-stats.streamlit.app/

Servicios utilizados

  • OpenAI API para la generacion de las respuestas. Modelos 3.5 y 4.
  • Pinecone como base de datos de vectores.
  • Streamlit Share para el frontend y deploy de la herramienta.

Taller de titulo. UNAP 2023-2024.

unap-chatbot's People

Contributors

agutierrezmorag avatar dependabot[bot] avatar gualterguaguita avatar

Watchers

 avatar

unap-chatbot's Issues

Reemplazar embeddings de OpenAI

Descripci贸n

Se esta dando uso de la clase OpenAIEmbeddings para realizar los embeddings. Esto trae consigo costos extra, los que se descuentan del plan actual en la API de OpenAI.

Objetivo

Implementar embeddings gratuitos (HuggingFace) y ver si hay diferencia significativa con los de OpenAI. En caso de que no, reemplazar OpenAIEmbeddings en el c贸digo por la opci贸n gratuita.

Reconsiderar uso de agentes

Descripci贸n

En pruebas anteriores, se defini贸 que el uso de agentes no era apropiado para el chatbot, debido a que el agente tend铆a a realizar b煤squedas online en vez de responder acorde a los documentos proporcionados.

Objetivo

Implementar nuevamente un agente, de manera tal que responda seg煤n los documentos, quiz谩s mediante una buena definici贸n de prompts. Una buena implementaci贸n de esto, significar铆a que la IA sea capaz de responder preguntas mas din谩micas sobre la universidad, como por ejemplo: carreras, pr贸ximos eventos, horarios de atenci贸n de diversos departamentos, etc. Lo que le dar铆a un boost importante a la funcionalidad del chatbot.

Manejo de datos sensibles

Descripci贸n

En nuestra propuesta de trabajo, mencionamos que tendr铆amos un manejo de datos sensibles, cosa que aun no hemos implementado debido a la poca cantidad de documentos actuales.

Objetivo

Primero, definir que tipo de datos sensibles se esperan que reciba la IA (que en realidad son los que se suben a la base de datos de vectores) en una reuni贸n con el profesor.
Luego, escribir un script que detecte estos datos en un documento y usar este script en cada commit que se realice correspondiente a la subida de documentos, cancelando el commit en caso de que se encuentre datos sensibles (o los elimine del documento).

Links 煤tiles

Implementar vectorizado de nuevos documentos

Descripci贸n

En la pagina de 馃搼 Documentos el usuario deber铆a ser capaz de realizar el vectorizado de los documentos que suba o elimine.

Objetivo

Implementar el vectorizado de los documentos que se suban. Tambi茅n habr谩 que realizarlo cuando se eliminen documentos. Ver si hacerlo mediante un bot贸n disponible al usuario o si se hace en el background durante la subida y eliminaci贸n.

Retrievers

Descripci贸n

En la ultima reuni贸n se menciono la idea de escribir un documento tipo glosario para la base de datos de vectores, donde se registrar铆an datos que no est谩n presentes en los reglamentos, como las facultades, carreras, e informaci贸n general de la universidad.
Seg煤n los avances que he estado haciendo en #5, pude ver que, durante el proceso de carga y split de los textos es posible utilizar una clase que realizar铆a este proceso pero a partir de una pagina en Wikipedia, por lo que implemente un bot贸n que realiza justo eso, cargar el texto relevante de la pagina (es decir, se omiten links, referencias a otras paginas, etc.), dividirlo en chunks y subirlo al index en Pinecone.

Algo similar ya se habia probado pero en el contexto de una herramienta (#5). Sin embargo, al ser una herramienta significaba que solo el agente podr铆a darle uso, ademas de que el scrapeo de la pagina se realizaba en el momento en que el usuario realizaba la pregunta, aumentando un mont贸n el tiempo que el agente tardaba en responder (hasta los 30 segundos). De la manera en la que esta implementada esta funci贸n ahora significa que tanto el LLM como el agente pueden darle uso. Ademas, como estos documentos est谩n en el index de Pinecone, se tienen acceso a esto much铆simo mas r谩pido, agregando solamente uno o dos segundos extra en la generaci贸n de respuesta.

Ahora bien, esto tambi茅n genero un problema al momento de gestionar el index que tenemos en Pinecone ya que, por lo menos como funciona ahora, cada vez que se presiona el bot贸n para realizar el scrapeo de Wikipedia, estos chunks son indexados en conjunto con el resto de reglamentos, lo que significa que es posible existan m煤ltiples vectores relacionados con Wikipedia en caso de presionar el bot贸n mas de una vez. Eliminar el index completo y volver a crearlo como lo hacemos con el resto de reglamentos no es una opci贸n ya que tambi茅n se eliminar铆an los vectores que ya existen y no tiene sentido que se tenga que volver a subir los reglamentos a Pinecone cada vez que se quiera actualizar la info recuperada de Wikipedia. Una soluci贸n a esto, y la que esta implementada ahora mismo, es la de utilizar los namespaces. Un namespace es b谩sicamente una colecci贸n o categor铆a en el index. Ahora los reglamentos se guardan en el namespace Reglamentos y lo extra铆do de wikipedia en el namespace Wikipedia.

Esto tambi茅n significa que tuvo que cambiar como funcionaban los retrievers de tanto el LLM como del Agente.

Agente

El agente ahora cuenta con dos herramientas, doc_retriever_tool y wikipedia_retriever_tool. Son esencialmente la misma herramienta solo que para los namespaces Reglamentos y Wikipedia, respectivamente. El agente solo utilizara la segunda herramienta en caso de que la primera no sea suficiente para dar respuesta a la pregunta del usuario. Tambi茅n es posible que no utilice ninguna en caso de no ser necesario, como cuando el usuario saluda o pregunta algo que el agente puede responder solo con el historial de conversaci贸n. Esto es perfecto ya que evitamos el gasto de tokens de manera innecesaria.

LLM

Para el LLM fue un poco mas complicado. En los primeros testeos, simplemente utilice dos retrievers, uno por cada namespace, y despu茅s los junte utilizando un EnsembleRetriever. Como simplemente copie y pegue el c贸digo de retriever que ten铆amos hecho en ambos retrievers, esto significo que, por cada retriever, se recuperaban 5 documentos, siendo 10 en total. Estos 10 documentos de contexto mas el historial de conversaci贸n y la pregunta actual del usuario aumento un mont贸n el uso de tokens. Pasamos de utilizar un promedio de 3.3k a alrededor de 7k por interacci贸n. Intente mitigar un poco esto simplemente reduciendo la cantidad de documentos recuperados por retrievers, a 2 cada uno. Esto cambio el uso de tokens a mas o menos el promedio que ten铆amos anteriormente. El problema parece ser que los documentos recuperados por el retriever de wikipedia no son siempre muy relevantes para el LLM, o el LLM simplemente los ignora. Por ejemplo, el LLM puede responder cuantas y cuales facultades existen en la universidad (wikipedia) pero responde que el rector actual es Gustavo Soto (reglamentos). Una soluci贸n a esto seria cambiar como funciona el LLM para que reformule la query del usuario a una mas adecuada para la recuperaci贸n de documentos (esto el agente lo hace autom谩ticamente), esto es posible hacerlo mediante una call a otro LLM, lo que significar铆a costos extra.

Tambi茅n vale la pena mencionar que prob茅 el search_type de mmr y similarity en los retrievers y los resultados de similarity parec铆an ser los mejores.

Objetivo

Decidir si vale la pena intentar mejorar como el LLM recupera los documentos contexto a costas de un costo mayor de la API de OpenAI o si simplemente lo dejamos as铆 para empezar ya las evaluaciones del LLM y el agente.

Implementar base de datos de vectores local

Descripci贸n

Pinecone es un servicio de pago a base de suscripci贸n, con un modelo de pago 'as-you-go', lo que significa que se paga acorde al uso dado.

Actualmente se esta dando uso del tier gratuito de Pinecone, lo que nos da acceso a una base de datos de vectores con un m谩ximo de 100.000 vectores. De momento, con los 12 documentos presente en este repo, estamos usando 221 vectores, lo que obviamente ira aumentando a medida que se agregan documentos.

Para evitar costos extra, seria ideal realizar pruebas con bases de datos locales, seg煤n las integraciones que tenga Langchain, como ChromaDB. Esto puede significar una mayor velocidad de respuesta en la b煤squeda de documentos contexto, pero tambi茅n puede significar una menor precisi贸n en las respuestas generadas, dependiendo de la base de datos que se implemente. Otra limitaci贸n puede ser el tama帽o de los archivos generados. Github solo permite un m谩ximo de 100MB por archivo que se suba al repo.

ss de los datos de Pinecone

Objetivo

Implementar una base de datos de vectores local y comparar los resultados con Pinecone. Si la diferencia no es mucha, reemplazar Pinecone por la opci贸n local. En caso de que Pinecone sea mucho mejor, mencionar esta situaci贸n al profesor e indicarle que igual tenemos bastante espacio disponible en la base de datos actual.

Scraper

Descripci贸n

La universidad tiene un portal noticiero, Actualidad UNAP, con art铆culos relacionados con la universidad sobre eventos, actividades, logros, etc. Es actualizada frecuentemente, con un nuevo articulo cada par de d铆as.

Objetivo

Facilitar los contenidos de estos art铆culos a la IA, para que pueda responder preguntas e informar al usuario sobre los mismos.

Limitaciones

Descripcion

Al depender de varias librerias y otros servicios externos, seria buena idea llevar registro de todas las limitaciones que estos tengan.

Objetivo

Registrar limitaciones, ya sea de usuarios, llamadas API o cualquier otro tipo de cuello de botella que vaya a llegar a afectar el funcionamiento del chatbot a futuro.

Carga de documentos

Descripci贸n

El proceso actual para subir documentos a Pinecone consta de los siguientes pasos:

  1. Convertir manualmente los escaneos a texto utilizando Tesseract-OCR*.
  2. Realizar correcciones necesarias a estos textos. Esto se debe a que el OCR puede tener dificultades al convertir ciertos s铆mbolos, y el orden y la estructura del texto pueden ser ca贸ticos*.
  3. Guardar estas correcciones en archivos con formato .txt*.
  4. Subir estos documentos .txt a trav茅s de la p谩gina de administraci贸n de documentos (que realiza un push a la rama docs de este repositorio en segundo plano).
  5. Cargar estos documentos directamente desde este repositorio y crear los chunks.
  6. Subir los chunks a su respectivo namespace en Pinecone.

Los pasos marcados con * son realizados por el usuario y suelen ser los m谩s tediosos. Para mejorar la experiencia del usuario, ser铆a l贸gico automatizar estos pasos, de modo que el usuario solo necesite subir los archivos (paso 4) y el resto se maneje en segundo plano.

Objetivo

Implementar la funcionalidad de escaneo autom谩tico de los contenidos de los documentos PDF. Afortunadamente, algunos PDF loaders de Langchain pueden extraer im谩genes de documentos, lo que podr铆a simplificar nuestra tarea, dependiendo de su eficacia y velocidad.

Definir frontend

Descripci贸n

Actualmente se da uso de los dise帽os por defecto de Streamlit para todo lo presente en la pagina.

pagina de chatbot

pagina de documentos

Objetivo

Discutir con el profesor si espera que se hagan cambios en el dise帽o. Algunas opciones serian:

  • Usar los colores de la universidad
  • Insertar el logo de la universidad en alguna parte
  • A帽adir instrucciones a la pagina 馃搼 Documentos para la subida de documentos (adjuntar docs -> presionar boton 'subir archivos' -> presionar boton de vectorizado)
  • Cambiar los iconos de usuario y IA en el chat

Evaluacion de respuestas

Descripci贸n

En la ultima reuni贸n se discuti贸 la idea de evaluar las respuestas generadas por el chatbot mediante la comparaci贸n de estas respuestas con el reglamento. Si bien con anterioridad se menciono una idea similar, en vez de comparar la similitud entre textos, seria mas adecuado comparar el significado en si de estos textos.

Objetivo

Implementar alguna forma de comparar respuestas y documentos fuente que utilizo el chatbot para generar la respuesta. Esta implementaci贸n habr谩 que hacerla en su propio repositorio, pero llevar registro de eso en este, por conveniencia.

Una opci贸n seria utilizar los modelos disponibles en HuggingFace para realizar y evaluar la comparaci贸n.

Implementar autentificacion

Descripci贸n

Con la implementaci贸n de la pagina 馃搼 Documentos se implemento la opci贸n de subir y eliminar documentos con los cuales se contextualiza el modelo de chat para la generaci贸n de respuestas. Los documentos con los que se interact煤an son los presentes en el branch test de este repositorio.
Actualmente cualquier usuario puede subir y eliminar documentos.

Objetivo

Implementar alguna forma de autentificaci贸n en la pagina 馃搼 Documentos para restringir el acceso a personas selectas. Quiz谩s sea necesario conversar con el profesor que tipo de autentificaci贸n seria necesaria. Tambi茅n habr谩 que informarle la manera con la que manejamos los documentos (mediante este repo) y consultarle si esta bien o si sera necesario realizar cambios.

Agregar preguntas de ejemplo

Descripci贸n

En la reunion de hoy, el profesor dio la idea de facilitar a los usuarios preguntas de ejemplo, para guiarlos sobre lo que pueden preguntar y las capacidades del chatbot.

Objetivo

Implementar un set de preguntas predefinidas que el usuario puede seleccionar que, una vez seleccionada, se de respuesta y se agregue al historial de chat. Un claro ejemplo de esto es lo que esta presente en la pagina de ChatGPT.

imagen

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    馃枛 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 馃搳馃搱馃帀

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google 鉂わ笍 Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.