File size: 6,586 Bytes
2892c38 98be4ed 2892c38 a7ec4d5 e1e6975 a7ec4d5 e1353cc e1e6975 a7ec4d5 3762144 a7ec4d5 2892c38 8a1ae64 2892c38 f1a99e0 313d9a2 a60f1bc a7ec4d5 d00bb7e a7ec4d5 e4553fc 2892c38 bbf8cbf 2892c38 3762144 2ad98d6 3762144 2892c38 bbf8cbf 18882b0 bbf8cbf baa186f 2892c38 a720ab6 f3cf0a9 3762144 bbf8cbf 3762144 bbf8cbf db0ead9 a7ec4d5 db0ead9 313d9a2 2892c38 bbf8cbf a720ab6 44f9072 2892c38 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
import gradio as gr
import json
import re
from huggingface_hub import InferenceClient
client = InferenceClient(
"mistralai/Mistral-7B-Instruct-v0.1"
)
system_prompt = """[INST] <<SYS>>
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.<</SYS>>
"""
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 = "<s>"
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'<span style="color: {color};">{match}</span>')
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() |