File size: 15,657 Bytes
c5586ab
2ce5e93
c5586ab
 
588b95c
 
c5586ab
 
 
 
 
de78af1
f490f11
de78af1
 
 
 
 
 
 
2213315
f490f11
 
 
de78af1
c5586ab
2213315
 
 
c5586ab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d07865c
c5586ab
 
 
0eba73c
f490f11
0eba73c
f490f11
c5586ab
de78af1
f490f11
 
de78af1
3d09051
 
de78af1
 
f490f11
 
 
de78af1
 
 
f490f11
 
0eba73c
 
f490f11
2ce5e93
f490f11
 
 
 
 
2ce5e93
f490f11
 
 
 
de78af1
f490f11
de78af1
 
 
 
f490f11
 
 
de78af1
f490f11
 
 
 
 
 
 
 
de78af1
 
113d947
de78af1
 
 
113d947
 
 
de78af1
 
 
 
 
 
 
 
 
 
 
 
2213315
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2ce5e93
 
2213315
 
 
2ce5e93
 
 
 
2213315
3d09051
2213315
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import pytest
from _utils.gerar_documento_utils.contextual_retriever import (
    ContextualRetriever,
)
from _utils.models.gerar_documento import RetrievalConfig
from _utils.models.gerar_documento import (
    ContextualizedChunk,
    DocumentChunk,
    RetrievalConfig,
)
from tests.fixtures.processo_civil_01 import response_auxiliary_summary
from tests.gerar_relatorio_modelo_usuario.fixture_chunks import (
    ChunkResponseFromLLM,
    cenario_01_lista_com_20_chunks,
    cenario_01_resumo_auxiliar,
    resposta_errada_ids,
)
from tests.gerar_relatorio_modelo_usuario.fixture_lista_respostas_contextuals import (
    lista_respostas_contextuals,
    lista_respostas,
    lista_respostas_contextuals_cenario_02,
    lista_20_chunks,
    lista_20_chunks_cenario_02,
    Listas20Chunks
)

from unittest.mock import Mock, AsyncMock, patch


config = RetrievalConfig(
    num_chunks=20,
    embedding_weight=0.5,
    bm25_weight=0.5,
    context_window=3,
    chunk_overlap=800,
    chunk_size=1000,
)

lista_chunks_errados = [
    DocumentChunk(
        content="AO JUÍZO DA VARA DO SISTEMA DE JUIZADO ESPECIAL CÍVEL DA \nCOMARCA DE MARAÚ/ITACARÉ-BA. \n \n \n \n \nProcesso nº: 8000630-48.2023.8.05.0114 \n \n \nGABRIELA SALVATORE TEBET PIEDADE PETROCELLO , já \nqualificada nos autos do processo em epígrafe, vem mui respeitosamente, através de seus \nprocuradores in fine assinado, instrumento procuratório anexo aos autos, apresentar  \nIMPUGNAÇÃO À CONTESTAÇÃO , pelos motivos de fato e de direito expostos a \nseguir: \n \nI. DAS PRELIMINARES EM SEDE DE CONTESTAÇÃO \nA. DA IMPUGNAÇÃO DA PRELIMINAR INCOMPETÊNCIA \nABSOLUTA DO JUÍZO \n \nA empresa requerida, aduz que o Juízo da comarca de Itacaré, não é competente \npara julgar as demandas de residentes na com arca de Maraú (Barra Grande), sob o \nargumento de que a demandante não anexou comprovante de residência, no entanto, por \num infortúnio , a autora n ão colacionou o comprovante de residência, porém, como é \ndocumento obrigatório e o sistema não se atentou a inf ormar a ausência, junta-se agora, \npara sanar quaisquer dúvidas. \n \n \nNum. 391025923 - Pág. 2\nAssinado eletronicamente por: ROGERIO DANTAS OLIVEIRA - 30/05/2023 10:58:20\nhttps://pje.tjba.jus.br/pje/Processo/ConsultaDocumento/listView.seam?x=23053010581937600000380220036\nNúmero do documento: 23053010581937600000380220036\nEste documento foi gerado pelo usuário 048.***.***-01 em 01/02/2025 18:32:20\n \n \nNão obstante, a autora reside em Barra Grande, na pen ínsula de Maraú, o nde a \ncomarca de Itacar é atua como seção judiciária, ou seja, as ações d essa região , são \nNum. 391025923 - Pág. 3\nAssinado eletronicamente por: ROGERIO DANTAS OLIVEIRA - 30/05/2023 10:58:20\nhttps://pje.tjba.jus.br/pje/Processo/ConsultaDocumento/listView.seam?x=23053010581937600000380220036\nNúmero do documento: 23053010581937600000380220036\nEste documento foi gerado pelo usuário 048.***.***-01 em 01/02/2025 18:32:20\n \nenglobadas à comarca de Itacaré, tendo em vista qu e o Município de Maraú não possui \ncomarca. \nPosto isso, não há o que se falar em incompetência do juízo, devendo a preliminar \nser afastada. \nB. IMPUGNAÇÃO DA PRELIMINAR DE CONEXÃO COM OUTRO \nPROCESSO \n \nInsta dizer, que a empresa ré, informa que há conexão entre o processo da autora \ncom o de seu esposo, com mesma causa de pedir e pedido, o que não é verdade. \nO caso da autora, foi que ela teve prejuízo moral,  onde teve por obr igação da \nempresa ré, a modificação de seu voo, para chegar depois do almoço de páscoa o que a \nfez perder a páscoa com sua família, com uma criança, diante da comprovada falha no \nserviço prestado, causando um transtorno absurdo. Já no caso do marido da autora, os \nfatos são diferentes, embora ocasionados pela mesma falha de serviço da ré. \nO marido da autora teve que pedir o cancelamento, uma vez que não podia viajar \nna data, e teve prejuízo, tanto moral como material, e foi obrigado a pagar um valor e não \nteve o reembolso, portanto, os fatos não são os mesmos, as partes não são as mesmas e os \nprejuízos causados são diversos. Devendo, portanto, a presente preliminar ser afastada. \n \nII. IMPUGNAÇÃO DAS TELAS E DOCUMENTOS \nCOLACIONADOS AOS AUTOS \n \nA tela colacionada no bojo da peça em que mostra os fatos narrados na exordial, \nsequer foram co nfrontados pelo requerido, uma vez que apenas trazem alegações sem \nprovas do que realmente aconteceu, usando do argu mento de que a demandante foi \ninformada com antecedência.  Num. 391025923 - Pág. 4\nAssinado eletronicamente por: ROGERIO DANTAS OLIVEIRA - 30/05/2023 10:58:20",
        page_number=89,
        chunk_id="fee5636c-92fb-4614-889f-ba981b62cbd0",
        start_char=138901,
        end_char=142372,
        id_do_processo=0,
        contextual_summary="",
    ),
    DocumentChunk(
        content="O marido da autora teve que pedir o cancelamento, uma vez que não podia viajar \nna data, e teve prejuízo, tanto moral como material, e foi obrigado a pagar um valor e não \nteve o reembolso, portanto, os fatos não são os mesmos, as partes não são as mesmas e os \nprejuízos causados são diversos. Devendo, portanto, a presente preliminar ser afastada. \n \nII. IMPUGNAÇÃO DAS TELAS E DOCUMENTOS \nCOLACIONADOS AOS AUTOS \n \nA tela colacionada no bojo da peça em que mostra os fatos narrados na exordial, \nsequer foram co nfrontados pelo requerido, uma vez que apenas trazem alegações sem \nprovas do que realmente aconteceu, usando do argu mento de que a demandante foi \ninformada com antecedência.  Num. 391025923 - Pág. 4\nAssinado eletronicamente por: ROGERIO DANTAS OLIVEIRA - 30/05/2023 10:58:20\nhttps://pje.tjba.jus.br/pje/Processo/ConsultaDocumento/listView.seam?x=23053010581937600000380220036\nNúmero do documento: 23053010581937600000380220036\nEste documento foi gerado pelo usuário 048.***.***-01 em 01/02/2025 18:32:20\n \nImportante mencionar que, os documentos colacionados aos autos não possuem o \ncondão de confrontar as alegações autorais, uma vez que não impugnam especificamente \nos direitos da Autora.  \nOs documentos acostados, são apenas documentos de representação, não tendo \nqualquer embasamento para trazer prova do contrário. \nDesse modo, resta evidente que o requerido não se desincumbiu do ônus de provar \nfato impeditivo, modificativo e extintivo. Sendo assim, a única conclusão lógica é a total \nprocedência dos pedidos autorais. Por fim, impugna todos os documentos apresentados \npelo réu. \n \nIII. DOS PEDIDOS \n \nAnte exposto, diante dos argumentos trazidos na peça contestatória se revelam \ninsuficientes e ineficazes para rechaçar os pedidos formulados no petitório inaugural, \nportanto, impugnado a defesa requer:  \na) A manutenção de todos os argumentos explanados na inicial, sendo julgada \ntotalmente procedente a ação;  \n \nNestes termos,  \nPede deferimento. \n \nIlhéus-Ba, 30 de maio de 2023. \n \n \nROGÉRIO DANTAS OLIVEIRA          MARIA CLARA NASCIMENTO BARROS \n               OAB/BA 64.702                                                 OAB/BA 63.039 \n Num. 391055932 - Pág. 1\nAssinado eletronicamente por: GABRIELLE CAROLINA LOPES PEREIRA - 30/05/2023 12:50:30\nhttps://pje.tjba.jus.br/pje/Processo/ConsultaDocumento/listView.seam?x=23053012503024400000380248733\nNúmero do documento: 23053012503024400000380248733\nEste documento foi gerado pelo usuário 048.***.***-01 em 01/02/2025 18:32:21\n\xa0\n\xa0\nPODER JUDICIÁRIO DO ESTADO DA BAHIA  \nComarca de Itacaré \n\xa0\nEnd: Rua Joaquim Vieira, sn, Itacaré-Bahia – Fone: (73) 3251-2158\n\xa0\n\xa0\nTERMO DE AUDIÊNCIA\xa0\nProcesso nº :\xa0 \xa08000630-48.2023.8.05.0114\nClasse - Assunto :\xa0[Transporte Aéreo, Cancelamento de vôo]\xa0\nAUTOR: GABRIELA SALVATORE TEBET PIEDADE  \n\xa0\nREU: GOL LINHAS AEREAS INTELIGENTES S.A.  \n\xa0\n \nNesta cidade Itacaré, Estado da Bahia, às 12:40, neste fórum, na sala de audiências,\xa0onde\xa0se encontrava Gabrielle Carolina Lopes \nPereira, conciliadora desta comarca, foi aberta a\xa0audiência de conciliação TELEPRESENCIAL no aplicativo LIFESIZE, sala \nAudiências\xa0Preliminares\xa0(9835079).\xa0Estavam presentes a autora da ação\xa0GABRIELA SALVATORE TEBET PIEDADE, \nacompanhada do seu advogado\xa0\xa0ROGERIO DANTAS OLIVEIRA - OAB BA64702 \xa0, bem como o\xa0réu GOL LINHAS AEREAS \nINTELIGENTES S.A. , representado pela preposta\xa0Juliana Scofano de Araujo Gonçalves CPF 096.147.127-16\xa0, desacompanhada \nde advogado.",
        page_number=89,
        chunk_id="bfb957f3-f98f-4680-95c3-e0232592c04a",
        start_char=142373,
        end_char=145831,
        id_do_processo=0,
        contextual_summary="",
    ),
    DocumentChunk(
        content="Processo nº :\xa0 \xa08000630-48.2023.8.05.0114\nClasse - Assunto :\xa0[Transporte Aéreo, Cancelamento de vôo]\xa0\nAUTOR: GABRIELA SALVATORE TEBET PIEDADE  \n\xa0\nREU: GOL LINHAS AEREAS INTELIGENTES S.A.  \n\xa0\n \nNesta cidade Itacaré, Estado da Bahia, às 12:40, neste fórum, na sala de audiências,\xa0onde\xa0se encontrava Gabrielle Carolina Lopes \nPereira, conciliadora desta comarca, foi aberta a\xa0audiência de conciliação TELEPRESENCIAL no aplicativo LIFESIZE, sala \nAudiências\xa0Preliminares\xa0(9835079).\xa0Estavam presentes a autora da ação\xa0GABRIELA SALVATORE TEBET PIEDADE, \nacompanhada do seu advogado\xa0\xa0ROGERIO DANTAS OLIVEIRA - OAB BA64702 \xa0, bem como o\xa0réu GOL LINHAS AEREAS \nINTELIGENTES S.A. , representado pela preposta\xa0Juliana Scofano de Araujo Gonçalves CPF 096.147.127-16\xa0, desacompanhada \nde advogado.\xa0\n\xa0\nAberta a audiência com as formalidades de estilo e iniciada a gravação, foi infrutífera a tentativa de acordo.\n \nManifestou-se a parte requerida nos seguintes termos:\nReitera a defesa sob ID\xa0390345882. Requer habilitação exclusiva do Dr. GUSTAVO ANTONIO FERES PAIXAO \nOAB BA 55666. Sem mais. Pede deferimento.\n \nManifestou-se a parte requerente nos seguintes termos:\nReitera a Impugnação à Contestação já juntada aos autos sob ID 391025923 e requer a total procedência da ação, nos \ntermos da Inicial. Pede deferimento.\xa0\n\xa0\nAo final voltam-se os\xa0autos conclusos para MM Juíza. Nada mais havendo encerra-se este termo.\nLink para gravação da audiência:\xa0 https://playback.lifesize.com/#/publicvideo/5555e592-32f9-4f1a-bea5-",
        page_number=89,
        chunk_id="f4c1c853-8d2f-4aae-9d04-d725066b6bf8",
        start_char=145832,
        end_char=147339,
        id_do_processo=0,
        contextual_summary="",
    ),
]


class TestContextualRetriever:
    context_retrieval = ContextualRetriever(config, "claude-3-haiku-20240307")

    @pytest.mark.asyncio
    async def test_contextualize_uma_lista_de_20_chunks(self):
        cenarios = Listas20Chunks()
        resultado = await self.context_retrieval.contextualize_uma_lista_de_20_chunks(
            cenarios.cenario_03_lista, cenarios.cenario_03_resumo_contextual
        )

        print('\n\nresultado[0]', resultado[0])

    @pytest.mark.asyncio
    async def test_llm_call_uma_lista_de_20_chunks(self):
        resultado = await self.context_retrieval.llm_call_uma_lista_de_20_chunks(
            cenario_01_lista_com_20_chunks, cenario_01_resumo_auxiliar
        )
        print("resultado: ", resultado)
        assert len(resultado) == len(cenario_01_lista_com_20_chunks)
        assert all(len(item) == 3 for item in resultado)

    @pytest.mark.asyncio
    async def test_validate_many_chunks_in_one_request(self):
        fixture = ChunkResponseFromLLM()
        lista_fixtures = [
            [fixture.resposta_cenario_01, fixture.lista_ids_cenario_01],
            [fixture.resposta_cenario_02, fixture.lista_ids_cenario_02],
        ]

        for cenario in lista_fixtures:
            resultado = validate_many_chunks_in_one_request(
                cenario[0],
                cenario[1],
            )

            assert resultado and len(resultado) == len(cenario[1])
            assert all( isinstance(item[0], int) and item[0] != 0 for item in resultado)
            assert all( isinstance(item[1], str) and item[1] != "" for item in resultado)
            assert all( isinstance(item[2], str) and item[2] != "" for item in resultado)

            print("\n\nresultado", resultado)

    @pytest.mark.asyncio
    async def test_get_info_from_validated_chunks(self):
        contador = 1
        print(len(lista_respostas_contextuals_cenario_02))
        # lista_respostas + lista_respostas_contextuals_cenario_02
        for response in (lista_respostas_contextuals_cenario_02 + lista_respostas):
            matches = validate_many_chunks_in_one_request(response, resposta_errada_ids)
            try:
                assert matches and len(matches) > 2
                assert all( isinstance(item[0], int) and item[0] != 0 for item in matches)
                assert all( isinstance(item[1], str) and item[1] != "" for item in matches)
                assert all( isinstance(item[2], str) and item[2] != "" for item in matches)
            except:
                print('\n\nresponse', response)
                raise BaseException("deu ruim")

            resultado = self.context_retrieval.get_info_from_validated_chunks(matches)
            print("\n\nresultado", resultado)
            print("\n\ncontador", contador)
            contador += 1
            assert all(len(item) == 3 for item in resultado)
            assert all(isinstance(item[0], int) for item in resultado)
            assert all(isinstance(item[1], str) for item in resultado)
            assert all(isinstance(item[2], str) for item in resultado)

        # COMENTADO ABAIXO PARA RODAR APENAS UMA RESPOSTA
        # print("lista_respostas[143]: ", lista_respostas[143])
        # matches = validate_many_chunks_in_one_request(
        #     lista_respostas[143], resposta_errada_ids
        # )

        # resultado = self.context_retrieval.get_info_from_validated_chunks(matches)
        # # print("\n\nresultado", resultado)
        # print("\n\ncontador", contador)
        # contador += 1
        # assert all(len(item) == 3 for item in resultado)

    @pytest.mark.asyncio
    async def test_valida_retries_automaticos_do_contextual(self, monkeypatch):
        call_count = 0  # Track how many times the function is called

        # Define the custom side effect
        def custom_side_effect(response, document_ids):
            nonlocal call_count
            print(f"MOCK CALL {call_count+1} RECEIVED")
            if call_count < 2:
                call_count += 1
                print("MOCK RETORNADO FALSE")
                return False  # Mocked return value for first two calls
            return validate_many_chunks_in_one_request(response, document_ids) # Call the real function after two mocks

        monkeypatch.setattr(
            "_utils.gerar_documento_utils.contextual_retriever.validate_many_chunks_in_one_request",
            custom_side_effect,
        )

        mock_agpt_answer = AsyncMock(return_value=lista_respostas_contextuals_cenario_02[0])
        monkeypatch.setattr(
            "_utils.gerar_documento_utils.contextual_retriever.agpt_answer",
            mock_agpt_answer,
        )

        resultado = await self.context_retrieval.llm_call_uma_lista_de_20_chunks(
            cenario_01_lista_com_20_chunks, cenario_01_resumo_auxiliar
        )
        assert all(len(item) == 3 for item in resultado)
        assert call_count == 2  # Ensure only the first two calls were mocked