joortif's picture
Update app.py
551b707 verified
import gradio as gr
from langchain_community.llms import HuggingFaceHub
from langchain_core.output_parsers import StrOutputParser
from langchain import hub
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_huggingface import HuggingFaceEmbeddings
from huggingface_hub import InferenceClient
from rerankers import Reranker
import os
embedding_function = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
persist_directory = "db"
if not os.path.exists(persist_directory):
loader = PyPDFLoader("Constitucion_española.pdf")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
docs_split = text_splitter.split_documents(documents)
vectordb = Chroma.from_documents(docs_split, embedding_function, persist_directory=persist_directory)
vectordb.persist()
else:
vectordb = Chroma(persist_directory=persist_directory, embedding_function=embedding_function)
client = InferenceClient("mrm8488/spanish-t5-small-sqac-for-qa", token=os.getenv("HUGGINGFACEHUB_API_TOKEN"))
ranker = Reranker("answerdotai/answerai-colbert-small-v1", model_type='colbert')
def generate_text(context, query):
prompt = f"""Responde en español. Basándote en el siguiente contexto contesta de forma clara y directa.
Contexto:
{context}
Pregunta: {query}
Respuesta:"""
response = client.text_generation(prompt=prompt, max_new_tokens=200)
return response.strip()
def test_rag_reranking(query, ranker):
print(f"\n🔍 Pregunta recibida: {query}")
docs = vectordb.similarity_search_with_score(query)
print(f"🔎 Documentos recuperados: {len(docs)}")
context = []
for i, (doc, score) in enumerate(docs):
print(f"📄 Doc {i} - Score: {score}")
if score < 7:
doc_details = doc.to_json()['kwargs']
content = doc_details['page_content']
context.append(content)
print(f"✅ Doc {i} agregado al contexto")
if not context:
print("❌ No se encontró contexto relevante.")
return "No se encontró información suficiente para responder."
print(f"📚 Contextos pasados al ranker: {len(context)}")
context_strings = [str(c) for c in context]
#print(help(Reranker.models.ColBERTRanker.rank))
reranked = ranker.rank(query=query, docs=context_strings)
print(f"🏅 Resultado del reranker: {reranked}")
best_context = reranked[0].document.text
print(f"🧠 Contexto elegido: {best_context[:500]}...")
respuesta = generate_text(best_context, query)
print(f"💬 Respuesta generada: {respuesta}")
return respuesta
def responder_chat(message, history):
respuesta = test_rag_reranking(message, ranker)
return respuesta
demo = gr.ChatInterface(
fn=responder_chat,
title="Chatbot sobre la constitución española",
theme="soft"
)
if __name__ == "__main__":
demo.launch()