dauid64 commited on
Commit
f4f1eab
1 Parent(s): f5c3f28

refatorando código

Browse files
.env.development CHANGED
@@ -1,4 +1,4 @@
1
- OPENAI_API_KEY="sk-gMXE7rzEMTcru85nwWsBBbGHLkk-QR8tXhtAijRGi9T3BlbkFJpMWIckiPxZegOJVabm0t1zzFIYlTrY5bJI_Eu5mpQA"
2
  OPENAI_MODEL_CHAT="gpt-3.5-turbo"
3
  OPENAI_MODEL_EMBEDDING="text-embedding-3-small"
4
 
@@ -10,6 +10,4 @@ EDGEDB_PASSWORD="secret"
10
  EDGEDB_PORT="5656"
11
 
12
  QDRANT_HOST="localhost"
13
- QDRANT_PORT="6333"
14
-
15
- HUGGINGFACE_API_KEY="SUA-KEY"
 
1
+ OPENAI_API_KEY="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"
2
  OPENAI_MODEL_CHAT="gpt-3.5-turbo"
3
  OPENAI_MODEL_EMBEDDING="text-embedding-3-small"
4
 
 
10
  EDGEDB_PORT="5656"
11
 
12
  QDRANT_HOST="localhost"
13
+ QDRANT_PORT="6333"
 
 
config/coleta/gov_links.csv CHANGED
@@ -127,11 +127,6 @@ https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov
127
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/cancelar-um-processo
128
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/transferir-um-processo
129
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/extrair-dados-de-um-processo
130
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/acessar-a-instancia-do-meu-servico
131
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/localizar-um-processo
132
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/localizar-um-processo
133
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/cancelar-um-processo
134
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/extrair-dados-de-um-processo
135
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/inconsistencia-de-dados-cadastrais-na-receita-federal
136
  https://www.gov.br/pt-br/servicos/solicitar-atendimento-conta-gov.br
137
  https://www.gov.br/governodigital/pt-br/atendimento-gov.br/duvidas-na-conta-gov.br/duvidas-em-outros-sistemas-integrados
@@ -171,7 +166,6 @@ https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov
171
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-conta-gov.br/titular-falecido-na-conta-gov.br
172
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-conta-gov.br/duvidas-em-outros-sistemas-integrados
173
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-conta-gov.br/erro-403-ao-fazer-o-login
174
- https://www.gov.br/governodigital/pt-br/atendimento-gov.br/duvidas-na-conta-gov.br/duvidas-em-outros-sistemas-integrados
175
  https://sso.acesso.gov.br/
176
  https://sso.acesso.gov.br/
177
  https://cadastro.acesso.gov.br/termo-de-uso
@@ -184,8 +178,6 @@ https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov
184
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/inconsistencia-de-dados-cadastrais-na-receita-federal
185
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/requisitos-para-acesso-aos-servicos
186
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/nao-alterei-meus-dados-cadastrais
187
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/inconsistencia-de-dados-cadastrais-na-receita-federal
188
- https://www.gov.br/governodigital/pt-br/atendimento-gov.br/duvidas-na-conta-gov.br/duvidas-em-outros-sistemas-integrados
189
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/nao-alterei-meus-dados-cadastrais/nao-lembro-de-ter-criado-uma-conta-gov.br
190
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/nao-alterei-meus-dados-cadastrais/limite-de-cadastro-do-mesmo-e-mail-ou-telefone
191
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/nao-alterei-meus-dados-cadastrais/identifiquei-uma-alteracao-ou-um-acesso-suspeito
@@ -235,24 +227,7 @@ https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov
235
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/cidadao/abrir-um-chamado
236
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta
237
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte
238
- https://solicitacao.servicos.gov.br/processos/iniciar?codServico=13139
239
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte/solicitar-a-automacao-de-um-novo-servico
240
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte/gestao-de-usuarios
241
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte/registrar-um-chamado
242
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte/solicitar-novo-treinamento
243
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte/sincronia-de-dados-com-a-automacao
244
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/acessar-a-instancia-do-meu-servico
245
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/visao-geral-da-plataforma
246
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/localizar-um-processo
247
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/cancelar-um-processo
248
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/transferir-um-processo
249
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/extrair-dados-de-um-processo
250
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/acessar-a-instancia-do-meu-servico
251
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/localizar-um-processo
252
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/localizar-um-processo
253
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/transferir-um-processo
254
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/extrair-dados-de-um-processo
255
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte/gestao-de-usuarios
256
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/visao-geral-da-plataforma
257
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/localizar-um-processo
258
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/cancelar-um-processo
@@ -261,8 +236,6 @@ https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov
261
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-no-aplicativo-gov.br/duvidas-no-reconhecimento-facial
262
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-no-aplicativo-gov.br/duvidas-sobre-a-gestao-de-dispositivos-no-gov.br
263
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-no-aplicativo-gov.br/duvidas-gerais-no-aplicativo-gov.br
264
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-no-aplicativo-gov.br/duvidas-no-reconhecimento-facial/bases-biometricas-faciais
265
- https://confiabilidades.acesso.gov.br/
266
  https://www.gov.br/governodigital/pt-br/identidade/carteira-de-documentos-digitais
267
  https://www.gov.br/governodigital/pt-br/identidade/assinatura-eletronica
268
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-assinatura-gov.br/nao-recebi-o-codigo-da-assinatura
@@ -274,76 +247,3 @@ https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov
274
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-conta-gov.br/duvidas-para-aumentar-o-nivel-da-conta-gov.br
275
  https://www.gov.br/pt-br/servicos/solicitar-atendimento-conta-gov.br
276
  https://www.mg.gov.br/pagina/unidades-de-atendimento-integrado-uai
277
- https://www.gov.br/pt-br/servicos/solicitar-atendimento-conta-gov.br
278
- https://www.gov.br/atendimento
279
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/acessar-a-instancia-do-meu-servico
280
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/localizar-um-processo
281
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/cancelar-um-processo
282
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/transferir-um-processo
283
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/extrair-dados-de-um-processo
284
- https://sso.acesso.gov.br/
285
- https://sso.acesso.gov.br/
286
- https://cadastro.acesso.gov.br/termo-de-uso
287
- https://www.gov.br/pt-br/servicos/solicitar-atendimento-conta-gov.br
288
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-conta-gov.br/duvidas-no-login-com-certificado-no-gov.br/certificado-nao-encontrado
289
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/imagens/gov-br_logo-svg.png/download
290
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/imagens/gov-br_logo-svg.png/image_view_fullscreen
291
- http://www.facebook.com/sharer.php?u=https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/imagens/gov-br_logo-svg.png
292
- https://twitter.com/share?text=Gov.br_logo.svg.png&url=https://www.gov.br/governodigital/resolveuid/fc8b62c9ff4142f19322784616ed91aa
293
- https://www.linkedin.com/shareArticle?mini=true&url=https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/imagens/gov-br_logo-svg.png&title=Gov.br_logo.svg.png
294
- https://api.whatsapp.com/send?text=https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/imagens/gov-br_logo-svg.png
295
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/imagens/gov-br_logo-svg.png
296
- https://www.gov.br/governodigital/pt-br/assinatura-eletronica
297
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-assinatura-gov.br/nao-recebi-o-codigo-da-assinatura
298
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-assinatura-gov.br/nome-incorreto-na-assinatura
299
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/cidadao/acessar-o-servico
300
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/cidadao/consultar-as-minhas-solicitacoes
301
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/cidadao/abrir-um-chamado
302
- https://solicitacao.servicos.gov.br/processos/iniciar?codServico=13132
303
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte/gestao-de-usuarios
304
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte/registrar-um-chamado
305
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte/registrar-uma-solicitacao-de-evolucao-melhoria
306
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte/solicitar-novo-treinamento
307
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte/sincronia-de-dados-com-a-automacao
308
- https://sso.acesso.gov.br/
309
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-conta-gov.br/recuperar-conta-gov.br
310
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-no-aplicativo-gov.br/duvidas-gerais-no-aplicativo-gov.br
311
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-conta-gov.br/duvidas-para-aumentar-o-nivel-da-conta-gov.br
312
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-conta-gov.br/ativar-a-verificacao-em-duas-etapas
313
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-no-aplicativo-gov.br/duvidas-sobre-a-gestao-de-dispositivos-no-gov.br
314
- https://registrato.bcb.gov.br/registrato/
315
- https://permissao.negocios.redesim.gov.br/consultar
316
- https://www.gov.br/governodigital/pt-br/identidade/identificacao-do-cidadao-e-carteira-de-identidade-nacional
317
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/nao-alterei-meus-dados-cadastrais/identifiquei-uma-alteracao-ou-um-acesso-suspeito/solicitar-o-bloqueio-da-minha-conta-gov.br
318
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/acessar-a-instancia-do-meu-servico
319
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/visao-geral-da-plataforma
320
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/localizar-um-processo
321
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/cancelar-um-processo
322
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/transferir-um-processo
323
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/extrair-dados-de-um-processo
324
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/imagens/Falarcomatendente.png/view
325
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/imagens/gov-br_logo-svg.png/view
326
- http://www.facebook.com/sharer.php?u=https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/imagens
327
- https://twitter.com/share?text=Imagens&url=https://www.gov.br/governodigital/resolveuid/bb5b67152b10451ca991bb22a614dbf0
328
- https://www.linkedin.com/shareArticle?mini=true&url=https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/imagens&title=Imagens
329
- https://api.whatsapp.com/send?text=https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/imagens
330
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/imagens
331
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-conta-gov.br/duvidas-na-vinculacao-de-cnpj-no-gov.br/como-vincular-cnpj
332
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-conta-gov.br/duvidas-na-vinculacao-de-cnpj-no-gov.br/como-gerenciar-colaboradores
333
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-conta-gov.br/duvidas-no-login-com-certificado-no-gov.br
334
- https://www.gov.br/pt-br/servicos/solicitar-atendimento-conta-gov.br
335
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/nao-consigo-cadastrar-meu-endereco-no-gov.br
336
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/inconsistencia-de-dados-cadastrais-na-receita-federal
337
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/requisitos-para-acesso-aos-servicos
338
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/nao-alterei-meus-dados-cadastrais
339
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte/registrar-um-chamado
340
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte/solicitar-a-automacao-de-um-novo-servico
341
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte/gestao-de-usuarios
342
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte/registrar-uma-solicitacao-de-evolucao-melhoria
343
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte/solicitar-novo-treinamento
344
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte/sincronia-de-dados-com-a-automacao
345
- https://www.gov.br/governodigital/pt-br/identidade/conta-gov-br/niveis-da-conta-govbr
346
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-no-aplicativo-gov.br/duvidas-no-reconhecimento-facial
347
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-conta-gov.br/duvidas-para-aumentar-o-nivel-da-conta-gov.br/duvidas-na-autenticacao-dos-bancos
348
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-conta-gov.br/duvidas-para-aumentar-o-nivel-da-conta-gov.br/duvidas-para-aumentar-o-nivel-com-a-cin
349
- https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/requisitos-para-acesso-aos-servicos
 
127
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/cancelar-um-processo
128
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/transferir-um-processo
129
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/extrair-dados-de-um-processo
 
 
 
 
 
130
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/inconsistencia-de-dados-cadastrais-na-receita-federal
131
  https://www.gov.br/pt-br/servicos/solicitar-atendimento-conta-gov.br
132
  https://www.gov.br/governodigital/pt-br/atendimento-gov.br/duvidas-na-conta-gov.br/duvidas-em-outros-sistemas-integrados
 
166
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-conta-gov.br/titular-falecido-na-conta-gov.br
167
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-conta-gov.br/duvidas-em-outros-sistemas-integrados
168
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-conta-gov.br/erro-403-ao-fazer-o-login
 
169
  https://sso.acesso.gov.br/
170
  https://sso.acesso.gov.br/
171
  https://cadastro.acesso.gov.br/termo-de-uso
 
178
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/inconsistencia-de-dados-cadastrais-na-receita-federal
179
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/requisitos-para-acesso-aos-servicos
180
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/nao-alterei-meus-dados-cadastrais
 
 
181
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/nao-alterei-meus-dados-cadastrais/nao-lembro-de-ter-criado-uma-conta-gov.br
182
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/nao-alterei-meus-dados-cadastrais/limite-de-cadastro-do-mesmo-e-mail-ou-telefone
183
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-nos-dados-cadastrais/nao-alterei-meus-dados-cadastrais/identifiquei-uma-alteracao-ou-um-acesso-suspeito
 
227
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/cidadao/abrir-um-chamado
228
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta
229
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/solicitar-suporte
 
 
 
 
 
 
 
 
 
 
 
 
230
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/acessar-a-instancia-do-meu-servico
 
 
 
 
 
231
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/visao-geral-da-plataforma
232
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/localizar-um-processo
233
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-plataforma-de-automacao/gestor-do-servico/dicas-sobre-a-ferramenta/cancelar-um-processo
 
236
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-no-aplicativo-gov.br/duvidas-no-reconhecimento-facial
237
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-no-aplicativo-gov.br/duvidas-sobre-a-gestao-de-dispositivos-no-gov.br
238
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-no-aplicativo-gov.br/duvidas-gerais-no-aplicativo-gov.br
 
 
239
  https://www.gov.br/governodigital/pt-br/identidade/carteira-de-documentos-digitais
240
  https://www.gov.br/governodigital/pt-br/identidade/assinatura-eletronica
241
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-assinatura-gov.br/nao-recebi-o-codigo-da-assinatura
 
247
  https://www.gov.br/governodigital/pt-br/acessibilidade-e-usuario/atendimento-gov.br/duvidas-na-conta-gov.br/duvidas-para-aumentar-o-nivel-da-conta-gov.br
248
  https://www.gov.br/pt-br/servicos/solicitar-atendimento-conta-gov.br
249
  https://www.mg.gov.br/pagina/unidades-de-atendimento-integrado-uai
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
config/edgedb/populate_edgedb.py CHANGED
@@ -10,7 +10,7 @@ client = edgedb.create_client(
10
  tls_security="insecure"
11
  )
12
 
13
- for root, dirs, files in os.walk("../../Banco_de_Dados/Coleta/downloaded_files"):
14
  for file in files:
15
  if file.endswith(".json"):
16
  with open(os.path.join(root, file), 'r') as f:
 
10
  tls_security="insecure"
11
  )
12
 
13
+ for root, dirs, files in os.walk("../coleta/downloaded_files"):
14
  for file in files:
15
  if file.endswith(".json"):
16
  with open(os.path.join(root, file), 'r') as f:
config/vetorial/oac/oac.py DELETED
@@ -1,33 +0,0 @@
1
- from openai import Client
2
-
3
-
4
- def get_description_of_image(oa_client: Client, image_url):
5
- completion = oa_client.chat.completions.create(
6
- model="gpt-4o-mini",
7
- messages=[
8
- {
9
- "role": "system",
10
- "content": """
11
- You are an image descriptor who will describe images using the Brazilian Portuguese language.
12
- This description should be short and to the point, with a maximum of 50 characters, to be placed in the alt tag of an HTML.
13
- """ # noqa
14
- },
15
- {
16
- "role": "user",
17
- "content": [
18
- {
19
- "type": "text",
20
- "text": "What's in this image?"
21
- },
22
- {
23
- "type": "image_url",
24
- "image_url": {
25
- "url": f"{image_url}"
26
- }
27
- }
28
- ]
29
- }
30
- ],
31
- max_tokens=300
32
- )
33
- return completion.choices[0].message.content
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
config/vetorial/rag.py CHANGED
@@ -1,4 +1,5 @@
1
  import os
 
2
  import time
3
  from typing import List
4
 
@@ -7,65 +8,163 @@ import edgedb
7
  from openai import OpenAI
8
  from qdrant_client import QdrantClient
9
 
10
- from utils.markdown import generate_image_description_with_empty_description
11
  from utils.cli import \
12
  print_execution_time, start_loading_animation, stop_loading_animation
13
- from splitter import splitter
14
  from qdrant_client.models import Distance, VectorParams
15
  from qdrant_client.models import PointStruct
16
 
17
- from utils.util import clear_enviromnent_variables
18
 
 
 
 
19
 
20
- HEADERS_TO_SPLIT_ON = [
21
- ("#", "Header 1"),
22
- ("##", "Header 2"),
23
- ("###", "Header 3"),
24
- ("####", "Header 4"),
25
- ("#####", "Header 5"),
26
- ("######", "Header 6"),
27
- ]
28
 
 
 
29
 
30
- def safe_join(thread, done: List[bool]):
31
- if thread is not None and thread.is_alive():
32
- done[0] = True
33
- thread.join()
34
 
 
 
35
 
36
- def run():
37
- clear_enviromnent_variables()
38
 
39
- type_env = input("Qual o tipo de ambiente? (dev, prod): ")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
 
41
- if type_env == "prod":
42
- load_dotenv(dotenv_path="../../.env", override=True)
43
- else:
44
- load_dotenv(dotenv_path="../../.env.development", override=True)
45
 
46
- loading_split = None
47
- loading_image_description = None
48
- loading_embedding = None
49
- done_split = [False]
50
- done_image_description = [False]
51
- done_embeding = [False]
52
 
53
- try:
54
- start_time = time.time()
55
- print("➗ Começando o RAG...")
56
-
57
- edgedb_client = None
58
- qdrant_client = None
59
- if type_env == "prod":
60
- edgedb_client = edgedb.create_client()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  print("✅ Conectado ao edgedb.")
62
- qdrant_client = QdrantClient(
63
  url=os.environ.get("QDRANT_URL"),
64
  api_key=os.environ.get("QDRANT_KEY")
65
  )
66
  print("✅ Conectado ao qdrant.")
67
- else:
68
- edgedb_client = edgedb.create_client(
 
 
69
  host=os.environ.get("EDGEDB_HOST"),
70
  user=os.environ.get("EDGEDB_USER"),
71
  password=os.environ.get("EDGEDB_PASSWORD"),
@@ -73,135 +172,115 @@ def run():
73
  tls_security="insecure"
74
  )
75
  print("✅ Conectado ao edgedb.")
76
- qdrant_client = QdrantClient(
77
- host=os.environ.get("QDRANT_HOST"),
78
  port=os.environ.get("QDRANT_PORT")
79
  )
80
  print("✅ Conectado ao qdrant.")
 
 
81
 
82
- oa_client = OpenAI(
83
  api_key=os.environ.get("OPENAI_API_KEY")
84
  )
85
  print("✅ Conectado a OpenAI.")
86
-
87
- if qdrant_client.collection_exists(os.environ.get("COLLECTION_NAME")):
88
- qdrant_client.delete_collection(
 
 
 
 
89
  collection_name=os.environ.get("COLLECTION_NAME")
90
  )
91
- qdrant_client.create_collection(
 
92
  collection_name=os.environ.get("COLLECTION_NAME"),
93
  vectors_config=VectorParams(size=1536, distance=Distance.COSINE)
94
  )
95
- print("✅ Collection criada.")
96
-
97
- web_sites = edgedb_client.query('''
98
- SELECT Website {
99
- url,
100
- text: {
101
- id,
102
- content
103
- },
104
- videos: {
105
- url
106
- },
107
- images: {
108
- path
109
- }
110
- }
111
- ''')
112
- print("✅ Websites capturados.")
113
 
114
- loading_image_description = start_loading_animation(
115
- done_image_description,
116
- "Gerando Descrições de imagens caso não tenha..."
117
- )
 
 
118
 
119
- texts_with_images_descriptions, error_images_description = \
120
- generate_image_description_with_empty_description(
121
- oa_client,
122
- web_sites
123
- )
124
- stop_loading_animation(
125
- done_image_description,
126
- loading_image_description
127
- )
128
- print("✅ Descrição de imagens geradas.")
129
 
130
- texts_parent_splitted, texts_child_splitted = splitter.split(
131
- texts_with_images_descriptions,
132
- HEADERS_TO_SPLIT_ON
133
- )
134
- print("✅ Textos dividos.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
 
136
- loading_split = start_loading_animation(
137
- done_split,
138
- "Dividindo textos..."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
139
  )
140
- for text_parent_splitted in texts_parent_splitted:
141
- edgedb_client.query(
142
- """
143
- INSERT Pattern {
144
- id := <uuid>$id,
145
- content := <str>$content,
146
- parent_id := <uuid>$parent_id,
147
- url := <str>$url
148
- }
149
- """,
150
- id=text_parent_splitted["id"],
151
- content=text_parent_splitted["content"].page_content,
152
- parent_id=text_parent_splitted["parent_id"],
153
- url=text_parent_splitted["url"]
154
- )
155
- stop_loading_animation(done_split, loading_split)
156
- print("✅ Texto pai salvo no Edgedb.")
157
-
158
- count_embeddings = 0
159
- total_child_splitted = len(texts_child_splitted)
160
- for text_child_splitted in texts_child_splitted:
161
- done_embeding = [False]
162
- loading_embedding = start_loading_animation(
163
- done_embeding,
164
- f"""Gerando embeddings e salvando no qdrant: {count_embeddings} de {total_child_splitted}""" # noqa
165
- )
166
- embedding = oa_client.embeddings.create(
167
- input=[text_child_splitted["content"].page_content],
168
- model=os.environ.get("OPENAI_MODEL_EMBEDDING")
169
- ).data[0].embedding
170
- qdrant_client.upsert(
171
- collection_name=os.environ.get("COLLECTION_NAME"),
172
- points=[PointStruct(
173
- id=str(text_child_splitted["id"]),
174
- vector=embedding,
175
- payload={
176
- "content": text_child_splitted["content"].page_content,
177
- "parent_id": text_child_splitted["parent_id"],
178
- "type": "text"
179
- }
180
- )]
181
- )
182
- count_embeddings += 1
183
- stop_loading_animation(done_embeding, loading_embedding)
184
- print("✅ Texto filho salvo no qdrant.")
185
-
186
- print("✅ RAG finalizado.")
187
-
188
- print(
189
- f"""
190
- 📊 Relatório:\n
191
- \t Tempo de execução: {print_execution_time(start_time)}\n
192
- \t Textos Filhos e Embedding gerados: {len(texts_child_splitted)}\n
193
- \t Textos pai gerados: {len(texts_parent_splitted)}\n
194
- \t WebSites recuperados da base: {len(web_sites)}\n
195
- \t Erros ao gerar descrição de imagens: {len(error_images_description)}\n
196
- """) # noqa
197
-
198
- except Exception as error:
199
- print(f"❌ Erro: {error}")
200
- finally:
201
- safe_join(loading_split, done_split)
202
- safe_join(loading_image_description, done_image_description)
203
- safe_join(loading_embedding, done_embeding)
204
 
205
 
206
  if __name__ == "__main__":
207
- run()
 
 
1
  import os
2
+ import re
3
  import time
4
  from typing import List
5
 
 
8
  from openai import OpenAI
9
  from qdrant_client import QdrantClient
10
 
 
11
  from utils.cli import \
12
  print_execution_time, start_loading_animation, stop_loading_animation
13
+ from splitter.splitter import Splitter
14
  from qdrant_client.models import Distance, VectorParams
15
  from qdrant_client.models import PointStruct
16
 
 
17
 
18
+ class Rag():
19
+ def __init__(self):
20
+ self.type_env = None
21
 
22
+ self.loading_split = None
23
+ self.loading_image_description = None
24
+ self.loading_embedding = None
25
+ self.done_split = [False]
26
+ self.done_image_description = [False]
27
+ self.done_embeding = [False]
 
 
28
 
29
+ self.edgedb_client = None
30
+ self.qdrant_client = None
31
 
32
+ def run(self):
33
+ try:
34
+ self._initial_config()
 
35
 
36
+ start_time = time.time()
37
+ print("➗ Começando o RAG...")
38
 
39
+ self._create_collection()
40
+ print("✅ Collection criada.")
41
 
42
+ web_sites = self.edgedb_client.query('''
43
+ SELECT Website {
44
+ url,
45
+ text: {
46
+ id,
47
+ content
48
+ },
49
+ videos: {
50
+ url
51
+ },
52
+ images: {
53
+ path
54
+ }
55
+ }
56
+ ''')
57
+ print("✅ Websites capturados.")
58
 
59
+ self.loading_image_description = start_loading_animation(
60
+ self.done_image_description,
61
+ "Gerando Descrições de imagens caso não tenha..."
62
+ )
63
 
64
+ texts_with_images_descriptions, error_images_description = \
65
+ self._generate_image_description_with_empty_description(web_sites)
 
 
 
 
66
 
67
+ stop_loading_animation(
68
+ self.done_image_description,
69
+ self.loading_image_description
70
+ )
71
+ print("✅ Descrição de imagens geradas.")
72
+
73
+ self.loading_split = start_loading_animation(
74
+ self.done_split,
75
+ "Dividindo textos e salvando textos pai no bd..."
76
+ )
77
+
78
+ splitter = Splitter(texts_with_images_descriptions)
79
+ splitter.split()
80
+
81
+ for text_parent in splitter.texts_parent:
82
+ self.edgedb_client.query(
83
+ """
84
+ INSERT Pattern {
85
+ id := <uuid>$id,
86
+ content := <str>$content,
87
+ parent_id := <uuid>$parent_id,
88
+ url := <str>$url
89
+ }
90
+ """,
91
+ id=text_parent["id"],
92
+ content=text_parent["content"].page_content,
93
+ parent_id=text_parent["parent_id"],
94
+ url=text_parent["url"]
95
+ )
96
+ stop_loading_animation(self.done_split, self.loading_split)
97
+ print("✅ Textos dividos e textos pai salvo no Edgedb.")
98
+
99
+ count_embeddings = 0
100
+ total_child = len(splitter.texts_child)
101
+ for text_child in splitter.texts_child:
102
+ self.done_embeding = [False]
103
+ self.loading_embedding = start_loading_animation(
104
+ self.done_embeding,
105
+ f"""Gerando embeddings e salvando no qdrant: {count_embeddings} de {total_child}""" # noqa
106
+ )
107
+ embedding = self.oa_client.embeddings.create(
108
+ input=[text_child["content"].page_content],
109
+ model=os.environ.get("OPENAI_MODEL_EMBEDDING")
110
+ ).data[0].embedding
111
+ self.qdrant_client.upsert(
112
+ collection_name=os.environ.get("COLLECTION_NAME"),
113
+ points=[PointStruct(
114
+ id=str(text_child["id"]),
115
+ vector=embedding,
116
+ payload={
117
+ "content": text_child["content"].page_content,
118
+ "parent_id": text_child["parent_id"],
119
+ "type": "text"
120
+ }
121
+ )]
122
+ )
123
+ count_embeddings += 1
124
+ stop_loading_animation(self.done_embeding, self.loading_embedding)
125
+
126
+ print("✅ Texto filho salvo no qdrant.")
127
+
128
+ print("✅ RAG finalizado.")
129
+
130
+ print(
131
+ f"""
132
+ 📊 Relatório:\n
133
+ \t Tempo de execução: {print_execution_time(start_time)}\n
134
+ \t Textos Filhos e Embedding gerados: {len(splitter.texts_child)}\n
135
+ \t Textos pai gerados: {len(splitter.texts_parent)}\n
136
+ \t WebSites recuperados da base: {len(web_sites)}\n
137
+ \t Erros ao gerar descrição de imagens: {len(error_images_description)}\n
138
+ """) # noqa
139
+
140
+ except Exception as error:
141
+ print(f"❌ Erro: {error}")
142
+
143
+ finally:
144
+ Rag.safe_join(self.loading_split, self.done_split)
145
+ Rag.safe_join(self.loading_image_description, self.done_image_description)
146
+ Rag.safe_join(self.loading_embedding, self.done_embeding)
147
+
148
+ def _initial_config(self):
149
+ """
150
+ Carrega as novas váriaveis de ambiente dependendo do tipo de ambiente e faz as conexões necessárias.
151
+ """
152
+ self.type_env = input("Qual o tipo de ambiente? (dev, prod): ")
153
+
154
+ if self.type_env == "prod":
155
+ print("Carregando váriaveis de ambiente de produção...")
156
+ load_dotenv(dotenv_path="../../.env", override=True)
157
+ self.edgedb_client = edgedb.create_client()
158
  print("✅ Conectado ao edgedb.")
159
+ self.qdrant_client = QdrantClient(
160
  url=os.environ.get("QDRANT_URL"),
161
  api_key=os.environ.get("QDRANT_KEY")
162
  )
163
  print("✅ Conectado ao qdrant.")
164
+ elif self.type_env == "dev":
165
+ print("Carregando váriaveis de ambiente de desenvolvimento...")
166
+ load_dotenv(dotenv_path="../../.env.development", override=True)
167
+ self.edgedb_client = edgedb.create_client(
168
  host=os.environ.get("EDGEDB_HOST"),
169
  user=os.environ.get("EDGEDB_USER"),
170
  password=os.environ.get("EDGEDB_PASSWORD"),
 
172
  tls_security="insecure"
173
  )
174
  print("✅ Conectado ao edgedb.")
175
+ self.qdrant_client = QdrantClient(
176
+ host=os.environ.get("QDRANT_HOST"),
177
  port=os.environ.get("QDRANT_PORT")
178
  )
179
  print("✅ Conectado ao qdrant.")
180
+ else:
181
+ raise Exception("Tipo de ambiente inválido.")
182
 
183
+ self.oa_client = OpenAI(
184
  api_key=os.environ.get("OPENAI_API_KEY")
185
  )
186
  print("✅ Conectado a OpenAI.")
187
+
188
+ def _create_collection(self):
189
+ """
190
+ Cria a collection do qdrant e se caso existir, a deleta.
191
+ """
192
+ if self.qdrant_client.collection_exists(os.environ.get("COLLECTION_NAME")):
193
+ self.qdrant_client.delete_collection(
194
  collection_name=os.environ.get("COLLECTION_NAME")
195
  )
196
+
197
+ self.qdrant_client.create_collection(
198
  collection_name=os.environ.get("COLLECTION_NAME"),
199
  vectors_config=VectorParams(size=1536, distance=Distance.COSINE)
200
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
201
 
202
+ def _generate_image_description_with_empty_description(self, websites):
203
+ """
204
+ Gera descrição de imagens caso não tenha.
205
+ """
206
+ # Expressão regular para encontrar o padrão ![](<link>)
207
+ pattern = r'!\[\]\(([^)]+)\)'
208
 
209
+ def replace_description_image(match):
210
+ link = match.group(1)
211
+ new_description = self._get_description_of_image(link)
212
+ return f'![{new_description}]({link})'
 
 
 
 
 
 
213
 
214
+ texts_with_images_descriptions = []
215
+ error_images_upload = []
216
+ for website in websites:
217
+ try:
218
+ text_with_image_description = re.sub(
219
+ pattern,
220
+ replace_description_image,
221
+ website.text.content
222
+ )
223
+ texts_with_images_descriptions.append({
224
+ "id": website.text.id,
225
+ "content": text_with_image_description,
226
+ "url": website.url
227
+ })
228
+ except Exception:
229
+ error_images_upload.append(
230
+ f"{website.text.id}: {website.text.content}")
231
+ texts_with_images_descriptions.append({
232
+ "id": website.text.id,
233
+ "content": website.text.content,
234
+ "url": website.url
235
+ })
236
+
237
+ return texts_with_images_descriptions, error_images_upload
238
 
239
+ def _get_description_of_image(self, image_url):
240
+ """
241
+ Faz uma chamada para Open AI aonde gera uma descrição para uma imagem
242
+ """
243
+ completion = self.oa_client.chat.completions.create(
244
+ model="gpt-4o-mini",
245
+ messages=[
246
+ {
247
+ "role": "system",
248
+ "content": """
249
+ You are an image descriptor who will describe images using the Brazilian Portuguese language.
250
+ This description should be short and to the point, with a maximum of 50 characters, to be placed in the alt tag of an HTML.
251
+ """ # noqa
252
+ },
253
+ {
254
+ "role": "user",
255
+ "content": [
256
+ {
257
+ "type": "text",
258
+ "text": "What's in this image?"
259
+ },
260
+ {
261
+ "type": "image_url",
262
+ "image_url": {
263
+ "url": f"{image_url}"
264
+ }
265
+ }
266
+ ]
267
+ }
268
+ ],
269
+ max_tokens=300
270
  )
271
+ return completion.choices[0].message.content
272
+
273
+ @staticmethod
274
+ def safe_join(thread, done: List[bool]):
275
+ """
276
+ Faz o join de uma thread se ela estiver viva
277
+ parando assim o print de loading.
278
+ """
279
+ if thread is not None and thread.is_alive():
280
+ done[0] = True
281
+ thread.join()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
282
 
283
 
284
  if __name__ == "__main__":
285
+ rag = Rag()
286
+ rag.run()
config/vetorial/splitter/splitter.py CHANGED
@@ -1,61 +1,97 @@
 
1
  from langchain_text_splitters import \
2
  MarkdownHeaderTextSplitter, RecursiveCharacterTextSplitter
3
  import uuid
 
4
 
 
 
 
 
 
 
 
 
5
 
6
- def split(texts, headers_to_split_on):
7
  """
8
- Dividir os textos em chunks utilizando a lógica
9
- "Parent Document Retriever",
10
- retornando os chunks e os documentos pais.
11
  """
12
- texts_parent_splitted_list = []
13
- texts_child_splitted_list = []
14
 
15
- for text in texts:
16
- texts_parent_splitted = markdown_split(
17
- text["content"], headers_to_split_on)
 
18
 
19
- for text_parent_splitted in texts_parent_splitted:
20
- parent_id = uuid.uuid4()
21
- text_parent_splitted_dict = {
22
- "id": parent_id,
23
- "parent_id": text["id"],
24
- "content": text_parent_splitted,
25
- "url": text["url"]
26
- }
27
 
28
- texts_parent_splitted_list.append(text_parent_splitted_dict)
29
- texts_child_splitted = text_split(
30
- text_parent_splitted.page_content)
31
 
32
- for text_child_splitted in texts_child_splitted:
33
- child_id = uuid.uuid4()
34
- texts_child_splitted_dict = {
35
- "id": child_id,
36
- "parent_id": parent_id,
37
- "content": text_child_splitted
38
- }
39
 
40
- texts_child_splitted_list.append(texts_child_splitted_dict)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
 
42
- return [texts_parent_splitted_list, texts_child_splitted_list]
43
 
 
 
 
 
 
 
 
 
 
 
 
 
44
 
45
- def markdown_split(text, headers_to_split_on):
46
- markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on)
47
 
48
- return markdown_splitter.split_text(text)
 
 
 
 
 
 
49
 
50
-
51
- def text_split(text):
52
- text_splitter = RecursiveCharacterTextSplitter(
53
- chunk_size=500,
54
- chunk_overlap=100,
55
- length_function=len,
56
- is_separator_regex=False,
57
- )
58
-
59
- texts = text_splitter.create_documents([text])
60
-
61
- return texts
 
 
 
1
+ from langchain_core.documents import Document
2
  from langchain_text_splitters import \
3
  MarkdownHeaderTextSplitter, RecursiveCharacterTextSplitter
4
  import uuid
5
+ from typing import List
6
 
7
+ HEADERS_TO_SPLIT_ON = [
8
+ ("#", "Header 1"),
9
+ ("##", "Header 2"),
10
+ ("###", "Header 3"),
11
+ ("####", "Header 4"),
12
+ ("#####", "Header 5"),
13
+ ("######", "Header 6"),
14
+ ]
15
 
16
+ class Splitter():
17
  """
18
+ Classe responsável por dividir os textos em chunks
 
 
19
  """
 
 
20
 
21
+ def __init__(self, texts):
22
+ self.texts = texts
23
+ self.texts_parent = []
24
+ self.texts_child = []
25
 
26
+ def split(self):
27
+ """
28
+ Dividir os textos em chunks utilizando a lógica
29
+ "Parent Document Retriever",
30
+ retornando os textos filhos e os textos pais.
31
+ """
32
+ for text in self.texts:
33
+ texts_parent = Splitter._markdown_split(text["content"])
34
 
35
+ for text_parent in texts_parent:
36
+ parent_id = self._save_parent_text(text, text_parent)
37
+ texts_child = Splitter._text_split(text_parent.page_content)
38
 
39
+ for text_child in texts_child:
40
+ self._save_child_text(parent_id, text_child)
 
 
 
 
 
41
 
42
+
43
+
44
+ def _save_parent_text(self, text, text_parent: str) -> uuid.UUID:
45
+ """
46
+ Responsável por salvar o texto pai com o id
47
+ do texto completo e seus dados completos e retornar
48
+ o id gerado do texto pai.
49
+ """
50
+
51
+ parent_id = uuid.uuid4()
52
+ text_parent_data = {
53
+ "id": parent_id,
54
+ "parent_id": text["id"],
55
+ "content": text_parent,
56
+ "url": text["url"]
57
+ }
58
+ self.texts_parent.append(text_parent_data)
59
 
60
+ return parent_id
61
 
62
+ def _save_child_text(self, parent_id: uuid.UUID, text_child: str) -> None:
63
+ """
64
+ Responsável por salvar o texto filho com o id
65
+ do texto pai e seus dados completos.
66
+ """
67
+ child_id = uuid.uuid4()
68
+ text_child_data = {
69
+ "id": child_id,
70
+ "parent_id": parent_id,
71
+ "content": text_child
72
+ }
73
+ self.texts_child.append(text_child_data)
74
 
 
 
75
 
76
+ @staticmethod
77
+ def _markdown_split(text: str) -> List[str]:
78
+ """
79
+ Dividi o texto pelos headers explicitados
80
+ """
81
+ markdown_splitter = MarkdownHeaderTextSplitter(HEADERS_TO_SPLIT_ON)
82
+ return markdown_splitter.split_text(text)
83
 
84
+
85
+ @staticmethod
86
+ def _text_split(text_parent: str) -> List[Document]:
87
+ """
88
+ Dividi o texto em chunks
89
+ """
90
+ text_splitter = RecursiveCharacterTextSplitter(
91
+ chunk_size=500,
92
+ chunk_overlap=100,
93
+ length_function=len,
94
+ is_separator_regex=False,
95
+ )
96
+
97
+ return text_splitter.create_documents([text_parent])
config/vetorial/utils/markdown.py DELETED
@@ -1,37 +0,0 @@
1
- import re
2
- from oac.oac import get_description_of_image
3
-
4
-
5
- def generate_image_description_with_empty_description(oa_client, websites):
6
- # Expressão regular para encontrar o padrão ![](<link>)
7
- pattern = r'!\[\]\(([^)]+)\)'
8
-
9
- def replace_description_image(match):
10
- link = match.group(1)
11
- new_description = get_description_of_image(oa_client, link)
12
- return f'![{new_description}]({link})'
13
-
14
- texts_with_images_descriptions = []
15
- error_images_upload = []
16
- for website in websites:
17
- try:
18
- text_with_image_description = re.sub(
19
- pattern,
20
- replace_description_image,
21
- website.text.content
22
- )
23
- texts_with_images_descriptions.append({
24
- "id": website.text.id,
25
- "content": text_with_image_description,
26
- "url": website.url
27
- })
28
- except Exception:
29
- error_images_upload.append(
30
- f"{website.text.id}: {website.text.content}")
31
- texts_with_images_descriptions.append({
32
- "id": website.text.id,
33
- "content": website.text.content,
34
- "url": website.url
35
- })
36
-
37
- return texts_with_images_descriptions, error_images_upload
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
requirements.txt CHANGED
@@ -3,7 +3,7 @@ annotated-types==0.7.0
3
  anyio==4.5.0
4
  async-timeout==4.0.3
5
  attrs==24.2.0
6
- bcrypt==4.2.0
7
  blinker==1.8.2
8
  cachetools==5.5.0
9
  certifi==2024.8.30
@@ -33,6 +33,7 @@ jsonschema-specifications==2023.12.1
33
  langchain-core==0.2.41
34
  langchain-text-splitters==0.2.4
35
  langsmith==0.1.133
 
36
  markdown-it-py==3.0.0
37
  MarkupSafe==2.1.5
38
  mdurl==0.1.2
@@ -65,6 +66,7 @@ rpds-py==0.20.0
65
  six==1.16.0
66
  smmap==5.0.1
67
  sniffio==1.3.1
 
68
  streamlit==1.39.0
69
  tenacity==8.5.0
70
  toml==0.10.2
 
3
  anyio==4.5.0
4
  async-timeout==4.0.3
5
  attrs==24.2.0
6
+ beautifulsoup4==4.12.3
7
  blinker==1.8.2
8
  cachetools==5.5.0
9
  certifi==2024.8.30
 
33
  langchain-core==0.2.41
34
  langchain-text-splitters==0.2.4
35
  langsmith==0.1.133
36
+ lxml==5.3.0
37
  markdown-it-py==3.0.0
38
  MarkupSafe==2.1.5
39
  mdurl==0.1.2
 
66
  six==1.16.0
67
  smmap==5.0.1
68
  sniffio==1.3.1
69
+ soupsieve==2.6
70
  streamlit==1.39.0
71
  tenacity==8.5.0
72
  toml==0.10.2