🧬 Modelo LATS ligero con agentes RAG y dos LLMs

🧬 Language Agent Tree Search aplicado a genética de poblaciones
Este modelo implementa un pipeline de investigación genética orientado al estudio de haplogrupos y migraciones antiguas. Se basa en la arquitectura Language Agent Tree Search (LATS), que permite explorar múltiples caminos de razonamiento mediante agentes lingüísticos, herramientas RAG y dos modelos de lenguaje: Deepseek y GPT‑4o.
Language Agent Tree Search (LATS) es una arquitectura de razonamiento basada en agentes lingüísticos que permite explorar múltiples caminos de pensamiento de forma estructurada, trazable y modular. A diferencia de los flujos lineales tradicionales, LATS organiza la ejecución como un árbol de decisiones, donde cada nodo representa una acción, reflexión o consulta, y cada rama representa una alternativa evaluada.
🌳 ¿Qué significa “Tree Search” en este contexto?
- El modelo no sigue un único camino de razonamiento.
- En lugar de eso, genera múltiples candidatos (ideas, hipótesis, enfoques).
- Cada candidato se expande con evidencia (usando agentes RAG).
- Luego se evalúan y puntúan con otro modelo (ej. GPT‑4o).
- El sistema elige el mejor camino y lo sintetiza en una respuesta final.
Este proceso es análogo a cómo un humano experto podría explorar varias hipótesis, consultar fuentes, reflexionar y decidir cuál es la más sólida.
🧠 ¿Qué lo diferencia de otros modelos?
| Característica | LATS (Tree Search) | Pipeline lineal tradicional |
|---|---|---|
| Generación de ideas | Múltiples candidatos simultáneos | Una sola idea por turno |
| Evaluación | Reflexión comparativa entre opciones | Validación secuencial |
| Trazabilidad | Cada paso tiene provenance y puntuación | Difícil de rastrear decisiones previas |
| Modularidad | Cada nodo puede tener herramientas específicas | Herramientas acopladas a todo el flujo |
| Persistencia de hipótesis | Conclusiones se guardan y condicionan el flujo | No hay memoria estructurada |
🔁 Flujo típico de LATS
- Candidate Generation Node → Un LLM genera 3–5 ideas breves para abordar una pregunta.
- Expansion Node (RAG) → Cada idea se expande con evidencia documental usando agentes especializados.
- Reflection Node → Otro LLM evalúa las ideas expandidas, asigna puntuaciones y justificaciones.
- Selection Node → Se elige el mejor candidato y se sintetiza una respuesta final.
- Persistence Node (opcional) → Si se detecta una hipótesis con alta certeza, se guarda y condiciona el resto del grafo.
1. 🎯 Objetivo del modelo
El propósito es automatizar la generación de hipótesis y síntesis científicas en genética de poblaciones, garantizando:
- 🧠 Creatividad controlada en la generación de candidatos de investigación
- 📚 Trazabilidad documental mediante agentes RAG
- 🧪 Evaluación crítica con un segundo modelo que puntúa y selecciona las mejores opciones
- 🧬 Persistencia de conclusiones genéticas con niveles de certeza (alta, media, baja)
2. 🔁 Flujo de trabajo: Language Agent Tree Search
El modelo sigue un flujo LATS con nodos especializados:
🟩 Setup
Carga modelos, herramientas y agentes RAG. Configura límites de expansión y logging.
🟨 Graph State
Define el estado compartido (PlanExecute) con entrada, pasos previos, respuesta, hipótesis y nivel de certeza.
🟦 Define Language Agent
Crea agentes con prompts dinámicos que inyectan contexto genético (haplogrupos, SNPs, migraciones). Si ya existe una conclusión con alta certeza, el agente se restringe a validar o refutar.
🟧 Tools
Se conectan agentes RAG especializados: human_genetics_agent, bronce_agent, neolitic_agent, etc. Cada candidato se expande con hasta 3 agentes, máximo 15 por ejecución.
🟪 Reflection
GPT‑4o evalúa los candidatos con puntuación (0–10) y justificación breve. Ejemplo:
“Rastreo de migraciones prehistóricas de R1b” || 10 || Conecta datos genéticos con eventos históricos.
🟫 Initial Response
Se selecciona el candidato mejor puntuado y se redacta una síntesis integrando evidencia RAG y conclusiones genéticas.
3. 🧩 Componentes técnicos
| Componente | Función |
|---|---|
Deepseek | Genera candidatos creativos (titulares breves de investigación) |
GPT‑4o | Evalúa candidatos y selecciona el mejor |
agent_tools | Registro de herramientas RAG genéticas y arqueológicas |
ToolAdapter | Normaliza llamadas a herramientas externas, maneja errores |
PlanExecute | Estructura compartida del grafo: entrada, pasos, hipótesis |
generate_agent_system_message | Prompt dinámico con restricciones de certeza genética |
RAG_KEY_KEYWORDS | Mapeo de palabras clave a agentes RAG |
4. 🧪 Ejemplo aplicado: Haplogrupo R1b
- Pregunta inicial: “Evolución del haplogrupo R1b”
- Candidatos generados:
- Rastreo de migraciones prehistóricas de R1b → 🟢 Score: 10
- Análisis de ADN antiguo → 🟢 Score: 9
- Relación con lenguas indoeuropeas → 🟢 Score: 9
- Secuenciación de cromosoma Y moderno → 🟡 Score: 8
- Estudio de subclados DF27 → 🟡 Score: 7
- Solución seleccionada: Rastreo de migraciones prehistóricas de R1b mediante herramientas genéticas
- Síntesis final: Explica el origen asiático del haplogrupo, su expansión hacia Europa en el Neolítico y la Edad del Bronce, su correlación con las culturas indoeuropeas y la aparición de subclados como R1b‑M269.
5. 🧠 Comentario técnico del código
1. Imports y configuración inicial
Carga librerías estándar, modelos LLM, y configura logging.DEBUG.
2. Gestión de herramientas (agent_tools)
Importa herramientas externas y agentes RAG. Usa dummy_tool si faltan módulos.
3. Estructuras de datos
Define Plan, Response, Act, y PlanExecute con campos genéticos clave.
4. Definición de agentes LLM
Crea agentes con prompts genéticos. Controla generación de nuevas hipótesis según certeza.
5. Configuración de RAG
Define claves RAG, límites por candidato, y mapeo de palabras clave.
6. ToolAdapter
Normaliza llamadas a herramientas, maneja .func, .run, y excepciones.
7. Helpers para invocar modelos
Funciones robustas para extraer texto de salidas LLM y manejar múltiples APIs (invoke, chat, generate).
8. Clase principal: AgentLATS
Orquesta el flujo completo:
generate_candidatescall_rag_toolsreflect_and_scoresynthesis final
✅ Conclusión
Este modelo basado en Language Agent Tree Search permite:
- Explorar múltiples caminos de razonamiento
- Integrar evidencia genética y arqueológica
- Generar narrativas científicas con trazabilidad y control de certeza
Es una arquitectura modular, extensible y rigurosa, ideal para investigación interdisciplinar en genética de poblaciones.
Comentario técnico de las principales partes del código
1. Imports y configuración inicial
- Se importan librerías estándar (
logging,operator,os,traceback) y tipos (TypedDict,List,Union, etc.). - Se asegura compatibilidad con LangChain (
ToolException,SystemMessage,HumanMessage) y LangGraph (create_react_agent). - Se carga el modelo con
get_model("Deepseek")yget_model("gpt-4o"). - Se configura el logging en nivel
DEBUGpara capturar salidas crudas de los modelos y facilitar el troubleshooting.
👉 Función: preparar el entorno y garantizar que los modelos y herramientas estén disponibles.
2. Gestión de herramientas (agent_tools)
- Se intenta importar herramientas externas (Wikipedia, DuckDuckGo news, feedback humano).
- Se definen RAG agents específicos para genética y arqueogenética (ej.
human_genetics_agent,bronce_agent,neolitic_agent). - Si no están disponibles, se crean dummy tools para que el código compile y devuelva resultados simulados.
- Se fusiona el registro
_rag_registry_agent_toolsconagent_toolspara asegurar que las herramientas estén accesibles.
👉 Función: centralizar y normalizar el acceso a herramientas externas y agentes RAG.
3. Estructuras de datos (Pydantic y TypedDict)
- Plan: lista de pasos ordenados para resolver una tarea de investigación genética.
- Response: respuesta final al usuario.
- Act: acción que puede ser un
Plano unaResponse. - PlanExecute (TypedDict): estado compartido del workflow, incluye:
input,plan,past_steps,response,log_filename,last_node_output.- Terminología genética:
hypothesis_certainty(alta/media/baja) ymain_hypothesis(conclusiones principales).
👉 Función: estructurar el flujo de ejecución y persistir conclusiones genéticas con trazabilidad.
4. Definición de agentes LLM
- Se crean agentes basados en Deepseek y GPT‑4o.
- Si no están disponibles, se define un
dummy_runnableque devuelve respuestas simuladas. - Se construye un prompt dinámico (
generate_agent_system_message) que:- Inyecta contexto genético (haplogrupos, SNPs, migraciones).
- Obliga a terminar con conclusiones persistentes:Codi
**Certainty Level (P-value/F-statistic):** [high/medium/low] **Key Genetic Conclusion:** - [evento de admixture] - [mutación SNP relevante] - Si ya existe una conclusión con alta certeza, restringe la generación de nuevas hipótesis.
👉 Función: controlar la narrativa del agente y garantizar rigor bioinformático.
5. Configuración de RAG
- Se definen
RAG_KEYS(ej.georgia_agent,human_genetics_agent,bronce_agent,neolitic_agent). - Se establecen límites:
MAX_RAG_TOOLS = 3por candidato.MAX_TOTAL_RAG = 15por ejecución.
- Se mapea palabras clave a agentes (
RAG_KEY_KEYWORDS) para activar el agente correcto según el texto.
👉 Función: evitar consultas excesivas y asegurar que cada candidato se expanda con evidencia relevante.
6. Tool y ToolAdapter
- Tool: clase mínima que simula ejecución de una herramienta.
- ToolAdapter: clase que normaliza cómo se llama a cada herramienta:
- Convierte queries en texto plano.
- Intenta invocar
.func,.runo el objeto callable. - Maneja excepciones (
ToolException) y devuelve resultados estructurados.
👉 Función: robustecer la interacción con herramientas externas, evitando errores de argumentos.
7. Helpers para invocar modelos
_extract_text_from_model_output: normaliza salidas de modelos (string, dict, lista, objeto)._invoke_model_for_text: intenta múltiples métodos (invoke,chat,generate, callable) para obtener texto.- Registra intentos fallidos en
logging.debug.
👉 Función: asegurar que siempre se obtenga texto usable del modelo, aunque cambie la API.
8. Clase principal: AgentLATS
- Descripción: “Lightweight LATS runner that uses RAG agents and two LLMs”.
- Flujo:
generate_candidates(Deepseek): genera titulares breves como pasos de investigación.call_rag_tools: expande cada candidato con agentes RAG.reflect_and_score(GPT‑4o): evalúa candidatos con puntuación y justificación.- Produce síntesis final integrando la mejor opción y su provenance.
👉 Función: orquestar todo el pipeline: creatividad → evidencia → evaluación → síntesis.
🎯 Conclusión
El código implementa un pipeline de investigación genética con tres capas principales:
- Generación creativa (Deepseek).
- Expansión con evidencia RAG.
- Evaluación crítica y síntesis (GPT‑4o).
Todo ello con estructuras de datos claras, control de certeza, y adaptadores robustos para herramientas externas.








🧬 Evolución del haplogrupo R1b: migraciones, genética y cultura – sanchezpares.com
[…] 🧬 Modelo LATS ligero con agentes RAG y dos LLMs […]