MistralAI / app.py
Last commit not found
raw
history blame
5.97 kB
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"
}"""
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 = """
SEGUNDA.- Que como consecuencia de lo manifestado con anterioridad, intereso la apertura del
periodo de prueba, conforme al el art. 13 del Real Decreto 320/1994 en relaci贸n con los arts. 77 y 78
de la Ley 39/2015 y propongo la pr谩ctica de los medios de prueba, conforme a lo dispuesto en el 13.1
del RD. 320/1994, que esta parte considera imprescindibles para poder ejercer su derecho a la
defensa, con expresa petici贸n de la notificaci贸n de su resultado y sin perjuicio de que una vez recibidas
pueda realizar cuantas alegaciones estime pertinentes, que se deja interesada como sigue:
A- Documental, para que se incorpore al expediente INFORME DEL AGENTE DENUNCIANTE
relativo a las circunstancias de la presunta infracci贸n, con expresi贸n en concreto de su consideraci贸n
acerca de la relaci贸n entre la conducta del presunto infractor y su determinaci贸n como infracci贸n
tipificada
"""
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 los argumentos expuestos en el anterior fragmento de texto siguiendo estos pasos:
Devuelve una lista de JSON, cuya longitud ser谩 igual al n煤mero de argumentos encontrados, que contenga los argumentos 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
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")
# Definimos la funci贸n que se ejecutar谩 cuando se env铆e la entrada
def fn(text, rag, prompt_template):
output = process_input(text, rag, prompt_template)
matches = re.findall(r'"tipo"\s*:\s*"(.*?)"', output)
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)
return output, classification_types_checkboxes
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=[output_text, classification_types_checkboxes],
examples=examples,
allow_flagging="manual",
flagging_options=["馃憤", "馃憥"],
flagging_callback=hf_writer
)
return iface
iface = create_interface()
iface.launch()