Spaces:
Sleeping
Sleeping
luanpoppe
commited on
Commit
·
d8410b4
1
Parent(s):
2776b52
feat: adicionando a geração do título do documento
Browse files
_utils/bubble_integrations/enviar_resposta_final.py
CHANGED
@@ -1,7 +1,15 @@
|
|
1 |
import requests
|
2 |
import os
|
3 |
|
4 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
url = f"https://vella.app.br/version-{version}/api/1.1/wf/texto_completo"
|
6 |
headers = {"Authorization": f"Bearer {os.environ.get("BUBBLE_TOKEN")}"}
|
7 |
|
@@ -10,5 +18,6 @@ def enviar_resposta_final(doc_id: str, form_response_id: str, version: str, text
|
|
10 |
"form_response_id": form_response_id,
|
11 |
"texto_completo": texto_completo,
|
12 |
"erro": error,
|
|
|
13 |
}
|
14 |
return requests.post(url, body, headers=headers)
|
|
|
1 |
import requests
|
2 |
import os
|
3 |
|
4 |
+
|
5 |
+
def enviar_resposta_final(
|
6 |
+
doc_id: str,
|
7 |
+
form_response_id: str,
|
8 |
+
version: str,
|
9 |
+
texto_completo: str,
|
10 |
+
error: bool = False,
|
11 |
+
titulo_do_documento: str = "Erro ao gerar documento",
|
12 |
+
):
|
13 |
url = f"https://vella.app.br/version-{version}/api/1.1/wf/texto_completo"
|
14 |
headers = {"Authorization": f"Bearer {os.environ.get("BUBBLE_TOKEN")}"}
|
15 |
|
|
|
18 |
"form_response_id": form_response_id,
|
19 |
"texto_completo": texto_completo,
|
20 |
"erro": error,
|
21 |
+
"titulo_do_documento": titulo_do_documento,
|
22 |
}
|
23 |
return requests.post(url, body, headers=headers)
|
_utils/gerar_relatorio_modelo_usuario/llm_calls.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1 |
import os
|
|
|
2 |
|
3 |
from pydantic import SecretStr
|
4 |
from _utils.LLMs.LLM_class import LLM
|
@@ -54,7 +55,7 @@ def gpt_answer(
|
|
54 |
else:
|
55 |
return response.content
|
56 |
|
57 |
-
async def agemini_answer(prompt, model="gemini-2.0-flash"):
|
58 |
gemini = llm.google_gemini(model)
|
59 |
resposta = await gemini.ainvoke([HumanMessage(content=prompt)])
|
60 |
return resposta.content
|
|
|
1 |
import os
|
2 |
+
from typing import Literal
|
3 |
|
4 |
from pydantic import SecretStr
|
5 |
from _utils.LLMs.LLM_class import LLM
|
|
|
55 |
else:
|
56 |
return response.content
|
57 |
|
58 |
+
async def agemini_answer(prompt, model: Literal["gemini-2.0-flash", "gemini-2.0-flash-lite"]="gemini-2.0-flash"):
|
59 |
gemini = llm.google_gemini(model)
|
60 |
resposta = await gemini.ainvoke([HumanMessage(content=prompt)])
|
61 |
return resposta.content
|
_utils/gerar_relatorio_modelo_usuario/utils.py
CHANGED
@@ -2,6 +2,7 @@ from typing import List, Tuple
|
|
2 |
from langchain_core.documents import Document
|
3 |
from langchain_core.messages import HumanMessage
|
4 |
|
|
|
5 |
from _utils.splitters.Splitter_class import Splitter
|
6 |
from _utils.LLMs.LLM_class import LLM
|
7 |
from _utils.gerar_relatorio_modelo_usuario.prompts import (
|
@@ -33,26 +34,28 @@ def gerar_resposta_compilada(serializer):
|
|
33 |
"prompt_gerar_documento": serializer["prompt_gerar_documento"][0:200],
|
34 |
}
|
35 |
|
|
|
36 |
def check_regex_patterns(context: str, lista_de_document_ids: List[int]):
|
37 |
patterns = [
|
38 |
# r"\[*([\d.\-]+)\]*\s*---\s*\[*([^]]+)\]*\s*---\s*\[*([^]]+)\]*\s*</chunk_context>", # PRIMEIRO DE TODOS
|
39 |
# r"<chunk_context>\s*([\d.\-]+)\s*---\s*([^<]+)\s*---\s*([^<]+)\s*</chunk_context>",
|
40 |
r"<chunk_context>\s*(\d+)(?:\s*-\s*Pág\.\s*\d+)?\s*---\s*([^-\n]+)\s*---\s*([^<]+)</chunk_context>",
|
41 |
-
r"<chunk_context>\s*(?:\[*([\d]+)\]*\s*[-–]*\s*(?:Pág\.\s*\d+\s*[-–]*)?)?\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*</chunk_context>"
|
42 |
# r"\[([\d.\-]+)\]\s*---\s*\[([^]]+)\]\s*---\s*\[([^]]+)\]\s*</chunk_context>",
|
43 |
# r"<chunk_context>\s*\[?([\d.\-]+)\]?\s*---\s*\[?([^\]\[]+?)\]?\s*---\s*\[?([^<]+?)\]?\s*</chunk_context>",
|
44 |
# r"<chunk_context>\s*\[([\d.\-]+)\]\s*---\s*\[([^\]]+)\]\s*---\s*\[([^\]]+)\]\s*</chunk_context>"
|
45 |
# r"<chunk_context>\s*\[?([\d.\-\s]+)\]?\s*---\s*\[?([^\]\[]+?)\]?\s*---\s*\[?([\s\S]+?)\]?\s*</chunk_context>",
|
46 |
]
|
47 |
-
|
48 |
for pattern in patterns:
|
49 |
matches = re.findall(pattern, context, re.DOTALL)
|
50 |
if len(matches) == len(lista_de_document_ids):
|
51 |
print("\n--------------- REGEX DO CONTEXTUAL FUNCIONOU")
|
52 |
break
|
53 |
-
|
54 |
return matches
|
55 |
|
|
|
56 |
def validate_many_chunks_in_one_request(
|
57 |
response: str, lista_de_document_ids: List[int]
|
58 |
):
|
@@ -134,3 +137,9 @@ async def get_full_text_and_all_PDFs_chunks(
|
|
134 |
all_PDFs_chunks = all_PDFs_chunks + chunks
|
135 |
|
136 |
return all_PDFs_chunks, pages
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
from langchain_core.documents import Document
|
3 |
from langchain_core.messages import HumanMessage
|
4 |
|
5 |
+
from _utils.gerar_relatorio_modelo_usuario.llm_calls import agemini_answer
|
6 |
from _utils.splitters.Splitter_class import Splitter
|
7 |
from _utils.LLMs.LLM_class import LLM
|
8 |
from _utils.gerar_relatorio_modelo_usuario.prompts import (
|
|
|
34 |
"prompt_gerar_documento": serializer["prompt_gerar_documento"][0:200],
|
35 |
}
|
36 |
|
37 |
+
|
38 |
def check_regex_patterns(context: str, lista_de_document_ids: List[int]):
|
39 |
patterns = [
|
40 |
# r"\[*([\d.\-]+)\]*\s*---\s*\[*([^]]+)\]*\s*---\s*\[*([^]]+)\]*\s*</chunk_context>", # PRIMEIRO DE TODOS
|
41 |
# r"<chunk_context>\s*([\d.\-]+)\s*---\s*([^<]+)\s*---\s*([^<]+)\s*</chunk_context>",
|
42 |
r"<chunk_context>\s*(\d+)(?:\s*-\s*Pág\.\s*\d+)?\s*---\s*([^-\n]+)\s*---\s*([^<]+)</chunk_context>",
|
43 |
+
r"<chunk_context>\s*(?:\[*([\d]+)\]*\s*[-–]*\s*(?:Pág\.\s*\d+\s*[-–]*)?)?\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*</chunk_context>",
|
44 |
# r"\[([\d.\-]+)\]\s*---\s*\[([^]]+)\]\s*---\s*\[([^]]+)\]\s*</chunk_context>",
|
45 |
# r"<chunk_context>\s*\[?([\d.\-]+)\]?\s*---\s*\[?([^\]\[]+?)\]?\s*---\s*\[?([^<]+?)\]?\s*</chunk_context>",
|
46 |
# r"<chunk_context>\s*\[([\d.\-]+)\]\s*---\s*\[([^\]]+)\]\s*---\s*\[([^\]]+)\]\s*</chunk_context>"
|
47 |
# r"<chunk_context>\s*\[?([\d.\-\s]+)\]?\s*---\s*\[?([^\]\[]+?)\]?\s*---\s*\[?([\s\S]+?)\]?\s*</chunk_context>",
|
48 |
]
|
49 |
+
|
50 |
for pattern in patterns:
|
51 |
matches = re.findall(pattern, context, re.DOTALL)
|
52 |
if len(matches) == len(lista_de_document_ids):
|
53 |
print("\n--------------- REGEX DO CONTEXTUAL FUNCIONOU")
|
54 |
break
|
55 |
+
|
56 |
return matches
|
57 |
|
58 |
+
|
59 |
def validate_many_chunks_in_one_request(
|
60 |
response: str, lista_de_document_ids: List[int]
|
61 |
):
|
|
|
137 |
all_PDFs_chunks = all_PDFs_chunks + chunks
|
138 |
|
139 |
return all_PDFs_chunks, pages
|
140 |
+
|
141 |
+
|
142 |
+
async def generate_document_title(resumo_para_gerar_titulo: str):
|
143 |
+
prompt = f"Você é um assistente jurídico e irá receber abaixo o resumo de um documento jurídico. Quero que você gere um título para este documento. Mande como resposta apenas o título gerado, nada mais. Aqui está um título de exemplo pra você se basear ao criar um novo: <titulo_de_exemplo>Ação Penal por Furto Qualificado nº 0002269-86.2009.805.0032<titulo_de_exemplo>\n\nSegue abaixo o resumo do documento jurídico:\n{resumo_para_gerar_titulo}"
|
144 |
+
response = await agemini_answer(prompt, "gemini-2.0-flash-lite")
|
145 |
+
return response
|
_utils/resumo_completo_cursor.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1 |
import os
|
|
|
2 |
from _utils.bubble_integrations.enviar_resposta_final import enviar_resposta_final
|
3 |
from _utils.custom_exception_handler import custom_exception_handler_wihout_api_handler
|
4 |
from _utils.gerar_relatorio_modelo_usuario.prompts import prompt_auxiliar_SEM_CONTEXT
|
@@ -9,6 +10,7 @@ from _utils.gerar_relatorio_modelo_usuario.contextual_retriever import (
|
|
9 |
ContextualRetriever,
|
10 |
)
|
11 |
from _utils.gerar_relatorio_modelo_usuario.utils import (
|
|
|
12 |
gerar_resposta_compilada,
|
13 |
get_full_text_and_all_PDFs_chunks,
|
14 |
get_response_from_auxiliar_contextual_prompt,
|
@@ -20,6 +22,7 @@ import markdown
|
|
20 |
|
21 |
from _utils.utils import convert_markdown_to_HTML
|
22 |
|
|
|
23 |
def reciprocal_rank_fusion(result_lists, weights=None):
|
24 |
"""Combine multiple ranked lists using reciprocal rank fusion"""
|
25 |
fused_scores = {}
|
@@ -79,14 +82,17 @@ async def get_llm_summary_answer_by_cursor_complete(
|
|
79 |
)
|
80 |
|
81 |
all_PDFs_chunks, full_text_as_array = await get_full_text_and_all_PDFs_chunks(
|
82 |
-
listaPDFs,
|
|
|
|
|
|
|
83 |
)
|
84 |
|
85 |
is_contextualized_chunk = serializer["should_have_contextual_chunks"]
|
86 |
|
87 |
if is_contextualized_chunk:
|
88 |
-
response_auxiliar_summary =
|
89 |
-
full_text_as_array
|
90 |
)
|
91 |
|
92 |
print("\nCOMEÇANDO A FAZER AS REQUISIÇÕES DO CONTEXTUAL")
|
@@ -108,7 +114,11 @@ async def get_llm_summary_answer_by_cursor_complete(
|
|
108 |
llm_ultimas_requests = serializer["llm_ultimas_requests"]
|
109 |
print("\nCOMEÇANDO A FAZER ÚLTIMA REQUISIÇÃO")
|
110 |
structured_summaries = await summarizer.gerar_documento_final(
|
111 |
-
vector_store,
|
|
|
|
|
|
|
|
|
112 |
)
|
113 |
print("\nTERMINOU DE FAZER A ÚLTIMA REQUISIÇÃO")
|
114 |
|
@@ -127,6 +137,14 @@ async def get_llm_summary_answer_by_cursor_complete(
|
|
127 |
texto_completo_como_html = convert_markdown_to_HTML(texto_completo)
|
128 |
print("\ntexto_completo_como_html", texto_completo_como_html)
|
129 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
130 |
if isBubble:
|
131 |
print("COMEÇANDO A REQUISIÇÃO FINAL PARA O BUBBLE")
|
132 |
enviar_resposta_final(
|
@@ -135,11 +153,13 @@ async def get_llm_summary_answer_by_cursor_complete(
|
|
135 |
serializer["version"],
|
136 |
texto_completo_como_html,
|
137 |
False,
|
|
|
138 |
)
|
139 |
print("TERMINOU A REQUISIÇÃO FINAL PARA O BUBBLE")
|
140 |
|
141 |
return {
|
142 |
"texto_completo": texto_completo_como_html,
|
|
|
143 |
"resultado": structured_summaries,
|
144 |
"parametros-utilizados": gerar_resposta_compilada(serializer),
|
145 |
}
|
|
|
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 prompt_auxiliar_SEM_CONTEXT
|
|
|
10 |
ContextualRetriever,
|
11 |
)
|
12 |
from _utils.gerar_relatorio_modelo_usuario.utils import (
|
13 |
+
generate_document_title,
|
14 |
gerar_resposta_compilada,
|
15 |
get_full_text_and_all_PDFs_chunks,
|
16 |
get_response_from_auxiliar_contextual_prompt,
|
|
|
22 |
|
23 |
from _utils.utils import convert_markdown_to_HTML
|
24 |
|
25 |
+
|
26 |
def reciprocal_rank_fusion(result_lists, weights=None):
|
27 |
"""Combine multiple ranked lists using reciprocal rank fusion"""
|
28 |
fused_scores = {}
|
|
|
82 |
)
|
83 |
|
84 |
all_PDFs_chunks, full_text_as_array = await get_full_text_and_all_PDFs_chunks(
|
85 |
+
listaPDFs,
|
86 |
+
summarizer.splitter,
|
87 |
+
serializer["should_use_llama_parse"],
|
88 |
+
isBubble,
|
89 |
)
|
90 |
|
91 |
is_contextualized_chunk = serializer["should_have_contextual_chunks"]
|
92 |
|
93 |
if is_contextualized_chunk:
|
94 |
+
response_auxiliar_summary = (
|
95 |
+
await get_response_from_auxiliar_contextual_prompt(full_text_as_array)
|
96 |
)
|
97 |
|
98 |
print("\nCOMEÇANDO A FAZER AS REQUISIÇÕES DO CONTEXTUAL")
|
|
|
114 |
llm_ultimas_requests = serializer["llm_ultimas_requests"]
|
115 |
print("\nCOMEÇANDO A FAZER ÚLTIMA REQUISIÇÃO")
|
116 |
structured_summaries = await summarizer.gerar_documento_final(
|
117 |
+
vector_store,
|
118 |
+
bm25,
|
119 |
+
chunk_ids,
|
120 |
+
llm_ultimas_requests,
|
121 |
+
prompt_auxiliar_SEM_CONTEXT,
|
122 |
)
|
123 |
print("\nTERMINOU DE FAZER A ÚLTIMA REQUISIÇÃO")
|
124 |
|
|
|
137 |
texto_completo_como_html = convert_markdown_to_HTML(texto_completo)
|
138 |
print("\ntexto_completo_como_html", texto_completo_como_html)
|
139 |
|
140 |
+
if is_contextualized_chunk:
|
141 |
+
prompt_titulo_do_documento = response_auxiliar_summary
|
142 |
+
else:
|
143 |
+
prompt_titulo_do_documento = texto_completo_como_html
|
144 |
+
titulo_do_documento = await generate_document_title(
|
145 |
+
cast(str, prompt_titulo_do_documento)
|
146 |
+
)
|
147 |
+
|
148 |
if isBubble:
|
149 |
print("COMEÇANDO A REQUISIÇÃO FINAL PARA O BUBBLE")
|
150 |
enviar_resposta_final(
|
|
|
153 |
serializer["version"],
|
154 |
texto_completo_como_html,
|
155 |
False,
|
156 |
+
cast(str, titulo_do_documento),
|
157 |
)
|
158 |
print("TERMINOU A REQUISIÇÃO FINAL PARA O BUBBLE")
|
159 |
|
160 |
return {
|
161 |
"texto_completo": texto_completo_como_html,
|
162 |
+
"titulo_do_documento": titulo_do_documento,
|
163 |
"resultado": structured_summaries,
|
164 |
"parametros-utilizados": gerar_resposta_compilada(serializer),
|
165 |
}
|