Spaces:
Running
Running
File size: 6,048 Bytes
78209bc d07865c d8410b4 d07865c f490f11 78209bc 12d3e1a 3d2062e 095b5f1 12d3e1a 78209bc d8410b4 f490f11 d8410b4 f490f11 d8410b4 f490f11 d8410b4 f490f11 78209bc d8410b4 c5586ab 78209bc f490f11 78209bc c5586ab de78af1 78209bc c5586ab 78209bc de78af1 78209bc d07865c 0f952b3 d07865c 0f952b3 d07865c 0f952b3 dc376b6 d07865c f490f11 d07865c f490f11 d07865c d8410b4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
from typing import List, Tuple
from langchain_core.documents import Document
from langchain_core.messages import HumanMessage
from _utils.gerar_relatorio_modelo_usuario.llm_calls import agemini_answer
from _utils.splitters.Splitter_class import Splitter
from _utils.LLMs.LLM_class import LLM
from _utils.gerar_relatorio_modelo_usuario.prompts import (
create_prompt_auxiliar_do_contextual_prompt,
)
import re
def gerar_resposta_compilada(serializer):
return {
"num_chunks_retrieval": serializer["num_chunks_retrieval"],
"embedding_weight": serializer["embedding_weight"],
"bm25_weight": serializer["bm25_weight"],
"context_window": serializer["context_window"],
"chunk_overlap": serializer["chunk_overlap"],
"num_k_rerank": serializer["num_k_rerank"],
"model_cohere_rerank": serializer["model_cohere_rerank"],
"more_initial_chunks_for_reranking": serializer[
"more_initial_chunks_for_reranking"
],
"claude_context_model": serializer["claude_context_model"],
"gpt_temperature": serializer["gpt_temperature"],
"user_message": serializer["user_message"],
"model": serializer["model"],
"hf_embedding": serializer["hf_embedding"],
"chunk_size": serializer["chunk_size"],
"chunk_overlap": serializer["chunk_overlap"],
# "prompt_auxiliar": serializer["prompt_auxiliar"],
"prompt_gerar_documento": serializer["prompt_gerar_documento"][0:200],
}
def check_regex_patterns(context: str, lista_de_document_ids: List[int]):
patterns = [
# r"\[*([\d.\-]+)\]*\s*---\s*\[*([^]]+)\]*\s*---\s*\[*([^]]+)\]*\s*</chunk_context>", # PRIMEIRO DE TODOS
# r"<chunk_context>\s*([\d.\-]+)\s*---\s*([^<]+)\s*---\s*([^<]+)\s*</chunk_context>",
r"<chunk_context>\s*(\d+)(?:\s*-\s*Pág\.\s*\d+)?\s*---\s*([^-\n]+)\s*---\s*([^<]+)</chunk_context>",
r"<chunk_context>\s*(?:\[*([\d]+)\]*\s*[-–]*\s*(?:Pág\.\s*\d+\s*[-–]*)?)?\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*[-–]*\s*\[*([^\]]+)\]*\s*</chunk_context>",
# r"\[([\d.\-]+)\]\s*---\s*\[([^]]+)\]\s*---\s*\[([^]]+)\]\s*</chunk_context>",
# r"<chunk_context>\s*\[?([\d.\-]+)\]?\s*---\s*\[?([^\]\[]+?)\]?\s*---\s*\[?([^<]+?)\]?\s*</chunk_context>",
# r"<chunk_context>\s*\[([\d.\-]+)\]\s*---\s*\[([^\]]+)\]\s*---\s*\[([^\]]+)\]\s*</chunk_context>"
# r"<chunk_context>\s*\[?([\d.\-\s]+)\]?\s*---\s*\[?([^\]\[]+?)\]?\s*---\s*\[?([\s\S]+?)\]?\s*</chunk_context>",
]
for pattern in patterns:
matches = re.findall(pattern, context, re.DOTALL)
if len(matches) == len(lista_de_document_ids):
print("\n--------------- REGEX DO CONTEXTUAL FUNCIONOU")
break
return matches
def validate_many_chunks_in_one_request(
response: str, lista_de_document_ids: List[int]
):
context = (
response.replace("document_id: ", "")
.replace("document_id:", "")
.replace("DOCUMENT_ID: ", "")
.replace("DOCUMENT_ID: ", "")
)
# pattern = r"\[(\d+|[-.]+)\] --- (.+?) --- (.+?)</chunk_context>" # Funciona para quando a resposta do LLM não vem com "document_id" escrito
matches = check_regex_patterns(context, lista_de_document_ids)
matches_as_list = []
for index, match in enumerate(list(matches)):
if index >= 20:
break
resultado = match[0].replace(".", "").replace("-", "")
resultado = lista_de_document_ids[index]
matches_as_list.append((resultado, match[1], match[2]))
if len(matches) == 0:
print(
"----------- ERROU NA TENTATIVA ATUAL DE FORMATAR O CONTEXTUAL -----------"
)
return False
return matches_as_list
# Esta função gera a resposta que será usada em cada um das requisições de cada chunk
async def get_response_from_auxiliar_contextual_prompt(full_text_as_array: List[str]):
full_text = ""
for x in full_text_as_array:
full_text += x
print("\nCRIANDO PROMPT AUXILIAR DO CONTEXTUAL")
prompt_auxiliar_summary = create_prompt_auxiliar_do_contextual_prompt(full_text)
print("\n\nprompt_auxiliar_summary[0:500]: ", prompt_auxiliar_summary[0:500])
# Claude comentado pois o limite de tokens estava sendo passado pela requisição e dava erro
# response_auxiliar_summary = await aclaude_answer(
# self.claude_client, self.claude_context_model, prompt_auxiliar_summary
# )
llms = LLM()
print("\nCOMEÇANDO REQUISIÇÃO AUXILIAR DO CONTEXTUAL")
response_auxiliar_summary = await llms.google_gemini().ainvoke(
[HumanMessage(content=prompt_auxiliar_summary)]
)
print("TERMINOU REQUISIÇÃO AUXILIAR DO CONTEXTUAL")
print(
"\n\nresponse_auxiliar_summary.content[0:500]: ",
response_auxiliar_summary.content[0:500],
)
return response_auxiliar_summary.content
async def get_full_text_and_all_PDFs_chunks(
listaPDFs: List[str],
splitterObject: Splitter,
should_use_llama_parse: bool,
isBubble: bool,
):
all_PDFs_chunks = []
pages: List[str] = []
# Load and process document
for pdf_path in listaPDFs:
chunks, pages = await splitterObject.load_and_split_document(
pdf_path, should_use_llama_parse, isBubble
)
all_PDFs_chunks = all_PDFs_chunks + chunks
return all_PDFs_chunks, pages
async def generate_document_title(resumo_para_gerar_titulo: str):
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}"
response = await agemini_answer(prompt, "gemini-2.0-flash-lite")
return response
|