Spaces:
Running
Running
luanpoppe
commited on
Commit
·
cb23311
1
Parent(s):
23087eb
feat: ajustando endpoint de /gerar-documento para receber a URL do PDF do bubble pela requisição feita pelo front
Browse files- _utils/bubble_integrations/obter_arquivo.py +19 -3
- _utils/gerar_relatorio_modelo_usuario/EnhancedDocumentSummarizer.py +38 -37
- _utils/gerar_relatorio_modelo_usuario/contextual_retriever.py +4 -1
- _utils/gerar_relatorio_modelo_usuario/prompts.py +63 -60
- _utils/handle_files.py +2 -1
- _utils/resumo_completo_cursor.py +1 -1
- _utils/splitters/Splitter_class.py +3 -1
- example.env +4 -4
- gerar_documento/serializer.py +16 -5
- gerar_documento/views.py +11 -3
- setup/easy_imports.py +3 -2
_utils/bubble_integrations/obter_arquivo.py
CHANGED
@@ -1,7 +1,23 @@
|
|
|
|
|
|
|
|
|
|
1 |
import requests
|
2 |
|
3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
|
|
|
|
|
|
|
|
|
|
|
5 |
|
6 |
-
|
7 |
-
requests.post(f"https://vella.app.br/{version_url}/api/1.1/wf/obter_arquivo")
|
|
|
1 |
+
# from setup.easy_imports import PyPDFLoader
|
2 |
+
import os
|
3 |
+
from langchain_community.document_loaders import PyPDFLoader
|
4 |
+
|
5 |
import requests
|
6 |
|
7 |
+
headers = {"Authorization": f"Bearer {os.environ.get("BUBBLE_TOKEN")}"}
|
8 |
+
|
9 |
+
|
10 |
+
# def obter_arquivo(id_arquivo="1735864318176x375804955201372160"):
|
11 |
+
# return requests.get(
|
12 |
+
# f"https://vella.app.br/version-test/api/1.1/obj/formresponseanswer/{id_arquivo}",
|
13 |
+
# headers=headers,
|
14 |
+
# )
|
15 |
+
|
16 |
|
17 |
+
def get_pdf_from_bubble(
|
18 |
+
file_url=f"https://vella.app.br/version-test/fileupload/f1735864316650x718601440484441900/Boleto_DIGITICS%20Servic%CC%A7os%20de%20Secretariado%20LTDA_30_12_2024_804841714.pdf",
|
19 |
+
bubble_editor_version="version-test",
|
20 |
+
):
|
21 |
+
result = PyPDFLoader(file_url, headers=headers)
|
22 |
|
23 |
+
return result
|
|
_utils/gerar_relatorio_modelo_usuario/EnhancedDocumentSummarizer.py
CHANGED
@@ -40,7 +40,7 @@ class EnhancedDocumentSummarizer(DocumentSummarizer):
|
|
40 |
prompt_auxiliar,
|
41 |
gpt_model,
|
42 |
gpt_temperature,
|
43 |
-
id_modelo_do_usuario,
|
44 |
prompt_gerar_documento,
|
45 |
reciprocal_rank_fusion,
|
46 |
):
|
@@ -61,7 +61,7 @@ class EnhancedDocumentSummarizer(DocumentSummarizer):
|
|
61 |
self.prompt_auxiliar = prompt_auxiliar
|
62 |
self.gpt_model = gpt_model
|
63 |
self.gpt_temperature = gpt_temperature
|
64 |
-
self.id_modelo_do_usuario = id_modelo_do_usuario
|
65 |
self.prompt_gerar_documento = prompt_gerar_documento
|
66 |
self.reciprocal_rank_fusion = reciprocal_rank_fusion
|
67 |
self.resumo_gerado = ""
|
@@ -178,33 +178,33 @@ class EnhancedDocumentSummarizer(DocumentSummarizer):
|
|
178 |
# )
|
179 |
|
180 |
# modelo_buscado = resposta.json()["modelo"]
|
181 |
-
from modelos_usuarios.models import ModeloUsuarioModel
|
182 |
-
|
183 |
-
try:
|
184 |
-
# modelo_buscado = ModeloUsuarioModel.objects.get(
|
185 |
-
# pk=self.id_modelo_do_usuario
|
186 |
-
# )
|
187 |
-
# serializer = ModeloUsuarioSerializer(modelo_buscado)
|
188 |
-
# print("serializer.data: ", serializer.data)
|
189 |
-
modelo_buscado = await sync_to_async(ModeloUsuarioModel.objects.get)(
|
190 |
-
pk=self.id_modelo_do_usuario
|
191 |
-
)
|
192 |
-
serializer = await sync_to_async(ModeloUsuarioSerializer)(
|
193 |
-
modelo_buscado
|
194 |
-
)
|
195 |
-
print("serializer.data: ", serializer.data)
|
196 |
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
206 |
|
207 |
-
print("modelo_buscado: ", serializer.data["modelo"])
|
208 |
|
209 |
llm = ChatOpenAI(
|
210 |
temperature=self.gpt_temperature,
|
@@ -212,29 +212,30 @@ class EnhancedDocumentSummarizer(DocumentSummarizer):
|
|
212 |
api_key=self.openai_api_key,
|
213 |
)
|
214 |
|
215 |
-
|
216 |
template=self.prompt_auxiliar, input_variables=["context"]
|
217 |
)
|
218 |
|
219 |
-
|
220 |
-
|
221 |
)
|
222 |
|
223 |
-
self.resumo_gerado =
|
224 |
|
225 |
-
|
226 |
template=self.prompt_gerar_documento,
|
227 |
-
input_variables=["context"
|
228 |
)
|
229 |
|
230 |
-
|
231 |
-
|
232 |
-
context=
|
|
|
233 |
)
|
234 |
).content
|
235 |
|
236 |
# Split the response into paragraphs
|
237 |
-
summaries = [p.strip() for p in
|
238 |
|
239 |
# Create structured output
|
240 |
structured_output = []
|
|
|
40 |
prompt_auxiliar,
|
41 |
gpt_model,
|
42 |
gpt_temperature,
|
43 |
+
# id_modelo_do_usuario,
|
44 |
prompt_gerar_documento,
|
45 |
reciprocal_rank_fusion,
|
46 |
):
|
|
|
61 |
self.prompt_auxiliar = prompt_auxiliar
|
62 |
self.gpt_model = gpt_model
|
63 |
self.gpt_temperature = gpt_temperature
|
64 |
+
# self.id_modelo_do_usuario = id_modelo_do_usuario
|
65 |
self.prompt_gerar_documento = prompt_gerar_documento
|
66 |
self.reciprocal_rank_fusion = reciprocal_rank_fusion
|
67 |
self.resumo_gerado = ""
|
|
|
178 |
# )
|
179 |
|
180 |
# modelo_buscado = resposta.json()["modelo"]
|
181 |
+
# from modelos_usuarios.models import ModeloUsuarioModel
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
182 |
|
183 |
+
# try:
|
184 |
+
# # modelo_buscado = ModeloUsuarioModel.objects.get(
|
185 |
+
# # pk=self.id_modelo_do_usuario
|
186 |
+
# # )
|
187 |
+
# # serializer = ModeloUsuarioSerializer(modelo_buscado)
|
188 |
+
# # print("serializer.data: ", serializer.data)
|
189 |
+
# modelo_buscado = await sync_to_async(ModeloUsuarioModel.objects.get)(
|
190 |
+
# pk=self.id_modelo_do_usuario
|
191 |
+
# )
|
192 |
+
# serializer = await sync_to_async(ModeloUsuarioSerializer)(
|
193 |
+
# modelo_buscado
|
194 |
+
# )
|
195 |
+
# print("serializer.data: ", serializer.data)
|
196 |
+
|
197 |
+
# except Exception as e:
|
198 |
+
# print("e: ", e)
|
199 |
+
# return Response(
|
200 |
+
# {
|
201 |
+
# "error": "Ocorreu um problema. Pode ser que o modelo não tenha sido encontrado. Tente novamente e/ou entre em contato com a equipe técnica",
|
202 |
+
# "full_error": e,
|
203 |
+
# },
|
204 |
+
# 400,
|
205 |
+
# )
|
206 |
|
207 |
+
# print("modelo_buscado: ", serializer.data["modelo"])
|
208 |
|
209 |
llm = ChatOpenAI(
|
210 |
temperature=self.gpt_temperature,
|
|
|
212 |
api_key=self.openai_api_key,
|
213 |
)
|
214 |
|
215 |
+
prompt_auxiliar = PromptTemplate(
|
216 |
template=self.prompt_auxiliar, input_variables=["context"]
|
217 |
)
|
218 |
|
219 |
+
resumo_auxiliar_do_documento = llm.invoke(
|
220 |
+
prompt_auxiliar.format(context="\n\n".join(contexts))
|
221 |
)
|
222 |
|
223 |
+
self.resumo_gerado = resumo_auxiliar_do_documento.content
|
224 |
|
225 |
+
prompt_gerar_documento = PromptTemplate(
|
226 |
template=self.prompt_gerar_documento,
|
227 |
+
input_variables=["context"],
|
228 |
)
|
229 |
|
230 |
+
documento_gerado = llm.invoke(
|
231 |
+
prompt_gerar_documento.format(
|
232 |
+
context=resumo_auxiliar_do_documento,
|
233 |
+
# modelo_usuario=serializer.data["modelo"],
|
234 |
)
|
235 |
).content
|
236 |
|
237 |
# Split the response into paragraphs
|
238 |
+
summaries = [p.strip() for p in documento_gerado.split("\n\n") if p.strip()]
|
239 |
|
240 |
# Create structured output
|
241 |
structured_output = []
|
_utils/gerar_relatorio_modelo_usuario/contextual_retriever.py
CHANGED
@@ -1,7 +1,9 @@
|
|
1 |
import os
|
|
|
2 |
# from _utils.gerar_relatorio_modelo_usuario.prompts import (
|
3 |
# prompt_auxiliar_do_contextual_prompt,
|
4 |
# )
|
|
|
5 |
from _utils.chains.Chain_class import Chain
|
6 |
from _utils.prompts.Prompt_class import Prompt
|
7 |
from _utils.splitters.Splitter_class import Splitter
|
@@ -120,7 +122,8 @@ def get_full_text_and_all_PDFs_chunks(contexto, listaPDFs, splitterObject: Split
|
|
120 |
chunks = splitterObject.load_and_split_document(pdf_path)
|
121 |
all_PDFs_chunks = all_PDFs_chunks + chunks
|
122 |
# Get full text for contextualization
|
123 |
-
loader = PyPDFLoader(pdf_path)
|
|
|
124 |
pages = loader.load()
|
125 |
full_text = " ".join([page.page_content for page in pages])
|
126 |
|
|
|
1 |
import os
|
2 |
+
|
3 |
# from _utils.gerar_relatorio_modelo_usuario.prompts import (
|
4 |
# prompt_auxiliar_do_contextual_prompt,
|
5 |
# )
|
6 |
+
from _utils.bubble_integrations.obter_arquivo import get_pdf_from_bubble
|
7 |
from _utils.chains.Chain_class import Chain
|
8 |
from _utils.prompts.Prompt_class import Prompt
|
9 |
from _utils.splitters.Splitter_class import Splitter
|
|
|
122 |
chunks = splitterObject.load_and_split_document(pdf_path)
|
123 |
all_PDFs_chunks = all_PDFs_chunks + chunks
|
124 |
# Get full text for contextualization
|
125 |
+
# loader = PyPDFLoader(pdf_path)
|
126 |
+
loader = get_pdf_from_bubble(pdf_path)
|
127 |
pages = loader.load()
|
128 |
full_text = " ".join([page.page_content for page in pages])
|
129 |
|
_utils/gerar_relatorio_modelo_usuario/prompts.py
CHANGED
@@ -1,3 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
def contextual_prompt(full_text, chunk_content):
|
2 |
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):
|
3 |
1. **Chain of Thought (internal)**:
|
@@ -17,9 +76,11 @@ Please return only the succinct context (without displaying your internal reason
|
|
17 |
```
|
18 |
"""
|
19 |
|
|
|
20 |
# Novo nome --> prompt-auxiliar --> Para gerar documentos (é usado como auxiliar no prompt final)
|
21 |
-
|
22 |
-
|
|
|
23 |
**Instructions**:
|
24 |
1. **Chain of Thought**: Before producing your final answer, you must think through and plan your summary silently, without showing this reasoning in the final output. The final answer must only contain the required formatted report and nothing else.
|
25 |
2. **Reading the Context**: Extract the following information from `context`:
|
@@ -119,61 +180,3 @@ A denúncia foi recebida em 12/03/2021, conforme Decisão 20210312-01.
|
|
119 |
Não há outras causas interruptivas ou suspensivas da prescrição.
|
120 |
</formato>
|
121 |
"""
|
122 |
-
|
123 |
-
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.
|
124 |
-
|
125 |
-
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:
|
126 |
-
1. Petição Inicial
|
127 |
-
2. Contestação
|
128 |
-
3. Réplica
|
129 |
-
4. Decisão de Saneamento
|
130 |
-
5. Sentença
|
131 |
-
6. Recurso de Apelação
|
132 |
-
7. Embargos de Declaração
|
133 |
-
8. Cumprimento de Sentença
|
134 |
-
9. Embargos à Execução
|
135 |
-
10. Agravo de Instrumento
|
136 |
-
|
137 |
-
Siga este passo a passo para criar o resumo:
|
138 |
-
|
139 |
-
1. Leia atentamente todo o processo jurídico fornecido.
|
140 |
-
<processo_juridico>
|
141 |
-
{{PROCESSO_JURIDICO}}
|
142 |
-
</processo_juridico>
|
143 |
-
|
144 |
-
2. Identifique e anote as datas e conteúdos relevantes relacionados às 10 peças processuais listadas acima.
|
145 |
-
|
146 |
-
3. Organize cronologicamente as informações coletadas.
|
147 |
-
|
148 |
-
4. Destaque a última movimentação processual e seu significado para o andamento do processo.
|
149 |
-
|
150 |
-
5. Resuma as principais movimentações, focando em seu impacto no processo.
|
151 |
-
|
152 |
-
6. Elabore um texto coeso que apresente o fluxo do processo, destacando os pontos cruciais e as decisões mais importantes.
|
153 |
-
|
154 |
-
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:
|
155 |
-
|
156 |
-
1. O resumo abrange todas as 10 peças processuais principais?
|
157 |
-
2. A última movimentação processual está claramente identificada e explicada?
|
158 |
-
3. O texto apresenta uma visão clara do fluxo do processo?
|
159 |
-
4. Todas as informações cruciais para o entendimento do caso estão incluídas?
|
160 |
-
5. O resumo está livre de opiniões pessoais e se atém aos fatos do processo?
|
161 |
-
6. A linguagem utilizada é clara e acessível, mesmo para quem não é especialista em direito?
|
162 |
-
|
163 |
-
Revise e ajuste o resumo conforme necessário com base nessa reflexão.
|
164 |
-
|
165 |
-
O resumo final deve ter no máximo 2 páginas de extensão (aproximadamente 1000 palavras).
|
166 |
-
|
167 |
-
Formate sua resposta da seguinte maneira:
|
168 |
-
|
169 |
-
<resumo_processo>
|
170 |
-
[Insira aqui o resumo do processo jurídico]
|
171 |
-
</resumo_processo>
|
172 |
-
|
173 |
-
<reflexao_socratica>
|
174 |
-
[Insira aqui suas respostas às perguntas da reflexão socrática]
|
175 |
-
</reflexao_socratica>
|
176 |
-
|
177 |
-
<resumo_final>
|
178 |
-
[Insira aqui o resumo final revisado, se houver alterações após a reflexão]
|
179 |
-
</resumo_final>"""
|
|
|
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 contextual_prompt(full_text, chunk_content):
|
61 |
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):
|
62 |
1. **Chain of Thought (internal)**:
|
|
|
76 |
```
|
77 |
"""
|
78 |
|
79 |
+
|
80 |
# Novo nome --> prompt-auxiliar --> Para gerar documentos (é usado como auxiliar no prompt final)
|
81 |
+
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."""
|
82 |
+
|
83 |
+
prompt_auxiliar_padrao = """
|
84 |
**Instructions**:
|
85 |
1. **Chain of Thought**: Before producing your final answer, you must think through and plan your summary silently, without showing this reasoning in the final output. The final answer must only contain the required formatted report and nothing else.
|
86 |
2. **Reading the Context**: Extract the following information from `context`:
|
|
|
180 |
Não há outras causas interruptivas ou suspensivas da prescrição.
|
181 |
</formato>
|
182 |
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_utils/handle_files.py
CHANGED
@@ -1,5 +1,7 @@
|
|
1 |
import tempfile, os
|
2 |
|
|
|
|
|
3 |
|
4 |
def handle_pdf_files_from_serializer(files):
|
5 |
listaPDFs = []
|
@@ -17,7 +19,6 @@ def handle_pdf_files_from_serializer(files):
|
|
17 |
print("listaPDFs: ", listaPDFs)
|
18 |
return listaPDFs
|
19 |
|
20 |
-
|
21 |
def remove_pdf_temp_files(listaPDFs):
|
22 |
for file in listaPDFs:
|
23 |
os.remove(file)
|
|
|
1 |
import tempfile, os
|
2 |
|
3 |
+
from _utils.bubble_integrations.obter_arquivo import get_pdf_from_bubble
|
4 |
+
|
5 |
|
6 |
def handle_pdf_files_from_serializer(files):
|
7 |
listaPDFs = []
|
|
|
19 |
print("listaPDFs: ", listaPDFs)
|
20 |
return listaPDFs
|
21 |
|
|
|
22 |
def remove_pdf_temp_files(listaPDFs):
|
23 |
for file in listaPDFs:
|
24 |
os.remove(file)
|
_utils/resumo_completo_cursor.py
CHANGED
@@ -65,7 +65,7 @@ async def get_llm_summary_answer_by_cursor_complete(
|
|
65 |
prompt_auxiliar=serializer["prompt_auxiliar"],
|
66 |
gpt_model=serializer["model"],
|
67 |
gpt_temperature=serializer["gpt_temperature"],
|
68 |
-
id_modelo_do_usuario=serializer["id_modelo_do_usuario"],
|
69 |
prompt_gerar_documento=serializer["prompt_gerar_documento"],
|
70 |
reciprocal_rank_fusion=reciprocal_rank_fusion,
|
71 |
)
|
|
|
65 |
prompt_auxiliar=serializer["prompt_auxiliar"],
|
66 |
gpt_model=serializer["model"],
|
67 |
gpt_temperature=serializer["gpt_temperature"],
|
68 |
+
# id_modelo_do_usuario=serializer["id_modelo_do_usuario"],
|
69 |
prompt_gerar_documento=serializer["prompt_gerar_documento"],
|
70 |
reciprocal_rank_fusion=reciprocal_rank_fusion,
|
71 |
)
|
_utils/splitters/Splitter_class.py
CHANGED
@@ -1,3 +1,4 @@
|
|
|
|
1 |
from setup.easy_imports import PyPDFLoader, RecursiveCharacterTextSplitter, Document
|
2 |
from typing import List, Dict, Tuple, Optional
|
3 |
from _utils.models.gerar_relatorio import (
|
@@ -19,7 +20,8 @@ class Splitter:
|
|
19 |
|
20 |
def load_and_split_document(self, pdf_path: str) -> List[DocumentChunk]:
|
21 |
"""Load PDF and split into chunks with metadata"""
|
22 |
-
loader = PyPDFLoader(pdf_path)
|
|
|
23 |
pages = (
|
24 |
loader.load()
|
25 |
) # Gera uma lista de objetos Document, sendo cada item da lista referente a UMA PÁGINA inteira do PDF.
|
|
|
1 |
+
from _utils.bubble_integrations.obter_arquivo import get_pdf_from_bubble
|
2 |
from setup.easy_imports import PyPDFLoader, RecursiveCharacterTextSplitter, Document
|
3 |
from typing import List, Dict, Tuple, Optional
|
4 |
from _utils.models.gerar_relatorio import (
|
|
|
20 |
|
21 |
def load_and_split_document(self, pdf_path: str) -> List[DocumentChunk]:
|
22 |
"""Load PDF and split into chunks with metadata"""
|
23 |
+
# loader = PyPDFLoader(pdf_path)
|
24 |
+
loader = get_pdf_from_bubble(pdf_path)
|
25 |
pages = (
|
26 |
loader.load()
|
27 |
) # Gera uma lista de objetos Document, sendo cada item da lista referente a UMA PÁGINA inteira do PDF.
|
example.env
CHANGED
@@ -1,8 +1,8 @@
|
|
|
|
1 |
DATABASE_PASSWORD=""
|
2 |
OPENAI_API_KEY=""
|
3 |
-
CLAUDE_API_KEY=""
|
4 |
-
LANGCHAIN_API_KEY=""
|
5 |
HUGGINGFACEHUB_API_TOKEN=""
|
|
|
|
|
6 |
COHERE_API_KEY=""
|
7 |
-
|
8 |
-
DATABASE_PASSWORD=""
|
|
|
1 |
+
SECRET_KEY=""
|
2 |
DATABASE_PASSWORD=""
|
3 |
OPENAI_API_KEY=""
|
|
|
|
|
4 |
HUGGINGFACEHUB_API_TOKEN=""
|
5 |
+
LANGCHAIN_API_KEY=""
|
6 |
+
CLAUDE_API_KEY=""
|
7 |
COHERE_API_KEY=""
|
8 |
+
BUBBLE_TOKEN=""
|
|
gerar_documento/serializer.py
CHANGED
@@ -2,17 +2,29 @@ from rest_framework import serializers
|
|
2 |
from _antigos.resumos.serializer import ResumoCursorSerializer
|
3 |
from _utils.gerar_relatorio_modelo_usuario.prompts import (
|
4 |
prompt_gerar_documento,
|
5 |
-
|
6 |
)
|
7 |
|
8 |
user_message = "What are the main points of this document?"
|
9 |
|
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
class ResumoCursorCompeltoSerializer(ResumoCursorSerializer):
|
12 |
system_prompt = None
|
13 |
-
|
14 |
-
|
15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
prompt_gerar_documento = serializers.CharField(
|
17 |
required=False, default=prompt_gerar_documento
|
18 |
)
|
@@ -31,6 +43,5 @@ class ResumoCursorCompeltoSerializer(ResumoCursorSerializer):
|
|
31 |
required=False, default="claude-3-haiku-20240307"
|
32 |
)
|
33 |
gpt_temperature = serializers.FloatField(default=0)
|
34 |
-
# id_modelo_do_usuario = serializers.IntegerField(required=True)
|
35 |
id_modelo_do_usuario = serializers.IntegerField(required=False)
|
36 |
should_have_contextual_chunks = serializers.BooleanField(default=False)
|
|
|
2 |
from _antigos.resumos.serializer import ResumoCursorSerializer
|
3 |
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 |
|
10 |
|
11 |
+
class FileInfoSerializer(serializers.Serializer):
|
12 |
+
unique_id = serializers.CharField(max_length=255)
|
13 |
+
tipo_arquivo = serializers.CharField(max_length=255)
|
14 |
+
link_arquivo = serializers.URLField()
|
15 |
+
|
16 |
+
|
17 |
class ResumoCursorCompeltoSerializer(ResumoCursorSerializer):
|
18 |
system_prompt = None
|
19 |
+
|
20 |
+
files = serializers.ListField(child=FileInfoSerializer(), required=True)
|
21 |
+
bubble_editor_version = serializers.CharField(
|
22 |
+
required=False, default="version-test"
|
23 |
+
) # Será o valor utilizado dentro da URL da requisição pro Bubble
|
24 |
+
|
25 |
+
prompt_auxiliar = serializers.CharField(
|
26 |
+
required=False, default=prompt_auxiliar_padrao
|
27 |
+
)
|
28 |
prompt_gerar_documento = serializers.CharField(
|
29 |
required=False, default=prompt_gerar_documento
|
30 |
)
|
|
|
43 |
required=False, default="claude-3-haiku-20240307"
|
44 |
)
|
45 |
gpt_temperature = serializers.FloatField(default=0)
|
|
|
46 |
id_modelo_do_usuario = serializers.IntegerField(required=False)
|
47 |
should_have_contextual_chunks = serializers.BooleanField(default=False)
|
gerar_documento/views.py
CHANGED
@@ -10,13 +10,14 @@ from _utils.handle_files import handle_pdf_files_from_serializer, remove_pdf_tem
|
|
10 |
from _utils.resumo_completo_cursor import (
|
11 |
get_llm_summary_answer_by_cursor_complete,
|
12 |
)
|
|
|
13 |
from .serializer import (
|
14 |
ResumoCursorCompeltoSerializer,
|
15 |
)
|
16 |
|
17 |
|
18 |
class ResumoSimplesCursorCompletoView(AsyncAPIView):
|
19 |
-
parser_classes = [MultiPartParser]
|
20 |
|
21 |
@extend_schema(
|
22 |
request=ResumoCursorCompeltoSerializer,
|
@@ -28,13 +29,20 @@ class ResumoSimplesCursorCompletoView(AsyncAPIView):
|
|
28 |
data = serializer.validated_data
|
29 |
print("\n\ndata: ", data)
|
30 |
|
31 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
32 |
|
33 |
resposta_llm = await get_llm_summary_answer_by_cursor_complete(
|
34 |
data, listaPDFs
|
35 |
)
|
36 |
print("\n\nresposta_llm: ", resposta_llm)
|
37 |
|
38 |
-
remove_pdf_temp_files(listaPDFs)
|
39 |
|
40 |
return Response({"resposta": resposta_llm})
|
|
|
10 |
from _utils.resumo_completo_cursor import (
|
11 |
get_llm_summary_answer_by_cursor_complete,
|
12 |
)
|
13 |
+
from _utils.gerar_relatorio_modelo_usuario.prompts import prompt_auxiliar_inicio
|
14 |
from .serializer import (
|
15 |
ResumoCursorCompeltoSerializer,
|
16 |
)
|
17 |
|
18 |
|
19 |
class ResumoSimplesCursorCompletoView(AsyncAPIView):
|
20 |
+
# parser_classes = [MultiPartParser]
|
21 |
|
22 |
@extend_schema(
|
23 |
request=ResumoCursorCompeltoSerializer,
|
|
|
29 |
data = serializer.validated_data
|
30 |
print("\n\ndata: ", data)
|
31 |
|
32 |
+
data["prompt_auxiliar"] = (
|
33 |
+
prompt_auxiliar_inicio + "\n" + data["prompt_auxiliar"]
|
34 |
+
)
|
35 |
+
|
36 |
+
# listaPDFs = handle_pdf_files_from_serializer(data["files"])
|
37 |
+
listaPDFs = [l["link_arquivo"] for l in data["files"]]
|
38 |
+
|
39 |
+
print("\n\nlistaPDFs: ", listaPDFs)
|
40 |
|
41 |
resposta_llm = await get_llm_summary_answer_by_cursor_complete(
|
42 |
data, listaPDFs
|
43 |
)
|
44 |
print("\n\nresposta_llm: ", resposta_llm)
|
45 |
|
46 |
+
# remove_pdf_temp_files(listaPDFs)
|
47 |
|
48 |
return Response({"resposta": resposta_llm})
|
setup/easy_imports.py
CHANGED
@@ -7,8 +7,9 @@ from rest_framework.parsers import MultiPartParser
|
|
7 |
|
8 |
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
9 |
|
10 |
-
|
11 |
-
|
|
|
12 |
from langchain.prompts import PromptTemplate
|
13 |
from langchain_core.prompts import ChatPromptTemplate
|
14 |
from langchain_community.document_loaders import PyPDFLoader
|
|
|
7 |
|
8 |
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
9 |
|
10 |
+
from langchain_huggingface import HuggingFaceEmbeddings
|
11 |
+
|
12 |
+
# from langchain_community.embeddings import HuggingFaceEmbeddings
|
13 |
from langchain.prompts import PromptTemplate
|
14 |
from langchain_core.prompts import ChatPromptTemplate
|
15 |
from langchain_community.document_loaders import PyPDFLoader
|