-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathestudante.py
More file actions
98 lines (84 loc) · 4.24 KB
/
estudante.py
File metadata and controls
98 lines (84 loc) · 4.24 KB
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
from langchain.prompts import PromptTemplate
from pydantic import BaseModel, Field
from langchain_core.output_parsers import JsonOutputParser
from langchain_openai import ChatOpenAI
from langchain_ollama.llms import OllamaLLM
from langchain_deepseek import ChatDeepSeek
from langchain.tools import BaseTool
import json
import os
from typing import List
import pandas as pd
def busca_dados_de_estudante(estudante):
dados = pd.read_csv("documentos/estudantes.csv")
dados_com_esse_estudante = dados[dados["USUARIO"] == estudante]
if dados_com_esse_estudante.empty:
return {}
return dados_com_esse_estudante.iloc[:1].to_dict()
class ExtratorDeEstudante(BaseModel):
estudante:str = Field("Nome do estudante informado, sempre em letras minúsculas.")
class DadosDeEstudante(BaseTool):
name:str = "DadosDeEstudante"
description:str = """Esta ferramenta extrai o histórico e preferências de um estudante de acordo com seu histórico.
Passe para essa ferramenta como argumento o nome do estudante."""
def _run(self, input: str) -> str:
# llm = ChatOpenAI(model="gpt-4o",
# api_key=os.getenv("OPENAI_API_KEY"))
# llm = ChatDeepSeek(
# model="deepseek-chat",
# temperature=0,
# api_key=os.getenv("DEEPSEEK_API_KEY"))
llm = OllamaLLM(model="gemma3:4b")
parser = JsonOutputParser(pydantic_object=ExtratorDeEstudante)
template = PromptTemplate(template="""Você deve analisar a entrada a seguir e extrair o nome informado em minúsculo.
Entrada:
-----------------
{input}
-----------------
Formato de saída:
{formato_saida}""",
input_variables=["input"],
partial_variables={"formato_saida" : parser.get_format_instructions()})
cadeia = template | llm | parser
resposta = cadeia.invoke({"input" : input})
estudante = resposta['estudante']
# estudante = input
estudante = estudante.lower().strip()
dados = busca_dados_de_estudante(estudante)
return json.dumps(dados)
class Nota(BaseModel):
area:str = Field("Nome da área de conhecimento")
nota:float = Field("Nota na área de conhecimento")
class PerfilAcademicoDeEstudante(BaseModel):
nome:str = Field("nome do estudante")
ano_de_conclusao:int = Field("ano de conclusão")
notas:List[Nota] = Field("Lista de notas das disciplinas e áreas de conhecimento")
resumo:str = Field("Resumo das principais características desse estudante de forma a torná-lo único e um ótimo potencial estudante para faculdades. Exemplo: só este estudante tem bla bla bla")
class PerfilAcademico(BaseTool):
name:str = "PerfilAcademico"
description:str = """Cria um perfil acadêmico de um estudante.
Esta ferramenta requer como entrada todos os dados do estudante.
Eu sou incapaz de buscar os dados do estudante.
Você tem que buscar os dados do estudante antes de me invocar."""
def _run(self, input:str) -> str:
# llm = ChatOpenAI(model="gpt-4o",
# api_key=os.getenv("OPENAI_API_KEY"))
# llm = ChatDeepSeek(
# model="deepseek-chat",
# temperature=0,
# api_key=os.getenv("DEEPSEEK_API_KEY"))
llm = OllamaLLM(model="gemma3:4b")
parser = JsonOutputParser(pydantic_object=PerfilAcademicoDeEstudante)
template = PromptTemplate(template = """- Formate o estudante para seu perfil acadêmico.
- Com os dados, identifique as opções de universidades sugeridas e cursos compatíveis com o interesse do aluno
- Destaque o perfil do aluno dando enfase principalmente naquilo que faz sentido para as instituições de interesse do aluno
Persona: você é uma consultora de carreira e precisa indicar com detalhes, riqueza, mas direta ao ponto para o estudante as opções e consequências possíveis.
Informações atuais:
{dados_do_estudante}
{formato_de_saida}
""",
input_variables=["dados_do_estudante"],
partial_variables={"formato_de_saida" : parser.get_format_instructions()})
cadeia = template | llm | parser
resposta = cadeia.invoke({"dados_do_estudante" : input})
return resposta