Spaces:
Sleeping
Sleeping
| import os | |
| import pandas as pd | |
| import openai | |
| import re | |
| import json | |
| from langchain.chat_models import ChatOpenAI | |
| import regex | |
| import gradio as gr | |
| from langchain.schema import Document | |
| from langchain.text_splitter import RecursiveCharacterTextSplitter | |
| from langchain.embeddings.openai import OpenAIEmbeddings | |
| from openai.embeddings_utils import get_embedding | |
| from openai.embeddings_utils import cosine_similarity | |
| import gspread # See: https://docs.gspread.org/en/v5.10.0/user-guide.html | |
| from oauth2client.service_account import ServiceAccountCredentials | |
| from datetime import datetime | |
| # API de OpenAI | |
| openai.api_key = os.getenv("OPENAI_API_KEY") | |
| # Establece las credenciales y la API | |
| credentials = os.getenv( "credentials" ) | |
| credentials = json.loads( credentials ) | |
| gc = gspread.service_account_from_dict( credentials ) | |
| Google_URL = os.getenv( "Google_URL" ) | |
| # Cargar el archivo | |
| df_Normas_Embeddings = pd.read_csv( os.getenv( "Data" ) ) | |
| # Main OpenAI Function | |
| # | |
| def get_completion_from_messages( messages, model = "gpt-3.5-turbo-16k", | |
| temperature = 0, max_tokens = 4500 ): ##Check max_tokens | |
| response = openai.ChatCompletion.create( | |
| model = model, | |
| messages = messages, | |
| temperature = temperature, | |
| max_tokens = max_tokens, | |
| ) | |
| return response.choices[0].message["content"] | |
| # Get LEY | |
| # | |
| def get_topic( user_message ): | |
| # | |
| delimiter = "####" | |
| system_message = f""" | |
| Eres un especialista en temas fiscales en México. \ | |
| Se le proporcionarán consultas o preguntas respecto de temas fiscales. \ | |
| Las consultas o preguntas se delimitarán con los caracteres {delimiter}. | |
| Las consultas serán sobre diferentes Leyes, Códigos Federales y normativas como: | |
| 1. La LEY DEL IMPUESTO ESPECIAL SOBRE PRODUCCIÓN Y SERVICIOS y el REGLAMENTO DE LA LEY DEL \ | |
| IMPUESTO ESPECIAL SOBRE PRODUCCIÓN Y SERVICIOS | |
| 2. La LEY DEL IMPUESTO SOBRE LA RENTA y el REGLAMENTO DE LA LEY DEL IMPUESTO SOBRE LA RENTA | |
| 3. La LEY DEL IMPUESTO AL VALOR AGREGADO y el REGLAMENTO DE LA LEY DEL IMPUESTO AL VALOR AGREGADO | |
| Proporciona una lista de objetos de python, donde cada objeto sea alguno de: \ | |
| 'IMPUESTO AL VALOR AGREGADO', 'IMPUESTO SOBRE LA RENTA', o 'IMPUESTO ESPECIAL SOBRE PRODUCCIÓN Y SERVICIOS'. | |
| Donde el tema se debe encontrar en la consulta o pregunta relacionada con temas fiscales. | |
| Solo proporciona la lista de objetos, nada más. | |
| """ | |
| # | |
| messages = [ | |
| {'role':'system', | |
| 'content': system_message}, | |
| {'role':'user', | |
| 'content': f"{delimiter}{user_message}{delimiter}"}, | |
| ] | |
| return get_completion_from_messages( messages ) | |
| # Function: Get embeddings | |
| def get_embedding( text , model ): | |
| text = text.replace("\n", " ") | |
| return openai.Embedding.create( input = [text], model = model )['data'][0]['embedding'] | |
| # Función de búsqueda | |
| def buscar( busqueda, datos, n_resultados): | |
| # | |
| busqueda_embed = get_embedding( busqueda, model = "text-embedding-ada-002" ) | |
| datos['Similitud'] = datos['Embedding'].apply( lambda x: cosine_similarity( eval( x ) , busqueda_embed ) ) | |
| datos = datos.sort_values('Similitud', ascending = False ) | |
| # | |
| return datos.iloc[:n_resultados][['Tema', 'Norma', 'Textos', 'NumPalabras', 'Embedding', 'Similitud']] | |
| # | |
| def get_respuesta( user_message, informacion ): | |
| # | |
| delimiter = "####" | |
| system_message = f""" | |
| Eres un especialista en temas fiscales en México. \ | |
| Se le proporcionarán consultas o preguntas respecto de temas fiscales. \ | |
| Las consultas o preguntas e información para responder se delimitarán \ | |
| con los caracteres {delimiter}. | |
| La información que se te proporcionará para responder las consultas o preguntas \ | |
| estará en una lista de Python. | |
| La información corresponde a extractos de Leyes, Códigos Federales y normativas como: | |
| 1. La LEY DEL IMPUESTO ESPECIAL SOBRE PRODUCCIÓN Y SERVICIOS y el REGLAMENTO DE LA LEY DEL \ | |
| IMPUESTO ESPECIAL SOBRE PRODUCCIÓN Y SERVICIOS. | |
| 2. La LEY DEL IMPUESTO SOBRE LA RENTA y el REGLAMENTO DE LA LEY DEL IMPUESTO SOBRE LA RENTA. | |
| 3. La LEY DEL IMPUESTO AL VALOR AGREGADO y el REGLAMENTO DE LA LEY DEL IMPUESTO AL VALOR AGREGADO. | |
| 4. El CÓDIGO FISCAL DE LA FEDERACIÓN y el REGLAMENTO DEL CÓDIGO FISCAL DE LA FEDERACIÓN. | |
| La información se te proporcionará con la siguiente estructura: Nombre de la Ley, Código o \ | |
| Reglamento, seguido del Artículo y el texto del Artículo. | |
| Asegúrate de realizar preguntas de seguimiento. | |
| """ | |
| # | |
| messages = [ | |
| {'role':'system', | |
| 'content': system_message}, | |
| {'role':'user', | |
| 'content': f""" | |
| {delimiter} | |
| Usa exclusivamente la información contenida en la siguiente lista: | |
| {informacion} | |
| para responder sin límite de palabras lo siguiente: {user_message} | |
| En tu respuesta menciona el Nombre de la Ley, Código o Reglamento de donde proviene la información \ | |
| incluida en tu respuesta. | |
| Responde de forma detallada. | |
| {delimiter} | |
| """}, | |
| ] | |
| # | |
| return get_completion_from_messages(messages) | |
| # | |
| # | |
| # | |
| def update_records( user_message ): | |
| # | |
| sht = gc.open_by_url(Google_URL) | |
| # | |
| sht.sheet1.get_all_records() | |
| # | |
| sht.sheet1.update_cell( len( sht.sheet1.get_all_records()[:] ) + 2 , | |
| 1 , datetime.now().strftime("%m/%d/%Y, %H:%M:%S") ) | |
| # | |
| sht.sheet1.update_cell( len( sht.sheet1.get_all_records()[:] ) + 1 , | |
| 2 , user_message ) | |
| # | |
| def Chat( user_message_1 ): | |
| # | |
| norma_y_tema_response_1 = get_topic( user_message_1 ) | |
| norma_y_tema_response_1 = eval(norma_y_tema_response_1) | |
| norma_y_tema_response_1.append( 'Todos' ) | |
| # | |
| df_datos = df_Normas_Embeddings[ df_Normas_Embeddings['Tema'].isin(norma_y_tema_response_1) ] | |
| # | |
| df_final = buscar( user_message_1, df_datos, 10).reset_index( drop = True) | |
| # | |
| df_final['Cum_NumPalabras'] = df_final['NumPalabras'].cumsum() | |
| # | |
| df_final = df_final[ df_final['Cum_NumPalabras'] <= 1400 ] | |
| # | |
| df_final[ 'Final_Text' ] = df_final[ 'Norma' ] + ', ' + df_final[ 'Textos' ] | |
| # | |
| Textos = df_final[ 'Final_Text' ].tolist() | |
| # | |
| # Save Question and date time | |
| update_records( user_message_1 ) | |
| # | |
| return get_respuesta( user_message_1, Textos ), '\n'.join(Textos) | |
| # | |
| # | |
| with gr.Blocks() as demo: | |
| # | |
| gr.Markdown("App basada en servicios (Embeddings) de OpenAI (Chat GPT-3.5)") | |
| gr.Markdown("Este es un producto de prueba desarrollado por Analítica Boutique, S.C.") | |
| gr.Markdown("Contacto: vicente@analiticaboutique.com.mx") | |
| gr.Markdown("La base de información de este ChatBot es:\ | |
| 1. La LEY DEL IMPUESTO ESPECIAL SOBRE PRODUCCIÓN Y SERVICIOS y el \ | |
| REGLAMENTO DE LA LEY DEL IMPUESTO ESPECIAL SOBRE PRODUCCIÓN Y SERVICIOS. \n\ | |
| 2. La LEY DEL IMPUESTO SOBRE LA RENTA y el REGLAMENTO DE LA LEY DEL IMPUESTO \ | |
| SOBRE LA RENTA. \n\ | |
| 3. La LEY DEL IMPUESTO AL VALOR AGREGADO y el REGLAMENTO DE LA LEY DEL IMPUESTO \ | |
| AL VALOR AGREGADO. \n\ | |
| 4. El CÓDIGO FISCAL DE LA FEDERACIÓN y el REGLAMENTO DEL CÓDIGO FISCAL DE LA \ | |
| FEDERACIÓN.") | |
| busqueda = gr.Textbox(label = "Escribe la pregunta o tarea para iniciar la conversación.") | |
| greet_btn = gr.Button("Preguntar") | |
| # Crear dos widgets de salida en lugar de uno | |
| output1 = gr.Textbox(label = "Mi propuesta de respuesta:") | |
| output2 = gr.Textbox(label = "Los extractos de las Leyes, Reglamentos y Código que usé:") | |
| # Modificar la función click para asignar cada parte de la tupla a un widget diferente | |
| greet_btn.click(fn=Chat, inputs=[busqueda], outputs=[output1, output2]) | |
| # | |
| #demo.launch( share = True ) | |
| demo.launch( ) | |
| # | |
| # |