File size: 1,953 Bytes
e679b32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# 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]}")