NightmareFox12 commited on
Commit
d8d049d
·
verified ·
1 Parent(s): 5881c42

Update rag_api.py

Browse files
Files changed (1) hide show
  1. rag_api.py +17 -53
rag_api.py CHANGED
@@ -7,35 +7,16 @@ from langchain.chains import RetrievalQA
7
  from langchain.prompts import PromptTemplate
8
  from langchain_groq import ChatGroq
9
 
10
- # Librerías necesarias para cargar y dividir documentos
11
- from langchain_community.document_loaders import WebBaseLoader # <-- Cargamos URLs
12
- from langchain_text_splitters import RecursiveCharacterTextSplitter
13
-
14
  # --------------------------------------------------------
15
  # 1. CONFIGURACIÓN
16
  # --------------------------------------------------------
17
- # **REEMPLAZA ESTO con tus URLs reales**
18
- urls = [
19
- "https://nutri-active-landing.vercel.app/guides/example",
20
- "https://nutri-active-landing.vercel.app/reference/1-alimentacion",
21
- "https://nutri-active-landing.vercel.app/reference/2-ejercicios",
22
- "https://nutri-active-landing.vercel.app/reference/3-habitos",
23
- "https://nutri-active-landing.vercel.app/reference/4-cursos",
24
- "https://nutri-active-landing.vercel.app/reference/5-comunidad",
25
- "https://nutri-active-landing.vercel.app/interfaz/01-registro",
26
- "https://nutri-active-landing.vercel.app/interfaz/02-login",
27
- "https://nutri-active-landing.vercel.app/interfaz/03-recuperar",
28
- "https://nutri-active-landing.vercel.app/interfaz/04-inicio",
29
- "https://nutri-active-landing.vercel.app/interfaz/05-ejercicio",
30
- "https://nutri-active-landing.vercel.app/interfaz/06-recetas",
31
- "https://nutri-active-landing.vercel.app/interfaz/07-listado",
32
- "https://nutri-active-landing.vercel.app/interfaz/08-planes",
33
- "https://nutri-active-landing.vercel.app/interfaz/09-imc",
34
- "https://nutri-active-landing.vercel.app/interfaz/10-membresias",
35
- "https://nutri-active-landing.vercel.app/interfaz/11-comunidad",
36
- "https://nutri-active-landing.vercel.app/interfaz/12-cursos"
37
- ]
38
 
 
 
 
39
 
40
  class QueryRequest(BaseModel):
41
  """Define el formato de la pregunta que recibirá el endpoint /query."""
@@ -43,28 +24,18 @@ class QueryRequest(BaseModel):
43
 
44
  def load_and_configure_rag():
45
  """
46
- Rastrea las URLs, procesa los datos y CONFIGURA el RAG Chain.
47
- Esto se ejecuta SOLO UNA VEZ al iniciar el servidor, EVITANDO el error de FAISS.load_local.
48
  """
49
  try:
50
- # 1. Cargar Documentos de las URLs
51
- loader = WebBaseLoader(urls)
52
- documents = loader.load()
53
-
54
- # 2. Dividir Documentos (Text Splitting)
55
- text_splitter = RecursiveCharacterTextSplitter(
56
- chunk_size=500,
57
- chunk_overlap=50
58
- )
59
- texts = text_splitter.split_documents(documents)
60
-
61
- # 3. Cargar Embeddings (el mismo modelo que usaste)
62
  embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
63
 
64
- # 4. CREAR Vector Store DESDE CERO
65
- vectorstore = FAISS.from_documents(texts, embeddings)
 
66
 
67
- # 5. Configurar LLM y Prompt (igual que antes)
68
  llm_groq = ChatGroq(temperature=0.0, model_name="llama-3.1-8b-instant")
69
 
70
  custom_prompt = """
@@ -79,7 +50,7 @@ def load_and_configure_rag():
79
  """
80
  RAG_PROMPT = PromptTemplate(template=custom_prompt, input_variables=["context", "question"])
81
 
82
- # 6. Crear la cadena de RAG
83
  qa_chain = RetrievalQA.from_chain_type(
84
  llm=llm_groq,
85
  chain_type="stuff",
@@ -91,32 +62,25 @@ def load_and_configure_rag():
91
 
92
  except Exception as e:
93
  print(f"Error crítico al cargar la configuración RAG: {e}")
94
- # Si falla, lanzamos una excepción clara
95
- raise RuntimeError(f"Falla al crear el RAG: {e}")
96
 
97
  # --------------------------------------------------------
98
  # 3. CONFIGURACIÓN DE FASTAPI Y ENDPOINTS
99
  # --------------------------------------------------------
100
 
101
- # Aquí iniciamos el servidor y la cadena RAG
102
  app = FastAPI(title="NutriActive RAG API")
103
- try:
104
- qa_chain = load_and_configure_rag() # Intenta cargar la cadena
105
- except RuntimeError:
106
- qa_chain = None # Si falla la carga, qa_chain será None
107
 
108
  @app.get("/")
109
  def home():
110
  """Verifica que el servidor está corriendo."""
111
- if qa_chain is None:
112
- return {"error": "El servidor está activo, pero el RAG no se pudo inicializar. Revisa los logs de inicio."}
113
  return {"message": "API de NutriActive RAG operativa. Usa el endpoint /query."}
114
 
115
  @app.post("/query")
116
  async def process_query(request: QueryRequest):
117
  """Endpoint principal para recibir la pregunta y devolver la respuesta."""
118
  if qa_chain is None:
119
- return {"error": "El sistema RAG no se pudo cargar. Revisa los logs de inicio para ver el error específico."}
120
 
121
  try:
122
  result = qa_chain.invoke({"query": request.query})
 
7
  from langchain.prompts import PromptTemplate
8
  from langchain_groq import ChatGroq
9
 
 
 
 
 
10
  # --------------------------------------------------------
11
  # 1. CONFIGURACIÓN
12
  # --------------------------------------------------------
13
+ # La clave se lee del secreto de Hugging Face. NO PEGAR CLAVE AQUÍ.
14
+ os.environ['GROQ_API_KEY'] = os.environ.get('GROQ_API_KEY')
15
+ DB_FAISS_PATH = 'vectorstore/db_faiss'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
 
17
+ # --------------------------------------------------------
18
+ # 2. CLASES Y CARGA DEL RAG CORE
19
+ # --------------------------------------------------------
20
 
21
  class QueryRequest(BaseModel):
22
  """Define el formato de la pregunta que recibirá el endpoint /query."""
 
24
 
25
  def load_and_configure_rag():
26
  """
27
+ Carga la base de datos FAISS pre-entrenada y configura el RAG Chain.
28
+ Esta función se ejecuta SOLO UNA VEZ al iniciar el servidor.
29
  """
30
  try:
31
+ # 1. Cargar Embeddings (necesario para saber cómo buscar)
 
 
 
 
 
 
 
 
 
 
 
32
  embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
33
 
34
+ # 2. Cargar Vector Store (busca la carpeta que subiste a Hugging Face)
35
+ # Esto fallará si la carpeta 'vectorstore/db_faiss' no se sube.
36
+ vectorstore = FAISS.load_local(DB_FAISS_PATH, embeddings, allow_dangerous_deserialization=True)
37
 
38
+ # 3. Configurar LLM y Prompt
39
  llm_groq = ChatGroq(temperature=0.0, model_name="llama-3.1-8b-instant")
40
 
41
  custom_prompt = """
 
50
  """
51
  RAG_PROMPT = PromptTemplate(template=custom_prompt, input_variables=["context", "question"])
52
 
53
+ # 4. Crear la cadena de RAG
54
  qa_chain = RetrievalQA.from_chain_type(
55
  llm=llm_groq,
56
  chain_type="stuff",
 
62
 
63
  except Exception as e:
64
  print(f"Error crítico al cargar la configuración RAG: {e}")
65
+ return None
 
66
 
67
  # --------------------------------------------------------
68
  # 3. CONFIGURACIÓN DE FASTAPI Y ENDPOINTS
69
  # --------------------------------------------------------
70
 
 
71
  app = FastAPI(title="NutriActive RAG API")
72
+ qa_chain = load_and_configure_rag() # Carga la cadena al iniciar
 
 
 
73
 
74
  @app.get("/")
75
  def home():
76
  """Verifica que el servidor está corriendo."""
 
 
77
  return {"message": "API de NutriActive RAG operativa. Usa el endpoint /query."}
78
 
79
  @app.post("/query")
80
  async def process_query(request: QueryRequest):
81
  """Endpoint principal para recibir la pregunta y devolver la respuesta."""
82
  if qa_chain is None:
83
+ return {"error": "El sistema RAG no se pudo cargar. Verifique que la carpeta 'vectorstore' existe."}
84
 
85
  try:
86
  result = qa_chain.invoke({"query": request.query})