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 ="""

Demo Inmobiliaria, el objetivo es responder preguntas a través de OpenAI previamente entrenado con un archivo PDF. logo

""" article = "

Demo Inmobiliaria: Link para más info

" 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"""

Demo Inmobiliaria

{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)