Benjov commited on
Commit
20c2b8b
·
1 Parent(s): 5bd3f24

Add application file

Browse files
Files changed (2) hide show
  1. app.py +175 -0
  2. requirements.txt +4 -0
app.py ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import pandas as pd
3
+ import openai
4
+ import re
5
+ import json
6
+ from langchain.chat_models import ChatOpenAI
7
+ import regex
8
+ import gradio as gr
9
+ from langchain.schema import Document
10
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
11
+ from langchain.embeddings.openai import OpenAIEmbeddings
12
+ from openai.embeddings_utils import get_embedding
13
+ from openai.embeddings_utils import cosine_similarity
14
+
15
+
16
+ # API de OpenAI
17
+ openai.api_key = os.environ["OPENAI_API_KEY"]
18
+
19
+ # Cargar el archivo
20
+ #df_Normas_Embeddings = pd.read_csv( 'datos/CLEAN_EMBEDDINGS/Textos_Normas.csv' )
21
+ df_Normas_Embeddings = pd.read_csv( 'https://raw.githubusercontent.com/benjov/Data_Fiscal/main/Textos_Normas.csv' )
22
+
23
+ # Main OpenAI Function
24
+ #
25
+ def get_completion_from_messages( messages, model = "gpt-3.5-turbo-16k",
26
+ temperature = 0, max_tokens = 4000 ): ##Check max_tokens
27
+ response = openai.ChatCompletion.create(
28
+ model = model,
29
+ messages = messages,
30
+ temperature = temperature,
31
+ max_tokens = max_tokens,
32
+ )
33
+ return response.choices[0].message["content"]
34
+
35
+ # Get LEY
36
+ #
37
+ def get_topic( user_message ):
38
+ #
39
+ delimiter = "####"
40
+ system_message = f"""
41
+ Eres un especialista en temas fiscales en México. \
42
+ Se le proporcionarán consultas o preguntas respecto de temas fiscales. \
43
+ Las consultas o preguntas se delimitarán con los caracteres {delimiter}.
44
+
45
+ Las consultas serán sobre diferentes Leyes, Códigos Federales y normativas como:
46
+ 1. La LEY DEL IMPUESTO ESPECIAL SOBRE PRODUCCIÓN Y SERVICIOS y el REGLAMENTO DE LA LEY DEL \
47
+ IMPUESTO ESPECIAL SOBRE PRODUCCIÓN Y SERVICIOS
48
+ 2. La LEY DEL IMPUESTO SOBRE LA RENTA y el REGLAMENTO DE LA LEY DEL IMPUESTO SOBRE LA RENTA
49
+ 3. La LEY DEL IMPUESTO AL VALOR AGREGADO y el REGLAMENTO DE LA LEY DEL IMPUESTO AL VALOR AGREGADO
50
+
51
+ Proporciona una lista de objetos de python, donde cada objeto sea alguno de: \
52
+ 'IMPUESTO AL VALOR AGREGADO', 'IMPUESTO SOBRE LA RENTA', o 'IMPUESTO ESPECIAL SOBRE PRODUCCIÓN Y SERVICIOS'.
53
+
54
+ Donde el tema se debe encontrar en la consulta o pregunta relacionada con temas fiscales.
55
+
56
+ Solo proporciona la lista de objetos, nada más.
57
+ """
58
+ #
59
+ messages = [
60
+ {'role':'system',
61
+ 'content': system_message},
62
+ {'role':'user',
63
+ 'content': f"{delimiter}{user_message}{delimiter}"},
64
+ ]
65
+ return get_completion_from_messages( messages )
66
+
67
+ # Function: Get embeddings
68
+
69
+ def get_embedding( text , model ):
70
+ text = text.replace("\n", " ")
71
+ return openai.Embedding.create( input = [text], model = model )['data'][0]['embedding']
72
+
73
+ # Función de búsqueda
74
+
75
+ def buscar( busqueda, datos, n_resultados):
76
+ #
77
+ busqueda_embed = get_embedding( busqueda, model = "text-embedding-ada-002" )
78
+ datos['Similitud'] = datos['Embedding'].apply( lambda x: cosine_similarity( eval( x ) , busqueda_embed ) )
79
+ datos = datos.sort_values('Similitud', ascending = False )
80
+ #
81
+ return datos.iloc[:n_resultados][['Tema', 'Norma', 'Textos', 'NumPalabras', 'Embedding', 'Similitud']]
82
+
83
+ #
84
+ def get_respuesta( user_message, informacion ):
85
+ #
86
+ delimiter = "####"
87
+ system_message = f"""
88
+ Eres un especialista en temas fiscales en México. \
89
+ Se le proporcionarán consultas o preguntas respecto de temas fiscales. \
90
+ Las consultas o preguntas e información para responder se delimitarán \
91
+ con los caracteres {delimiter}.
92
+
93
+ La información que se te proporcionará para responder las consultas o preguntas \
94
+ estará en una lista de Python.
95
+
96
+ La información corresponde a extractos de Leyes, Códigos Federales y normativas como:
97
+ 1. La LEY DEL IMPUESTO ESPECIAL SOBRE PRODUCCIÓN Y SERVICIOS y el REGLAMENTO DE LA LEY DEL \
98
+ IMPUESTO ESPECIAL SOBRE PRODUCCIÓN Y SERVICIOS.
99
+ 2. La LEY DEL IMPUESTO SOBRE LA RENTA y el REGLAMENTO DE LA LEY DEL IMPUESTO SOBRE LA RENTA.
100
+ 3. La LEY DEL IMPUESTO AL VALOR AGREGADO y el REGLAMENTO DE LA LEY DEL IMPUESTO AL VALOR AGREGADO.
101
+ 4. El CÓDIGO FISCAL DE LA FEDERACIÓN y el REGLAMENTO DEL CÓDIGO FISCAL DE LA FEDERACIÓN.
102
+
103
+ La información se te proporcionará con la siguiente estructura: Nombre de la Ley, Código o \
104
+ Reglamento, seguido del Artículo y el texto del Artículo.
105
+
106
+ Asegúrate de realizar preguntas de seguimiento.
107
+ """
108
+ #
109
+ messages = [
110
+ {'role':'system',
111
+ 'content': system_message},
112
+ {'role':'user',
113
+ 'content': f"""
114
+ {delimiter}
115
+ Usa exclusivamente la información contenida en la siguiente lista:
116
+ {informacion}
117
+ para responder sin límite de palabras lo siguiente: {user_message}
118
+ En tu respuesta menciona el Nombre de la Ley, Código o Reglamento de donde proviene la información,
119
+ {delimiter}
120
+ """},
121
+ ]
122
+ #
123
+ return get_completion_from_messages(messages)
124
+ #
125
+
126
+ #
127
+ def Chat( user_message_1 ):
128
+ #
129
+ norma_y_tema_response_1 = get_topic( user_message_1 )
130
+ norma_y_tema_response_1 = eval(norma_y_tema_response_1)
131
+ norma_y_tema_response_1.append( 'Todos' )
132
+ #
133
+ df_datos = df_Normas_Embeddings[ df_Normas_Embeddings['Tema'].isin(norma_y_tema_response_1) ]
134
+ #
135
+ df_final = buscar( user_message_1, df_datos, 10).reset_index( drop = True)
136
+ #
137
+ df_final['Cum_NumPalabras'] = df_final['NumPalabras'].cumsum()
138
+ #
139
+ df_final = df_final[ df_final['Cum_NumPalabras'] <= 1400 ]
140
+ #
141
+ df_final[ 'Final_Text' ] = df_final[ 'Norma' ] + ', ' + df_final[ 'Textos' ]
142
+ #
143
+ Textos = df_final[ 'Final_Text' ].tolist()
144
+ #
145
+ return get_respuesta( user_message_1, Textos ), '\n'.join(Textos)
146
+
147
+
148
+ #
149
+ #
150
+ with gr.Blocks() as demo:
151
+ #
152
+ gr.Markdown("App basada en servicios (Embeddings) de OpenAI (Chat GPT-3.5)")
153
+ gr.Markdown("Este es un producto de prueba desarrollado por Analítica Boutique, S.C.")
154
+ gr.Markdown("La base de información de este ChatBot es:\
155
+ 1. La LEY DEL IMPUESTO ESPECIAL SOBRE PRODUCCIÓN Y SERVICIOS y el \
156
+ REGLAMENTO DE LA LEY DEL IMPUESTO ESPECIAL SOBRE PRODUCCIÓN Y SERVICIOS. \n\
157
+ 2. La LEY DEL IMPUESTO SOBRE LA RENTA y el REGLAMENTO DE LA LEY DEL IMPUESTO \
158
+ SOBRE LA RENTA. \n\
159
+ 3. La LEY DEL IMPUESTO AL VALOR AGREGADO y el REGLAMENTO DE LA LEY DEL IMPUESTO \
160
+ AL VALOR AGREGADO. \n\
161
+ 4. El CÓDIGO FISCAL DE LA FEDERACIÓN y el REGLAMENTO DEL CÓDIGO FISCAL DE LA \
162
+ FEDERACIÓN.")
163
+ busqueda = gr.Textbox(label = "Escribe la pregunta o tarea para iniciar la conversación.")
164
+ greet_btn = gr.Button("Preguntar")
165
+ # Crear dos widgets de salida en lugar de uno
166
+ output1 = gr.Textbox(label = "Mi propuesta de respuesta:")
167
+ output2 = gr.Textbox(label = "Los extractos de las Leyes, Reglamentos y Código que usé:")
168
+
169
+ # Modificar la función click para asignar cada parte de la tupla a un widget diferente
170
+ greet_btn.click(fn=Chat, inputs=[busqueda], outputs=[output1, output2])
171
+ #
172
+ #demo.launch( share = True )
173
+ demo.launch( )
174
+ #
175
+ #
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ gradio==3.27.0
2
+ openai==0.27.4
3
+ pandas==1.4.3
4
+