Spaces:
Running
Running
luanpoppe
commited on
Commit
·
4e93adb
1
Parent(s):
bca06e1
feat: adicionado endpoint de resumo
Browse files- langchain_backend/main.py +9 -0
- resumos/__init__.py +0 -0
- resumos/admin.py +3 -0
- resumos/apps.py +6 -0
- resumos/migrations/__init__.py +0 -0
- resumos/models.py +3 -0
- resumos/serializer.py +24 -0
- resumos/tests.py +3 -0
- resumos/views.py +42 -0
- setup/settings.py +2 -1
- setup/urls.py +3 -1
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 |
]
|