Spaces:
Sleeping
Sleeping
| # 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]}") | |