Chatbot para tus documentos de Google utilizando Langchain y OpenAI

Chatbot para documentos de Google con Langchain y OpenAI

Introducción

En este artículo, crearemos un Chatbot para tus documentos de Google con OpenAI y Langchain. Ahora, ¿por qué tenemos que hacer esto en primer lugar? Sería tedioso copiar y pegar el contenido de tus documentos de Google en OpenAI. OpenAI tiene un límite de tokens de caracteres en el que solo puedes agregar cantidades específicas de información. Entonces, si quieres hacer esto a gran escala o quieres hacerlo de forma programática, necesitarás una biblioteca que te ayude; y es ahí donde entra Langchain. Puedes crear un impacto en tu negocio conectando Langchain con Google Drive y Open AI para resumir tus documentos y hacer preguntas relacionadas. Estos documentos podrían ser los documentos de tu producto, tus documentos de investigación o la base de conocimientos interna que tu empresa está utilizando.

Objetivos de Aprendizaje

  • Puedes aprender cómo obtener el contenido de tus documentos de Google utilizando Langchain.
  • Aprender cómo integrar el contenido de tus documentos de Google con OpenAI LLM.
  • Puedes aprender a resumir y hacer preguntas sobre el contenido de tus documentos.
  • Puedes aprender cómo crear un Chatbot que responda preguntas basadas en tus documentos.

Este artículo fue publicado como parte del Data Science Blogathon.

Cargar tus Documentos

Antes de comenzar, necesitamos configurar nuestros documentos en Google Drive. La parte crítica aquí es un cargador de documentos que proporciona Langchain llamado GoogleDriveLoader. Usando esto, puedes inicializar esta clase y luego pasarle una lista de IDs de documentos.

from langchain.document_loaders import GoogleDriveLoader
import os
loader = GoogleDriveLoader(document_ids=["IDs de tus documentos"],
                          credentials_path="RUTA AL archivo credentials.json")
docs = loader.load()

Puedes encontrar la ID de tu documento en el enlace de tu documento. Puedes encontrar la ID entre las barras diagonales después de /d/ en el enlace.

Por ejemplo, si el enlace de tu documento es https://docs.google.com/document/d/1zqC3_bYM8Jw4NgF entonces la ID de tu documento es “1zqC3_bYM8Jw4NgF”.

Puedes pasar la lista de estas IDs de documentos al parámetro document_ids, y la parte interesante de esto es que también puedes pasar la ID de una carpeta de Google Drive que contiene tus documentos. Si tu enlace de carpeta es https://drive.google.com/drive/u/0/folders/OuKkeghlPiGgWZdM entonces la ID de la carpeta es “OuKkeghlPiGgWZdM1TzuzM”.

Autorizar Credenciales de Google Drive

Paso 1:

Habilita la API de GoogleDrive usando este enlace https://console.cloud.google.com/flows/enableapi?apiid=drive.googleapis.com. Asegúrate de haber iniciado sesión en la misma cuenta de Gmail donde se encuentran almacenados tus documentos en Drive.

Paso 2: Ve a la consola de Google Cloud haciendo clic en este enlace. Selecciona “OAuth client ID”. Selecciona el tipo de aplicación como “Aplicación de escritorio”.

Paso 3: Después de crear el cliente OAuth, descarga el archivo de secretos haciendo clic en “DESCARGAR JSON”. Puedes seguir los pasos de Google si tienes alguna duda al crear un archivo de credenciales.

Paso 4: Actualiza tu cliente de API de Google Python ejecutando el siguiente comando pip

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

Luego necesitamos pasar la ruta de nuestro archivo json a GoogleDriveLoader.

Resumiendo sus documentos

Asegúrese de tener sus claves de API de OpenAI disponibles. Si no es así, siga los siguientes pasos:

1. Vaya a ’https://openai.com/ y cree su cuenta.

2. Inicie sesión en su cuenta y seleccione ‘API’ en su panel de control.

3. Ahora haga clic en su icono de perfil, luego seleccione ‘Ver claves de API’.

4. Seleccione ‘Crear nueva clave secreta’, cópiela y guárdela.

A continuación, necesitamos cargar nuestro OpenAI LLM. Resumamos los documentos cargados usando OpenAI. En el siguiente código, utilizamos un algoritmo de resumen llamado summarize_chain proporcionado por langchain para crear un proceso de resumen que almacenamos en una variable llamada chain que toma documentos de entrada y produce resúmenes concisos utilizando el enfoque map_reduce. Reemplace su clave de API en el siguiente código.

from langchain.llms import OpenAI
from langchain.chains.summarize import load_summarize_chain
llm = OpenAI(temperature=0, openai_api_key=os.environ['OPENAI_API_KEY'])
chain = load_summarize_chain(llm, chain_type="map_reduce", verbose=False)
chain.run(docs)

Obtendrá un resumen de sus documentos si ejecuta este código. Si desea ver lo que LangChain estaba haciendo debajo de la superficie, cambie verbose a True y podrá ver la lógica que Langchain está utilizando y cómo está pensando. Puede observar que LangChain insertará automáticamente la consulta para resumir su documento y todo el texto (consulta + contenido del documento) se pasará a OpenAI. Ahora OpenAI generará el resumen.

A continuación se muestra un caso de uso en el que envié un documento en Google Drive relacionado con un producto llamado SecondaryEquityHub y resumí el documento utilizando el tipo de cadena map_reduce y la función load_summarize_chain(). He configurado verbose=True para ver cómo Langchain está funcionando internamente.

from langchain.document_loaders import GoogleDriveLoader
import os
loader = GoogleDriveLoader(document_ids=["ceHbuZXVTJKe1BT5apJMTUvG9_59-yyknQsz9ZNIEwQ8"],
                          credentials_path="../../desktop_credetnaisl.json")
docs = loader.load()
from langchain.llms import OpenAI
from langchain.chains.summarize import load_summarize_chain
llm = OpenAI(temperature=0, openai_api_key=os.environ['OPENAI_API_KEY'])
chain = load_summarize_chain(llm, chain_type="map_reduce", verbose=True)
chain.run(docs)

Salida:

Podemos observar que Langchain insertó la indicación para generar un resumen para un documento dado.

Podemos ver el resumen conciso y las características del producto presentes en el documento generado por Langchain utilizando OpenAI LLM.

Más casos de uso

1. Investigación: Podemos utilizar esta funcionalidad al realizar investigaciones, en lugar de leer intensivamente todo el documento de investigación palabra por palabra, podemos utilizar la funcionalidad de resumen para obtener una idea rápida del documento.

2. Educación: Las instituciones educativas pueden obtener resúmenes de contenido curado de libros de texto a partir de datos extensos, libros académicos y documentos.

3. Inteligencia empresarial: Los analistas de datos deben revisar un gran conjunto de documentos para extraer información de ellos. Utilizando esta funcionalidad, pueden reducir la gran cantidad de esfuerzo.

4. Análisis de casos legales: Los profesionales del derecho pueden utilizar esta funcionalidad para obtener rápidamente argumentos críticos de su vasta cantidad de documentos de casos similares anteriores.

Supongamos que queremos hacer preguntas sobre el contenido de un documento dado, debemos cargar una cadena diferente llamada load_qa_chain. A continuación, inicializamos esta cadena con un parámetro llamado chain_type. En nuestro caso, usamos chain_type como “stuff”. Este es un tipo de cadena sencillo; toma todo el contenido, lo concatena y lo pasa a LLM.

Otros tipos de cadenas:

  • map_reduce: Al principio, el modelo examinará individualmente cada documento y almacenará sus conocimientos, y al final, combinará todos estos conocimientos y volverá a examinar estos conocimientos combinados para obtener la respuesta final.
  • refinar: Examinará de forma iterativa cada documento proporcionado en la lista document_id y luego refinará las respuestas con la información más reciente que encuentre en el documento a medida que avanza.
  • Map re-rank: el modelo examinará individualmente cada documento y asignará una puntuación a los conocimientos. Finalmente, devolverá el que tenga la puntuación más alta.

A continuación, ejecutamos nuestra cadena pasando los documentos de entrada y la consulta.

from langchain.chains.question_answering import load_qa_chain
query = "¿Quién es el fundador de Analytics Vidhya?"
chain = load_qa_chain(llm, chain_type="stuff")
chain.run(input_documents=docs, question=query)

Cuando ejecutas este código, langchain inserta automáticamente la indicación con el contenido de tu documento antes de enviarlo a OpenAI LLM. Bajo la superficie, langchain nos ayuda con la ingeniería de indicaciones proporcionando indicaciones optimizadas para extraer el contenido requerido de los documentos. Si quieres ver qué indicaciones están utilizando internamente, simplemente establece verbose=True, entonces podrás ver la indicación en la salida.

from langchain.chains.question_answering import load_qa_chain
query = "¿Quién es el fundador de Analytics Vidhya?"
chain = load_qa_chain(llm, chain_type="stuff", verbose=True)
chain.run(input_documents=docs, question=query)

Construye tu Chatbot

Ahora necesitamos encontrar una forma de convertir este modelo en un Chatbot de pregunta-respuesta. Principalmente necesitamos seguir tres cosas para crear un Chatbot.

1. El Chatbot debe recordar el historial del chat para comprender el contexto con respecto a la conversación en curso.

2. El historial del chat debe actualizarse después de cada indicación que el usuario le haga al bot.

3. El Chatbot debe funcionar hasta que el usuario quiera salir de la conversación.

from langchain.chains.question_answering import load_qa_chain

# Función para cargar la cadena de pregunta-respuesta de Langchain
def cargar_cadena_langchain_qa():
    llm = OpenAI(temperature=0, openai_api_key=os.environ['OPENAI_API_KEY'])  
    chain = load_qa_chain(llm, chain_type="stuff", verbose=True)
    return chain

# Función para manejar la entrada del usuario y generar respuestas
def chatbot():
    print("Chatbot: ¡Hola! Soy tu amigable chatbot. Hazme cualquier pregunta o escribe 'exit' para finalizar la conversación.")
    from langchain.document_loaders import GoogleDriveLoader
    loader = GoogleDriveLoader(document_ids=["TUS ID DE DOCUMENTO"],
                          credentials_path="RUTA AL ARCHIVO credentials.json")
    docs = loader
    # Inicializar la cadena de pregunta-respuesta de Langchain
    chain = cargar_cadena_langchain_qa()
    
    # Lista para almacenar el historial del chat
    chat_history = []
    
    while True:
        user_input = input("Tú: ")
        
        if user_input.lower() == "exit":
            print("Chatbot: ¡Adiós! Que tengas un gran día.")
            break

        # Agregar la pregunta del usuario al historial del chat
        chat_history.append(user_input)

        # Procesar la pregunta del usuario utilizando la cadena de pregunta-respuesta
        response = chain.run(input_documents=chat_history, question=user_input)
        
        # Extraer la respuesta de la respuesta
        answer = response['answers'][0]['answer'] if response['answers'] else "No pude encontrar una respuesta a tu pregunta."

        # Agregar la respuesta del chatbot al historial del chat
        chat_history.append("Chatbot: " + answer)

        # Imprimir la respuesta del chatbot
        print("Chatbot:", answer)

if __name__ == "__main__":
    chatbot()

Inicializamos nuestros documentos de Google Drive y OpenAI LLM. A continuación, creamos una lista para almacenar el historial del chat y actualizamos la lista después de cada indicación. Luego creamos un bucle infinito que se detiene cuando el usuario da “exit” como indicación.

Conclusión

En este artículo, hemos visto cómo crear un Chatbot para proporcionar información sobre el contenido de tus documentos de Google. Integrar Langchain, OpenAI y Google Drive es uno de los casos de uso más beneficiosos en cualquier campo, ya sea médico, de investigación, industrial o ingeniería. En lugar de leer toda la información y analizar los datos para obtener información, lo cual requiere mucho esfuerzo humano y tiempo, podemos implementar esta tecnología para automatizar la descripción, resumen, análisis y extracción de información de nuestros archivos de datos.

Puntos clave

  • Los documentos de Google se pueden obtener en Python utilizando la clase GoogleDriveLoader de Python y las credenciales de la API de Google Drive.
  • Al integrar OpenAI LLM con Langchain, podemos resumir nuestros documentos y hacer preguntas relacionadas con los documentos.
  • Podemos obtener información de varios documentos al elegir tipos de cadenas apropiados como map_reduce, stuff, refine y map rerank.

Preguntas frecuentes

Los medios mostrados en este artículo no son propiedad de Analytics Vidhya y se utilizan a discreción del autor.