English | Español | 简体中文 | 한국어
Esta herramienta convierte archivos Office (.doc, .docx, .pptx) a Markdown optimizado para RAG, manteniendo fidelidad estructural y aplicando normalización lingüística segura.
Script principal:
Convert-OfficeToRAG.ps1
- Windows con Microsoft Word y PowerPoint instalados (automatización COM).
- PowerShell 7 (
pwsh) instalado. - Permisos de lectura/escritura sobre las carpetas fuente.
Verificación rápida:
pwsh -NoProfile -Command "$PSVersionTable.PSVersion"Editar el bloque $Config al inicio de Convert-OfficeToRAG.ps1:
SourceFolders: carpetas origen a procesar.FileExtensions: extensiones permitidas.OcrDictionary: diccionario conservador OCR.ResidualOcrRegex: regex de validación de residuos.LogPath,QaLogPath,SummaryPath: rutas de salida de logs.ForceReprocess: fuerza reprocesado de archivos aunque ya exista.md.
Comportamiento portable:
- Si una ruta es relativa, el script la resuelve desde la carpeta donde vive
Convert-OfficeToRAG.ps1. - Por defecto, los logs (
rag_converter_log.txt,rag_converter_qa_log.txt,rag_converter_summary.txt) se escriben enoutputs/logsdentro de la carpeta del script. SourceFolderspor defecto apunta a..\inputrespecto a la carpeta del script.
Variables de entorno clave:
RAG_SOURCE_FOLDERS: acepta múltiples rutas separadas por;o,.RAG_SOURCE_FILES: acepta uno o varios archivos concretos separados por;o,.RAG_FORCE_REPROCESS:true/falsepara reprocesar aunque exista.md.RAG_FAIL_FAST:true/falsepara abortar o continuar ante errores.RAG_ENABLE_PREFLIGHT:true/falsepara activar/desactivar preflight API.RAG_OPENROUTER_MODEL: modelo de visión a usar.
Parámetros directos del script (prioridad alta, recomendados en automatización):
-SourceFoldersOverride <string[]>-SourceFilesOverride <string[]>-ForceReprocessOverride <bool>-FailFastOverride <bool>-EnablePreflightOverride <bool>-OpenRouterModelOverride <string>
Ejecutar siempre con pwsh para mantener estabilidad UTF-8. Comando agnóstico a ruta:
$toolDir = "D:\Ruta\Donde\Está\RAG_Converter_Tool"
pwsh -NoProfile -File (Join-Path $toolDir "Convert-OfficeToRAG.ps1")Salida esperada en consola:
NORM_OKoNORM_WITH_ERRORS.
$toolDir = "D:\Ruta\Donde\Está\RAG_Converter_Tool"; pwsh -NoProfile -Command "$s=(Join-Path '$toolDir' 'Convert-OfficeToRAG.ps1'); $sum=(Join-Path '$toolDir' 'outputs\logs\rag_converter_summary.txt'); & $s; if($LASTEXITCODE -ne 0){ throw 'Falló la ejecución del convertidor' }; $st=(Get-Content $sum | Select-String '^STATUS=').Line; if($st -ne 'STATUS=NORM_OK'){ throw \"Estado inválido: $st\" }; Write-Host 'OK => STATUS=NORM_OK' -ForegroundColor Green"Auditoría rápida de resumen:
$toolDir = "D:\Ruta\Donde\Está\RAG_Converter_Tool"
Get-Content -Path (Join-Path $toolDir "outputs\logs\rag_converter_summary.txt")Estado en una línea:
$toolDir = "D:\Ruta\Donde\Está\RAG_Converter_Tool"
(Get-Content (Join-Path $toolDir "outputs\logs\rag_converter_summary.txt") | Select-String '^STATUS=').LineIncidencias QA:
$toolDir = "D:\Ruta\Donde\Está\RAG_Converter_Tool"
$qa = Join-Path $toolDir "outputs\logs\rag_converter_qa_log.txt"
if((Test-Path $qa) -and ((Get-Item $qa).Length -gt 0)){Get-Content $qa}else{"Sin incidencias QA"}El script está diseñado con un enfoque robusto y modular:
El script ya no está acoplado a una temática específica (como el fútbol). Utiliza variables de configuración para inyectar el contexto dinámicamente en el prompt del modelo de IA:
$Config.DomainContext: Define el entorno (ej. "entorno educativo de alto rendimiento deportivo").$Config.DomainNoiseFilter: Palabras clave a ignorar por el modelo (ej. "colores de ropa, paisajes, clima").$Config.DomainTechnicalTerms: Instrucciones de precisión terminológica (ej. evitar sustituir términos especializados por sinónimos ambiguos).
El análisis de imágenes se realiza mediante la API de OpenRouter. El nuevo prompt exige un formato de salida estricto en Markdown que incluye:
- OCR Literal: Transcripción exacta de texto en diapositivas.
- Análisis Técnico Espacial: Interpretación de diagramas y flechas.
- Valor Pedagógico: Extracción del concepto central.
Para evitar "dar palos de ciego" durante ejecuciones masivas:
- Salida de Consola (Verbose): Muestra el progreso en tiempo real (
[1/10] Procesando...,[Imagen 3/5] Solicitando análisis...,Generando Markdown final). - Telemetría COM: Mide y muestra tiempos de
Word.OpenyWord.SaveAs(HTML)para detectar cuellos de botella. - Archivos de Log:
rag_converter_log.txt: Registra eventos conINFOyERROR(incluyendo StackTraces).rag_converter_qa_log.txt: Registra errores de validación (ej. análisis de imagen incompleto).rag_converter_summary.txt: Resumen final de la ejecución.
- Soporta perfiles como
defaultystagingpara cambiar modelos rápidamente sin tocar el código. - Incluye un preflight check que verifica la conectividad y soporte multimodal de la API antes de empezar, con fallback automático de
visionatextsi el modelo no soporta imágenes.
- Si al lanzar con
powershell.exeaparecen caracteres rotos en regex/tildes, usarpwsh. - Si COM falla, verificar instalación de Word/PowerPoint y sesión de usuario activa.
- Si el estado es
NORM_WITH_ERRORS, revisar primerorag_converter_qa_log.txt. - Si mueves la carpeta
RAG_Converter_Tool, el script sigue funcionando; solo revisaSourceFolderssi las fuentes quedaron en otra ubicación. - Si una extracción Word se queda lenta, revisar en consola los tiempos
Word.Open/Word.SaveAs(HTML)para ubicar el cuello de botella. - Si hay archivos temporales bloqueados (
~$*.docx), cerrarlos en Office antes de ejecutar el lote.
Ejecución completa (carpetas configuradas):
$toolDir = "D:\Ruta\RAG_Converter_Tool"
$env:OPENROUTER_API_KEY="TU_API_KEY"; $env:RAG_OPENROUTER_MODEL="google/gemini-3.1-flash-lite-preview"; $env:RAG_FAIL_FAST="false"; $env:RAG_ENABLE_PREFLIGHT="false"; & (Join-Path $toolDir "Convert-OfficeToRAG.ps1")Reprocesado completo forzado:
$toolDir = "D:\Ruta\RAG_Converter_Tool"
$env:OPENROUTER_API_KEY="TU_API_KEY"; $env:RAG_OPENROUTER_MODEL="google/gemini-3.1-flash-lite-preview"; $env:RAG_FORCE_REPROCESS="true"; $env:RAG_FAIL_FAST="false"; $env:RAG_ENABLE_PREFLIGHT="false"; & (Join-Path $toolDir "Convert-OfficeToRAG.ps1")Ejecución de un solo archivo:
$toolDir = "D:\Ruta\RAG_Converter_Tool"
$env:OPENROUTER_API_KEY="TU_API_KEY"; $env:RAG_OPENROUTER_MODEL="google/gemini-3.1-flash-lite-preview"; $env:RAG_SOURCE_FILES="D:\Ruta\Input\Documento.docx"; $env:RAG_FORCE_REPROCESS="true"; $env:RAG_FAIL_FAST="false"; $env:RAG_ENABLE_PREFLIGHT="false"; & (Join-Path $toolDir "Convert-OfficeToRAG.ps1")Ejecución de un solo archivo (vía parámetros, recomendado):
$toolDir = "D:\Ruta\RAG_Converter_Tool"
$env:OPENROUTER_API_KEY="TU_API_KEY"; & (Join-Path $toolDir "Convert-OfficeToRAG.ps1") -SourceFilesOverride "D:\Ruta\Input\Documento.docx" -ForceReprocessOverride $true -FailFastOverride $false -EnablePreflightOverride $false -OpenRouterModelOverride "google/gemini-3.1-flash-lite-preview"Ejecución total aunque ya existan .md (vía parámetros):
$toolDir = "D:\Ruta\RAG_Converter_Tool"
$env:OPENROUTER_API_KEY="TU_API_KEY"; & (Join-Path $toolDir "Convert-OfficeToRAG.ps1") -ForceReprocessOverride $true -FailFastOverride $false -EnablePreflightOverride $false -OpenRouterModelOverride "google/gemini-3.1-flash-lite-preview"- Crear
.envcopiando la plantilla:
$toolDir = "D:\Ruta\RAG_Converter_Tool"
Copy-Item (Join-Path $toolDir ".env.example") (Join-Path $toolDir ".env") -Force-
Editar
.envy poner tuOPENROUTER_API_KEY. -
Cargar alias cortos en la sesión actual:
$toolDir = "D:\Ruta\RAG_Converter_Tool"
. (Join-Path $toolDir "Enable-RagAlias.ps1")- Usar comandos cortos:
rag
rag -Target "D:\Ruta\Input"
rag -Target "D:\Ruta\Input\Documento.docx"
rag -Target "D:\Ruta\Input\Documento.docx" -Reprocess
rr -Target "D:\Ruta\Input\Documento.docx" -Reprocess- Opcional: persistir alias en el perfil de PowerShell:
$toolDir = "D:\Ruta\RAG_Converter_Tool"
. (Join-Path $toolDir "Enable-RagAlias.ps1") -Persist- Escalabilidad multi-cliente con archivos
.envdedicados:
$toolDir = "D:\Ruta\RAG_Converter_Tool"
Copy-Item (Join-Path $toolDir ".env.example") (Join-Path $toolDir ".env.acme.dev") -Force
Copy-Item (Join-Path $toolDir ".env.example") (Join-Path $toolDir ".env.acme.prod") -ForceNota general:
- Crea un archivo
.envpor cliente y entorno. - El parser de
.envsoporta comentarios en líneas que empiezan por#.
Uso por cliente sin tocar comandos largos:
rag -EnvFile ".env.acme.dev"
rag -EnvFile ".env.acme.prod" -Target "D:\Ruta\Input"
rag -EnvFile ".env.acme.prod" -Target "D:\Ruta\Input\Documento.docx" -ReprocessChecklist rápido para dar de alta un cliente nuevo sin tocar código:
- Crear archivo de entorno del cliente:
$toolDir = "D:\Ruta\RAG_Converter_Tool"
Copy-Item (Join-Path $toolDir ".env.example") (Join-Path $toolDir ".env.<cliente>.<entorno>") -Force- Editar
.env.<cliente>:
OPENROUTER_API_KEY: clave del cliente.RAG_OPENROUTER_MODEL: modelo acordado para ese cliente.RAG_FAIL_FAST,RAG_ENABLE_PREFLIGHT,RAG_FORCE_REPROCESS: política operativa.- Se permiten comentarios en líneas que empiezan por
#.
- Ejecutar una prueba mínima sobre un archivo:
rag -EnvFile ".env.<cliente>" -Target "D:\Ruta\Documento.docx"- Validar resultado:
- Consola con
NORM_OK. - Revisar
rag_converter_summary.txtyrag_converter_qa_log.txt. - En esta versión los artefactos están en
outputs/logs.
- Operación diaria del cliente:
rag -EnvFile ".env.<cliente>.<entorno>"- Reproceso total cuando sea necesario:
rag -EnvFile ".env.<cliente>.<entorno>" -ReprocessPara escalar sin fricción, usar esta convención:
.env.<cliente>.<entorno><cliente>: identificador estable (sin espacios), por ejemploacme,clinicax,lexcorp.<entorno>:dev,stagingoprod.
Ejemplos:
.env.acme.dev.env.acme.prod.env.lexcorp.staging
Flujo recomendado:
- Crear variante por entorno desde la base del cliente:
$toolDir = "D:\Ruta\RAG_Converter_Tool"
Copy-Item (Join-Path $toolDir ".env.example") (Join-Path $toolDir ".env.acme.dev") -Force
Copy-Item (Join-Path $toolDir ".env.example") (Join-Path $toolDir ".env.acme.prod") -Force- Ejecutar por entorno:
rag -EnvFile ".env.acme.dev"
rag -EnvFile ".env.acme.prod" -Target "D:\Ruta\Input" -ReprocessGeneración automática de informe ejecutivo desde rag_converter_summary.txt:
$toolDir = "D:\Ruta\Donde\Está\RAG_Converter_Tool"
& (Join-Path $toolDir "Gen-Report.ps1") -Cliente "Cliente Demo" -Firmante "Nombre Apellido" -Modo comercialOpcionalmente puedes definir salida:
$toolDir = "D:\Ruta\Donde\Está\RAG_Converter_Tool"
& (Join-Path $toolDir "Gen-Report.ps1") -Cliente "Cliente Demo" -Modo tecnico -OutputPath (Join-Path $toolDir "outputs\reports\Informe_RAG_Auditoria.md")Notas:
- El informe usa métricas reales del summary/log; si un dato no existe, se muestra como
N/D. - Se evita inventar KPIs (por ejemplo porcentajes de OCR o aceleraciones) si no están medidos en los archivos de evidencia.
- Modos disponibles:
-Modo comercial(storytelling ejecutivo) y-Modo tecnico(auditoría forense). - Por defecto, los logs se generan en
outputs/logsy los reportes enoutputs/reports(rutas portables, no hardcodeadas). - El informe incorpora
DHI (Data Health Index)con escala 0-100 y grados (WORLD CLASS,ENTERPRISE READY,ACCEPTABLE,NEEDS IMPROVEMENT). - El DHI se calcula con 4 pilares ponderados: Integridad (30), Semántica (40), Normalización OCR (20), Citación (10).
- Caso sin imágenes (
VISION_ITEMS=0): no penaliza; se marca comoTexto puroen el pilar semántico. - El cálculo de DHI usa
summary + qa log; puedes sobreescribir QA con-QaPath.
Atajo con alias (tras cargar Enable-RagAlias.ps1):
rag-report -Modo comercial -Cliente "Cliente Demo" -Firmante "Nombre Apellido"
rag-report -Modo tecnico -Cliente "Cliente Demo" -OutputPath "D:\Ruta\RAG_Converter_Tool\outputs\reports\Informe_RAG_Auditoria.md"