File size: 3,251 Bytes
e4d11a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from langchain_ollama.llms import OllamaLLM
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
from vector import buscar_contexto
import streamlit as st

llm = OllamaLLM(model="llama3.2", temperature=0.7)

template = """
    Você é um assistente de IA especializado em ajudar pacientes com informações sobre doenças, sintomas e tratamentos.
    Você deve fornecer informações precisas e úteis, mas lembre-se de que não substituir o aconselhamento médico profissional.
    Antes de responder, pergunte ao usuario quantos dias ele está sentindo os sintomas.
    Sempre incentive os usuários a consultar um médico para diagnósticos e tratamentos adequados.
    Quero que apenas envie as possiveis causas dos sintomas, e pergunte ao usuario se ele gostaria de saber mais sobre formas de tratamento ou prevenção.

    Contexto: 
    {context}
    
    Histórico:
    {history}

    Pergunta:
    {question}
"""

template_especialista = """
Você é um assistente de IA que ajuda usuários a encontrar especialistas médicos com base em dados fornecidos.

Seu objetivo é:

- listar **somente os nomes e endereços** dos especialistas disponíveis, **sem inventar dados**.
- Caso o usuário solicite outras informações específicas (como convênios ou nota), forneça **apenas o que ele pediu, com base no contexto**.
- Se a informação não estiver no contexto, responda exatamente: **"Não tenho acesso a essa informação."**

Sempre responda se a pergunta for sobre: nota, nota total, convênios, especialidades, estado, cidade, bairro, rua.  
Apenas envie a informação sobre o médico ou médicos da pergunta.  
Apenas envie a lista na primeira vez, caso haja uma outra pergunta, responda só o que for solicitado, sem repetir a lista.

Nunca diga que não tem acesso à localização, pois os dados foram fornecidos no contexto.  
Nunca invente ou crie dados.  

Formato da resposta, mantenha exatamente:

1. Nome: 'name'  
- Rua: 'rua'  
- bairro: 'bairro'  
- Cidade: 'cidade'  
- Especialidades: 'especialidades'  

Contexto:  
{context}

Histórico:  
{history}

Pergunta:  
{question}
"""

prompt = ChatPromptTemplate.from_messages([
    ("system", template),
    MessagesPlaceholder(variable_name="history"),
    ("human", "{question}"),
])

chain = prompt | llm

prompt_especialista = ChatPromptTemplate.from_messages([
    ("system", template_especialista),
    MessagesPlaceholder(variable_name="history"),
    ("human", "{question}"),
])

chain_especialista = prompt_especialista | llm


store = {}

def get_session_history(session_id):
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    return store[session_id]

chat_with_history = RunnableWithMessageHistory(
    chain,
    get_session_history,
    input_messages_key="question",
    history_messages_key="history"
)
chat_especialista_with_history = RunnableWithMessageHistory(
    chain_especialista,
    get_session_history,
    input_messages_key="question",
    history_messages_key="history"
)