import gradio as gr
import json
import re
from huggingface_hub import InferenceClient
client = InferenceClient(
"mistralai/Mistral-7B-Instruct-v0.1"
)
system_prompt = """[INST] <>
You are a helpful, respectful and honest assistant. Always answer in spanish. Never answer in English. Always answer as
helpfully as possible, while being safe.
If a question does not make any sense, or is not factually coherent, explain
why instead of answering something not correct. If you don't know the answer
to a question, please don't share false information.
Your goal is to provide answers relating to a legal document, making classifications of arguments inside an allegation.<>
"""
rag_text = """
"""
#format_text = """{
# "tipo": "clasificación del argumento (Argumento tipo X)",
# "descripcion": "Descripcion breve del argumento",
# "texto_referencia": "texto original completo perteneciente a dicho argumento"
#}"""
format_text = """{
"tipo": "clasificación del argumento (Argumento tipo X)",
"descripcion": "Descripcion breve del argumento",
"texto_referencia": "cita el fragmento del texto original letra a letra signo a signo en el cual has basado tu respuesta"
}"""
prompt_template_text = """
--- Lista Argumentos ---
* Argumento tipo 49 (Desvirtuación de los hechos, el denunciado no está de acuerdo con el relato de los hechos)
* Argumento tipo 304 (El denunciado solicita medios de prueba)
* Argumento tipo 994 (El denunciado solicita fotografía como medio de prueba, desafiando el relato del agente denunciante)
* Argumento tipo 1002 (Prescripción, el delito ha prescrito)
* Argumento tipo 2014 (Principio de proporcionalidad, denunciado considera sanción excesiva)
* Argumento tipo 2027 (Niega desobediencia de señales de tráfico de prohibición)
* Argumento tipo 2002 (Denuncia no notificada en el momento en el que se formuló)
* Argumento tipo 1001 (Defecto de forma en la denuncia, la sanción contiene algún error)
"""
recorte = """
CUARTA .- Que conforme al art.53.2 a) de la Ley 39/2015 de 1 de Octubre del Procedimiento
Administrativo Común de las Administraciones Públicas, SOLICITO la comunicación de la identidad
de la autoridad competente para imponerla sanción y de la norma que le atribuya tal competencia.
"""
def format_prompt(message):
prompt = ""
prompt += f"[INST] {message} [/INST]"
return prompt
def generate(prompt):
generate_kwargs = dict(
temperature=0.9,
max_new_tokens=1024,
top_p=0.95,
repetition_penalty=1.0,
do_sample=True,
seed=42,
)
formatted_prompt = format_prompt(prompt)
output = client.text_generation(formatted_prompt, **generate_kwargs)
return output
def process_input(text, rag, prompt_template):
#if not(rag):
# rag_text = " "
#if not(prompt_template):
# prompt_template_text = " "
prompt = f"""
{system_prompt}
Teniendo en cuenta que los argumentos se clasifican de la siguiente manera:
{prompt_template_text}
Partiendo del siguiente fragmento de texto:
Fragmento:
---------------------------------------------------------------
{text}
--------------------------------------------------------------
Identifica y clasifica el tipo de los argumentos expuestos en el anterior fragmento de texto siguiendo estos pasos cuidadosamente:
- Primero: Determina cúantos argumentos se exponen en el fragmento.
- Segundo: Determina el contenido de cada uno de los argumentos encontrados en el fragmento anterior.
- Tercero: Clasifica cada uno de los argumentos encontrados en el fragmento anterior con el tipo de argumento que le corresponda.
- Cuarto: Devuelve una lista de JSONs que contenga los argumentos ya clasificados con el siguiente formato:
{format_text}
Recuerda responder en español. Los argumentos que no se puedan clasificar o que *claramente* no encajen con ningún tipo predefinido serán clasificados como 'Desconocido'. Recuerda que los tipos de argumentos de representan con un número que puedes encontrar en la información anterior.
Respira profundamente y piensa paso a paso.
[/INST]
"""
output = generate(prompt)
return output,prompt
def create_interface():
# Definimos los componentes de la interfaz
input_text = gr.Textbox(label="Input")
rag_checkbox = gr.Checkbox(label="RAG")
prompt_template = gr.Checkbox(label="PromptTemplate")
output_text = gr.Textbox(label="Output")
classification_types_checkboxes = gr.CheckboxGroup(label="Clasificacion Tipo")
def highlight_text(text, output, color="red"):
# Encuentra las partes del texto que se encuentran en la variable output
matches = re.findall(r"'texto_referencia'\s*:\s*\"(.*?)\"", output)
# Resalta las partes del texto que se encuentran en la variable output en rojo
for match in matches:
if match in text:
text = text.replace(match, f'{match}')
return text
# Definimos la función que se ejecutará cuando se envíe la entrada
def fn(text, rag, prompt_template):
output = []
output = process_input(text, rag, prompt_template)
matches = re.findall(r'"tipo"\s*:\s*"(.*?)"', output[0])
classification_types = matches
classification_types_options = [(option, option) for option in classification_types]
classification_types_checkboxes = gr.CheckboxGroup(label="Clasificacion Tipo", choices=classification_types_options,value=[option[0] for option in classification_types_options], interactive = True)
# Resalta las partes del texto que se encuentran en la variable output en rojo
highlighted_text = highlight_text(text, output[0], color="red")
return highlighted_text, classification_types_checkboxes, output[0], output[1]
examples = [
[recorte, False, True]
]
HF_TOKEN = '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'
hf_writer = gr.HuggingFaceDatasetSaver(HF_TOKEN, "MistralAI")
# Creamos la interfaz
iface = gr.Interface(
fn=fn,
inputs=[input_text, rag_checkbox, prompt_template],
outputs=["html", classification_types_checkboxes, "text", "text"],
examples=examples,
allow_flagging="manual",
flagging_options=["👍", "👎"],
flagging_callback=hf_writer
)
return iface
iface = create_interface()
iface.launch()