La gestión del conocimiento en entornos industriales, específicamente en el área de mantenimiento, presenta un desafío crítico: la accesibilidad y la interpretación precisa de volúmenes masivos de documentación técnica. Los manuales de mantenimiento, fichas técnicas y protocolos de seguridad contienen información vital que, a menudo, permanece «atrapada» en archivos PDF estáticos.
En este artículo, desglosaremos la implementación técnica de un sistema de Generación Aumentada por Recuperación (RAG) diseñado para interactuar con documentación técnica de mantenimiento. El objetivo es mitigar las alucinaciones inherentes a los Modelos de Lenguaje Grande (LLMs) y garantizar respuestas deterministas basadas exclusivamente en manuales propietarios, utilizando una arquitectura totalmente local con LangChain, Ollama y ChromaDB.
1. Arquitectura del Sistema y Stack Tecnológico
La solución propuesta se basa en una arquitectura de inferencia local, lo cual es crucial en entornos industriales donde la privacidad de los datos (planos, patentes, procedimientos internos) impide el uso de APIs externas en la nube.
El núcleo del sistema, implementado en Python, orquesta tres componentes fundamentales:
- Motor de Inferencia y Embeddings: Se utiliza Ollama para ejecutar modelos de la familia Qwen (
qwen3:8bpara generación yqwen3-embedding:8bpara la vectorización). La elección de modelos de 8 mil millones de parámetros ofrece un equilibrio óptimo entre latencia y capacidad de razonamiento en hardware de consumo o servidores on-premise. - Orquestación: LangChain gestiona el flujo de datos, desde la carga de documentos hasta la construcción del prompt final.
- Almacenamiento Vectorial: ChromaDB actúa como la base de datos vectorial persistente, permitiendo la recuperación semántica de fragmentos de texto relevantes.
2. Ingesta y Vectorización Eficiente de Documentos
El primer paso crítico en el pipeline es la transformación de la documentación no estructurada (PDFs de mantenimiento) en representaciones matemáticas procesables. El script implementa una lógica condicional para optimizar el cómputo:
Persistencia y Caché
El sistema verifica la existencia de una base de datos persistida (./chroma_db). Si esta existe, se omite el costoso proceso de re-indexación, cargando directamente la colección existente. Esta estrategia reduce drásticamente el tiempo de arranque (cold start) en ejecuciones subsiguientes.
Estrategia de «Chunking»
En caso de una indexación inicial (o «arranque en frío»), se emplea un DirectoryLoader para ingerir recursivamente todos los archivos PDF del directorio objetivo. Posteriormente, se aplica un RecursiveCharacterTextSplitter.
La configuración de este splitter es vital para el contexto técnico:
- Chunk Size (1000 caracteres): Un tamaño suficiente para capturar un procedimiento completo o una especificación técnica sin cortar el contexto semántico.
- Overlap (200 caracteres): Un solapamiento necesario para mantener la continuidad entre fragmentos, evitando que frases críticas se rompan en los límites de los bloques.
Python
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
Estos fragmentos se transforman en vectores densos mediante el modelo qwen3-embedding:8b y se almacenan en Chroma.
3. El Mecanismo de Recuperación (Retrieval)
Una vez constituido el índice vectorial, el sistema configura un «Retriever» que busca los $k=5$ fragmentos más similares semánticamente a la consulta del usuario.
En el dominio del mantenimiento, la precisión es más importante que la creatividad. Al recuperar 5 fragmentos, aumentamos la probabilidad de encontrar la respuesta exacta distribuida en varias partes de un manual, proporcionando al LLM suficiente contexto «grounded» (fundamentado) para formular su respuesta.
4. Ingeniería de Prompts y Auditabilidad
La fase final de la cadena (Chain) utiliza el patrón LCEL (LangChain Expression Language) para inyectar los documentos recuperados en el contexto del modelo.
Restricción del Dominio
El prompt del sistema ha sido diseñado con instrucciones estrictas para evitar la generación de información falsa:
«Eres un experto en mantenimiento. Responde SOLO usando el CONTEXTO. Si el contexto no contiene la respuesta, di ‘No lo sé’.»
Esta instrucción, combinada con una temperatura de $0$ en la configuración del LLM (temperature=0), fuerza al modelo a un comportamiento determinista. En mantenimiento industrial, inventar un procedimiento puede tener consecuencias catastróficas; por tanto, el modelo debe admitir ignorancia antes que confabular.
Observabilidad del Proceso
Un aspecto destacado de esta implementación es la función format_docs_with_print. A diferencia de una caja negra, este componente imprime en consola los metadatos (fuente y número de página) y el contenido de los chunks recuperados antes de generar la respuesta.
Esto permite a los ingenieros de mantenimiento auditar la trazabilidad de la respuesta: no solo saben qué dice el sistema, sino en qué página de qué manual se basó para decirlo.
Experimento: «¿En el modelo GLP, el motor se puede encender con GLP?»
============================================================
CHUNKS RECUPERADOS:
— Chunk 1 (y similares) —
Fuente: docs_mantenimiento\mantenimiento.pdf | Página: 23
Contenido:
[…] Operación Puesta en marcha del motor.
El motor siempre se pone en marcha con gasolina.
– Para vehículos con llave 🡺 141.
[…]
Nota: si el modo GLP se encuentra activo al arrancar el motor,
el sistema pasa temporalmente a modo «gasolina».
— Chunk 5 —
Fuente: docs_mantenimiento\mantenimiento.pdf | Página: 23
Contenido:
VEHÍCULO GLP […]
Estos vehículos funcionan con dos tipos de combustible: GLP y gasolina.
Cuentan con dos depósitos distintos 🡺 132.
[…]
============================================================
RESPUESTA GENERADA:
No, en el modelo GLP el motor no se puede encender directamente con GLP.
El contexto indica que el motor siempre se pone en marcha con gasolina,
y si el modo GLP está activo al arrancar, el sistema pasa temporalmente
a modo «gasolina».
Conclusión
La implementación presentada demuestra cómo la combinación de modelos abiertos y orquestadores modernos permite desplegar asistentes técnicos fiables. Al restringir el conocimiento del LLM exclusivamente a los manuales vectorizados, transformamos un modelo de lenguaje generalista en una herramienta de consulta técnica especializada, capaz de asistir en la toma de decisiones operativas con un alto grado de confianza.
