DHEIVER commited on
Commit
97f6f5e
·
verified ·
1 Parent(s): 662191a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +51 -152
app.py CHANGED
@@ -1,27 +1,29 @@
1
  import gradio as gr
2
- from transformers import pipeline
3
- import json
4
  from datetime import datetime
5
  import logging
6
  from typing import Dict, List, Optional
7
 
8
  # Configuração do logging
9
- logging.basicConfig(
10
- level=logging.INFO,
11
- format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
12
- )
13
  logger = logging.getLogger(__name__)
14
 
15
- class PromptManager:
16
- """Gerencia a criação e otimização de prompts"""
17
 
18
- @staticmethod
19
- def get_base_prompt(doc_type: str, context: Dict[str, str]) -> str:
20
- """Retorna o prompt base para cada tipo de documento"""
21
-
22
- prompts = {
23
- "habeas_corpus": f"""
24
- Atue como um advogado criminalista experiente e gere um Habeas Corpus detalhado:
 
 
 
 
 
 
25
 
26
  DADOS DO CASO:
27
  Cliente: {context.get('client_name')}
@@ -35,135 +37,33 @@ class PromptManager:
35
  FUNDAMENTOS JURÍDICOS:
36
  {context.get('legal_basis')}
37
 
38
- Gere um Habeas Corpus completo e tecnicamente preciso, incluindo:
39
- 1. Cabeçalho com endereçamento correto
40
- 2. Qualificação das partes
41
- 3. Fatos relevantes
42
- 4. Fundamentos jurídicos
43
- 5. Jurisprudência relevante
44
- 6. Pedidos (liminar e mérito)
45
- """,
46
-
47
- "denuncia": f"""
48
- Atue como um promotor de justiça experiente e gere uma denúncia criminal:
49
-
50
- DADOS DO CASO:
51
- Processo: {context.get('process_number')}
52
- Tribunal: {context.get('court')}
53
- Comarca: {context.get('jurisdiction')}
54
-
55
- FATOS:
56
- {context.get('facts')}
57
-
58
- ENQUADRAMENTO LEGAL:
59
- {context.get('legal_basis')}
60
-
61
- Gere uma denúncia criminal completa, incluindo:
62
- 1. Qualificação do(s) denunciado(s)
63
- 2. Narrativa clara dos fatos
64
- 3. Tipificação penal
65
- 4. Circunstâncias do crime
66
- 5. Rol de testemunhas
67
- 6. Pedidos
68
- """,
69
-
70
- "alegacoes_finais": f"""
71
- Atue como um advogado criminalista e gere alegações finais:
72
-
73
- DADOS DO PROCESSO:
74
- Cliente: {context.get('client_name')}
75
- Processo: {context.get('process_number')}
76
- Tribunal: {context.get('court')}
77
-
78
- FATOS E PROVAS:
79
- {context.get('facts')}
80
-
81
- TESE DEFENSIVA:
82
- {context.get('legal_basis')}
83
-
84
- Elabore alegações finais completas, incluindo:
85
- 1. Relatório do processo
86
- 2. Preliminares (se houver)
87
- 3. Mérito
88
- 4. Análise das provas
89
- 5. Pedidos
90
- """
91
- }
92
-
93
- return prompts.get(doc_type, "Tipo de documento não suportado")
94
 
95
- class DocumentGenerator:
96
- """Gerencia a geração de documentos usando OpenHermes"""
97
-
98
- def __init__(self):
99
- self.pipe = pipeline(
100
- "text-generation",
101
- model="jondurbin/airoboros-l2-70b-gpt4-1.4.1", # Modelo público com bom desempenho em PT
102
- trust_remote_code=True
103
- )
104
- self.prompt_manager = PromptManager()
105
-
106
- def generate(self, doc_type: str, context: Dict[str, str]) -> str:
107
- """Gera o documento baseado no tipo e contexto"""
108
- try:
109
- # Prepara o prompt com instruções específicas
110
- base_prompt = self.prompt_manager.get_base_prompt(doc_type, context)
111
-
112
- system_prompt = """Você é um advogado criminalista experiente especializado em gerar documentos jurídicos.
113
- Gere o documento solicitado usando linguagem formal e técnica apropriada."""
114
-
115
- formatted_prompt = f"""### System:
116
- {system_prompt}
117
-
118
- ### User:
119
- {base_prompt}
120
-
121
- ### Assistant:
122
- Gerando o documento solicitado em formato jurídico adequado:
123
- """
124
-
125
- # Configuração otimizada para documentos jurídicos
126
- result = self.pipe(
127
- formatted_prompt,
128
- max_new_tokens=2048, # Aumentado para documentos longos
129
- temperature=0.3, # Reduzido para maior consistência
130
- top_p=0.85, # Ajustado para melhor coerência
131
- top_k=40, # Limita as opções de tokens
132
- num_return_sequences=1,
133
- do_sample=True,
134
- repetition_penalty=1.2, # Evita repetições
135
- pad_token_id=self.pipe.tokenizer.eos_token_id
136
- )[0]['generated_text']
137
-
138
- # Remove o prompt do resultado e retorna apenas o documento
139
- final_text = result.split("### Assistant:")[-1].strip()
140
- return self._format_output(final_text)
141
 
142
  except Exception as e:
143
  logger.error(f"Erro na geração: {str(e)}")
144
- if "CUDA" in str(e):
145
- return "Erro: Problema com recursos GPU. Tentando novamente com configurações reduzidas..."
146
- elif "out of memory" in str(e):
147
- return "Erro: Memória insuficiente. Tente um documento menor."
148
- else:
149
- return f"Erro na geração do documento: {str(e)}"
150
 
151
  def _format_output(self, text: str) -> str:
152
- """Formata o texto gerado para melhor apresentação"""
153
- if not isinstance(text, str):
154
- if isinstance(text, (list, tuple)) and len(text) > 0:
155
- text = str(text[0])
156
- else:
157
- text = str(text)
158
-
159
- # Remove linhas vazias extras
160
- lines = [line for line in text.split('\n') if line.strip()]
161
- formatted_text = '\n'.join(lines)
162
-
163
- # Ajusta espaçamento de parágrafos
164
- formatted_text = formatted_text.replace('\n\n\n', '\n\n')
165
-
166
- return formatted_text.strip()
167
 
168
  class WebInterface:
169
  """Interface Gradio para o gerador de documentos"""
@@ -178,7 +78,7 @@ class WebInterface:
178
  with gr.Blocks(theme=gr.themes.Soft()) as self.app:
179
  gr.Markdown("""
180
  # Gerador de Documentos Criminais
181
- ### Powered by GPT4All-J
182
  """)
183
 
184
  with gr.Row():
@@ -188,7 +88,10 @@ class WebInterface:
188
  choices=[
189
  "Habeas Corpus",
190
  "Denúncia",
191
- "Alegações Finais"
 
 
 
192
  ],
193
  label="Tipo de Documento",
194
  value="Habeas Corpus"
@@ -228,12 +131,6 @@ class WebInterface:
228
  placeholder="Indique os fundamentos legais principais..."
229
  )
230
 
231
- # Status e botões
232
- status = gr.Textbox(
233
- label="Status",
234
- interactive=False
235
- )
236
-
237
  generate_btn = gr.Button(
238
  "Gerar Documento",
239
  variant="primary"
@@ -245,8 +142,13 @@ class WebInterface:
245
  lines=30,
246
  show_copy_button=True
247
  )
 
 
 
 
 
248
 
249
- # Exemplos de uso
250
  gr.Examples(
251
  examples=[
252
  [
@@ -302,7 +204,7 @@ class WebInterface:
302
 
303
  # Gera documento
304
  result = self.generator.generate(
305
- doc_type.lower().replace(" ", "_"),
306
  context
307
  )
308
 
@@ -314,11 +216,8 @@ class WebInterface:
314
 
315
  def launch(self):
316
  """Inicia a interface web"""
317
- self.app.launch(share=True)
318
 
319
  if __name__ == "__main__":
320
- # Dependências necessárias:
321
- # pip install gradio transformers torch
322
-
323
  interface = WebInterface()
324
  interface.launch()
 
1
  import gradio as gr
2
+ from huggingface_hub import InferenceClient
 
3
  from datetime import datetime
4
  import logging
5
  from typing import Dict, List, Optional
6
 
7
  # Configuração do logging
8
+ logging.basicConfig(level=logging.INFO)
 
 
 
9
  logger = logging.getLogger(__name__)
10
 
11
+ class DocumentGenerator:
12
+ """Gerencia a geração de documentos usando Mistral via InferenceClient"""
13
 
14
+ def __init__(self):
15
+ # Inicializa o cliente de inferência
16
+ self.client = InferenceClient()
17
+ self.model = "mistralai/Mistral-7B-Instruct-v0.2"
18
+
19
+ def generate(self, doc_type: str, context: Dict[str, str]) -> str:
20
+ """Gera o documento baseado no tipo e contexto"""
21
+ try:
22
+ # Prepara a mensagem para o modelo
23
+ system_prompt = """Você é um advogado criminalista experiente especializado em gerar documentos jurídicos no Brasil.
24
+ Gere o documento solicitado usando linguagem formal, técnica e no formato jurídico correto."""
25
+
26
+ user_content = f"""Gere um {doc_type} com os seguintes dados:
27
 
28
  DADOS DO CASO:
29
  Cliente: {context.get('client_name')}
 
37
  FUNDAMENTOS JURÍDICOS:
38
  {context.get('legal_basis')}
39
 
40
+ O documento deve ser completo, tecnicamente preciso e seguir o formato jurídico brasileiro."""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
 
42
+ messages = [
43
+ {"role": "system", "content": system_prompt},
44
+ {"role": "user", "content": user_content}
45
+ ]
46
+
47
+ # Faz a chamada ao modelo
48
+ completion = self.client.chat.completions.create(
49
+ model=self.model,
50
+ messages=messages,
51
+ max_tokens=2048,
52
+ temperature=0.3,
53
+ top_p=0.85,
54
+ )
55
+
56
+ return self._format_output(completion.choices[0].message.content)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
 
58
  except Exception as e:
59
  logger.error(f"Erro na geração: {str(e)}")
60
+ return f"Erro na geração do documento: {str(e)}"
 
 
 
 
 
61
 
62
  def _format_output(self, text: str) -> str:
63
+ """Formata o texto gerado"""
64
+ if not text:
65
+ return "Erro: Nenhum texto gerado"
66
+ return text.strip()
 
 
 
 
 
 
 
 
 
 
 
67
 
68
  class WebInterface:
69
  """Interface Gradio para o gerador de documentos"""
 
78
  with gr.Blocks(theme=gr.themes.Soft()) as self.app:
79
  gr.Markdown("""
80
  # Gerador de Documentos Criminais
81
+ ### Powered by Mistral-7B-Instruct
82
  """)
83
 
84
  with gr.Row():
 
88
  choices=[
89
  "Habeas Corpus",
90
  "Denúncia",
91
+ "Alegações Finais",
92
+ "Resposta à Acusação",
93
+ "Recurso em Sentido Estrito",
94
+ "Apelação Criminal"
95
  ],
96
  label="Tipo de Documento",
97
  value="Habeas Corpus"
 
131
  placeholder="Indique os fundamentos legais principais..."
132
  )
133
 
 
 
 
 
 
 
134
  generate_btn = gr.Button(
135
  "Gerar Documento",
136
  variant="primary"
 
142
  lines=30,
143
  show_copy_button=True
144
  )
145
+
146
+ status = gr.Textbox(
147
+ label="Status",
148
+ interactive=False
149
+ )
150
 
151
+ # Exemplo de uso
152
  gr.Examples(
153
  examples=[
154
  [
 
204
 
205
  # Gera documento
206
  result = self.generator.generate(
207
+ doc_type,
208
  context
209
  )
210
 
 
216
 
217
  def launch(self):
218
  """Inicia a interface web"""
219
+ self.app.launch()
220
 
221
  if __name__ == "__main__":
 
 
 
222
  interface = WebInterface()
223
  interface.launch()