isatopus commited on
Commit
6664893
1 Parent(s): 8b5d7cc
Files changed (1) hide show
  1. app.py +53 -75
app.py CHANGED
@@ -1,100 +1,78 @@
1
  import os
2
  from openai import AzureOpenAI
3
  import gradio as gr
4
- from dotenv import load_dotenv
5
 
6
- load_dotenv()
7
  client = AzureOpenAI(
8
- azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"),
9
- api_key=os.getenv("AZURE_OPENAI_API_KEY"),
10
- api_version="2024-02-01"
11
  )
12
 
13
  # Define three prompt options with user-friendly names
14
  prompts = [
15
- os.getenv("prompt1"),
16
- os.getenv("prompt2"),
17
- "Você é um chatbot especializado em direito brasileiro, treinado em legislação, jurisprudência e doutrina nacionais. Sua principal função é fornecer informações jurídicas precisas e confiáveis aos usuários. Para cumprir essa tarefa, siga estas diretrizes: 1. Base de Conhecimento: Legislação: Consulte a Constituição Federal, leis, decretos, portarias e demais normas jurídicas brasileiras atualizadas. Jurisprudência: Utilize julgados dos tribunais superiores brasileiros (STF, STJ, etc.), tribunais estaduais e tribunais federais, sempre buscando decisões recentes e relevantes para o tema em questão. Doutrina: Recorra a livros, artigos acadêmicos e obras de renomados juristas brasileiros para aprofundar sua análise e fornecer diferentes perspectivas sobre o assunto. 2. Metodologia de Resposta: Compreensão da Pergunta: Leia atentamente a pergunta do usuário para identificar o tema central, as dúvidas específicas e o contexto em que a questão se insere. Pesquisa e Análise: Utilize sua base de conhecimento para pesquisar as normas, julgados e doutrinas relevantes para o tema. Analise as informações encontradas, identificando os pontos convergentes e divergentes, e avalie a aplicabilidade das normas e precedentes ao caso concreto. Elaboração da Resposta: Estruture sua resposta de forma clara, objetiva e didática, utilizando linguagem jurídica acessível ao público leigo. Apresente as normas, julgados e doutrinas relevantes, explicando sua aplicação ao caso e destacando os pontos mais importantes. Precisão e Confiabilidade: Priorize a precisão e a confiabilidade das informações fornecidas, evitando especulações ou opiniões pessoais. Se houver dúvidas ou controvérsias sobre o tema, apresente as diferentes correntes e perspectivas, sem tomar partido.Atualização: Mantenha-se atualizado sobre as mudanças legislativas, jurisprudenciais e doutrinárias, buscando sempre as informações mais recentes e relevantes. Orientações adicionais: 1. Priorize a precisão acima de tudo. * Se não tiver informações suficientes para responder com precisão, recomende fontes alternativas ao usuário. * Nunca invente informações ou apresente algo como factual se não tiver certeza. * Seja transparente sobre as limitações do seu conhecimento e quando a informação pode estar desatualizada. 2. Responda com base em evidências. * Sempre busque suporte confiável para suas respostas, seja de seu conhecimento interno ou de pesquisas. * Cite suas fontes sempre que possível, especialmente ao lidar com tópicos complexos ou controversos. * Evite fazer suposições ou tirar conclusões que não sejam diretamente apoiadas pelas evidências disponíveis. 3. Lide com a incerteza com cuidado. * Se a pergunta for ambígua, peça esclarecimentos ao usuário antes de responder. * Se houver várias respostas possíveis, apresente-as de forma neutra e explique os diferentes pontos de vista. * Em caso de dúvida, erre do lado da cautela e evite fornecer informações que possam ser enganosas ou prejudiciais. * Lembre-se de que sua principal responsabilidade é fornecer informações precisas e confiáveis. 5. Lembre-se de suas limitações. * Você não é capaz de realizar ações no mundo físico. * Você não tem opiniões pessoais. Em tópicos controversos, apresente os diferentes pontos de vista de forma neutra e evite tomar partido. * Se solicitado a representar um lado específico de uma questão controversa, siga as instruções do usuário, mas mantenha um tom neutro e distanciado. Ao seguir estas ordens, você minimizará o risco de alucinação e fornecerá aos usuários as informações mais precisas e confiáveis possíveis.",
18
- "Seja um assistente de IA útil",
19
- "You are an expert AI coding assistant. Follow these principles when assisting: 1. **Clarity First:** Write clear, well-structured code with comments explaining complex logic. 2. **Security is Paramount:** Never introduce security vulnerabilities. If unsure about potential risks, prioritize safety. 3. **Context Matters:** Utilize any provided code context or instructions to generate the most accurate and relevant code. 4. **User Preferences:** When applicable, adapt your coding style to align with the existing code or the user's explicit instructions. 5. **Efficiency:** If multiple approaches exist, favor the most efficient solution, unless the user prioritizes readability or maintainability.",
20
- ]
21
-
22
- option_names = [
23
- "Resumir Sentença em linguagem simples",
24
- "Transformar Transcrição de oitiva judicial em citação indireta",
25
- "IA jurídica",
26
- "IA genérica",
27
- "IA para tecnologia",
28
  ]
29
 
30
  # Initialize a dictionary to store chat histories per user
31
  chat_histories = {}
32
 
33
- def predict(message, history, selected_option, username):
34
- # Get the user's chat history or create a new one
35
- if username not in chat_histories:
36
- chat_histories[username] = []
37
- history = chat_histories[username]
38
 
39
- # Get the index of the selected option
40
- selected_index = option_names.index(selected_option)
41
- # Get the corresponding prompt based on the selected index
42
- selected_prompt = prompts[selected_index]
43
- history_openai_format = []
44
- history_openai_format.append({"role": "system", "content": selected_prompt})
45
  for human, assistant in history:
46
- history_openai_format.append({"role": "user", "content": human })
47
- history_openai_format.append({"role": "assistant", "content":assistant})
48
  history_openai_format.append({"role": "user", "content": message})
49
 
50
-
51
-
52
  response = client.chat.completions.create(
53
- model='gpt-4o-mini',
54
- messages= history_openai_format,
55
- temperature=1,
56
- max_tokens=2000,
57
- stream=True)
58
 
59
  partial_message = ""
60
  for chunk in response:
61
- # Check if choices exist and are not empty
62
- if chunk.choices and len(chunk.choices) > 0:
63
- if chunk.choices[0].delta.content is not None:
64
- partial_message = partial_message + chunk.choices[0].delta.content
65
- yield partial_message
66
 
67
- # Update the chat history for the user
68
- chat_histories[username].append((message, partial_message))
69
 
70
- option_dropdown = gr.Dropdown(choices=option_names, label="Select Option")
71
- username_textbox = gr.Textbox(label="Username", placeholder="Enter your username")
72
 
73
- bot = gr.ChatInterface(
74
- predict,
75
- additional_inputs=[option_dropdown, username_textbox],
76
- title="Chatbot do direito 👩‍⚖️",
77
- description="""Feito para auxiliar profissionais do direito no dia-a-dia.
78
- \n\n
79
- Instruções:
80
- 1. no canto inferior da tela clique em "Additional Input", selecione a tarefa desejada:
81
- a) Resumir Sentença em linguagem simples;
82
- b) Transformar Transcrição de oitiva judicial em citação indireta;
83
- c) IA jurídica;
84
- d) IA genérica;
85
- 2. Digite um nome de usuário (O nome de usuário serve apenas para não embaralhar as mensagens entre usuários concomitantes).
86
- 3. Copie o conteúdo para o campo "insira sua mensagem" e depois clique em "enviar". \n
87
- e-mail: isa.[email protected]
88
- """,
89
- theme="Soft",
90
- examples=[
91
- ["quais as teorias para o início da vida", "IA jurídica", "usuário1"],
92
- ["O que é exceção de pré-executividade", "IA jurídica", "Usuário1"],
93
- ],
94
- retry_btn="🔄Refazer pergunta",
95
- undo_btn=None,
96
- clear_btn="🗑️Apagar tudo",
97
- submit_btn="enviar",
98
- stop_btn="parar",
99
- )
100
- bot.launch(auth=([(os.getenv("username"), os.getenv("password")), (os.getenv("username2"), os.getenv("password2"))]))
 
 
1
  import os
2
  from openai import AzureOpenAI
3
  import gradio as gr
 
4
 
 
5
  client = AzureOpenAI(
6
+ azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
7
+ api_key=os.getenv("AZURE_OPENAI_API_KEY"),
8
+ api_version="2024-02-01"
9
  )
10
 
11
  # Define three prompt options with user-friendly names
12
  prompts = [
13
+ "be a helpful assistant",
14
+ "Crie um resumo de aproximadamente uma página da sentença abaixo em linguagem simples e acessível, sem jargões. O resumo deve conter: 1) Tipo de sentença; 2) fatos relevantes: 2.1) data do crime; 2.2) Local do crime; 2.3 vítimas; 2.4) descrição do fato apurado; 3) A decisão 4) A fundamentação.",
15
+ """Abaixo consta uma transcrição de uma oitiva judicial. Faça uma citação indireta do que a depoente respondeu, separado por ponto e vírgula. O resultado deve constar tudo que foi dito pela testemunha, podendo ser omitido apenas o que for repetitivo.  O texto não deve ser interrompido até exaurir todo o conteúdo da oitiva.
16
+ exemplo de reposta: Estava trabalhando durante os fatos; Trabalhava em um depósito de cerveja ao lado de um posto de gasolina; Quando soube dos fatos a vítima estava no hospital; Fechou o comércio e foi até o Hospital de Acopiara, todavia a vítima foi transferida; Ouviu dizer que Leandro chegou alterado e começou a espancar Vitória, tendo a mãe da adolescente a defendido; Neste momento o réu sacou um punhal e perfurou a ofendida; Não sabe de nenhuma desavença entre a vítima e o réu; Acredita que o réu estava "virado" de uma vaquejada; Conhece o réu apenas de vista; É irmão e sobrinho de Luciene."""
 
 
 
 
 
 
 
 
 
17
  ]
18
 
19
  # Initialize a dictionary to store chat histories per user
20
  chat_histories = {}
21
 
22
+ def predict(message, prompt_index):
23
+ history = chat_histories.setdefault(prompt_index, [])
 
 
 
24
 
25
+ selected_prompt = prompts[prompt_index]
26
+ history_openai_format = [{"role": "system", "content": selected_prompt}]
 
 
 
 
27
  for human, assistant in history:
28
+ history_openai_format.append({"role": "user", "content": human})
29
+ history_openai_format.append({"role": "assistant", "content": assistant})
30
  history_openai_format.append({"role": "user", "content": message})
31
 
 
 
32
  response = client.chat.completions.create(
33
+ model='gpt-4o-mini',
34
+ messages=history_openai_format,
35
+ temperature=1.0,
36
+ stream=True
37
+ )
38
 
39
  partial_message = ""
40
  for chunk in response:
41
+ if chunk.choices and chunk.choices[0].delta.content is not None:
42
+ partial_message += chunk.choices[0].delta.content
43
+ yield partial_message
 
 
44
 
45
+ chat_histories[prompt_index].append((message, partial_message))
 
46
 
47
+ def predict_wrapper(message, prompt_index):
48
+ return list(predict(message, prompt_index))[-1]
49
 
50
+ def clear_history():
51
+ global chat_histories
52
+ chat_histories = {}
53
+
54
+ # Gradio Blocks interface
55
+ with gr.Blocks() as demo:
56
+ with gr.Tab("Genérica"):
57
+ message_input = gr.Textbox(label="Message")
58
+ output = gr.Textbox()
59
+ message_input.submit(predict_wrapper, inputs=[message_input, gr.State(0)], outputs=output)
60
+
61
+ with gr.Tab("Resumir Sentença em linguagem simples"):
62
+ message_input = gr.Textbox(label="Message")
63
+ output = gr.Textbox()
64
+ message_input.submit(predict_wrapper, inputs=[message_input, gr.State(1)], outputs=output)
65
+
66
+ with gr.Tab("Transformar Transcrição de oitiva judicial em citação indireta"):
67
+ message_input = gr.Textbox(label="Message")
68
+ output = gr.Textbox()
69
+ message_input.submit(predict_wrapper, inputs=[message_input, gr.State(2)], outputs=output)
70
+
71
+ with gr.Tab("Clear Memory"):
72
+ clear_button = gr.Button("Clear Memory")
73
+ clear_button.click(fn=clear_history, inputs=[], outputs=[])
74
+
75
+ try:
76
+ demo.launch(auth=([(os.getenv("username"), os.getenv("password"))]))
77
+ finally:
78
+ clear_history()