fcernafukuzaki's picture
Update app.py
0d0a541
import json
import gradio as gr
from pathlib import Path
import os
import pandas as pd
import time
import random
from datetime import datetime
import pytz
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
from pymongo import MongoClient
# API KEY OPENAI
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY
# DATABASE CONNECTION
CONNECTION = os.getenv("CONNECTION")
DATABASE = os.getenv("DATABASE")
COLLECTION = os.getenv("COLLECTION")
# 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}"
print(f"Ubicación del archivo: {PATH_FILE}")
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 str(self.index.query(f"Eres un agente inmobiliario virtual especializado en venta y alquiler de propiedades locales. Estoy aquí para ayudarte a encontrar la casa de tus sueños basado en tus preferencias y la legislación actual de Argentina. Por favor, proporciona tus preferencias y te mostraré algunas opciones que se ajusten a tus necesidades, teniendo en cuenta la legislación vigente. \
Debes de responder la pregunta '```'{question}'```'.\
Si la propiedad por la que pregunta si existe, entonces la frase con la que debes de responder debe tener el siguiente formato: El precio de venta o alquiler, la cantidad de ambientes o dormitorios, la superficie y la URL de una propiedad. La URL debe estar luego del texto 'Más información en '. \
Si la propiedad por la que pregunta no existe, entonces debes de responder con la siguiente frase: 'Lo sentimos, no contamos con información para la propiedad solicitada. Sin embargo, puedes contactarnos vía telefónica al (011) 5368-5950 o en nuestra web https://www.oreilly.com.ar'."))
except Exception as e:
print(e)
return "Hubo un error."
# Gradio
title = """
<p><center><h1>Demo Inmobiliaria</h1></p></center>
"""
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)
# Conexión a la base de datos MongoDB
client = MongoClient(CONNECTION)
db = client[DATABASE]
collection = db[COLLECTION]
def get_datetime():
# Obtener la hora actual
hora_actual = datetime.now()
# Obtener la zona horaria de la hora actual
zona_horaria_actual = pytz.timezone('America/Argentina/Buenos_Aires')
# Aplicar la zona horaria a la hora actual
hora_actual_con_zona_horaria = hora_actual.astimezone(zona_horaria_actual)
return hora_actual_con_zona_horaria
def insert_chat(data):
return collection.insert_one({"conversacion": data})
def update_chat(id, data):
collection.update_one({"_id": id}, {"$set": {"conversacion": data}})
def add_chat_history(chat_history, message, answer, calificacion=None):
global json_chat_history
global id_chat
json_chat = {"message": message,
"answer": answer,
"datetime": get_datetime(),
"calificacion": calificacion}
if len(chat_history) > 0:
# Si chat_history no está vacía, significa que es una continuación de la conversación anterior
json_chat_history.append(json_chat)
# chat_history.append([message, answer])
update_chat(id_chat, json_chat_history)
else:
# Si chat_history está vacía, es una nueva conversación
json_chat_history = []
json_chat_history.append(json_chat)
# chat_history.append([message, answer])
# Almacenar la nueva conversación en la base de datos
db_result = insert_chat(json_chat_history)
id_chat = db_result.inserted_id
with gr.Blocks() as demo:
gr.Markdown(f"""
{title}
{description}
""")
out1 = gr.Chatbot(label="Respuesta").style(height=300)
with gr.Row():
in2 = gr.Textbox(label="Pregunta")
enter = gr.Button("Enviar mensaje")
with gr.Row():
upvote_btn = gr.Button(value="👍 Conforme", interactive=True)
downvote_btn = gr.Button(value="👎 No conforme", interactive=True)
flag_btn = gr.Button(value="⚠️ Alertar", interactive=True)
# regenerate_btn = gr.Button(value="🔄 Regenerar", interactive=False)
clear_btn = gr.Button(value="🗑️ Nuevo chat", interactive=True)
ejemplos_gradio = gr.Examples(examples=examples, inputs=[in2, out1])
gr.Markdown(article)
def respond(message, chat_history):
answer = str(gpt_bot.ask(question=message))
add_chat_history(chat_history=chat_history,
message=message,
answer=answer)
chat_history.append([message, answer])
time.sleep(1)
return "", chat_history
enter.click(fn=respond, inputs=[in2, out1], outputs=[in2, out1])
in2.submit(respond, [in2, out1], [in2, out1])
def upvote_last_response(message, chat_history):
"""
Obtener el último objeto JSON de la lista
Actualizar el valor del atributo "calificacion"
"""
if len(json_chat_history) > 0:
json_chat_history[-1]["calificacion"] = "Conforme"
update_chat(id_chat, json_chat_history)
return message, chat_history
def downvote_last_response(message, chat_history):
"""
Obtener el último objeto JSON de la lista
Actualizar el valor del atributo "calificacion"
"""
if len(json_chat_history) > 0:
json_chat_history[-1]["calificacion"] = "No conforme"
update_chat(id_chat, json_chat_history)
return message, chat_history
def flag_last_response(message, chat_history):
"""
Obtener el último objeto JSON de la lista
Actualizar el valor del atributo "calificacion"
"""
if len(json_chat_history) > 0:
json_chat_history[-1]["calificacion"] = "Alertar"
update_chat(id_chat, json_chat_history)
return message, chat_history
# def regenerate_answer(message, chat_history):
# """
# Obtener el último objeto JSON de la lista
# Actualizar el valor del atributo "calificacion"
# """
# if len(json_chat_history) > 0:
# pregunta = json_chat_history[-1]["message"]
# answer = str(gpt_bot.ask(question=pregunta))
# add_chat_history(chat_history=chat_history,
# message=pregunta,
# answer=answer,
# calificacion="Regenerado")
# chat_history.pop(-1)
# chat_history.append([message, answer])
# time.sleep(1)
# return message, chat_history
upvote_btn.click(upvote_last_response, inputs=[in2, out1], outputs=[in2, out1])
downvote_btn.click(downvote_last_response, inputs=[in2, out1], outputs=[in2, out1])
flag_btn.click(flag_last_response, inputs=[in2, out1], outputs=[in2, out1])
# regenerate_btn.click(regenerate_answer, inputs=[in2, out1], outputs=[in2, out1])
clear_btn.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)