Spaces:
Sleeping
Sleeping
refatorando código
Browse files- .env.development +2 -4
- config/coleta/gov_links.csv +0 -100
- config/edgedb/populate_edgedb.py +1 -1
- config/vetorial/oac/oac.py +0 -33
- config/vetorial/rag.py +230 -151
- config/vetorial/splitter/splitter.py +80 -44
- config/vetorial/utils/markdown.py +0 -37
- requirements.txt +3 -1
.env.development
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
OPENAI_API_KEY="sk-
|
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("
|
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
|
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 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
("######", "Header 6"),
|
27 |
-
]
|
28 |
|
|
|
|
|
29 |
|
30 |
-
def
|
31 |
-
|
32 |
-
|
33 |
-
thread.join()
|
34 |
|
|
|
|
|
35 |
|
36 |
-
|
37 |
-
|
38 |
|
39 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
|
46 |
-
|
47 |
-
|
48 |
-
loading_embedding = None
|
49 |
-
done_split = [False]
|
50 |
-
done_image_description = [False]
|
51 |
-
done_embeding = [False]
|
52 |
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
68 |
-
|
|
|
|
|
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 |
-
|
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 |
-
|
88 |
-
|
|
|
|
|
|
|
|
|
89 |
collection_name=os.environ.get("COLLECTION_NAME")
|
90 |
)
|
91 |
-
|
|
|
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 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
|
|
|
|
118 |
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
)
|
124 |
-
stop_loading_animation(
|
125 |
-
done_image_description,
|
126 |
-
loading_image_description
|
127 |
-
)
|
128 |
-
print("✅ Descrição de imagens geradas.")
|
129 |
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
135 |
|
136 |
-
|
137 |
-
|
138 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
139 |
)
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
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 |
-
|
|
|
|
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 |
-
|
7 |
"""
|
8 |
-
|
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 |
-
|
16 |
-
|
17 |
-
|
|
|
18 |
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
"
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
|
32 |
-
|
33 |
-
|
34 |
-
texts_child_splitted_dict = {
|
35 |
-
"id": child_id,
|
36 |
-
"parent_id": parent_id,
|
37 |
-
"content": text_child_splitted
|
38 |
-
}
|
39 |
|
40 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
|
42 |
-
|
43 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
|
45 |
-
def markdown_split(text, headers_to_split_on):
|
46 |
-
markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on)
|
47 |
|
48 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
|
|
|
|
|
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 |
-
|
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
|