joortif's picture
Update app.py
946d2c8 verified
raw
history blame
2.75 kB
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
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)
embedding_function = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vectordb = Chroma.from_documents(docs_split, embedding_function)
client = InferenceClient("google/flan-t5-base", token=os.getenv("HUGGINGFACEHUB_API_TOKEN"))
ranker = Reranker("answerdotai/answerai-colbert-small-v1", model_type='colbert')
def generate_text(context, query):
inputs = f"Context: {context} Question: {query}"
response = client.text_generation(prompt=inputs)
return response
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)}")
# ✅ Corregido: pasar solo lista de strings
context_strings = [str(c) for c in context]
reranked = ranker.rank(query, context_strings, 1)
print(f"🏅 Resultado del reranker: {reranked}")
# ✅ Seguridad en el acceso al mejor contexto
best_context = reranked[0].get("text", reranked[0].get("content", context_strings[0]))
print(f"🧠 Contexto elegido: {best_context[:300]}...")
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()