Spaces:
Running
Running
luanpoppe
commited on
Commit
·
a263183
1
Parent(s):
6e09bf4
feat: adicionando query dinamicamente
Browse files
_utils/LLMs/LLM_class.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
from typing import cast
|
2 |
from pydantic import SecretStr
|
3 |
from setup.environment import default_model
|
4 |
from setup.easy_imports import ChatOpenAI, ChatGoogleGenerativeAI
|
@@ -22,7 +22,12 @@ class LLM:
|
|
22 |
model=model,
|
23 |
)
|
24 |
|
25 |
-
def google_gemini(
|
|
|
|
|
|
|
|
|
|
|
26 |
return ChatGoogleGenerativeAI(
|
27 |
api_key=SecretStr(google_api_key),
|
28 |
model=model,
|
|
|
1 |
+
from typing import Literal, cast
|
2 |
from pydantic import SecretStr
|
3 |
from setup.environment import default_model
|
4 |
from setup.easy_imports import ChatOpenAI, ChatGoogleGenerativeAI
|
|
|
22 |
model=model,
|
23 |
)
|
24 |
|
25 |
+
def google_gemini(
|
26 |
+
self,
|
27 |
+
model: Literal[
|
28 |
+
"gemini-2.5-pro-exp-03-25", "gemini-2.0-flash"
|
29 |
+
] = "gemini-2.0-flash",
|
30 |
+
):
|
31 |
return ChatGoogleGenerativeAI(
|
32 |
api_key=SecretStr(google_api_key),
|
33 |
model=model,
|
_utils/gerar_relatorio_modelo_usuario/prompts.py
CHANGED
@@ -1,167 +1,98 @@
|
|
1 |
-
prompt_auxiliar_do_contextual_prompt = """Você é um assistente jurídico especializado em direito brasileiro. Sua tarefa é criar um resumo conciso e informativo de um processo jurídico, de acordo com as leis do Brasil. O resumo deve focar nos momentos cruciais do processo, na última movimentação processual e nas principais movimentações que ocorreram.
|
2 |
-
|
3 |
-
Aqui estão as 10 principais peças processuais em ordem cronológica do processo civil brasileiro que você deve priorizar em sua análise:
|
4 |
-
1. Petição Inicial
|
5 |
-
2. Contestação
|
6 |
-
3. Réplica
|
7 |
-
4. Decisão de Saneamento
|
8 |
-
5. Sentença
|
9 |
-
6. Recurso de Apelação
|
10 |
-
7. Embargos de Declaração
|
11 |
-
8. Cumprimento de Sentença
|
12 |
-
9. Embargos à Execução
|
13 |
-
10. Agravo de Instrumento
|
14 |
-
|
15 |
-
Siga este passo a passo para criar o resumo:
|
16 |
-
|
17 |
-
1. Leia atentamente todo o processo jurídico fornecido.
|
18 |
-
<processo_juridico>
|
19 |
-
{PROCESSO_JURIDICO}
|
20 |
-
</processo_juridico>
|
21 |
-
|
22 |
-
2. Identifique e anote as datas e conteúdos relevantes relacionados às 10 peças processuais listadas acima.
|
23 |
-
|
24 |
-
3. Organize cronologicamente as informações coletadas.
|
25 |
-
|
26 |
-
4. Destaque a última movimentação processual e seu significado para o andamento do processo.
|
27 |
-
|
28 |
-
5. Resuma as principais movimentações, focando em seu impacto no processo.
|
29 |
-
|
30 |
-
6. Elabore um texto coeso que apresente o fluxo do processo, destacando os pontos cruciais e as decisões mais importantes.
|
31 |
-
|
32 |
-
Após criar o resumo inicial, utilize a técnica socrática de reflexão para garantir a precisão e completude do resumo. Faça a si mesmo as seguintes perguntas:
|
33 |
-
|
34 |
-
1. O resumo abrange todas as 10 peças processuais principais?
|
35 |
-
2. A última movimentação processual está claramente identificada e explicada?
|
36 |
-
3. O texto apresenta uma visão clara do fluxo do processo?
|
37 |
-
4. Todas as informações cruciais para o entendimento do caso estão incluídas?
|
38 |
-
5. O resumo está livre de opiniões pessoais e se atém aos fatos do processo?
|
39 |
-
6. A linguagem utilizada é clara e acessível, mesmo para quem não é especialista em direito?
|
40 |
-
|
41 |
-
Revise e ajuste o resumo conforme necessário com base nessa reflexão.
|
42 |
-
|
43 |
-
O resumo final deve ter no máximo 2 páginas de extensão (aproximadamente 1000 palavras).
|
44 |
-
|
45 |
-
Formate sua resposta da seguinte maneira:
|
46 |
-
|
47 |
-
<resumo_processo>
|
48 |
-
[Insira aqui o resumo do processo jurídico]
|
49 |
-
</resumo_processo>
|
50 |
-
|
51 |
-
<reflexao_socratica>
|
52 |
-
[Insira aqui suas respostas às perguntas da reflexão socrática]
|
53 |
-
</reflexao_socratica>
|
54 |
-
|
55 |
-
<resumo_final>
|
56 |
-
[Insira aqui o resumo final revisado, se houver alterações após a reflexão]
|
57 |
-
</resumo_final>"""
|
58 |
-
|
59 |
-
|
60 |
def create_prompt_auxiliar_do_contextual_prompt(PROCESSO_JURIDICO: str):
|
61 |
-
return f"""
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
106 |
|
107 |
<resumo_processo>
|
108 |
-
[Insira aqui o resumo do processo jurídico]
|
109 |
</resumo_processo>
|
|
|
|
|
110 |
|
111 |
-
|
112 |
-
[Insira aqui suas respostas às perguntas da reflexão socrática]
|
113 |
-
</reflexao_socratica>
|
114 |
-
|
115 |
-
<resumo_final>
|
116 |
-
[Insira aqui o resumo final revisado, se houver alterações após a reflexão]
|
117 |
-
</resumo_final>"""
|
118 |
-
|
119 |
-
|
120 |
-
# ORIGINAL
|
121 |
-
# def contextual_prompt(single_page_text, summary_text, chunk_content):
|
122 |
-
# return f"""You are an AI assistant specialized in providing context for document retrieval. Your task is to analyze a chunk of text from a larger document and provide a brief context for it.
|
123 |
-
|
124 |
-
# Here's the summary of the full text of the document:
|
125 |
-
# <summary_text>
|
126 |
-
# {summary_text}
|
127 |
-
# </summary_text>
|
128 |
-
|
129 |
-
# Here's the single page where the chunk is situated:
|
130 |
-
|
131 |
-
# <single_page>
|
132 |
-
# {single_page_text}
|
133 |
-
# </single_page>
|
134 |
-
|
135 |
-
# And here's the specific chunk to contextualize:
|
136 |
-
# <chunk>
|
137 |
-
# {chunk_content}
|
138 |
-
# </chunk>
|
139 |
-
|
140 |
-
# Follow these steps:
|
141 |
-
# 1. Identify and quote the document ID (found between "NUM." and "- Pág") and the document name (from the header).
|
142 |
-
# 2. Summarize the main topics or themes of the single page and where it fit within the summary of the full text.
|
143 |
-
# 3. Identify where the specific chunk fits within these themes.
|
144 |
-
# 4. Create a concise context that situates the chunk within the document.
|
145 |
-
|
146 |
-
# With this informations, your response should be a single, concise paragraph that includes:
|
147 |
-
# - The document ID
|
148 |
-
# - The document name
|
149 |
-
# - A brief context for the chunk
|
150 |
-
|
151 |
-
# Example final output structure (do not copy the content, only the format):
|
152 |
-
# <chunk_context>
|
153 |
-
# [Single paragraph with document ID, name, and chunk context]
|
154 |
-
# </chunk_context>"""
|
155 |
-
|
156 |
-
|
157 |
-
# Removido do prompt abaixo após mudar para cada chunk ter 5000 caracteres:
|
158 |
-
# Here are the pages where the chunks are situated:
|
159 |
-
# <page>
|
160 |
-
# {all_pages_contents}
|
161 |
-
# </page>
|
162 |
-
|
163 |
-
|
164 |
-
# 1. Identify the document ID (found between "NUM." and "- Pág") and the document name (from the header).
|
165 |
|
166 |
|
167 |
def contextual_prompt(
|
@@ -203,25 +134,6 @@ Please provide context for all {numero_de_chunks} chunks, following this structu
|
|
203 |
"""
|
204 |
|
205 |
|
206 |
-
# return f"""You are a language model tasked with providing context to improve the retrieval of information from a chunk extracted from a document. Follow these steps internally (do not display reasoning or reflection in the final output):
|
207 |
-
# 1. **Chain of Thought (internal)**:
|
208 |
-
# - Identify the document ID, which is the value between "NUM." and "- Pág".
|
209 |
-
# - Identify the document name from the header.
|
210 |
-
# 2. **Reflection (internal)**:
|
211 |
-
# - Confirm the document ID and name are correctly identified.
|
212 |
-
# - Ensure the final context is concise and helpful.
|
213 |
-
# 3. **Final Response**:
|
214 |
-
# - Provide a short context situating the *chunk* within the document, including the document ID and document name.
|
215 |
-
# - Do not include any reasoning or reflection in your response.
|
216 |
-
# **Example Usage:**
|
217 |
-
# ```
|
218 |
-
# <document> {full_text} </document>
|
219 |
-
# <chunk> {chunk_content} </chunk>
|
220 |
-
# Please return only the succinct context (without displaying your internal reasoning), including the document ID and the document name.
|
221 |
-
# ```
|
222 |
-
# """
|
223 |
-
|
224 |
-
|
225 |
# Novo nome --> prompt-auxiliar --> Para gerar documentos (é usado como auxiliar no prompt final)
|
226 |
prompt_auxiliar_inicio = """You are a language model specialized in producing concise and well-structured legal case summaries in Portuguese. You will receive a variable `context`, which contains information about a legal case. Your task is to read the `context` carefully and produce a summary report in Portuguese, following the specific format provided below. Do not include any additional comments or reasoning steps in your final answer."""
|
227 |
|
@@ -297,63 +209,73 @@ After composing the sentence, but before presenting it as the final answer, refl
|
|
297 |
|
298 |
|
299 |
# VALOR ANTIGO DE PROMPT UTILIZADO NO QUERY DA PESQUISA POR SIMILARIDADE DO VECTOR_SEARCH
|
300 |
-
# prompt_auxiliar_SEM_CONTEXT = """
|
301 |
-
#
|
302 |
-
#
|
303 |
-
#
|
304 |
-
#
|
305 |
-
#
|
306 |
-
#
|
307 |
-
#
|
308 |
-
#
|
309 |
-
#
|
310 |
-
#
|
311 |
-
#
|
312 |
-
#
|
313 |
-
#
|
314 |
-
#
|
315 |
-
#
|
316 |
-
#
|
317 |
-
#
|
318 |
-
#
|
319 |
-
#
|
320 |
-
#
|
321 |
-
#
|
322 |
-
|
323 |
-
#
|
324 |
-
#
|
325 |
-
#
|
326 |
-
#
|
327 |
-
#
|
328 |
-
|
329 |
-
|
330 |
-
|
331 |
-
|
332 |
-
|
333 |
-
|
334 |
-
|
335 |
-
|
336 |
-
|
337 |
-
|
338 |
-
|
339 |
-
|
340 |
-
|
341 |
-
|
342 |
-
|
343 |
-
|
344 |
-
|
345 |
-
|
346 |
-
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
-
|
351 |
-
|
352 |
-
|
353 |
-
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
def create_prompt_auxiliar_do_contextual_prompt(PROCESSO_JURIDICO: str):
|
2 |
+
return f"""
|
3 |
+
<prompt>
|
4 |
+
<persona>
|
5 |
+
Você é um assistente jurídico especialista em direito processual civil brasileiro. Sua função é analisar o texto de um processo judicial, extrair informações chave e gerar um relatório estruturado.
|
6 |
+
</persona>
|
7 |
+
|
8 |
+
<tarefa>
|
9 |
+
Seu objetivo é analisar o processo jurídico fornecido e gerar um relatório conciso contendo:
|
10 |
+
1. Uma lista explícita das peças processuais chave ou fases relevantes identificadas no texto, com base na lista expandida abaixo.
|
11 |
+
2. Uma lista dos artigos de lei específicos mencionados ou discutidos no processo.
|
12 |
+
3. Uma lista das jurisprudências (casos específicos, súmulas) mencionadas, com breve contexto.
|
13 |
+
4. Um resumo detalhado do processo, narrando o fluxo dos eventos, as principais decisões, argumentos, a última movimentação relevante e garantindo um **mínimo de 2000 caracteres**.
|
14 |
+
|
15 |
+
**Peças/Fases Processuais Chave a Serem Identificadas (Multirrito):**
|
16 |
+
1. Petição Inicial
|
17 |
+
2. Denúncia / Queixa-Crime
|
18 |
+
4. Auto de Prisão em Flagrante / Representação por Prisão Preventiva/Temporária
|
19 |
+
5. Inquérito Policial (Relatório Final)
|
20 |
+
6. Despacho Inicial / Decisão de Recebimento (ou Rejeição) da Inicial/Denúncia
|
21 |
+
8. Audiência de Custódia (Penal)
|
22 |
+
9. Audiência de Conciliação ou Mediação
|
23 |
+
10. Contestação / Defesa Prévia / Resposta à Acusação / Informações da Autoridade Coatora
|
24 |
+
11. Réplica
|
25 |
+
12. Decisão de Saneamento e Organização do Processo
|
26 |
+
13. Decisão de Pronúncia / Impronúncia / Absolvição Sumária (Penal)
|
27 |
+
15. Audiência de Instrução e Julgamento
|
28 |
+
16. Alegações Finais (Orais ou Memoriais)
|
29 |
+
17. Parecer do Ministério Público / Parecer Jurídico
|
30 |
+
18. Sentença / Acórdão
|
31 |
+
19. Embargos de Declaração
|
32 |
+
20. Recurso de Apelação (Cível/Penal) / Recurso Inominado (JEC) / Recurso Ordinário / Recurso Administrativo
|
33 |
+
21. Contrarrazões de Recurso
|
34 |
+
22. Agravo de Instrumento (Cível) / Recurso em Sentido Estrito (RESE - Penal) / Agravo Interno
|
35 |
+
23. Acórdão (TJ, TRF, Turma Recursal, etc.)
|
36 |
+
24. Recurso Especial (para o STJ)
|
37 |
+
25. Recurso Extraordinário (para o STF)
|
38 |
+
26. Habeas Corpus (HC) / Mandado de Segurança (MS)
|
39 |
+
27. Trânsito em Julgado (Certidão)
|
40 |
+
28. Cumprimento de Sentença / Início da Execução / Execução Penal
|
41 |
+
29. Impugnação ao Cumprimento de Sentença / Embargos à Execução
|
42 |
+
30. Incidentes da Execução Penal (Progressão de Regime, Livramento Condicional, etc.)
|
43 |
+
</tarefa>
|
44 |
+
|
45 |
+
|
46 |
+
<instrucoes>
|
47 |
+
Siga estritamente os passos abaixo:
|
48 |
+
|
49 |
+
1. **Análise Completa:** Leia e analise todo o conteúdo do processo fornecido.
|
50 |
+
<processo_juridico>
|
51 |
+
{PROCESSO_JURIDICO}
|
52 |
+
</processo_juridico>
|
53 |
+
|
54 |
+
2. **Identificação e Listagem de Peças:** Identifique quais das peças listadas na `<tarefa>` estão presentes no texto. Liste **apenas** as encontradas na tag `<pecas_identificadas>`.
|
55 |
+
|
56 |
+
3. **Identificação de Artigos:** Localize e liste todos os artigos de lei (ex: "Art. 319 do CPC", "Art. 186 do Código Civil") que são explicitamente mencionados ou discutidos no processo. Liste-os na tag `<artigos_mencionados>`. Se nenhum for encontrado, indique isso claramente.
|
57 |
+
|
58 |
+
4. **Identificação de Jurisprudência:** Localize e liste todas as menções a jurisprudências (Súmulas, Recursos Repetitivos, casos específicos como REsp, AgRg, HC, etc.). Inclua o identificador (se disponível) e um breve contexto de por que foi citada (ex: "Súmula X do STJ - sobre dano moral", "REsp 12345 - citado pela defesa sobre prescrição"). Liste-as na tag `<jurisprudencia_mencionada>`. Se nenhuma for encontrada, indique isso claramente.
|
59 |
+
|
60 |
+
5. **Extração e Organização:** Extraia informações cruciais (datas, argumentos, pedidos, decisões) relacionadas às peças identificadas e outros eventos relevantes. Organize cronologicamente.
|
61 |
+
|
62 |
+
6. **Destaque da Última Movimentação:** Identifique e descreva a última movimentação processual e seu impacto no estado atual do processo.
|
63 |
+
|
64 |
+
7. **Elaboração do Resumo Detalhado:** Redija um resumo narrativo e coeso na tag `<resumo_processo>`. Descreva o fluxo processual, as partes, o pedido inicial, as defesas, as principais decisões, os argumentos chave (fazendo referência às peças, artigos e jurisprudências identificados quando relevante) e a última movimentação. **O texto final nesta tag DEVE ter no mínimo 2000 caracteres.**
|
65 |
+
|
66 |
+
8. **Verificação Interna (Não incluir no output):** Antes de gerar a resposta final, realize uma verificação interna para garantir que:
|
67 |
+
* A lista de peças (`<pecas_identificadas>`) está correta e em formato de lista.
|
68 |
+
* As listas de artigos (`<artigos_mencionados>`) e jurisprudências (`<jurisprudencia_mencionada>`) contêm as informações solicitadas ou indicam claramente a ausência delas.
|
69 |
+
* O resumo (`<resumo_processo>`) é detalhado, cobre os pontos essenciais (incluindo última movimentação), tem fluxo lógico e **atinge o mínimo de 2000 caracteres**.
|
70 |
+
* O conteúdo é objetivo e baseado estritamente nos fatos do processo fornecido.
|
71 |
+
|
72 |
+
9. **Geração do Output Final:** Formate a resposta final **exclusivamente** com as tags definidas em `<formato_output>`, preenchendo-as conforme as instruções acima. Não inclua nenhuma outra informação ou texto fora dessas tags.
|
73 |
+
|
74 |
+
</instrucoes>
|
75 |
+
|
76 |
+
<formato_output>
|
77 |
+
<pecas_identificadas>
|
78 |
+
[Liste aqui, usando marcadores ou numeração, APENAS as peças processuais da lista expandida que foram encontradas no processo.]
|
79 |
+
</pecas_identificadas>
|
80 |
+
|
81 |
+
<artigos_mencionados>
|
82 |
+
[Liste aqui os artigos de lei identificados (ex: Art. X da Lei Y). Se nenhum for encontrado, escreva: "Nenhum artigo de lei foi explicitamente mencionado ou discutido de forma relevante no trecho analisado."]
|
83 |
+
</artigos_mencionados>
|
84 |
+
|
85 |
+
<jurisprudencia_mencionada>
|
86 |
+
[Liste aqui as jurisprudências identificadas com breve contexto (ex: Súmula Z do Tribunal W - citada sobre tema A; REsp 98765 - mencionado pela parte B sobre questão C). Se nenhuma for encontrada, escreva: "Nenhuma jurisprudência foi explicitamente mencionada ou discutida de forma relevante no trecho analisado."]
|
87 |
+
</jurisprudencia_mencionada>
|
88 |
|
89 |
<resumo_processo>
|
90 |
+
[Insira aqui o resumo detalhado e narrativo do processo jurídico, com no mínimo 2000 caracteres, conforme instrução 7.]
|
91 |
</resumo_processo>
|
92 |
+
</formato_output>
|
93 |
+
</prompt>
|
94 |
|
95 |
+
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
96 |
|
97 |
|
98 |
def contextual_prompt(
|
|
|
134 |
"""
|
135 |
|
136 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
137 |
# Novo nome --> prompt-auxiliar --> Para gerar documentos (é usado como auxiliar no prompt final)
|
138 |
prompt_auxiliar_inicio = """You are a language model specialized in producing concise and well-structured legal case summaries in Portuguese. You will receive a variable `context`, which contains information about a legal case. Your task is to read the `context` carefully and produce a summary report in Portuguese, following the specific format provided below. Do not include any additional comments or reasoning steps in your final answer."""
|
139 |
|
|
|
209 |
|
210 |
|
211 |
# VALOR ANTIGO DE PROMPT UTILIZADO NO QUERY DA PESQUISA POR SIMILARIDADE DO VECTOR_SEARCH
|
212 |
+
# prompt_auxiliar_SEM_CONTEXT = """Busque e analise os trechos mais relevantes deste processo legal, priorizando os seguintes elementos:
|
213 |
+
# Identificação do Caso:
|
214 |
+
# Nome das partes envolvidas
|
215 |
+
# Jurisdição e instância processual
|
216 |
+
# Disputa Central:
|
217 |
+
# Qual é a principal controvérsia do caso?
|
218 |
+
# Quais são os argumentos centrais apresentados por cada parte?
|
219 |
+
# Peças Processuais Essenciais:
|
220 |
+
# Petição Inicial: Identifique os pedidos, fundamentos jurídicos e fatos alegados.
|
221 |
+
# Contestação: Extraia os argumentos de defesa e eventuais preliminares processuais.
|
222 |
+
# Réplica (se houver): Destaque contrargumentos apresentados pelo autor.
|
223 |
+
# Pedido e Pedido Contraposto (se aplicável): Identifique os requerimentos de ambas as partes.
|
224 |
+
# Provas Produzidas:
|
225 |
+
# Documentos apresentados pelo autor e sua relevância.
|
226 |
+
# Documentos apresentados pelo réu e sua relevância.
|
227 |
+
# Audiências Realizadas:
|
228 |
+
# Conciliação: Houve acordo ou resistência de alguma parte?
|
229 |
+
# Instrução e Julgamento: Quais testemunhas foram ouvidas? Algum elemento probatório relevante foi destacado pelo juiz?
|
230 |
+
# Trechos Relevantes do Caso:
|
231 |
+
# Extraia e organize os principais excertos do processo que sustentam a decisão.
|
232 |
+
# Identifique precedentes ou fundamentos jurídicos citados.
|
233 |
+
# Caso haja decisão judicial, sintetize o raciocínio adotado pelo magistrado.
|
234 |
+
|
235 |
+
# Diretrizes de Análise:
|
236 |
+
# Priorize passagens de maior impacto jurídico, como fundamentos da decisão e discussões centrais do caso.
|
237 |
+
# Evite redundâncias: Se um mesmo argumento aparece repetidamente, sintetize-o.
|
238 |
+
# Mantenha a hierarquia lógica da decisão: Se houver votos divergentes ou decisões parciais, destaque essas diferenças.
|
239 |
+
# Caso haja lacunas na documentação, identifique e sinalize a ausência de informações relevantes."""
|
240 |
+
|
241 |
+
|
242 |
+
def prompt_gerar_query_dinamicamente(resumo_do_processo: str):
|
243 |
+
return f"""
|
244 |
+
- *Seu Papel:** Você é um assistente de IA especializado em análise de processos judiciais brasileiros.
|
245 |
+
- *Contexto:** Você receberá informações parciais ou as peças mais recentes de um processo judicial brasileiro dentro de uma variável chamada `context`.
|
246 |
+
|
247 |
+
{resumo_do_processo}
|
248 |
+
|
249 |
+
- *Sua Tarefa:**
|
250 |
+
|
251 |
+
1. **Analise internamente (não inclua na saída):** Identifique o tipo de processo (Cível, Criminal, Trabalhista, etc.) e a fase processual atual (Inicial, Instrução, Decisão, Recursal, etc.) com base no `context`. Use essa análise para informar a criação da query.
|
252 |
+
|
253 |
+
2. **Gere uma Query para Vector Store (ChromaDB):** Com base na sua análise do `context`, crie um prompt de consulta (query) em **linguagem natural e em português**. Este prompt será usado para buscar documentos em uma base de dados vetorial (ChromaDB) que contém **todas** as peças do processo referenciado no `context`. O objetivo desta query é recuperar as **principais peças processuais indispensáveis** para que um juiz brasileiro possa analisar e proferir uma decisão de mérito (sentença) ou uma decisão importante equivalente. A query deve ser formulada para buscar semanticamente por documentos como:
|
254 |
+
|
255 |
+
* Petição Inicial (completa, com causa de pedir e pedidos)
|
256 |
+
|
257 |
+
* Comprovação da Citação válida
|
258 |
+
|
259 |
+
* Contestação (completa, com todas as defesas e eventuais reconvenções)
|
260 |
+
|
261 |
+
* Réplica à contestação (se houver e for relevante)
|
262 |
+
|
263 |
+
* Decisão de Saneamento e Organização do Processo (se houver)
|
264 |
+
|
265 |
+
* Provas cruciais produzidas (Ex: laudos periciais integrais, atas de audiência de instrução com depoimentos chave, documentos essenciais juntados pelas partes)
|
266 |
+
|
267 |
+
* Alegações Finais ou Memoriais das partes
|
268 |
+
|
269 |
+
* Parecer do Ministério Público (quando obrigatório ou relevante)
|
270 |
+
|
271 |
+
* Decisões interlocutórias anteriores que definiram pontos importantes.
|
272 |
+
|
273 |
+
* *A query deve priorizar o conjunto documental essencial para o juiz formar sua convicção para julgamento, excluindo peças de mero expediente ou rotineiras.*
|
274 |
+
|
275 |
+
- *Formato da Saída:** Apresente **APENAS e EXCLUSIVAMENTE** o texto da query em linguagem natural que você gerou para a busca na vector store (ChromaDB). Não inclua nenhuma outra informação, texto introdutório, cabeçalhos, ou as análises internas de tipo/fase do processo.
|
276 |
+
- *Exemplo de Saída Esperada (APENAS o formato, NÃO o conteúdo exato):**
|
277 |
+
|
278 |
+
`Recuperar peças processuais fundamentais deste caso, incluindo petição inicial, contestação, provas determinantes como laudos e depoimentos, e manifestações finais das partes, necessárias para o julgamento pelo juiz.`
|
279 |
+
|
280 |
+
- *Importante:** Sua resposta final deve ser *somente* a string da query.
|
281 |
+
"""
|
_utils/gerar_relatorio_modelo_usuario/utils.py
CHANGED
@@ -95,6 +95,7 @@ async def get_response_from_auxiliar_contextual_prompt(full_text_as_array: List[
|
|
95 |
full_text += x
|
96 |
|
97 |
print("\nCRIANDO PROMPT AUXILIAR DO CONTEXTUAL")
|
|
|
98 |
prompt_auxiliar_summary = create_prompt_auxiliar_do_contextual_prompt(full_text)
|
99 |
|
100 |
print("\n\nprompt_auxiliar_summary[0:500]: ", prompt_auxiliar_summary[0:500])
|
|
|
95 |
full_text += x
|
96 |
|
97 |
print("\nCRIANDO PROMPT AUXILIAR DO CONTEXTUAL")
|
98 |
+
# PROMPT PARA GERAR O RESUMO INICIAL DO PROCESSO
|
99 |
prompt_auxiliar_summary = create_prompt_auxiliar_do_contextual_prompt(full_text)
|
100 |
|
101 |
print("\n\nprompt_auxiliar_summary[0:500]: ", prompt_auxiliar_summary[0:500])
|
_utils/resumo_completo_cursor.py
CHANGED
@@ -1,8 +1,12 @@
|
|
1 |
import os
|
|
|
2 |
from typing import cast
|
|
|
3 |
from _utils.bubble_integrations.enviar_resposta_final import enviar_resposta_final
|
4 |
from _utils.custom_exception_handler import custom_exception_handler_wihout_api_handler
|
5 |
-
from _utils.gerar_relatorio_modelo_usuario.prompts import
|
|
|
|
|
6 |
from _utils.gerar_relatorio_modelo_usuario.GerarDocumento import (
|
7 |
GerarDocumento,
|
8 |
)
|
@@ -20,6 +24,7 @@ from _utils.models.gerar_relatorio import (
|
|
20 |
)
|
21 |
import markdown
|
22 |
|
|
|
23 |
from _utils.utils import convert_markdown_to_HTML
|
24 |
|
25 |
|
@@ -104,6 +109,21 @@ async def get_llm_summary_answer_by_cursor_complete(
|
|
104 |
else:
|
105 |
chunks_processados = all_PDFs_chunks
|
106 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
107 |
# Create enhanced vector store and BM25 index
|
108 |
vector_store, bm25, chunk_ids = (
|
109 |
summarizer.vector_store.create_enhanced_vector_store(
|
@@ -118,7 +138,9 @@ async def get_llm_summary_answer_by_cursor_complete(
|
|
118 |
bm25,
|
119 |
chunk_ids,
|
120 |
llm_ultimas_requests,
|
121 |
-
|
|
|
|
|
122 |
)
|
123 |
print("\nTERMINOU DE FAZER A ÚLTIMA REQUISIÇÃO")
|
124 |
|
|
|
1 |
import os
|
2 |
+
from langchain_core.messages import HumanMessage
|
3 |
from typing import cast
|
4 |
+
from _utils.LLMs.LLM_class import LLM
|
5 |
from _utils.bubble_integrations.enviar_resposta_final import enviar_resposta_final
|
6 |
from _utils.custom_exception_handler import custom_exception_handler_wihout_api_handler
|
7 |
+
from _utils.gerar_relatorio_modelo_usuario.prompts import (
|
8 |
+
prompt_gerar_query_dinamicamente,
|
9 |
+
)
|
10 |
from _utils.gerar_relatorio_modelo_usuario.GerarDocumento import (
|
11 |
GerarDocumento,
|
12 |
)
|
|
|
24 |
)
|
25 |
import markdown
|
26 |
|
27 |
+
from _utils.prompts.Prompt_class import Prompt
|
28 |
from _utils.utils import convert_markdown_to_HTML
|
29 |
|
30 |
|
|
|
109 |
else:
|
110 |
chunks_processados = all_PDFs_chunks
|
111 |
|
112 |
+
llm = LLM()
|
113 |
+
prompt_para_gerar_query_dinamico = prompt_gerar_query_dinamicamente(
|
114 |
+
cast(str, response_auxiliar_summary)
|
115 |
+
)
|
116 |
+
|
117 |
+
print("\nCOMEÇANDO REQUISIÇÃO PARA GERAR O QUERY DINAMICAMENTE DO VECTOR STORE")
|
118 |
+
query_gerado_dinamicamente_para_o_vector_store = await llm.google_gemini(
|
119 |
+
"gemini-2.5-pro-exp-03-25"
|
120 |
+
).ainvoke([HumanMessage(content=prompt_para_gerar_query_dinamico)])
|
121 |
+
|
122 |
+
print(
|
123 |
+
"\nquery_gerado_dinamicamente_para_o_vector_store: ",
|
124 |
+
query_gerado_dinamicamente_para_o_vector_store.content,
|
125 |
+
)
|
126 |
+
|
127 |
# Create enhanced vector store and BM25 index
|
128 |
vector_store, bm25, chunk_ids = (
|
129 |
summarizer.vector_store.create_enhanced_vector_store(
|
|
|
138 |
bm25,
|
139 |
chunk_ids,
|
140 |
llm_ultimas_requests,
|
141 |
+
cast(
|
142 |
+
str, query_gerado_dinamicamente_para_o_vector_store.content
|
143 |
+
), # prompt_auxiliar_SEM_CONTEXT,
|
144 |
)
|
145 |
print("\nTERMINOU DE FAZER A ÚLTIMA REQUISIÇÃO")
|
146 |
|
gerar_documento/serializer.py
CHANGED
@@ -4,6 +4,7 @@ from _utils.gerar_relatorio_modelo_usuario.prompts import (
|
|
4 |
prompt_gerar_documento,
|
5 |
prompt_auxiliar_padrao,
|
6 |
)
|
|
|
7 |
|
8 |
user_message = "What are the main points of this document?"
|
9 |
|
@@ -53,6 +54,7 @@ class GerarDocumentoSerializer(ResumoCursorSerializer):
|
|
53 |
form_response_id = serializers.CharField(required=True)
|
54 |
version = serializers.CharField(required=True)
|
55 |
|
|
|
56 |
class GerarDocumentoComPDFProprioSerializer(ResumoCursorSerializer):
|
57 |
system_prompt = None
|
58 |
# prompt_auxiliar = serializers.CharField(
|
@@ -80,3 +82,16 @@ class GerarDocumentoComPDFProprioSerializer(ResumoCursorSerializer):
|
|
80 |
should_have_contextual_chunks = serializers.BooleanField(default=False) # type: ignore
|
81 |
should_use_llama_parse = serializers.BooleanField(required=False, default=False) # type: ignore
|
82 |
llm_ultimas_requests = serializers.CharField(required=False, default="gpt-4o-mini")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
prompt_gerar_documento,
|
5 |
prompt_auxiliar_padrao,
|
6 |
)
|
7 |
+
from setup.environment import default_model
|
8 |
|
9 |
user_message = "What are the main points of this document?"
|
10 |
|
|
|
54 |
form_response_id = serializers.CharField(required=True)
|
55 |
version = serializers.CharField(required=True)
|
56 |
|
57 |
+
|
58 |
class GerarDocumentoComPDFProprioSerializer(ResumoCursorSerializer):
|
59 |
system_prompt = None
|
60 |
# prompt_auxiliar = serializers.CharField(
|
|
|
82 |
should_have_contextual_chunks = serializers.BooleanField(default=False) # type: ignore
|
83 |
should_use_llama_parse = serializers.BooleanField(required=False, default=False) # type: ignore
|
84 |
llm_ultimas_requests = serializers.CharField(required=False, default="gpt-4o-mini")
|
85 |
+
|
86 |
+
|
87 |
+
class GerarEmentaSerializer(serializers.Serializer):
|
88 |
+
files = serializers.ListField(child=FileInfoSerializer(), required=True)
|
89 |
+
user_message = serializers.CharField(required=False, default="")
|
90 |
+
chunk_size = serializers.IntegerField(required=False, default=3500)
|
91 |
+
chunk_overlap = serializers.IntegerField(required=False, default=800)
|
92 |
+
bubble_editor_version = serializers.CharField(
|
93 |
+
required=False, default="version-test"
|
94 |
+
) # Será o valor utilizado dentro da URL da requisição pro Bubble
|
95 |
+
doc_id = serializers.CharField(required=True)
|
96 |
+
form_response_id = serializers.CharField(required=True)
|
97 |
+
version = serializers.CharField(required=True)
|
gerar_documento/views.py
CHANGED
@@ -1,4 +1,10 @@
|
|
1 |
from typing import Any, Dict, cast
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
from setup.easy_imports import (
|
3 |
Response,
|
4 |
AsyncAPIView,
|
@@ -15,8 +21,10 @@ from _utils.gerar_relatorio_modelo_usuario.prompts import prompt_auxiliar_inicio
|
|
15 |
from .serializer import (
|
16 |
GerarDocumentoComPDFProprioSerializer,
|
17 |
GerarDocumentoSerializer,
|
|
|
18 |
)
|
19 |
import asyncio
|
|
|
20 |
|
21 |
|
22 |
class GerarDocumentoView(AsyncAPIView):
|
@@ -28,12 +36,12 @@ class GerarDocumentoView(AsyncAPIView):
|
|
28 |
)
|
29 |
async def post(self, request):
|
30 |
print(f"\n\nDATA E HORA DA REQUISIÇÃO: {datetime.now()}")
|
31 |
-
print(
|
32 |
serializer = GerarDocumentoSerializer(data=request.data)
|
33 |
if serializer.is_valid(raise_exception=True):
|
34 |
if not serializer.validated_data:
|
35 |
raise ValueError("Erro no validated_data")
|
36 |
-
|
37 |
async def proccess_data_after_response():
|
38 |
# await asyncio.sleep(0)
|
39 |
data = cast(Dict[str, Any], serializer.validated_data)
|
@@ -57,12 +65,16 @@ class GerarDocumentoView(AsyncAPIView):
|
|
57 |
# remove_pdf_temp_files(listaPDFs)
|
58 |
|
59 |
# print("PRÓXIMA LINHA ENVIA A RESPOSTA A QUEM FEZ A REQUISIÇÃO")
|
60 |
-
|
61 |
# asyncio.create_task(proccess_data_after_response())
|
62 |
loop = asyncio.get_running_loop()
|
63 |
-
loop.run_in_executor(
|
64 |
-
|
65 |
-
|
|
|
|
|
|
|
|
|
66 |
|
67 |
|
68 |
class GerarDocumentoComPDFProprioView(AsyncAPIView):
|
@@ -90,3 +102,101 @@ class GerarDocumentoComPDFProprioView(AsyncAPIView):
|
|
90 |
remove_pdf_temp_files(listaPDFs)
|
91 |
print("PRÓXIMA LINHA ENVIA A RESPOSTA A QUEM FEZ A REQUISIÇÃO")
|
92 |
return Response({"resposta": resposta_llm})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
from typing import Any, Dict, cast
|
2 |
+
from langchain.prompts import PromptTemplate
|
3 |
+
from _utils.LLMs.LLM_class import LLM
|
4 |
+
from _utils.gerar_relatorio_modelo_usuario.utils import (
|
5 |
+
get_full_text_and_all_PDFs_chunks,
|
6 |
+
)
|
7 |
+
from _utils.prompts.Prompt_class import Prompt
|
8 |
from setup.easy_imports import (
|
9 |
Response,
|
10 |
AsyncAPIView,
|
|
|
21 |
from .serializer import (
|
22 |
GerarDocumentoComPDFProprioSerializer,
|
23 |
GerarDocumentoSerializer,
|
24 |
+
GerarEmentaSerializer,
|
25 |
)
|
26 |
import asyncio
|
27 |
+
from _utils.splitters.Splitter_class import Splitter
|
28 |
|
29 |
|
30 |
class GerarDocumentoView(AsyncAPIView):
|
|
|
36 |
)
|
37 |
async def post(self, request):
|
38 |
print(f"\n\nDATA E HORA DA REQUISIÇÃO: {datetime.now()}")
|
39 |
+
print("request.data: ", request.data)
|
40 |
serializer = GerarDocumentoSerializer(data=request.data)
|
41 |
if serializer.is_valid(raise_exception=True):
|
42 |
if not serializer.validated_data:
|
43 |
raise ValueError("Erro no validated_data")
|
44 |
+
|
45 |
async def proccess_data_after_response():
|
46 |
# await asyncio.sleep(0)
|
47 |
data = cast(Dict[str, Any], serializer.validated_data)
|
|
|
65 |
# remove_pdf_temp_files(listaPDFs)
|
66 |
|
67 |
# print("PRÓXIMA LINHA ENVIA A RESPOSTA A QUEM FEZ A REQUISIÇÃO")
|
68 |
+
|
69 |
# asyncio.create_task(proccess_data_after_response())
|
70 |
loop = asyncio.get_running_loop()
|
71 |
+
loop.run_in_executor(
|
72 |
+
None, lambda: asyncio.run(proccess_data_after_response())
|
73 |
+
)
|
74 |
+
|
75 |
+
return Response(
|
76 |
+
{"resposta": "Requisição está sendo processada em segundo plano"}
|
77 |
+
)
|
78 |
|
79 |
|
80 |
class GerarDocumentoComPDFProprioView(AsyncAPIView):
|
|
|
102 |
remove_pdf_temp_files(listaPDFs)
|
103 |
print("PRÓXIMA LINHA ENVIA A RESPOSTA A QUEM FEZ A REQUISIÇÃO")
|
104 |
return Response({"resposta": resposta_llm})
|
105 |
+
|
106 |
+
|
107 |
+
class GerarEmentaView(AsyncAPIView):
|
108 |
+
serializer = {}
|
109 |
+
|
110 |
+
@extend_schema(
|
111 |
+
request=GerarDocumentoSerializer,
|
112 |
+
)
|
113 |
+
async def post(self, request):
|
114 |
+
print(f"\n\nDATA E HORA DA REQUISIÇÃO: {datetime.now()}")
|
115 |
+
print("request.data: ", request.data)
|
116 |
+
serializer = GerarEmentaSerializer(data=request.data)
|
117 |
+
if serializer.is_valid(raise_exception=True):
|
118 |
+
if not serializer.validated_data:
|
119 |
+
raise ValueError("Erro no validated_data")
|
120 |
+
|
121 |
+
async def proccess_data_after_response():
|
122 |
+
data = cast(Dict[str, Any], serializer.validated_data)
|
123 |
+
self.serializer = data
|
124 |
+
|
125 |
+
listaPDFs = [l["link_arquivo"] for l in data["files"]]
|
126 |
+
print("\n\nlistaPDFs: ", listaPDFs)
|
127 |
+
|
128 |
+
all_PDFs_chunks, full_text_as_array = (
|
129 |
+
await get_full_text_and_all_PDFs_chunks(
|
130 |
+
listaPDFs,
|
131 |
+
Splitter(data["chunk_size"], data["chunk_overlap"]),
|
132 |
+
False,
|
133 |
+
True,
|
134 |
+
)
|
135 |
+
)
|
136 |
+
full_text = "".join(full_text_as_array)
|
137 |
+
|
138 |
+
llm = LLM()
|
139 |
+
prompt_template = PromptTemplate(
|
140 |
+
input_variables=["context"], template=full_text
|
141 |
+
)
|
142 |
+
response = await llm.google_gemini().ainvoke(
|
143 |
+
prompt_template.format(context=full_text)
|
144 |
+
)
|
145 |
+
|
146 |
+
print("\n\nresposta_llm: ", response.content)
|
147 |
+
|
148 |
+
# asyncio.create_task(proccess_data_after_response())
|
149 |
+
loop = asyncio.get_running_loop()
|
150 |
+
loop.run_in_executor(
|
151 |
+
None, lambda: asyncio.run(proccess_data_after_response())
|
152 |
+
)
|
153 |
+
|
154 |
+
return Response(
|
155 |
+
{"resposta": "Requisição está sendo processada em segundo plano"}
|
156 |
+
)
|
157 |
+
|
158 |
+
|
159 |
+
class GerarEmentaComPDFProprioView(AsyncAPIView):
|
160 |
+
parser_classes = [MultiPartParser]
|
161 |
+
serializer = {}
|
162 |
+
|
163 |
+
@extend_schema(
|
164 |
+
request=GerarDocumentoComPDFProprioSerializer,
|
165 |
+
)
|
166 |
+
async def post(self, request):
|
167 |
+
print(f"\n\nDATA E HORA DA REQUISIÇÃO: {datetime.now()}")
|
168 |
+
serializer = GerarDocumentoComPDFProprioSerializer(data=request.data)
|
169 |
+
if serializer.is_valid(raise_exception=True):
|
170 |
+
data = cast(Dict[str, Any], serializer.validated_data)
|
171 |
+
print("\n\ndata: ", data)
|
172 |
+
self.serializer = data
|
173 |
+
|
174 |
+
data = cast(Dict[str, Any], serializer.validated_data)
|
175 |
+
self.serializer = data
|
176 |
+
|
177 |
+
listaPDFs = [l["link_arquivo"] for l in data["files"]]
|
178 |
+
print("\n\nlistaPDFs: ", listaPDFs)
|
179 |
+
|
180 |
+
all_PDFs_chunks, full_text_as_array = (
|
181 |
+
await get_full_text_and_all_PDFs_chunks(
|
182 |
+
listaPDFs,
|
183 |
+
Splitter(data["chunk_size"], data["chunk_overlap"]),
|
184 |
+
False,
|
185 |
+
True,
|
186 |
+
)
|
187 |
+
)
|
188 |
+
full_text = "".join(full_text_as_array)
|
189 |
+
|
190 |
+
llm = LLM()
|
191 |
+
prompt_template = PromptTemplate(
|
192 |
+
input_variables=["context"], template=full_text
|
193 |
+
)
|
194 |
+
response = await llm.google_gemini().ainvoke(
|
195 |
+
prompt_template.format(context=full_text)
|
196 |
+
)
|
197 |
+
|
198 |
+
print("\n\nresposta_llm: ", response.content)
|
199 |
+
|
200 |
+
remove_pdf_temp_files(listaPDFs)
|
201 |
+
print("PRÓXIMA LINHA ENVIA A RESPOSTA A QUEM FEZ A REQUISIÇÃO")
|
202 |
+
return Response({"resposta": response.content})
|