PablitoGil14 commited on
Commit
8329127
verified
1 Parent(s): 179639e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +32 -27
app.py CHANGED
@@ -1,18 +1,13 @@
 
1
  import gradio as gr
2
- from langchain_community.llms import HuggingFaceHub
3
- from langchain_community.vectorstores import Chroma
4
- from langchain_community.document_loaders import PyPDFLoader
5
  from langchain.text_splitter import RecursiveCharacterTextSplitter
6
- from langchain_core.output_parsers import StrOutputParser
7
  from langchain_huggingface import HuggingFaceEmbeddings
8
- from langchain import hub
9
  from rerankers import Reranker
10
- import os
11
 
12
- # Configuraci贸n del token de acceso a Hugging Face (si usas modelo privado)
13
- os.environ["HUGGINGFACEHUB_API_TOKEN"] = os.getenv("HUGGINGFACEHUB_API_TOKEN")
14
-
15
- # Cargar PDF
16
  loader = PyPDFLoader("80dias.pdf")
17
  documents = loader.load()
18
  splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=20)
@@ -23,44 +18,54 @@ embedding_model = "sentence-transformers/paraphrase-multilingual-mpnet-base-v2"
23
  embeddings = HuggingFaceEmbeddings(model_name=embedding_model)
24
  vectordb = Chroma.from_documents(splits, embedding=embeddings)
25
 
26
- # Modelo LLM desde HuggingFace (usa uno disponible en Spaces)
27
- llm = HuggingFaceHub(repo_id="mistralai/Mistral-7B-Instruct-v0.1", model_kwargs={"temperature": 0.5, "max_new_tokens": 500})
28
- chain = llm | StrOutputParser()
29
-
30
- # Reranker
31
  ranker = Reranker("answerdotai/answerai-colbert-small-v1", model_type="colbert")
32
 
33
- # Funci贸n RAG
 
 
 
 
 
 
34
  def rag_chat(message, history):
35
- # Solo usamos el mensaje del usuario
36
  query = message
37
-
38
  results = vectordb.similarity_search_with_score(query)
 
 
39
  context = []
40
  for doc, score in results:
41
  if score < 7:
42
  context.append(doc.page_content)
 
43
  if not context:
44
  return "No tengo informaci贸n suficiente para responder a esa pregunta."
45
 
 
46
  ranking = ranker.rank(query=query, docs=context)
47
  best_context = ranking[0].text
48
 
49
- prompt = f"""Contesta a la siguiente pregunta usando solo el contexto que se proporciona:
 
50
 
51
- Contexto:
52
- {best_context}
53
 
54
- Pregunta: {query}
55
- Respuesta:"""
56
 
57
- return llm.invoke(prompt)
58
-
59
- # Interfaz Gradio
 
 
 
60
  iface = gr.ChatInterface(
61
  fn=rag_chat,
62
  title="Chat Julio Verne - RAG",
63
  description="Pregunta lo que quieras sobre *La vuelta al mundo en 80 d铆as* de Julio Verne.",
64
- chatbot=gr.Chatbot(type="messages") # 馃憟 Esto elimina el warning de formato obsoleto
 
65
  )
 
66
  iface.launch()
 
1
+ import os
2
  import gradio as gr
3
+ from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
4
+ from langchain.document_loaders import PyPDFLoader
 
5
  from langchain.text_splitter import RecursiveCharacterTextSplitter
 
6
  from langchain_huggingface import HuggingFaceEmbeddings
7
+ from langchain_community.vectorstores import Chroma
8
  from rerankers import Reranker
 
9
 
10
+ # Cargar PDF y partirlo en chunks
 
 
 
11
  loader = PyPDFLoader("80dias.pdf")
12
  documents = loader.load()
13
  splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=20)
 
18
  embeddings = HuggingFaceEmbeddings(model_name=embedding_model)
19
  vectordb = Chroma.from_documents(splits, embedding=embeddings)
20
 
21
+ # Inicializar reranker
 
 
 
 
22
  ranker = Reranker("answerdotai/answerai-colbert-small-v1", model_type="colbert")
23
 
24
+ # Cargar modelo de lenguaje de Hugging Face
25
+ model_id = "mistralai/Mistral-7B-Instruct-v0.1"
26
+ tokenizer = AutoTokenizer.from_pretrained(model_id)
27
+ model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", torch_dtype="auto")
28
+ generator = pipeline("text-generation", model=model, tokenizer=tokenizer)
29
+
30
+ # Funci贸n principal RAG
31
  def rag_chat(message, history):
 
32
  query = message
 
33
  results = vectordb.similarity_search_with_score(query)
34
+
35
+ # Seleccionar contextos relevantes
36
  context = []
37
  for doc, score in results:
38
  if score < 7:
39
  context.append(doc.page_content)
40
+
41
  if not context:
42
  return "No tengo informaci贸n suficiente para responder a esa pregunta."
43
 
44
+ # Aplicar reranking
45
  ranking = ranker.rank(query=query, docs=context)
46
  best_context = ranking[0].text
47
 
48
+ # Crear prompt final
49
+ prompt = f"""Responde a la siguiente pregunta utilizando solo el contexto proporcionado:
50
 
51
+ Contexto:
52
+ {best_context}
53
 
54
+ Pregunta: {query}
55
+ Respuesta:"""
56
 
57
+ # Generar respuesta
58
+ output = generator(prompt, max_new_tokens=300, do_sample=False)[0]["generated_text"]
59
+ response = output.split("Respuesta:")[-1].strip()
60
+ return response
61
+
62
+ # Gradio Chat Interface
63
  iface = gr.ChatInterface(
64
  fn=rag_chat,
65
  title="Chat Julio Verne - RAG",
66
  description="Pregunta lo que quieras sobre *La vuelta al mundo en 80 d铆as* de Julio Verne.",
67
+ chatbot=gr.Chatbot(type="messages"),
68
+ theme="default"
69
  )
70
+
71
  iface.launch()