Spaces:
Running
Running
luanpoppe
commited on
Commit
·
6876423
1
Parent(s):
0eba73c
feat: adicionando mais testes unitários dos contextuals e pequenas melhorias
Browse files- _utils/gerar_documento_utils/contextual_retriever.py +18 -23
- _utils/gerar_documento_utils/llm_calls.py +8 -1
- _utils/gerar_documento_utils/tests/fixtures/resposta_llm_com_20_chunks.py +60 -0
- _utils/gerar_documento_utils/tests/fixtures/resumo_auxiliar.py +87 -0
- _utils/gerar_documento_utils/tests/test_contextual_retriever_inside.py +74 -1
- _utils/langchain_utils/LLM_class.py +1 -1
_utils/gerar_documento_utils/contextual_retriever.py
CHANGED
@@ -65,42 +65,38 @@ class ContextualRetriever:
|
|
65 |
lista_com_20_chunks
|
66 |
)
|
67 |
)
|
|
|
|
|
68 |
|
69 |
try:
|
70 |
print("\n\nCOMEÇOU A REQUISIÇÃO")
|
71 |
prompt = contextual_prompt(
|
72 |
resumo_auxiliar, all_chunks_contents, len(lista_com_20_chunks)
|
73 |
)
|
|
|
74 |
for attempt in range(4):
|
75 |
if attempt != 0:
|
76 |
-
|
77 |
f"------------- FORMATAÇÃO DO CONTEXTUAL INCORRETA - TENTANDO NOVAMENTE (TENTATIVA: {attempt + 1}) -------------"
|
78 |
)
|
79 |
|
80 |
-
|
|
|
|
|
81 |
raw_response = await agemini_answer(prompt, "gemini-2.0-flash-lite")
|
82 |
response = cast(str, raw_response)
|
83 |
-
|
84 |
-
f"RESPOSTA LLM DE UM ITEM DA LISTA
|
85 |
)
|
86 |
-
print("TERMINOU UMA REQUISIÇÃO DO CONTEXTUAL")
|
87 |
|
88 |
-
matches = (
|
89 |
-
|
90 |
-
response, all_document_ids
|
91 |
-
)
|
92 |
)
|
93 |
|
94 |
if matches:
|
95 |
-
|
96 |
-
f"CONTEXTUAL FUNCIONOU NA TENTATIVA {attempt + 1}"
|
97 |
-
)
|
98 |
|
99 |
-
result = (
|
100 |
-
self.contextual_retriever_utils.get_info_from_validated_chunks(
|
101 |
-
matches
|
102 |
-
)
|
103 |
-
)
|
104 |
|
105 |
break
|
106 |
|
@@ -234,7 +230,10 @@ class ContextualRetrieverUtils:
|
|
234 |
|
235 |
# pattern = r"\[(\d+|[-.]+)\] --- (.+?) --- (.+?)</chunk_context>" # Funciona para quando a resposta do LLM não vem com "document_id" escrito
|
236 |
matches = self.check_regex_patterns(context, lista_de_document_ids)
|
237 |
-
if not matches:
|
|
|
|
|
|
|
238 |
return False
|
239 |
|
240 |
matches_as_list = []
|
@@ -248,11 +247,6 @@ class ContextualRetrieverUtils:
|
|
248 |
|
249 |
matches_as_list.append((resultado, match[1], match[2]))
|
250 |
|
251 |
-
if len(matches) == 0:
|
252 |
-
print(
|
253 |
-
"----------- ERROU NA TENTATIVA ATUAL DE FORMATAR O CONTEXTUAL -----------"
|
254 |
-
)
|
255 |
-
return False
|
256 |
return matches_as_list
|
257 |
|
258 |
def check_regex_patterns(self, context: str, lista_de_document_ids: List[int]):
|
@@ -260,6 +254,7 @@ class ContextualRetrieverUtils:
|
|
260 |
# r"\[*([\d.\-]+)\]*\s*---\s*\[*([^]]+)\]*\s*---\s*\[*([^]]+)\]*\s*</chunk_context>", # PRIMEIRO DE TODOS
|
261 |
# r"<chunk_context>\s*([\d.\-]+)\s*---\s*([^<]+)\s*---\s*([^<]+)\s*</chunk_context>",
|
262 |
r"\[(.*?)\] --- \[(.*?)\] --- \[(.*?)\](?=\n|\s*$)",
|
|
|
263 |
r"<chunk_context>\s*(\d+)(?:\s*-\s*Pág\.\s*\d+)?\s*---\s*([^-\n]+)\s*---\s*([^<]+)</chunk_context>",
|
264 |
r"<chunk_context>\s*(?:\[*([\d]+)\]*\s*[-–]*\s*(?:Pág\.\s*\d+\s*[-–]*)?)?\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*</chunk_context>",
|
265 |
# r"\[([\d.\-]+)\]\s*---\s*\[([^]]+)\]\s*---\s*\[([^]]+)\]\s*</chunk_context>",
|
|
|
65 |
lista_com_20_chunks
|
66 |
)
|
67 |
)
|
68 |
+
send_axiom = axiom_instance.send_axiom
|
69 |
+
utils = self.contextual_retriever_utils
|
70 |
|
71 |
try:
|
72 |
print("\n\nCOMEÇOU A REQUISIÇÃO")
|
73 |
prompt = contextual_prompt(
|
74 |
resumo_auxiliar, all_chunks_contents, len(lista_com_20_chunks)
|
75 |
)
|
76 |
+
result = None
|
77 |
for attempt in range(4):
|
78 |
if attempt != 0:
|
79 |
+
send_axiom(
|
80 |
f"------------- FORMATAÇÃO DO CONTEXTUAL INCORRETA - TENTANDO NOVAMENTE (TENTATIVA: {attempt + 1}) -------------"
|
81 |
)
|
82 |
|
83 |
+
send_axiom(
|
84 |
+
f"COMEÇANDO UMA REQUISIÇÃO DO CONTEXTUAL - TENTATIVA {attempt + 1}"
|
85 |
+
)
|
86 |
raw_response = await agemini_answer(prompt, "gemini-2.0-flash-lite")
|
87 |
response = cast(str, raw_response)
|
88 |
+
send_axiom(
|
89 |
+
f"TERMINOU UMA REQUISIÇÃO DO CONTEXTUAL - TENTATIVA {attempt + 1} ------- RESPOSTA LLM DE UM ITEM COM 20 CHUNKS EM TEXTO DA LISTA : {response}"
|
90 |
)
|
|
|
91 |
|
92 |
+
matches = utils.validate_many_chunks_in_one_request(
|
93 |
+
response, all_document_ids
|
|
|
|
|
94 |
)
|
95 |
|
96 |
if matches:
|
97 |
+
send_axiom(f"CONTEXTUAL FUNCIONOU NA TENTATIVA {attempt + 1}")
|
|
|
|
|
98 |
|
99 |
+
result = utils.get_info_from_validated_chunks(matches)
|
|
|
|
|
|
|
|
|
100 |
|
101 |
break
|
102 |
|
|
|
230 |
|
231 |
# pattern = r"\[(\d+|[-.]+)\] --- (.+?) --- (.+?)</chunk_context>" # Funciona para quando a resposta do LLM não vem com "document_id" escrito
|
232 |
matches = self.check_regex_patterns(context, lista_de_document_ids)
|
233 |
+
if not matches or len(matches) == 0:
|
234 |
+
print(
|
235 |
+
"----------- ERROU NA TENTATIVA ATUAL DE FORMATAR O CONTEXTUAL -----------"
|
236 |
+
)
|
237 |
return False
|
238 |
|
239 |
matches_as_list = []
|
|
|
247 |
|
248 |
matches_as_list.append((resultado, match[1], match[2]))
|
249 |
|
|
|
|
|
|
|
|
|
|
|
250 |
return matches_as_list
|
251 |
|
252 |
def check_regex_patterns(self, context: str, lista_de_document_ids: List[int]):
|
|
|
254 |
# r"\[*([\d.\-]+)\]*\s*---\s*\[*([^]]+)\]*\s*---\s*\[*([^]]+)\]*\s*</chunk_context>", # PRIMEIRO DE TODOS
|
255 |
# r"<chunk_context>\s*([\d.\-]+)\s*---\s*([^<]+)\s*---\s*([^<]+)\s*</chunk_context>",
|
256 |
r"\[(.*?)\] --- \[(.*?)\] --- \[(.*?)\](?=\n|\s*$)",
|
257 |
+
r"\[([^\[\]]+?)\]\s*---\s*\[([^\[\]]+?)\]\s*---\s*(.*?)</chunk_context>",
|
258 |
r"<chunk_context>\s*(\d+)(?:\s*-\s*Pág\.\s*\d+)?\s*---\s*([^-\n]+)\s*---\s*([^<]+)</chunk_context>",
|
259 |
r"<chunk_context>\s*(?:\[*([\d]+)\]*\s*[-–]*\s*(?:Pág\.\s*\d+\s*[-–]*)?)?\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*</chunk_context>",
|
260 |
# r"\[([\d.\-]+)\]\s*---\s*\[([^]]+)\]\s*---\s*\[([^]]+)\]\s*</chunk_context>",
|
_utils/gerar_documento_utils/llm_calls.py
CHANGED
@@ -9,6 +9,7 @@ from langchain_openai import ChatOpenAI
|
|
9 |
|
10 |
llm = LLM()
|
11 |
|
|
|
12 |
async def aclaude_answer(claude_client, claude_context_model, prompt):
|
13 |
print("\n\nComeçou uma requisição pelo Claude")
|
14 |
response = await claude_client.messages.create(
|
@@ -55,7 +56,13 @@ def gpt_answer(
|
|
55 |
else:
|
56 |
return response.content
|
57 |
|
58 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
59 |
gemini = llm.google_gemini(model)
|
60 |
resposta = await gemini.ainvoke([HumanMessage(content=prompt)])
|
61 |
return resposta.content
|
|
|
9 |
|
10 |
llm = LLM()
|
11 |
|
12 |
+
|
13 |
async def aclaude_answer(claude_client, claude_context_model, prompt):
|
14 |
print("\n\nComeçou uma requisição pelo Claude")
|
15 |
response = await claude_client.messages.create(
|
|
|
56 |
else:
|
57 |
return response.content
|
58 |
|
59 |
+
|
60 |
+
async def agemini_answer(
|
61 |
+
prompt,
|
62 |
+
model: Literal[
|
63 |
+
"gemini-2.5-pro-exp-03-25", "gemini-2.0-flash", "gemini-2.0-flash-lite"
|
64 |
+
] = "gemini-2.0-flash",
|
65 |
+
):
|
66 |
gemini = llm.google_gemini(model)
|
67 |
resposta = await gemini.ainvoke([HumanMessage(content=prompt)])
|
68 |
return resposta.content
|
_utils/gerar_documento_utils/tests/fixtures/resposta_llm_com_20_chunks.py
CHANGED
@@ -1,5 +1,65 @@
|
|
1 |
resposta_llm_com_20_chunks_fixture_array = [
|
2 |
"""1. <chunk_context>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
[0000687-31.2017.8.05.0142] --- [APELAÇÃO CRIMINAL] --- [This chunk provides the basic identifying information for the case, including the case number, type of action (Apelação Criminal), the court, the parties involved (Estado da Bahia, Defensor Dativo, Adenilton da Conceição Samuel), and the main subjects (Honorários Advocatícios, Crimes de Trânsito). It sets the stage for the document, which is a record of the appeal.]
|
4 |
</chunk_context>
|
5 |
2. <chunk_context>
|
|
|
1 |
resposta_llm_com_20_chunks_fixture_array = [
|
2 |
"""1. <chunk_context>
|
3 |
+
[76915] --- [APELAÇÃO CRIMINAL] --- Este chunk apresenta os dados iniciais do processo de Apelação Criminal, incluindo o número, classe, órgão julgador, partes envolvidas (Estado da Bahia, Defensor Dativo, e Adenilton da Conceição Samuel), e os assuntos tratados (Honorários Advocatícios, Crimes de Trânsito). Ele se encaixa na descrição do resumo do processo, que trata da apelação do Estado da Bahia sobre os honorários do defensor dativo em um caso de crimes de trânsito.
|
4 |
+
</chunk_context>
|
5 |
+
2. <chunk_context>
|
6 |
+
[76646] --- [APELAÇÃO CRIMINAL] --- Este chunk lista uma série de intimações, sentenças, certidões e outros documentos relacionados ao processo, abrangendo um período de tempo considerável. Ele demonstra o andamento processual, desde a intimação da sentença até as alegações finais e a interposição da apelação, conforme descrito no resumo do processo.
|
7 |
+
</chunk_context>
|
8 |
+
3. <chunk_context>
|
9 |
+
[RELATOR A: DES A. NARTIR DANTAS WEBER] --- [APELAÇÃO CRIMINAL] --- Este chunk apresenta o pronunciamento do Desembargador Relator Nartir Dantas Weber, que trata do recurso de apelação interposto pelo Estado da Bahia. Ele destaca que a controvérsia se refere a honorários advocatícios e que a intervenção do Ministério Público pode não ser necessária, alinhando-se com a questão central do processo: a responsabilidade do Estado pelo pagamento dos honorários.
|
10 |
+
</chunk_context>
|
11 |
+
4. <chunk_context>
|
12 |
+
[Num. 78015845 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma certidão de publicação no Diário de Justiça Eletrônico (DJe) referente ao processo, informando a disponibilização de um acórdão, decisão ou despacho. Ele se relaciona com o resumo do processo, que menciona as movimentações processuais e a publicação de decisões.
|
13 |
+
</chunk_context>
|
14 |
+
5. <chunk_context>
|
15 |
+
[Num. 76747604 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma certidão de publicação no DJe, informando sobre a disponibilização de um despacho. Ele menciona o artigo 224, § 2º, do CPC, que trata da contagem de prazos processuais, e se encaixa na descrição do resumo do processo, que acompanha as movimentações processuais.
|
16 |
+
</chunk_context>
|
17 |
+
6. <chunk_context>
|
18 |
+
[Num. 76648177 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma certidão de triagem inicial realizada pela Diretoria de Distribuição do 2º Grau, que verifica a regularidade dos dados cadastrais do processo. Ele se relaciona com o resumo do processo, que descreve o andamento processual e as etapas de análise dos documentos.
|
19 |
+
</chunk_context>
|
20 |
+
7. <chunk_context>
|
21 |
+
[Num. 76647593 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma certidão de triagem inicial, confirmando a conferência dos dados cadastrais do processo e identificando alterações necessárias. Ele se encaixa na descrição do resumo do processo, que acompanha as movimentações processuais e as etapas de análise dos documentos.
|
22 |
+
</chunk_context>
|
23 |
+
8. <chunk_context>
|
24 |
+
[Num. 76647590 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é um despacho do Juiz de Direito Leandro Ferreira de Moraes, intimando o advogado Ailton Silva Dantas para apresentar as contrarrazões ao recurso de apelação. Ele se encaixa no resumo do processo, que menciona a intimação do apelado para apresentar contrarrazões.
|
25 |
+
</chunk_context>
|
26 |
+
9. <chunk_context>
|
27 |
+
[Num. 76647588 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma certidão que atesta que o advogado Ailton Silva Dantas, apesar de devidamente intimado, permaneceu inerte, não apresentando as contrarrazões recursais. Ele se relaciona com o resumo do processo, que menciona a inércia do apelado após a intimação.
|
28 |
+
</chunk_context>
|
29 |
+
10. <chunk_context>
|
30 |
+
[Num. 76647583 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk contém um comprovante de comunicação à Justiça Eleitoral sobre a condenação criminal de Adenilton da Conceição Samuel, mencionando os artigos 303 e 306 da Lei 9.503/97. Ele se encaixa no resumo do processo, que descreve os crimes pelos quais o réu foi condenado.
|
31 |
+
</chunk_context>
|
32 |
+
11. <chunk_context>
|
33 |
+
[Num. 76647583 - Pág. 2] --- [APELAÇÃO CRIMINAL] --- Este chunk é a continuação da certidão, que informa o envio do ofício ao CEDEP (Centro de Documentação e Estatística Policial) sobre a condenação criminal de Adenilton da Conceição Samuel. Ele se relaciona com o resumo do processo, que descreve os crimes pelos quais o réu foi condenado e as comunicações oficiais.
|
34 |
+
</chunk_context>
|
35 |
+
12. <chunk_context>
|
36 |
+
[Num. 76647582 - Pág. 2] --- [APELAÇÃO CRIMINAL] --- Este chunk é a continuação do ofício de comunicação da condenação criminal de Adenilton da Conceição Samuel ao CEDEP, detalhando a pena imposta. Ele se relaciona com o resumo do processo, que descreve os crimes pelos quais o réu foi condenado e as comunicações oficiais.
|
37 |
+
</chunk_context>
|
38 |
+
13. <chunk_context>
|
39 |
+
[Num. 76647579 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma certidão de trânsito em julgado da sentença condenatória para o Ministério Público em 21/08/2023 e para a defesa em 19/12/2023. Ele se encaixa no resumo do processo, que menciona o trânsito em julgado da sentença.
|
40 |
+
</chunk_context>
|
41 |
+
14. <chunk_context>
|
42 |
+
[Num. 76647578 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma certidão de intimação de Adenilton da Conceição Samuel sobre a sentença proferida. Ele se relaciona com o resumo do processo, que descreve as etapas processuais, incluindo as intimações.
|
43 |
+
</chunk_context>
|
44 |
+
15. <chunk_context>
|
45 |
+
[Num. 76647575 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma intimação judicial para o advogado Ailton Silva Dantas apresentar contrarrazões recursais. Ele se encaixa no resumo do processo, que menciona a intimação do apelado para apresentar contrarrazões.
|
46 |
+
</chunk_context>
|
47 |
+
16. <chunk_context>
|
48 |
+
[Num. 76647573 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma decisão do juiz Leandro Ferreira de Moraes que recebe o recurso de apelação interposto pela Procuradoria Geral do Estado da Bahia, com efeito suspensivo, e determina a intimação do apelado para apresentar contrarrazões. Ele se encaixa no resumo do processo, que descreve as etapas processuais, incluindo a decisão sobre o recurso.
|
49 |
+
</chunk_context>
|
50 |
+
17. <chunk_context>
|
51 |
+
[Num. 76647572 - Pág. 1] --- [APELAÇÃO CRIMINAL] --- Este chunk é uma certidão que atesta a tempestividade da interposição do recurso de apelação. Ele se relaciona com o resumo do processo, que descreve a interposição do recurso pelo Estado da Bahia.
|
52 |
+
</chunk_context>
|
53 |
+
18. <chunk_context>
|
54 |
+
[Num. 76647571 - Pág. 2] --- [APELAÇÃO CRIMINAL] --- Este chunk apresenta as razões do recurso de apelação interposto pelo Estado da Bahia, argumentando sobre o cabimento do recurso e a ilegitimidade do Estado para recorrer. Ele se encaixa no resumo do processo, que descreve os argumentos do Estado na apelação.
|
55 |
+
</chunk_context>
|
56 |
+
19. <chunk_context>
|
57 |
+
[Num. 76647571 - Pág. 3] --- [APELAÇÃO CRIMINAL] --- Este chunk continua as razões do recurso, detalhando a preliminar de inobservância do Tema Repetitivo 984 do STJ, que trata da ausência de obrigatoriedade de observância da tabela da OAB para fixação de honorários de defensor dativo. Ele se relaciona com o resumo do processo, que menciona a alegação do Estado sobre o Tema Repetitivo 984.
|
58 |
+
</chunk_context>
|
59 |
+
20. <chunk_context>
|
60 |
+
[Num. 76647571 - Pág. 5] --- [APELAÇÃO CRIMINAL] --- Este chunk continua a discussão sobre o Tema Repetitivo 984 do STJ, apresentando a ementa do julgado e os argumentos do Estado sobre a fixação dos honorários de defensor dativo. Ele se relaciona com o resumo do processo, que menciona a alegação do Estado sobre o Tema Repetitivo 984.
|
61 |
+
</chunk_context>""",
|
62 |
+
"""1. <chunk_context>
|
63 |
[0000687-31.2017.8.05.0142] --- [APELAÇÃO CRIMINAL] --- [This chunk provides the basic identifying information for the case, including the case number, type of action (Apelação Criminal), the court, the parties involved (Estado da Bahia, Defensor Dativo, Adenilton da Conceição Samuel), and the main subjects (Honorários Advocatícios, Crimes de Trânsito). It sets the stage for the document, which is a record of the appeal.]
|
64 |
</chunk_context>
|
65 |
2. <chunk_context>
|
_utils/gerar_documento_utils/tests/fixtures/resumo_auxiliar.py
ADDED
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
resumo_auxiliar_fixture = """
|
2 |
+
```xml
|
3 |
+
<pecas_identificadas>
|
4 |
+
1. Apelação Criminal
|
5 |
+
2. Parecer do Ministério Público
|
6 |
+
3. Despacho
|
7 |
+
4. Certidão de publicação no DJe
|
8 |
+
5. Certidão
|
9 |
+
6. Intimação
|
10 |
+
7. Informação (N° Execução SEEU, Comprovante envio SEEU)
|
11 |
+
8. Outros documentos (Guia de Execução Regime Aberto, Guia de Execução - Adenilton da Conceição, Ofício INFODIP, Ofício)
|
12 |
+
9. Certidão Trânsito em Julgado
|
13 |
+
10. Petição
|
14 |
+
11. Sentença
|
15 |
+
12. Alegações Finais
|
16 |
+
13. Contestação
|
17 |
+
14. Ato Ordinatório
|
18 |
+
15. Petição Inicial
|
19 |
+
16. Termo de Audiência
|
20 |
+
17. Decisão
|
21 |
+
18. Mandado de Intimação de Sentença
|
22 |
+
</pecas_identificadas>
|
23 |
+
|
24 |
+
<artigos_mencionados>
|
25 |
+
1. Art. 127, caput, CF
|
26 |
+
2. Lei nº 11.419
|
27 |
+
3. Decreto Judiciário nº 064 de 10 de março de 2009
|
28 |
+
4. Art. 224, § 2º, do CPC
|
29 |
+
5. Artigos 303 e 306 da Lei 9.503/97
|
30 |
+
6. Art. 13 da Resolução n° 04/2017
|
31 |
+
7. Art. 597 do CPP
|
32 |
+
8. Art. 185, § 2º, I e IV, e § 8º, do CPP
|
33 |
+
9. Artigos 303 e 306, ambos da Lei 9.503/97
|
34 |
+
10. Art. 59 e 68, ambos do Código Penal
|
35 |
+
11. Art. 387, parágrafo único, do Código de Processo Penal
|
36 |
+
12. Art. 44, inciso I, art. 43 do Código Penal
|
37 |
+
13. Art. 367 do CPP
|
38 |
+
14. Art. 396-A, do CPP
|
39 |
+
15. Art. 593 do Código de Processo Penal
|
40 |
+
16. Art. 85 do CPC
|
41 |
+
17. Art. 5º da Constituição Federal, itens LIV e LV
|
42 |
+
18. Art. 22, §§ 1º e 2º da Lei 8.906/1994
|
43 |
+
19. Lei nº 1.060/50, § 1º do seu artigo 5º
|
44 |
+
20. § 2º do artigo 5º da Lei nº 1.060/50
|
45 |
+
21. § 1º do artigo 22 da Lei nº 8.906, de 4.7.1994
|
46 |
+
</artigos_mencionados>
|
47 |
+
|
48 |
+
<jurisprudencia_mencionada>
|
49 |
+
1. Tema Repetitivo 984 do STJ - ausência de vinculação da tabela da OAB para fins de fixação de honorários de defensor dativo.
|
50 |
+
2. Súmula Vinculante n. 47 do STF - natureza alimentar dos honorários advocatícios.
|
51 |
+
3. Ag 3.805-SP-AgRg, rel. Min. Waldemar Zveiter - exigência de valor exato dos honorários ou arbitramento prévio para cobrança via executiva.
|
52 |
+
4. Apelação Crime nº 0000004-84.1991.805.0148-0 do TJBA - competência da justiça cível para fixação de honorários de defensor dativo.
|
53 |
+
5. TJRS-AGR 70001144344 - competência do juízo cível para fixação de honorários de defensor dativo.
|
54 |
+
6. TRF 5ª R.; AC 517334 - fixação equitativa de honorários quando vencida a Fazenda Pública.
|
55 |
+
7. TJMG; APCV 1588447-53.2005.8.13.0105 - fixação equitativa de honorários quando vencida a Fazenda Pública.
|
56 |
+
8. TRF 1ª R.; AC 39581-69.2001.4.01.3800 - fixação equitativa de honorários quando vencida a Fazenda Pública.
|
57 |
+
9. Ap. 42.309, TACrimSP, Rel. GOULART SOBRINHO - probabilidade não é certeza para condenação.
|
58 |
+
10. Ap. 160.097, TACrimSP, Rel. GONÇALVES SOBRINHO - dúvida autoriza absolvição.
|
59 |
+
11. Ap. 162.055. TACrimSP, Rel. GOULART SOBRINHO - certeza total é necessária para condenação.
|
60 |
+
12. JUTACRIM, 72:26, Rel. ÁLVARO CURY - dúvida favorece o réu.
|
61 |
+
13. AgRg no AREsp 1239057/MS - Crimes de embriaguez ao volante e lesão corporal culposa são autônomos.
|
62 |
+
14. MS n. 8011612-51.2018.8.05.0000 - garantia da não realização de escoltas de presos sem as medidas de proteção da polícia penal.
|
63 |
+
15. REsp 1656322/SC, tema 984 - STJ
|
64 |
+
</jurisprudencia_mencionada>
|
65 |
+
|
66 |
+
<resumo_processo>
|
67 |
+
O processo em análise, de número 0000687-31.2017.8.05.0142, é uma Apelação Criminal originada na Vara Criminal de Jeremoabo, Bahia, e tramita na Segunda Câmara Criminal 1ª Turma do Tribunal de Justiça do Estado da Bahia. O apelante é o Estado da Bahia, e o apelado é o Defensor Dativo, Ailton Silva Dantas, representando Adenilton da Conceição Samuel. A ação penal de origem apura crimes de trânsito, especificamente os artigos 303 e 306 da Lei 9.503/97.
|
68 |
+
|
69 |
+
O processo teve início com a denúncia do Ministério Público contra Adenilton da Conceição Samuel, imputando-lhe a prática de lesão corporal culposa na direção de veículo automotor e condução de veículo sob influência de álcool. A denúncia narra que, em 15/05/2017, Adenilton conduzia um Fiat Uno sem habilitação e em estado de embriaguez, colidindo com uma motocicleta e causando lesões na vítima, Erivaldo Teixeira da Silva.
|
70 |
+
|
71 |
+
Após o recebimento da denúncia, o réu foi citado e, permanecendo inerte, foi nomeado o defensor dativo Ailton Silva Dantas. O defensor apresentou Resposta à Acusação, alegando a inocência do réu e arrolando testemunhas. O Ministério Público se manifestou pelo recebimento da denúncia e prosseguimento do feito.
|
72 |
+
|
73 |
+
Durante a instrução processual, foi realizada audiência de instrução e julgamento, com a oitiva da testemunha Luiz Gonzaga de Sá Teixeira. O réu não compareceu à audiência, e o juiz dispensou seu interrogatório, nos termos do art. 367 do CPP. Tanto o Ministério Público quanto a defesa requereram prazo para apresentação de alegações finais em forma de memoriais.
|
74 |
+
|
75 |
+
Em suas alegações finais, o Ministério Público requereu a condenação do réu nos termos da denúncia, pelos crimes de direção de veículo automotor alcoolizado e sem habilitação, em concurso formal. A defesa, por sua vez, pugnou pela absolvição do réu, alegando insuficiência de provas.
|
76 |
+
|
77 |
+
O juiz da Vara Criminal de Jeremoabo proferiu sentença, julgando procedente a pretensão punitiva estatal e condenando Adenilton da Conceição Samuel pela prática dos crimes tipificados nos artigos 303 e 306 da Lei 9.503/97. A pena imposta foi de 01 (um) ano de detenção e suspensão ou proibição de se obter a permissão ou a habilitação para dirigir veículo automotor, substituída por prestação de serviços à comunidade e prestação pecuniária. O regime inicial foi o aberto. O juiz também condenou o Estado da Bahia ao pagamento de honorários advocatícios ao defensor dativo, no valor de R$ 3.500,00.
|
78 |
+
|
79 |
+
Inconformado com a sentença, o Estado da Bahia interpôs recurso de apelação, alegando, em síntese: a) preliminar de inobservância do Tema Repetitivo 984 do STJ, que trata da ausência de obrigatoriedade de observância da tabela da OAB para fixação de honorários de defensor dativo; b) preliminar de nulidade por ofensa à ampla defesa e ao devido processo legal, argumentando que o Estado não foi parte na demanda e não pôde exercer plenamente seu direito à defesa; c) impossibilidade de arbitramento de honorários no processo criminal, defendendo que a competência para fixação é da justiça cível; d) excessividade nos valores arbitrados. O Estado requereu a declaração de nulidade da sentença na parte em que o condenou ao pagamento dos honorários, ou, subsidiariamente, a reforma da sentença para extirpar a condenação em honorários, ou, ainda, a redução dos honorários arbitrados.
|
80 |
+
|
81 |
+
Após a interposição da apelação, o apelado, Adenilton da Conceição Samuel, foi intimado para apresentar contrarrazões ao recurso, mas permaneceu inerte, conforme certidões nos autos.
|
82 |
+
|
83 |
+
Em 03/02/2025, o Desembargador Relator Nartir Dantas Weber determinou o encaminhamento dos autos à Procuradoria de Justiça para emissão de opinativo. Em 05/02/2025, a Procuradoria de Justiça Criminal manifestou-se no sentido de que sua intervenção no feito se mostra inadequada, por se tratar de discussão sobre direito patrimonial disponível (honorários advocatícios), sem repercussão social apta a atrair a intervenção ministerial, conforme o art. 127, caput, da CF.
|
84 |
+
|
85 |
+
A **última movimentação** relevante no processo, datada de 04/02/2025, é um despacho do Desembargador Relator Nartir Dantas Weber, determinando o encaminhamento dos autos à Procuradoria de Justiça para emissão de opinativo, o que já foi cumprido. O processo aguarda, portanto, o retorno dos autos ao Relator para prosseguimento do julgamento da apelação. A questão central a ser decidida é a responsabilidade do Estado da Bahia pelo pagamento dos honorários do defensor dativo e, em caso afirmativo, o valor adequado desses honorários, considerando o Tema Repetitivo 984 do STJ e os princípios da razoabilidade e proporcionalidade.
|
86 |
+
</resumo_processo>
|
87 |
+
```"""
|
_utils/gerar_documento_utils/tests/test_contextual_retriever_inside.py
CHANGED
@@ -9,10 +9,17 @@ from _utils.models.gerar_documento import (
|
|
9 |
DocumentChunk,
|
10 |
RetrievalConfig,
|
11 |
)
|
|
|
|
|
|
|
|
|
|
|
12 |
from .fixtures.resposta_llm_com_20_chunks import (
|
13 |
resposta_llm_com_20_chunks_fixture_array,
|
14 |
lista_20_ids_fixture,
|
15 |
)
|
|
|
|
|
16 |
|
17 |
|
18 |
config = RetrievalConfig(
|
@@ -57,7 +64,6 @@ lista_chunks_errados = [
|
|
57 |
|
58 |
class TestContextualRetrieverUtils:
|
59 |
context_retrieval_utils = ContextualRetrieverUtils()
|
60 |
-
# context_retrieval = ContextualRetriever(config, "claude-3-haiku-20240307")
|
61 |
|
62 |
# @pytest.mark.asyncio
|
63 |
# async def test_valida_retries_automaticos_do_contextual(self, monkeypatch):
|
@@ -145,3 +151,70 @@ class TestContextualRetrieverUtils:
|
|
145 |
assert isinstance(r[2], str)
|
146 |
assert len(r[1]) > 0
|
147 |
assert len(r[2]) > 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
DocumentChunk,
|
10 |
RetrievalConfig,
|
11 |
)
|
12 |
+
from gerar_documento.serializer import (
|
13 |
+
GerarDocumentoComPDFProprioSerializer,
|
14 |
+
GerarDocumentoComPDFProprioSerializerData,
|
15 |
+
)
|
16 |
+
from setup.logging import Axiom
|
17 |
from .fixtures.resposta_llm_com_20_chunks import (
|
18 |
resposta_llm_com_20_chunks_fixture_array,
|
19 |
lista_20_ids_fixture,
|
20 |
)
|
21 |
+
from .fixtures.lista_com_20_chunks import lista_com_20_chunks_fixture
|
22 |
+
from .fixtures.resumo_auxiliar import resumo_auxiliar_fixture
|
23 |
|
24 |
|
25 |
config = RetrievalConfig(
|
|
|
64 |
|
65 |
class TestContextualRetrieverUtils:
|
66 |
context_retrieval_utils = ContextualRetrieverUtils()
|
|
|
67 |
|
68 |
# @pytest.mark.asyncio
|
69 |
# async def test_valida_retries_automaticos_do_contextual(self, monkeypatch):
|
|
|
151 |
assert isinstance(r[2], str)
|
152 |
assert len(r[1]) > 0
|
153 |
assert len(r[2]) > 0
|
154 |
+
|
155 |
+
@pytest.mark.asyncio
|
156 |
+
def test_validate_many_chunks_in_one_request_falha_01(self, monkeypatch):
|
157 |
+
monkeypatch.setattr(
|
158 |
+
self.context_retrieval_utils,
|
159 |
+
"check_regex_patterns",
|
160 |
+
lambda ctx, ids: None,
|
161 |
+
)
|
162 |
+
for resposta in resposta_llm_com_20_chunks_fixture_array:
|
163 |
+
result = self.context_retrieval_utils.validate_many_chunks_in_one_request(
|
164 |
+
resposta, lista_20_ids_fixture
|
165 |
+
)
|
166 |
+
assert result is False
|
167 |
+
|
168 |
+
@pytest.mark.asyncio
|
169 |
+
def test_validate_many_chunks_in_one_request_falha_02_empty_list(self, monkeypatch):
|
170 |
+
monkeypatch.setattr(
|
171 |
+
self.context_retrieval_utils,
|
172 |
+
"check_regex_patterns",
|
173 |
+
lambda ctx, ids: [],
|
174 |
+
)
|
175 |
+
for resposta in resposta_llm_com_20_chunks_fixture_array:
|
176 |
+
result = self.context_retrieval_utils.validate_many_chunks_in_one_request(
|
177 |
+
resposta, lista_20_ids_fixture
|
178 |
+
)
|
179 |
+
assert result is False
|
180 |
+
|
181 |
+
|
182 |
+
class TestContextuRetriever:
|
183 |
+
serializer = GerarDocumentoComPDFProprioSerializerData([])
|
184 |
+
context_retrieval = ContextualRetriever(serializer)
|
185 |
+
axiom = Axiom()
|
186 |
+
axiom.generate_new_uuid()
|
187 |
+
|
188 |
+
@pytest.mark.asyncio
|
189 |
+
async def test_llm_call_uma_lista_de_chunks_success(
|
190 |
+
self,
|
191 |
+
):
|
192 |
+
resultado = await self.context_retrieval.llm_call_uma_lista_de_chunks(
|
193 |
+
lista_com_20_chunks_fixture, resumo_auxiliar_fixture, self.axiom
|
194 |
+
)
|
195 |
+
|
196 |
+
print("resultado: ", resultado)
|
197 |
+
assert resultado
|
198 |
+
|
199 |
+
@pytest.mark.asyncio
|
200 |
+
async def test_llm_call_uma_lista_de_chunks_falha_01(self, monkeypatch):
|
201 |
+
monkeypatch.setattr(
|
202 |
+
self.context_retrieval.contextual_retriever_utils,
|
203 |
+
"get_all_document_ids_and_contents",
|
204 |
+
lambda ids: ("", [1, 2, 3, 4]),
|
205 |
+
)
|
206 |
+
|
207 |
+
async def mock_agemini_answer(prompt, modelo):
|
208 |
+
return "texto incorreto"
|
209 |
+
|
210 |
+
monkeypatch.setattr(
|
211 |
+
"_utils.gerar_documento_utils.contextual_retriever.agemini_answer",
|
212 |
+
mock_agemini_answer,
|
213 |
+
)
|
214 |
+
|
215 |
+
resultado = await self.context_retrieval.llm_call_uma_lista_de_chunks(
|
216 |
+
lista_com_20_chunks_fixture, resumo_auxiliar_fixture, self.axiom
|
217 |
+
)
|
218 |
+
|
219 |
+
print("resultado: ", resultado)
|
220 |
+
assert resultado == [[""]]
|
_utils/langchain_utils/LLM_class.py
CHANGED
@@ -26,7 +26,7 @@ class LLM:
|
|
26 |
def google_gemini(
|
27 |
self,
|
28 |
model: Literal[
|
29 |
-
"gemini-2.5-pro-exp-03-25", "gemini-2.0-flash"
|
30 |
] = "gemini-2.0-flash",
|
31 |
):
|
32 |
return ChatGoogleGenerativeAI(
|
|
|
26 |
def google_gemini(
|
27 |
self,
|
28 |
model: Literal[
|
29 |
+
"gemini-2.5-pro-exp-03-25", "gemini-2.0-flash", "gemini-2.0-flash-lite"
|
30 |
] = "gemini-2.0-flash",
|
31 |
):
|
32 |
return ChatGoogleGenerativeAI(
|