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(question + "\nResponde 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 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)