Saltar a contenido

Data Document Chat

Resumen del proceso completo

Este documento detalla el desarrollo y funcionamiento de un sistema avanzado diseñado para la consulta interactiva de documentos en formato CSV o Excel. El sistema abarca varios procesos clave, incluyendo la transformación del documento a un dataframe de pandas y el uso de un agent que es capaz de ejecutar instrucciones en python sobre el dataframe, con lo cual nos puede devolver las consultas que le realicemos, basandose en el documento subido.
Este proceso es más simple que el proceso de consulta a documentos, ya que este no require de todo el proceso de embedding.

Proceso de Subida del documento

La aplicación para poder comenzar a chatear con ella pide una entrada en formato CSV o Excel.

Proceso de conversión del documento a un dataframe

Seguidamente la aplicación procede con el proceso de conversión del documento de entrada a un dataframe de pandas.

Proceso de Q&A haciendo uso de un agent

Seguidamente se define un Agent, el cual realizará todas las operaciones necesarias sobre el dataframe, para ser capaz de responder al usuario.

  • Agent: En el contexto de la inteligencia artificial (IA), un "agente" se refiere a un programa de software o una entidad virtual que actúa de manera autónoma en un entorno para lograr objetivos específicos o resolver problemas. Los agentes en la IA están diseñados para percibir su entorno, tomar decisiones basadas en la información que recopilan y ejecutar acciones para alcanzar sus metas.

Explicación del código empleado

Parte 1: Inicialización de las variables de sesión necesarias

if 'user_id' not in st.session_state:
    st.session_state.user_id = str(uuid.uuid4())

if 'user_question_datadocument_chat' not in st.session_state:
    st.session_state['user_question_datadocument_chat'] = []

if 'response_datadocument_chat' not in st.session_state:
    st.session_state['response_datadocument_chat'] = []
  • Variable de sesión user_id:
    Esta variable se utiliza para almacenar de manera única la identificación del usuario. Si no existe en la sesión, se crea y se le asigna un valor único generado por UUID.

  • Variable de sesión user_question_datadocument_chat:
    Esta variable se utiliza para almacenar una lista de preguntas o datos del usuario en un chat. Si no existe en la sesión, se crea como una lista vacía.

  • Variable de sesión response_datadocument_chat:
    Esta variable se utiliza para almacenar una lista de respuestas en un chat. Si no existe en la sesión, se crea como una lista vacía.

Estas variables de sesión se emplean para llevar un registro de la identificación del usuario, así como de las preguntas y respuestas en un chat dentro de la aplicación. La primera variable, 'user_id', almacena una identificación única para el usuario, mientras que las otras dos variables, 'user_question_datadocument_chat' y 'response_datadocument_chat', almacenan listas que registran las preguntas del usuario y las respuestas generadas en el chat.

Parte 2: Carga del Modelo OpenAI con Caché de Streamlit

@st.cache_resource
def load_OpenAI(temperature=0.7):
    llm = AzureChatOpenAI(model_name="gpt-3.5-turbo",deployment_name="GPTTurbo35",
                    openai_api_base=st.secrets.openai.api_base,
                    openai_api_key=st.secrets.openai.api_key,
                    openai_api_type=st.secrets.openai.api_type,
                    openai_api_version=st.secrets.openai.api_version,temperature=temperature)
    return llm

Esta parte del script define una función load_OpenAI con un parámetro opcional temperature. La función está diseñada para inicializar y devolver un modelo de lenguaje de OpenAI. Aquí está el desglose del código:

  • Decorador de Caché de Streamlit (@st.cache_resource): Este decorador se utiliza para almacenar en caché la salida de la función. En Streamlit, el almacenamiento en caché es beneficioso para el rendimiento, ya que previene la carga repetida de recursos (como un modelo de lenguaje) cada vez que se accede o se actualiza la aplicación.

  • Definición de la Función (load_OpenAI):

  • Parámetro: temperature=0.7 - Esto establece el comportamiento predeterminado del modelo de lenguaje. El parámetro de temperatura en los modelos de lenguaje típicamente controla la aleatoriedad de la salida. Una temperatura más alta resulta en respuestas más variadas, mientras que una temperatura más baja produce respuestas más predecibles y conservadoras.

  • Inicialización del Modelo de Lenguaje (AzureChatOpenAI):

    • Esto crea una instancia de un modelo de lenguaje usando AzureChatOpenAI, lo que sugiere que el modelo está alojado en Azure, la plataforma en la nube de Microsoft.
    • model_name="gpt-3.5-turbo": Especifica el uso del modelo GPT-3.5 Turbo de OpenAI.
    • deployment_name, openai_api_base, openai_api_key, openai_api_type, openai_api_version: Estos parámetros están configurados con ajustes y credenciales, probablemente almacenados en la gestión de secretos de Streamlit. Esta es una forma segura de manejar información sensible como las claves de API.
    • temperature=temperature: Pasa el parámetro de temperatura al modelo, influyendo en su estilo de respuesta.
  • Declaración de Retorno: La función devuelve el objeto del modelo de lenguaje inicializado, que se puede utilizar en otras partes del script para diversas tareas de procesamiento de lenguaje natural o generación.

Parte 4: Función callback usada para limpiar el chat en caso de cargar nuevo documentio

def on_change_clear_chat():
    st.session_state['user_question_datadocument_chat'] = []
    st.session_state['response_datadocument_chat'] = []

Parte 5: Configuración de la página de streamlit

st.set_page_config(page_title="Data Document Chat", page_icon="📊",layout="centered")
sogetilabs_logo = Image.open('images/SogetiLabs_Logo.png')
st.image(sogetilabs_logo, width=200)
st.title("Data Document Chat 📊")

El código que se muestra anteriormente configura el lyout, logos y títulos de la página de streamlit

Parte 6: Input y lógica de la aplicación

document = st.file_uploader("Upload your document", type=['csv','xlsx'],on_change=on_change_clear_chat)

if document is not None:
    if document.type == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":
        df = pd.read_excel(document)
    elif document.type == "text/csv":
        df = pd.read_csv(document)
    user_question = st.text_input("Ask a question about your data document:")
    if user_question:
        try:
            with get_openai_callback() as cb:
                agent = create_pandas_dataframe_agent(load_OpenAI(), df, verbose=True)
                result = agent.run(user_question)
                LogGenerator().store_entry("data-document-chat", load_OpenAI().model_name, cb.total_tokens,user_question)
            st.session_state['user_question_datadocument_chat'].append(user_question)
            st.session_state['response_datadocument_chat'].append(result)
        except:
            st.error("Sorry, I couldn't understand your question. Please try again.")
    for i in range(len(st.session_state['user_question_datadocument_chat'])-1, -1, -1):
        message(st.session_state['user_question_datadocument_chat'][i], is_user=True, key=str(i) + '_user')
        message(st.session_state["response_datadocument_chat"][i], key=str(i))
else:
    st.warning("Please upload a document for start chatting")

El código anteriormente descrito tiene múcha similitud con el código de Text Document Chat, en este caso una de las diferencias que nos encontramos es la creación de un agent, al cual se le pasa el LLM para poder ejecutarse y el dataframe sobre el que se quiere hacer las preguntas, el resto de la lógica es totalmente la misma.