ChatBot - Intents Dinamicas a funcionar/traduções/estrutura
This commit is contained in:
parent
d823baed31
commit
d6180e4973
Binary file not shown.
@ -173,6 +173,20 @@ def chat_with_gpt(prompt, attempts=3):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
return f"Erro genérico com a API OpenAI: {type(e).__name__} - {e}"
|
return f"Erro genérico com a API OpenAI: {type(e).__name__} - {e}"
|
||||||
|
|
||||||
|
def extract_intent_and_params(user_input):
|
||||||
|
prompt = f"""
|
||||||
|
Analisa a seguinte pergunta de utilizador e devolve um JSON com:
|
||||||
|
- "intent": a intenção principal (ex: comparar_total, comparar_kwh, listar_faturas, total_kwh_tipo_edificio, top_consumidores, etc)
|
||||||
|
- "params": dicionário com parâmetros relevantes (ex: mes, ano, tipo_edificio, cunit_id, etc)
|
||||||
|
Pergunta: "{user_input}"
|
||||||
|
Exemplo de resposta: {{"intent": "comparar_total", "params": {{"mes": 1, "ano": 2025}}}}
|
||||||
|
"""
|
||||||
|
response = chat_with_gpt(prompt)
|
||||||
|
try:
|
||||||
|
return json.loads(response)
|
||||||
|
except Exception:
|
||||||
|
return {"intent": "unknown", "params": {}}
|
||||||
|
|
||||||
def get_price_comparison():
|
def get_price_comparison():
|
||||||
conn = connect_db()
|
conn = connect_db()
|
||||||
if not conn:
|
if not conn:
|
||||||
@ -555,7 +569,6 @@ if __name__ == "__main__":
|
|||||||
"janeiro": 1,
|
"janeiro": 1,
|
||||||
"fevereiro": 2,
|
"fevereiro": 2,
|
||||||
"março": 3,
|
"março": 3,
|
||||||
"março": 3,
|
|
||||||
"abril": 4,
|
"abril": 4,
|
||||||
"maio": 5,
|
"maio": 5,
|
||||||
"junho": 6,
|
"junho": 6,
|
||||||
@ -572,173 +585,60 @@ if __name__ == "__main__":
|
|||||||
if user_input.lower() in ["quit", "exit", "bye"]:
|
if user_input.lower() in ["quit", "exit", "bye"]:
|
||||||
break
|
break
|
||||||
|
|
||||||
if any(word in user_input.lower() for word in ["tabela", "coluna", "campos", "estrutura", "schema"]):
|
# NOVO: Extração dinâmica de intenção e parâmetros
|
||||||
schema_info = get_schema_with_examples()
|
intent_data = extract_intent_and_params(user_input)
|
||||||
if isinstance(schema_info, str):
|
intent = intent_data.get("intent")
|
||||||
print(f"Chatbot: {schema_info}")
|
params = intent_data.get("params", {})
|
||||||
else:
|
|
||||||
if re.search(r"tabelas|todas as tabelas", user_input.lower()):
|
|
||||||
nomes = [t['table'] for t in schema_info]
|
|
||||||
print(f"Chatbot: As tabelas disponíveis são: {', '.join(nomes)}")
|
|
||||||
else:
|
|
||||||
for t in schema_info:
|
|
||||||
if t['table'].lower() in user_input.lower():
|
|
||||||
colunas = ", ".join([
|
|
||||||
next((k for k, v in column_mapping.items() if v == c['name']), c['name'])
|
|
||||||
for c in t['columns']
|
|
||||||
])
|
|
||||||
print(f"Chatbot: A tabela '{t['table']}' tem as colunas: {colunas}.")
|
|
||||||
if t['example']:
|
|
||||||
exemplo_traduzido = {
|
|
||||||
next((k for k, v in column_mapping.items() if v == k or v == k or v == col), col): val
|
|
||||||
for col, val in t['example'].items()
|
|
||||||
}
|
|
||||||
exemplo_traduzido = {
|
|
||||||
next((k for k, v in column_mapping.items() if v == col), col): val
|
|
||||||
for col, val in t['example'].items()
|
|
||||||
}
|
|
||||||
print(f"Exemplo de linha: {exemplo_traduzido}")
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
print("Chatbot: Não encontrei essa tabela. Pergunte por outra ou peça 'tabelas' para ver todas.")
|
|
||||||
continue
|
|
||||||
|
|
||||||
cunit_id, date_billling_begin, date_billing_end, total_requested = parse_user_input(user_input)
|
|
||||||
|
|
||||||
if total_requested and cunit_id:
|
|
||||||
data = get_total_by_cunit(cunit_id)
|
|
||||||
print(f"Chatbot: Aqui estão os totais encontrados:\n{data}")
|
|
||||||
continue
|
|
||||||
|
|
||||||
if cunit_id or date_billling_begin or date_billing_end:
|
|
||||||
data = get_filtered_data(cunit_id, date_billling_begin, date_billing_end)
|
|
||||||
print(f"Chatbot: Aqui estão os dados encontrados:\n{data}")
|
|
||||||
continue
|
|
||||||
|
|
||||||
if "preços faturados" in user_input.lower():
|
|
||||||
data = get_price_comparison()
|
|
||||||
print(f"Chatbot: Aqui está a comparação dos preços:\n{data}")
|
|
||||||
continue
|
|
||||||
|
|
||||||
if re.search(r"mês atual.*igual período.*ano anterior", user_input.lower()):
|
|
||||||
data = compare_current_vs_previous_year()
|
|
||||||
print(f"Chatbot: {data}")
|
|
||||||
continue
|
|
||||||
|
|
||||||
if re.search(r"mês.*igual período.*ano anterior", user_input.lower()):
|
|
||||||
match = re.search(
|
|
||||||
r"(?:mês\s+de\s+([a-zç]+|\d{1,2}))(?:\s+do\s+ano\s+(\d{4}))?",
|
|
||||||
user_input.lower()
|
|
||||||
)
|
|
||||||
|
|
||||||
if match:
|
|
||||||
mes_input = match.group(1).strip().lower()
|
|
||||||
ano = int(match.group(2)) if match.group(2) else datetime.now().year
|
|
||||||
|
|
||||||
if mes_input.isdigit():
|
|
||||||
mes = int(mes_input)
|
|
||||||
else:
|
|
||||||
mes = month_map.get(mes_input)
|
|
||||||
|
|
||||||
if not mes:
|
|
||||||
print("Chatbot: Mês não reconhecido. Tenta novamente.")
|
|
||||||
continue
|
|
||||||
else:
|
|
||||||
mes = datetime.now().month
|
|
||||||
ano = datetime.now().year
|
|
||||||
|
|
||||||
|
if intent == "comparar_total":
|
||||||
|
mes = params.get("mes")
|
||||||
|
ano = params.get("ano")
|
||||||
data = compare_current_vs_previous_year(month=mes, year=ano)
|
data = compare_current_vs_previous_year(month=mes, year=ano)
|
||||||
print(f"Chatbot: {data}")
|
print(f"Chatbot: {data}")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if "homólogo" in user_input.lower():
|
if intent == "comparar_kwh":
|
||||||
match = re.search(r"homólogo.*?(\d{4})", user_input.lower())
|
mes = params.get("mes")
|
||||||
ano = int(match.group(1)) if match else None
|
ano = params.get("ano")
|
||||||
data = get_top_consumers(current=False, year=ano)
|
|
||||||
if ano:
|
|
||||||
print(f"Chatbot: Aqui estão as instalações com maior consumo no período homólogo de {ano}:\n{data}")
|
|
||||||
else:
|
|
||||||
print(f"Chatbot: Aqui estão as instalações com maior consumo no período homólogo atual:\n{data}")
|
|
||||||
continue
|
|
||||||
|
|
||||||
if re.search(r"total de kwh.*mês.*ano anterior", user_input.lower()):
|
|
||||||
match = re.search(
|
|
||||||
r"(?:mês\s+de\s+([a-zç]+|\d{1,2}))(?:\s+do\s+ano\s+(\d{4}))?",
|
|
||||||
user_input.lower()
|
|
||||||
)
|
|
||||||
|
|
||||||
if match:
|
|
||||||
mes_input = match.group(1).strip().lower()
|
|
||||||
ano = int(match.group(2)) if match.group(2) else datetime.now().year
|
|
||||||
|
|
||||||
if mes_input.isdigit():
|
|
||||||
mes = int(mes_input)
|
|
||||||
else:
|
|
||||||
mes = month_map.get(mes_input)
|
|
||||||
|
|
||||||
if not mes:
|
|
||||||
print("Chatbot: Mês não reconhecido. Tenta novamente.")
|
|
||||||
continue
|
|
||||||
else:
|
|
||||||
mes = datetime.now().month
|
|
||||||
ano = datetime.now().year
|
|
||||||
|
|
||||||
data = compare_kwh_current_vs_previous_year(month=mes, year=ano)
|
data = compare_kwh_current_vs_previous_year(month=mes, year=ano)
|
||||||
print(f"Chatbot: {data}")
|
print(f"Chatbot: {data}")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if re.search(r"quantas faturas.*mês", user_input.lower()):
|
if intent == "listar_faturas_inativas":
|
||||||
match = re.search(
|
|
||||||
r"(?:mês\s+de\s+([a-zç]+|\d{1,2}))(?:\s+do\s+ano\s+(\d{4}))?",
|
|
||||||
user_input.lower()
|
|
||||||
)
|
|
||||||
|
|
||||||
if match:
|
|
||||||
mes_input = match.group(1).strip().lower()
|
|
||||||
ano = int(match.group(2)) if match.group(2) else datetime.now().year
|
|
||||||
|
|
||||||
if mes_input.isdigit():
|
|
||||||
mes = int(mes_input)
|
|
||||||
else:
|
|
||||||
mes = month_map.get(mes_input)
|
|
||||||
|
|
||||||
if not mes:
|
|
||||||
print("Chatbot: Mês não reconhecido. Tenta novamente.")
|
|
||||||
continue
|
|
||||||
else:
|
|
||||||
mes = datetime.now().month
|
|
||||||
ano = datetime.now().year
|
|
||||||
|
|
||||||
data = get_invoices_by_month_year(month=mes, year=ano)
|
|
||||||
print(f"Chatbot: {data}")
|
|
||||||
continue
|
|
||||||
|
|
||||||
if re.search(r"faturas.*instalações.*inativas", user_input.lower()):
|
|
||||||
data = get_invoices_from_inactive_units()
|
data = get_invoices_from_inactive_units()
|
||||||
print(f"Chatbot: {data}")
|
print(f"Chatbot: {data}")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if re.search(r"total de kwh.*tipo de edifícios", user_input.lower()):
|
if intent == "listar_faturas_mes":
|
||||||
match = re.search(r"tipo de edifícios\s+([a-zçãõáéíóúâêîôûäëïöü\s]+)", user_input.lower())
|
mes = params.get("mes")
|
||||||
building_type = match.group(1).strip() if match else None
|
ano = params.get("ano")
|
||||||
|
data = get_invoices_by_month_year(month=mes, year=ano)
|
||||||
if building_type:
|
print(f"Chatbot: {data}")
|
||||||
data = get_total_kwh_by_building_type(building_type=building_type)
|
|
||||||
print(f"Chatbot: Aqui está o total de kWh para o tipo de edifício '{building_type}':\n{data}")
|
|
||||||
else:
|
|
||||||
data = get_total_kwh_by_building_type()
|
|
||||||
print(f"Chatbot: Aqui está o total de kWh por tipo de edifício:\n{data}")
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if user_input.lower() in ["cunitbills", "cunits", "cunittypes"]:
|
if intent == "total_kwh_tipo_edificio":
|
||||||
data = get_data(table_name=user_input)
|
tipo = params.get("tipo_edificio")
|
||||||
print(f"\nDados da tabela {user_input}:\n{data}")
|
data = get_total_kwh_by_building_type(building_type=tipo)
|
||||||
|
print(f"Chatbot: {data}")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if "dados" in user_input.lower():
|
if intent == "top_consumidores":
|
||||||
data = get_data()
|
ano = params.get("ano")
|
||||||
print(f"\nDados do SQL Server:\n{data}")
|
data = get_top_consumers(year=ano)
|
||||||
|
print(f"Chatbot: {data}")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
# ...adiciona mais intents conforme necessário...
|
||||||
|
|
||||||
|
# fallback: resposta do LLM se não reconhecer a intenção
|
||||||
response = chat_with_gpt(user_input)
|
response = chat_with_gpt(user_input)
|
||||||
print("Chatbot:", response)
|
print("Chatbot:", response)
|
||||||
|
|
||||||
|
# --- CÓDIGO ANTIGO (comentado, não removido) ---
|
||||||
|
# if "No mês de Janeiro estamos a pagar mais ou menos que em igual período do ano anterior?" in user_input:
|
||||||
|
# print("Chatbot: Estamos a pagar menos em 01/2025 (219711.01) do que no mesmo período do ano passado (250508.93).")
|
||||||
|
# continue
|
||||||
|
# if "total do CUnitId" in user_input:
|
||||||
|
# # lógica antiga...
|
||||||
|
# continue
|
||||||
|
# ...restante código hardcoded...
|
@ -211,6 +211,15 @@ def chat():
|
|||||||
user_input = data.get("message", "")
|
user_input = data.get("message", "")
|
||||||
lower_input = user_input.lower()
|
lower_input = user_input.lower()
|
||||||
|
|
||||||
|
if "cunits" in lower_input or "dados cunit" in lower_input or "dados unidades" in lower_input:
|
||||||
|
return make_reply(translate_any(get_data(table_name="CUnits"), column_mapping_inv))
|
||||||
|
|
||||||
|
if "cunittypes" in lower_input or "cunitstypes" in lower_input or "dados cunittypes" in lower_input or "dados tipos" in lower_input:
|
||||||
|
return make_reply(translate_any(get_data(table_name="CUnitTypes"), column_mapping_inv))
|
||||||
|
|
||||||
|
if "cunitbills" in lower_input or "dados" in lower_input:
|
||||||
|
return make_reply(translate_any(get_data(table_name="CUnitBills"), column_mapping_inv))
|
||||||
|
|
||||||
if "tabela" in lower_input or "coluna" in lower_input:
|
if "tabela" in lower_input or "coluna" in lower_input:
|
||||||
return make_reply(answer_schema_question(lower_input))
|
return make_reply(answer_schema_question(lower_input))
|
||||||
|
|
||||||
@ -286,9 +295,6 @@ def chat():
|
|||||||
pref = f"para o tipo de edifício '{building}'" if building else "por tipo de edifício"
|
pref = f"para o tipo de edifício '{building}'" if building else "por tipo de edifício"
|
||||||
return make_reply(f"Aqui está o total de kWh {pref}:\n" + dicts_to_markdown(translate_any(dados, column_mapping_inv)))
|
return make_reply(f"Aqui está o total de kWh {pref}:\n" + dicts_to_markdown(translate_any(dados, column_mapping_inv)))
|
||||||
|
|
||||||
if "dados" in lower_input:
|
|
||||||
return make_reply(translate_any(get_data(), column_mapping_inv))
|
|
||||||
|
|
||||||
return make_reply(chat_with_gpt(user_input))
|
return make_reply(chat_with_gpt(user_input))
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
Loading…
x
Reference in New Issue
Block a user