Feat: adds front and infra
This commit is contained in:
@@ -18,6 +18,8 @@ from typing import Union
|
||||
from langchain_core.agents import AgentAction, AgentFinish
|
||||
from langchain.agents.output_parsers import ReActSingleInputOutputParser
|
||||
from langchain.tools import Tool
|
||||
from langgraph.checkpoint.memory import MemorySaver
|
||||
from langgraph.prebuilt import create_react_agent
|
||||
import os
|
||||
|
||||
def find_tool_by_name(tools: list[Tool],tool_name:str):
|
||||
@@ -27,15 +29,14 @@ def find_tool_by_name(tools: list[Tool],tool_name:str):
|
||||
print("\n\n")
|
||||
return tool
|
||||
raise ValueError(f"Tool with name {tool_name} not found")
|
||||
def agent_call(event,context):
|
||||
|
||||
def hello(event,context):
|
||||
llm = ChatBedrock(
|
||||
model_id="arn:aws:bedrock:us-east-1:654654422992:application-inference-profile/d9blf0g3fzqz",
|
||||
model_id="arn:aws:bedrock:us-east-1:654654422992:application-inference-profile/glvyppv11ds5",
|
||||
region_name="us-east-1",
|
||||
aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
|
||||
aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"],
|
||||
aws_session_token=os.environ["AWS_SESSION_TOKEN"],
|
||||
model_kwargs={"temperature": 0, 'max_tokens': 1000,},
|
||||
#aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
|
||||
#aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"],
|
||||
#aws_session_token=os.environ["AWS_SESSION_TOKEN"],
|
||||
model_kwargs={"temperature": 0.1, 'max_tokens': 1000,},
|
||||
provider='anthropic'
|
||||
)
|
||||
retriever = AmazonKnowledgeBasesRetriever(
|
||||
@@ -44,55 +45,22 @@ def agent_call(event,context):
|
||||
retrieval_config={"vectorSearchConfiguration": {"numberOfResults": 4}},
|
||||
|
||||
)
|
||||
|
||||
# Cria o retrieval chain
|
||||
retrievertool=retriever.as_tool()
|
||||
retrievertool.description="Baseando se numa query retorna trechos de editais de campus diferentes do instituto são paulo"
|
||||
tools=[retrievertool]
|
||||
template="""Você é um assistente para alunos de diversos campus diferentes do instituto federal de são paulo, sua função é responder perguntas
|
||||
de forma mais eficiente possivel sobre editais, que pode ser acessados pela tool fornecida:
|
||||
|
||||
{tools}
|
||||
|
||||
Note que dependendo do Campus os editais são diferentes, então é mandatório saber o campus do aluno antes de devolver alguma informação.
|
||||
memory = MemorySaver()
|
||||
model = llm
|
||||
tools = [retriever.as_tool()]
|
||||
prompt="""Você é um assistente para alunos de diversos campus diferentes do instituto federal de são paulo, sua função é responder perguntas de forma mais eficiente possivel sobre editais, que pode ser acessados pela tool fornecida.
|
||||
Note que dependendo do Campus os editais são diferentes, então é mandatório saber o campus do aluno antes de devolver alguma informação.
|
||||
Além disso existem editais válidos apenas para alunos do ensino médio, apaenas para ensino superior e para ambos.
|
||||
O edital difere também se o aluno já recebe algum auxílio ou é o primeiro. Obtenha a informação do edital mais recente que cumpra as condições.
|
||||
Além disso leve em consideração o chat history fornecido. Responda baseando-se exclusivamente nos documentos retornados pela tool amazonknowledgebase retriever. Não crie informações de editais.
|
||||
Use the following format:
|
||||
|
||||
Question: the input question you must answer
|
||||
Thought: you should always think about what to do and take your previous thougths into consideration
|
||||
Action: the action to take, should be one of [{tool_names}]
|
||||
Action Input: the input to the action
|
||||
Observation: the result of the action
|
||||
... (this Thought/Action/Action Input/Observation can repeat N times)
|
||||
Thought: I now know the final answer
|
||||
Final Answer: the final answer to the original input question
|
||||
|
||||
Begin!
|
||||
Question: {input}
|
||||
Chat history:{chat_history}
|
||||
Thought: {agent_scratchpad}
|
||||
"""
|
||||
prompt=PromptTemplate.from_template(template=template).partial(tools=render_text_description(tools), tool_names=','.join([t.name for t in tools]))
|
||||
#llm=ChatOpenAI(model="gpt-4o-mini",temperature=0,stop_sequences=["\nObservation:"])
|
||||
intermediate_steps=[]
|
||||
|
||||
agent= {"input": lambda x:x["input"],"agent_scratchpad": lambda x:format_log_to_str(x["agent_scratchpad"]),"chat_history":lambda x:x["chat_history"]}|prompt | llm
|
||||
agent_step: Union[AgentAction,AgentFinish]=agent.invoke({"input": "Quanto é o valor do auxilio moradia?","agent_scratchpad":intermediate_steps,"chat_history":{"role":"user","content":"sou do campus sao paulo, ensino superior e não recebo auxílio ainda, estamos no primeiro semestre de 2025"}})
|
||||
#print(agent_step)
|
||||
if isinstance(agent_step,AgentAction):
|
||||
tool_name=agent_step.tool
|
||||
tool_to_use=find_tool_by_name(tools,tool_name)
|
||||
tool_input=agent_step.tool_input
|
||||
observation=tool_to_use.func(str(tool_input))
|
||||
print(f"{observation=}")
|
||||
intermediate_steps.append((agent_step,str(observation)))
|
||||
agent_step: Union[AgentAction,AgentFinish]=agent.invoke({"input": "Quanto é o valor do auxilio moradia?","agent_scratchpad":intermediate_steps,"chat_history":{"role":"user","content":"sou do campus sao paulo, ensino superior e não recebo auxílio ainda, estamos no primeiro semestre de 2025"}})
|
||||
return agent_step
|
||||
def hello(event,context):
|
||||
return{
|
||||
"statusCode":200,
|
||||
"body":json.dumps("hello_world")
|
||||
}
|
||||
print(agent_call("",""))
|
||||
Além disso leve em consideração o chat history fornecido. Não crie informações de editais, apenas faça perguntas para o contexto e busque dos editais quando estiver com informações suficientes. Retorne o titulo do documento consultado, não o nome do arquivo.
|
||||
Documentos com a sigla MTO são do campus matão. Documentos com a sigla SPO são do campus são paulo. É imperativo não obeter documentos de outros campus que não sejam o solicitado, não use informações deles. Os valores, se estiverem em formato de tabela, se encontrarão após o tipo da modaldie (moradia,transporte e etc), nunca antes. Não é nescessário buscar informações dos editais se uma dúvida não for apresentada ou se houver uma informação importante faltando.
|
||||
Use sempre os documentos mais recentes, atualmente estamos no segundo semestre de 2025.
|
||||
Caso seja mencionado que um dos pais não é registrado isso significa que é trabalhador informal."""
|
||||
agent_executor = create_react_agent(model, tools, checkpointer=memory, prompt=prompt)
|
||||
config = {"configurable": {"thread_id": "abc123"}}
|
||||
input_message = event["message"]
|
||||
#input_message=[{"role":"user","content":"aluno superior, nunca recebi auxilio, campus são paulo, Meu pai não é registrado, como faço para ganhar auxilio?"}]
|
||||
response=""
|
||||
for step in agent_executor.stream({"messages": input_message}, config, stream_mode="values"):
|
||||
response={"json":(step["messages"][-1].text())}
|
||||
return (response)
|
||||
Reference in New Issue
Block a user