velvet-api / models /chatbot_engine.py
Grilocas77's picture
Upload 25 files
e679b32 verified
# chatbot_engine.py
# Duarte Grilo - 2201320 - Projeto Informático
from sentence_transformers import SentenceTransformer, util
from models.rag_engine import get_chroma_db
from config import EMBEDDING_MODEL
# 🔧 Carrega o modelo de embeddings definido no ficheiro de configuração
model = SentenceTransformer(EMBEDDING_MODEL)
# 📚 Acede à base local de embeddings via ChromaDB (LangChain)
collection = get_chroma_db()
def busca_local_heuristica(pergunta: str, k: int = 5, retorna=False):
print(f"🔍 Pergunta: {pergunta}")
emb_pergunta = model.encode(pergunta, convert_to_tensor=True)
resultados = collection.similarity_search(query=pergunta, k=k)
# Depuração: Imprimir os resultados para verificar o conteúdo
print(f"🔎 Melhores documentos encontrados: {resultados}")
# Verificar se 'resultados' é uma lista de tuplas e extrair os documentos corretamente
if isinstance(resultados, list) and isinstance(resultados[0], tuple):
# Se for uma lista de tuplas, extraímos o texto (assumindo que o texto está na segunda posição)
melhores_docs = [d[0]['page_content'] for d in resultados if isinstance(d, tuple) and len(d) > 0 and 'page_content' in d[0]]
else:
# Caso contrário, tentamos simplesmente acessar a chave 'page_content'
melhores_docs = [d['page_content'] for d in resultados if 'page_content' in d]
# Se não houver documentos válidos, retorna uma resposta padrão
if not melhores_docs:
return "Desculpe, não encontrei informações relevantes."
# Encontra o melhor documento baseado na similaridade
melhor_doc = max(melhores_docs, key=lambda d: util.pytorch_cos_sim(emb_pergunta, model.encode([d], convert_to_tensor=True)).mean().item())
if retorna:
return melhor_doc[:800] # devolve a resposta em vez de imprimir
print(f"\n✅ Melhor resposta:\n{melhor_doc[:800]}")