fcernafukuzaki's picture
Update app.py
f3ceecb
raw
history blame
4.52 kB
import json
import gradio as gr
from pathlib import Path
import os
import pandas as pd
import time
import random
import openai
from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader, LLMPredictor, ServiceContext
from langchain.chat_models import ChatOpenAI
import textwrap
# Procesar datos de PDF
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import CharacterTextSplitter
#import gradio as gr
from openai.embeddings_utils import get_embedding
from openai.embeddings_utils import cosine_similarity
# API KEY OPENAI
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY
# CONSTANTES
DATASET_JSON = "demo-inmobiliaria.json"
# Ubicación dataset
carpeta_actual = os.getcwd()
print(f"Nombre de la carpeta actual: {carpeta_actual}")
PATH_FILE = f"{os.getcwd()}/{DATASET_JSON}"
class ChatBotInmobiliaria():
def __init__(self):
self.embedding_engine = "text-embedding-ada-002"
self.model_name = "gpt-3.5-turbo"
self.index = None
def create_dataset(self, directory_path, filepath_dataset):
# directory_path: Directorio donde se ubican los archivos PDF.
# filepath_dataset: Nombre del archivo JSON vectorizado.
if directory_path != None:
#Leer los PDFs
pdf = SimpleDirectoryReader(directory_path).load_data()
#Definir e instanciar el modelo
modelo = LLMPredictor(llm=ChatOpenAI(temperature=0, model_name=self.model_name))
#Indexar el contenido de los PDFs
service_context = ServiceContext.from_defaults(llm_predictor=modelo)
self.index = GPTSimpleVectorIndex.from_documents(pdf, service_context = service_context)
self.__save_model(filepath_dataset)
def __save_model(self, filepath):
#Guardar el índice a disco para no tener que repetir cada vez
#Recordar que necesistaríamos persistir el drive para que lo mantenga
self.index.save_to_disk(filepath)
def load_dataset(self, filepath):
#Cargar el índice del disco
self.index = GPTSimpleVectorIndex.load_from_disk(filepath)
def ask(self, question=""):
if len(question) == 0:
print("Debe de ingresar una pregunta.")
try:
return self.index.query(f"""
Actúa como un representante de ventas de una inmobiliaria.
{question}
Responde en español
""")
except Exception as e:
print(e)
return "Hubo un error."
# Gradio
description ="""
<p>
<center>
Demo Inmobiliaria, el objetivo es responder preguntas a través de OpenAI previamente entrenado con un archivo PDF.
<img src="https://raw.githubusercontent.com/All-Aideas/sea_apirest/main/logo.png" alt="logo" width="250"/>
</center>
</p>
"""
article = "<p style='text-align: center'><a href='http://allaideas.com/index.html' target='_blank'>Demo Inmobiliaria: Link para más info</a> </p>"
examples = [["¿Cuánto está una casa en San Isidro?"],["Hay precios más baratos?"],["A dónde llamo?"],["Qué leyes existen?"]]
gpt_bot = ChatBotInmobiliaria()
gpt_bot.load_dataset(PATH_FILE)
chat_history = []
def chat(pregunta):
bot_message = str(gpt_bot.ask(question=pregunta))
chat_history.append((pregunta, bot_message))
time.sleep(1)
return chat_history
with gr.Blocks() as demo:
gr.Markdown(f"""
<p><center><h1>Demo Inmobiliaria</h1></p></center>
{description}
""")
out1 = gr.Chatbot(label="Respuesta").style(height=300)
with gr.Row():
in2 = gr.Textbox(label="Pregunta")
enter = gr.Button("Enviar mensaje")
clear = gr.Button("Nuevo chat")
gr.Markdown(article)
def respond(message, chat_history):
bot_message = str(gpt_bot.ask(question=message))
chat_history.append((message, bot_message))
time.sleep(1)
return "", chat_history
enter.click(fn=respond, inputs=[in2, out1], outputs=[in2, out1])
in2.submit(respond, [in2, out1], [in2, out1])
clear.click(lambda: None, None, out1, queue=False)
# in1 = gr.inputs.Textbox(label="Pregunta")
# out1 = gr.outputs.Chatbot(label="Respuesta").style(height=350)
# demo = gr.Interface(
# fn=chat,
# inputs=in1,
# outputs=out1,
# title="Demo Inmobiliaria",
# description=description,
# article=article,
# enable_queue=True,
# examples=examples,
# )
demo.launch(debug=True)