luanpoppe commited on
Commit
4e93adb
·
1 Parent(s): bca06e1

feat: adicionado endpoint de resumo

Browse files
langchain_backend/main.py CHANGED
@@ -34,4 +34,13 @@ def get_llm_answer(system_prompt, user_prompt, pdf_url, model, embedding):
34
  vectorstore.delete_collection()
35
  utils.allIds = []
36
  print('utils.allIds: ', utils.allIds)
 
 
 
 
 
 
 
 
 
37
  return results
 
34
  vectorstore.delete_collection()
35
  utils.allIds = []
36
  print('utils.allIds: ', utils.allIds)
37
+ return results
38
+
39
+ def get_llm_answer_summary(system_prompt, user_prompt, pdf_url, model):
40
+ print('model: ', model)
41
+ pages = getPDF(pdf_url)
42
+ rag_chain = create_prompt_llm_chain(system_prompt, model)
43
+
44
+ results = rag_chain.invoke({"input": user_prompt, "context": pages})
45
+
46
  return results
resumos/__init__.py ADDED
File without changes
resumos/admin.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ from django.contrib import admin
2
+
3
+ # Register your models here.
resumos/apps.py ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ from django.apps import AppConfig
2
+
3
+
4
+ class ResumosConfig(AppConfig):
5
+ default_auto_field = 'django.db.models.BigAutoField'
6
+ name = 'resumos'
resumos/migrations/__init__.py ADDED
File without changes
resumos/models.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ from django.db import models
2
+
3
+ # Create your models here.
resumos/serializer.py ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from rest_framework import serializers
2
+
3
+ # Exemplo de retorno que devo enviar ao frontend:
4
+ # {
5
+ # "nome_do_memorial": "[b]Memorial de Defesa em Ação de Indenização por Danos Morais[/b]",
6
+ # "argumentos": "[b]Argumentos:[/b]\n[i]• Responsabilidade Civil do Réu:[/i] [i]O réu agiu de forma negligente ao causar o dano. Há dever de indenizar baseado no artigo 186 do Código Civil Brasileiro.[/i]\n[i]• Dano Moral Comprovado:[/i] [i]O dano sofrido pela parte autora é evidente, gerando sofrimento e abalo psicológico. O nexo causal entre a ação do réu e o dano sofrido é claro.[/i]",
7
+ # "jurisprudencia": "[b]Jurisprudência:[/b]\n[i]• STJ, REsp 123456/DF -[/i] [i]O Superior Tribunal de Justiça entendeu que a indenização por danos morais deve ser fixada de acordo com a gravidade do ato ilícito.[/i]\n[i]• STJ, REsp 654321/SP -[/i] [i]A jurisprudência confirma que o réu tem o dever de reparar integralmente o dano causado.[/i]",
8
+ # "doutrina": "[b]Doutrina:[/b]\n[i]• Carlos Roberto Gonçalves, Responsabilidade Civil -[/i] [i]A responsabilidade civil é objetiva quando há risco para os direitos da personalidade da vítima.[/i]\n[i]• Maria Helena Diniz, Curso de Direito Civil -[/i] [i]O dano moral é configurado pela violação dos direitos da personalidade.[/i]",
9
+ # "argumentos_faltantes": "[b]Argumentos Faltantes:[/b]\n[i]• Prova pericial de impacto psicológico.[/i]\n[i]• Estudo comparativo com casos análogos para quantificação do valor da indenização.[/i]",
10
+ # "palavras_chave": [
11
+ # "[i]Responsabilidade civil[/i]",
12
+ # "[i]Dano moral[/i]",
13
+ # "[i]Nexo causal[/i]",
14
+ # "[i]Indenização[/i]"
15
+ #   ]
16
+ # }
17
+
18
+ # pecam para a AI formatar em BBcode
19
+
20
+ class ResumoPDFSerializer(serializers.Serializer):
21
+ files = serializers.ListField(child=serializers.FileField(), required=True)
22
+ system_prompt = serializers.CharField(required=True)
23
+ user_message = serializers.CharField(required=False)
24
+ model = serializers.CharField(required=False)
resumos/tests.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ from django.test import TestCase
2
+
3
+ # Create your tests here.
resumos/views.py ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from rest_framework.views import APIView
2
+ import tempfile, os
3
+ from rest_framework.response import Response
4
+ from .serializer import ResumoPDFSerializer
5
+ from langchain_backend.main import get_llm_answer_summary
6
+ from setup.environment import default_model
7
+ from rest_framework.parsers import MultiPartParser
8
+ from drf_spectacular.utils import extend_schema
9
+
10
+
11
+ class ResumoView(APIView):
12
+ parser_classes = [MultiPartParser]
13
+
14
+ @extend_schema(
15
+ request=ResumoPDFSerializer,
16
+ )
17
+ def post(self, request):
18
+ serializer = ResumoPDFSerializer(data=request.data)
19
+ if serializer.is_valid(raise_exception=True):
20
+ listaPDFs = []
21
+ data = request.data
22
+ model = serializer.validated_data.get("model", default_model)
23
+ user_message = data.get("user_message", "")
24
+
25
+ for file in serializer.validated_data['files']:
26
+ print("file: ", file)
27
+ file.seek(0)
28
+ with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as temp_file: # Create a temporary file to save the uploaded PDF
29
+ for chunk in file.chunks(): # Write the uploaded file content to the temporary file
30
+ temp_file.write(chunk)
31
+ temp_file_path = temp_file.name # Get the path of the temporary file
32
+ listaPDFs.append(temp_file_path)
33
+ # print('listaPDFs: ', listaPDFs)
34
+
35
+ resposta_llm = get_llm_answer_summary(data["system_prompt"], user_message, listaPDFs, model=model)
36
+
37
+ for file in listaPDFs:
38
+ os.remove(file)
39
+
40
+ return Response({
41
+ resposta_llm
42
+ })
setup/settings.py CHANGED
@@ -46,7 +46,8 @@ INSTALLED_APPS = [
46
  "django_filters",
47
  "corsheaders",
48
  "endpoint_teste",
49
- "drf_spectacular"
 
50
  ]
51
 
52
  MIDDLEWARE = [
 
46
  "django_filters",
47
  "corsheaders",
48
  "endpoint_teste",
49
+ "drf_spectacular",
50
+ "resumos"
51
  ]
52
 
53
  MIDDLEWARE = [
setup/urls.py CHANGED
@@ -5,6 +5,7 @@ from drf_spectacular.views import SpectacularSwaggerView, SpectacularAPIView
5
 
6
 
7
  from endpoint_teste.views import EndpointTesteViewSet, getTeste, getPDF
 
8
 
9
  router = routers.DefaultRouter()
10
  # router.register("endpoint-teste", EndpointTesteViewSet, basename="Basename do endpoint-teste")
@@ -15,5 +16,6 @@ urlpatterns = [
15
  path("admin/", admin.site.urls),
16
  path('', include(router.urls)),
17
  path("teste", getTeste),
18
- path('pdf', getPDF, name='upload-pdf')
 
19
  ]
 
5
 
6
 
7
  from endpoint_teste.views import EndpointTesteViewSet, getTeste, getPDF
8
+ from resumos.views import ResumoView
9
 
10
  router = routers.DefaultRouter()
11
  # router.register("endpoint-teste", EndpointTesteViewSet, basename="Basename do endpoint-teste")
 
16
  path("admin/", admin.site.urls),
17
  path('', include(router.urls)),
18
  path("teste", getTeste),
19
+ path('pdf', getPDF, name='upload-pdf'),
20
+ path('resumo', ResumoView.as_view(), name='summary-pdf')
21
  ]