MGC1991MF commited on
Commit
2a26ed4
·
verified ·
1 Parent(s): 06e2c83

Update RAG_tool.py

Browse files
Files changed (1) hide show
  1. RAG_tool.py +22 -19
RAG_tool.py CHANGED
@@ -1,4 +1,6 @@
1
- # --- PARCHE PARA CHROMADB EN HUGGING FACE (ESTO DEBE SER LA LÍNEA 1) ---
 
 
2
  __import__('pysqlite3')
3
  import sys
4
  sys.modules['sqlite3'] = sys.modules.pop('pysqlite3')
@@ -9,8 +11,9 @@ from crewai.tools import BaseTool
9
  from langchain_huggingface import HuggingFaceEmbeddings
10
  from langchain_community.vectorstores import Chroma
11
 
12
- # --- YA NO USAMOS LA CLASE 'BuscadorInput' NI 'args_schema' ---
13
- # Esto libera al modelo Dolphin-Mistral de intentar formatear JSON complejos
 
14
 
15
  class BuscadorGuiasClinicas(BaseTool):
16
  name: str = "Buscador de Guías Clínicas"
@@ -22,35 +25,35 @@ class BuscadorGuiasClinicas(BaseTool):
22
 
23
  def _run(self, query: str) -> str:
24
  try:
25
- # ==============================================================================
26
- # 1. BLOQUE DE SEGURIDAD PARA INPUTS (La parte nueva importante)
27
- # ==============================================================================
28
- # Si el modelo envía un diccionario o JSON malformado en lugar de texto plano:
29
  if isinstance(query, dict):
30
- # Intenta sacar el valor si viene en formato {'query': 'valor'}
31
  query = query.get('query', str(query))
32
- if isinstance(query, dict): # Si sigue siendo dict (tu error específico)
33
  query = query.get('description', str(query))
34
 
35
- # Limpieza final de string por si quedan llaves sueltas
36
  query = str(query).replace("{'query':", "").replace("}", "").strip()
37
  # ==============================================================================
38
 
39
- # Configuración del modelo de embeddings (Multilingüe)
40
  embedding_function = HuggingFaceEmbeddings(
41
  model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
42
  )
43
 
44
- # Conexión a la DB
45
  db = Chroma(persist_directory="./chroma_db", embedding_function=embedding_function)
46
 
47
- # 2. RECUPERACIÓN AMPLIADA (k=10)
48
  results_raw = db.similarity_search(query, k=10)
49
 
50
  if not results_raw:
51
  return "No se encontró información relevante en las guías para esta consulta."
52
 
53
- # 3. DEFINICIÓN DE "BASURA" (FILTROS)
54
  frases_basura = [
55
  "End-User License Agreement",
56
  "All Rights Reserved",
@@ -61,7 +64,7 @@ class BuscadorGuiasClinicas(BaseTool):
61
  "ME-D"
62
  ]
63
 
64
- # 4. PROCESO DE LIMPIEZA Y FORMATEO
65
  contexto = f"RESULTADOS (FILTRADOS) DE LA BASE DE DATOS PARA: '{query}'\n\n"
66
  contador_validos = 0
67
  max_resultados_utiles = 4
@@ -69,15 +72,15 @@ class BuscadorGuiasClinicas(BaseTool):
69
  for doc in results_raw:
70
  contenido = doc.page_content
71
 
72
- # A) Filtro de Contenido Prohibido
73
  if any(basura in contenido for basura in frases_basura):
74
  continue
75
 
76
- # B) Filtro de Longitud
77
  if len(contenido) < 50:
78
  continue
79
 
80
- # Si pasa los filtros, lo agregamos al reporte final
81
  fuente = doc.metadata.get('source', 'Guía desconocida')
82
  nombre_archivo = os.path.basename(fuente)
83
  pagina = doc.metadata.get('page', '?')
@@ -90,7 +93,7 @@ class BuscadorGuiasClinicas(BaseTool):
90
  if contador_validos >= max_resultados_utiles:
91
  break
92
 
93
- # Validación final
94
  if contador_validos == 0:
95
  return "Se encontraron fragmentos, pero todos fueron descartados por ser texto legal (Disclaimers/Copyright)."
96
 
 
1
+ # ===========================================================================================
2
+ # 1. LIBRERIAS PARA HERRAMIENTA DE INGESTA RAG & CONFIGURACIONES PARA HUGGING FACE SPACES
3
+ # ===========================================================================================
4
  __import__('pysqlite3')
5
  import sys
6
  sys.modules['sqlite3'] = sys.modules.pop('pysqlite3')
 
11
  from langchain_huggingface import HuggingFaceEmbeddings
12
  from langchain_community.vectorstores import Chroma
13
 
14
+ # ==============================================================================
15
+ # 2. DEFINICION DE FUNCION DE GUIAS CLINICAS
16
+ # ==============================================================================
17
 
18
  class BuscadorGuiasClinicas(BaseTool):
19
  name: str = "Buscador de Guías Clínicas"
 
25
 
26
  def _run(self, query: str) -> str:
27
  try:
28
+ # ==============================================================================
29
+ # 3. BLOQUE DE SEGURIDAD PARA INPUTS
30
+ # ==============================================================================
31
+ # 1. Si el modelo envía un diccionario o JSON malformado en lugar de texto plano:
32
  if isinstance(query, dict):
33
+ # 1.1 Intenta sacar el valor si viene en formato {'query': 'valor'}
34
  query = query.get('query', str(query))
35
+ if isinstance(query, dict): # 1.2 Si sigue siendo dict
36
  query = query.get('description', str(query))
37
 
38
+ # 2. Limpieza final de string por si quedan llaves sueltas
39
  query = str(query).replace("{'query':", "").replace("}", "").strip()
40
  # ==============================================================================
41
 
42
+ # 3. Configuración del modelo de embeddings (Multilingüe)
43
  embedding_function = HuggingFaceEmbeddings(
44
  model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
45
  )
46
 
47
+ # 4. Conexión a la DB
48
  db = Chroma(persist_directory="./chroma_db", embedding_function=embedding_function)
49
 
50
+ # 5. RECUPERACIÓN AMPLIADA (k=10)
51
  results_raw = db.similarity_search(query, k=10)
52
 
53
  if not results_raw:
54
  return "No se encontró información relevante en las guías para esta consulta."
55
 
56
+ # 6. DEFINICIÓN DE "BASURA" (FILTROS)
57
  frases_basura = [
58
  "End-User License Agreement",
59
  "All Rights Reserved",
 
64
  "ME-D"
65
  ]
66
 
67
+ # 7. PROCESO DE LIMPIEZA Y FORMATEO
68
  contexto = f"RESULTADOS (FILTRADOS) DE LA BASE DE DATOS PARA: '{query}'\n\n"
69
  contador_validos = 0
70
  max_resultados_utiles = 4
 
72
  for doc in results_raw:
73
  contenido = doc.page_content
74
 
75
+ # 7.1 Filtro de Contenido Prohibido
76
  if any(basura in contenido for basura in frases_basura):
77
  continue
78
 
79
+ # 7.2 Filtro de Longitud
80
  if len(contenido) < 50:
81
  continue
82
 
83
+ # 7.3 Si pasa los filtros, lo agregamos al reporte final
84
  fuente = doc.metadata.get('source', 'Guía desconocida')
85
  nombre_archivo = os.path.basename(fuente)
86
  pagina = doc.metadata.get('page', '?')
 
93
  if contador_validos >= max_resultados_utiles:
94
  break
95
 
96
+ # 8. Validación final
97
  if contador_validos == 0:
98
  return "Se encontraron fragmentos, pero todos fueron descartados por ser texto legal (Disclaimers/Copyright)."
99