RedactorTutelas / app.py
Jacobo
forgot to add the theme to blocks lmao
a697953
from dotenv import load_dotenv
from together import Together
from sentence_transformers import SentenceTransformer
from sentence_transformers import SentenceTransformer
import vecs
import gradio as gr
import os
load_dotenv()
user = os.getenv("user")
password = os.getenv("password")
host = os.getenv("host")
port = os.getenv("port")
db_name = "postgres"
DB_CONNECTION = f"postgresql://{user}:{password}@{host}:{port}/{db_name}"
vx = vecs.create_client(DB_CONNECTION)
model = SentenceTransformer('Snowflake/snowflake-arctic-embed-xs')
client = Together(api_key=os.getenv('TOGETHER_API_KEY'))
def query_db(query, limit = 5, filters = {}, measure = "cosine_distance", include_value = False, include_metadata=False, table = "2023"):
query_embeds = vx.get_or_create_collection(name= table, dimension=384)
ans = query_embeds.query(
data=query,
limit=limit,
filters=filters,
measure=measure,
include_value=include_value,
include_metadata=include_metadata,
)
return ans
def construct_result(ans):
results = ""
for i in range(0, len(ans)):
a, b = ans[i][2].get("sentencia"), ans[i][2].get("fragmento")
results += (f"En la sentencia {a}, se dijo {b}\n")
return results
def sort_by_score(item):
return item[1]
def referencias(results):
references = 'Sentencias encontradas: \n'
enlistadas = []
for item in results:
if item[2].get('sentencia') in enlistadas:
pass
else:
references += item[2].get('sentencia')+ ' '
enlistadas.append(item[2].get('sentencia'))
return references
def live_inference(messages, max_new_tokens = 512):
response = client.chat.completions.create(
model="meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo",
messages = messages,
max_tokens = max_new_tokens
)
return response.choices[0].message.content
def inference(hechos, investigacion, teoria):
encoded_prompt1 = model.encode(investigacion)
years = range(2019, 2025)
results = []
for year in years:
results.extend(query_db(encoded_prompt1, include_metadata = True, table = str(year), include_value=True, limit = 5))
results.sort(key=sort_by_score, reverse=True)
researchAI=[
{"role": "system", "content": f"""
Eres Ticio, un asistente de investigaci贸n jur铆dica. Tu deber es organizar el contenido de las sentencias de la jurisprudencia de acuerdo
a las necesidades del usuario. Debes responder solo en espa帽ol. Debes responder solo en base a la informaci贸n del contexto a continuaci贸n.
Siempre debes mencionar la fuente en tu escrito, debe tener un estilo formal y juridico.
Contexto:
{construct_result(results)}
"""
},
{"role": "user", "content": investigacion},
]
research = live_inference(researchAI, max_new_tokens=1024)
factsAI =[
{"role": "system", "content": f"""
Eres Ticio, un asistente de redacci贸n jur铆dica. Debes ayudar a organizar el texto de los hechos.
el texto debe verse como una lista numerada de parrafos con la siguiente estructura:
numero. fecha. descripci贸n del evento.
Debes usar lenguaje juridico y profesional para explicar el evento y explicarlos de la forma que mejor beneficie
la teor铆a del caso del usuario.
Teor铆a del caso:
{teoria}
"""
},
{"role": "user", "content": hechos},
]
facts = live_inference(factsAI, max_new_tokens=1024)
argsAI = [
{"role": "system", "content": f"""
Eres Ticio, un asistente de redacci贸n jur铆dica. Tu tarea es redactar los fundamentos de derecho de la tutela del usuario.
Para redactar unos fundamentos de derecho debes escribir varios argumentos en uno o dos parrafos de la siguiente forma:
Fuente juridica (artiuclo de un decreto, ley o resoluci贸n).
Estandar jur铆dico (debes mencionar una sentencia judicial que interprete la fuente juridica y explique como se debe aplicar).
Aplicaci贸n al caso (debes explicar en varios parrafos el analisis detallados donde menciones las fuentes y estandares porque los hechos del caso se ajustan al estandar que mencionaste antes).
Redacta la aplicaci贸n del caso en parrafos continuos sin bullet points
Debes utilizar las fuentes y estandares juridicos que aparezcan en la investigaci贸n que te proporciona el usuario
El argumento debe ayudar a defender la postura de la teor铆a del caso
Teor铆a del caso:
{teoria}
Hechos:
{facts}
recuerda redactar de forma que expliques en lenguaje juridico y t茅cnico el analisis de cada uno de los argumentos
"""
},
{"role": "user", "content": research},
]
args = live_inference(argsAI, max_new_tokens=1536)
return "**Hechos**: \n\n" + facts + "\n\n **Fundamentos**: \n\n" + args
theme = gr.themes.Base(
primary_hue="red",
secondary_hue="red",
neutral_hue="neutral",
).set(
button_primary_background_fill='#910A0A',
button_primary_border_color='*primary_300',
button_primary_text_color='*primary_50'
)
with gr.Blocks(theme=theme) as demo:
hechos = gr.Textbox(label = "Hechos", lines = 15, show_label = True, show_copy_button= True)
tema = gr.Textbox(label = "Investigaci贸n", lines = 1, show_label = True, show_copy_button= True)
teoria = gr.Textbox(label = "Teor铆a del caso", lines = 5, show_label = True, show_copy_button= True)
btn = gr.Button("Generar")
output = gr.Markdown(label = "respuesta", show_label = True, show_copy_button= True)
btn.click(fn=inference, inputs=[hechos, tema, teoria], outputs=output, api_name=False)
if __name__ == "__main__":
demo.queue()
demo.launch(show_api=False, debug= True)