chore: clean unnecessary markdown files for CV sharing
This commit is contained in:
@@ -1,207 +0,0 @@
|
||||
# Pipeline de Generación de Resúmenes Matemáticos (LaTeX -> PDF)
|
||||
|
||||
Este documento contiene un script genérico en Python diseñado para integrarse en pipelines de automatización (GitHub Actions, Jenkins, GitLab CI). El script toma un archivo de texto plano, genera un resumen académico con fórmulas matemáticas usando LLMs (MiniMax, GLM, Gemini) y lo compila a PDF preservando la notación LaTeX.
|
||||
|
||||
## 1. Requisitos del Sistema
|
||||
|
||||
El entorno donde se ejecute este script debe tener instalado:
|
||||
|
||||
- **Python 3.8+**
|
||||
- **Pandoc** (para conversión de documentos)
|
||||
- **PDFLaTeX** (generalmente parte de TexLive, para renderizar fórmulas)
|
||||
|
||||
### Instalación en Debian/Ubuntu (Docker o CI)
|
||||
```bash
|
||||
apt-get update && apt-get install -y pandoc texlive-latex-base texlive-fonts-recommended python3-pip
|
||||
pip install requests
|
||||
```
|
||||
|
||||
## 2. Script Genérico (`math_summary.py`)
|
||||
|
||||
Guarda el siguiente código como `math_summary.py`. Este script es agnóstico al proveedor y se configura mediante argumentos o variables de entorno.
|
||||
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
import os
|
||||
import sys
|
||||
import argparse
|
||||
import subprocess
|
||||
import requests
|
||||
import json
|
||||
|
||||
# Configuración de Modelos
|
||||
PROVIDERS = {
|
||||
"minimax": {
|
||||
"url": "https://api.minimax.io/anthropic/v1/messages",
|
||||
"model": "MiniMax-M2",
|
||||
"header_key": "x-api-key",
|
||||
"version_header": {"anthropic-version": "2023-06-01"},
|
||||
"env_var": "MINIMAX_API_KEY"
|
||||
},
|
||||
"glm": {
|
||||
"url": "https://api.z.ai/api/anthropic/v1/messages",
|
||||
"model": "glm-4.7",
|
||||
"header_key": "x-api-key",
|
||||
"version_header": {"anthropic-version": "2023-06-01"},
|
||||
"env_var": "GLM_API_KEY"
|
||||
}
|
||||
}
|
||||
|
||||
PROMPT_SYSTEM = """
|
||||
Eres un asistente académico experto en matemáticas y economía.
|
||||
Tu tarea es resumir el texto proporcionado manteniendo el rigor científico.
|
||||
|
||||
REGLAS DE FORMATO (CRÍTICO):
|
||||
1. La salida debe ser Markdown válido.
|
||||
2. TODAS las fórmulas matemáticas deben estar en formato LaTeX.
|
||||
3. Usa bloques $$ ... $$ para ecuaciones centradas importantes.
|
||||
4. Usa $ ... $ para ecuaciones en línea.
|
||||
5. NO uses bloques de código (```latex) para las fórmulas, úsalas directamente en el texto para que Pandoc las renderice.
|
||||
6. Incluye una sección de 'Conceptos Matemáticos' con las fórmulas desglosadas.
|
||||
"""
|
||||
|
||||
def get_api_key(provider):
|
||||
env_var = PROVIDERS[provider]["env_var"]
|
||||
key = os.getenv(env_var)
|
||||
if not key:
|
||||
print(f"Error: La variable de entorno {env_var} no está definida.")
|
||||
sys.exit(1)
|
||||
return key
|
||||
|
||||
def call_llm(provider, text, api_key):
|
||||
print(f"--- Contactando API: {provider.upper()} ---")
|
||||
|
||||
config = PROVIDERS[provider]
|
||||
headers = {
|
||||
"Content-Type": "application/json",
|
||||
config["header_key"]: api_key,
|
||||
}
|
||||
if "version_header" in config:
|
||||
headers.update(config["version_header"])
|
||||
|
||||
payload = {
|
||||
"model": config["model"],
|
||||
"max_tokens": 4096,
|
||||
"messages": [
|
||||
{"role": "user", "content": f"{PROMPT_SYSTEM}\n\nTEXTO A RESUMIR:\n{text}"}
|
||||
]
|
||||
}
|
||||
|
||||
try:
|
||||
resp = requests.post(config["url"], json=payload, headers=headers, timeout=120)
|
||||
resp.raise_for_status()
|
||||
data = resp.json()
|
||||
|
||||
# Manejo específico para MiniMax que puede devolver bloques de "thinking"
|
||||
content = ""
|
||||
for part in data.get("content", []):
|
||||
if part.get("type") == "text":
|
||||
content += part.get("text", "")
|
||||
|
||||
# Fallback si no hay tipo explícito (GLM estándar)
|
||||
if not content and data.get("content"):
|
||||
if isinstance(data["content"], list):
|
||||
content = data["content"][0].get("text", "")
|
||||
|
||||
return content
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error llamando a {provider}: {e}")
|
||||
return None
|
||||
|
||||
def convert_to_pdf(markdown_content, output_file):
|
||||
base_name = os.path.splitext(output_file)[0]
|
||||
md_file = f"{base_name}.md"
|
||||
|
||||
with open(md_file, "w", encoding="utf-8") as f:
|
||||
f.write(markdown_content)
|
||||
|
||||
print(f"--- Generando PDF: {output_file} ---")
|
||||
cmd = [
|
||||
"pandoc", md_file,
|
||||
"-o", output_file,
|
||||
"--pdf-engine=pdflatex",
|
||||
"-V", "geometry:margin=2.5cm",
|
||||
"-V", "fontsize=12pt",
|
||||
"--highlight-style=tango"
|
||||
]
|
||||
|
||||
result = subprocess.run(cmd, capture_output=True, text=True)
|
||||
if result.returncode == 0:
|
||||
print("Éxito: PDF generado correctamente.")
|
||||
return True
|
||||
else:
|
||||
print("Error en Pandoc:")
|
||||
print(result.stderr)
|
||||
return False
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Generador de Resúmenes Matemáticos PDF")
|
||||
parser.add_argument("input_file", help="Ruta al archivo de texto (.txt) fuente")
|
||||
parser.add_argument("--provider", choices=["minimax", "glm"], default="glm", help="Proveedor de IA a usar")
|
||||
parser.add_argument("--output", default="resumen_output.pdf", help="Nombre del archivo PDF de salida")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if not os.path.exists(args.input_file):
|
||||
print(f"Error: No se encuentra el archivo {args.input_file}")
|
||||
sys.exit(1)
|
||||
|
||||
with open(args.input_file, "r", encoding="utf-8") as f:
|
||||
text_content = f.read()
|
||||
|
||||
api_key = get_api_key(args.provider)
|
||||
summary_md = call_llm(args.provider, text_content, api_key)
|
||||
|
||||
if summary_md:
|
||||
convert_to_pdf(summary_md, args.output)
|
||||
else:
|
||||
print("Fallo en la generación del resumen.")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
```
|
||||
|
||||
## 3. Ejemplo de Uso en Pipeline
|
||||
|
||||
### Ejecución Local
|
||||
```bash
|
||||
export GLM_API_KEY="tu_api_key_aqui"
|
||||
python3 math_summary.py entrada.txt --provider glm --output reporte_final.pdf
|
||||
```
|
||||
|
||||
### GitHub Actions (Ejemplo .yaml)
|
||||
Este paso automatizaría la creación del PDF cada vez que se sube un .txt a la carpeta `docs/`.
|
||||
|
||||
```yaml
|
||||
name: Generar PDF Matemático
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- 'docs/*.txt'
|
||||
|
||||
jobs:
|
||||
build-pdf:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Instalar dependencias
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y pandoc texlive-latex-base texlive-fonts-recommended
|
||||
pip install requests
|
||||
|
||||
- name: Generar Resumen
|
||||
env:
|
||||
GLM_API_KEY: ${{ secrets.GLM_API_KEY }}
|
||||
run: |
|
||||
python3 math_summary.py docs/archivo.txt --provider glm --output docs/resumen.pdf
|
||||
|
||||
- name: Subir Artefacto
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: PDF-Resumen
|
||||
path: docs/resumen.pdf
|
||||
```
|
||||
221
latex/resumen.md
221
latex/resumen.md
@@ -1,221 +0,0 @@
|
||||
# Prompt para Generar Resúmenes Académicos en LaTeX
|
||||
|
||||
## Instrucciones de Uso
|
||||
|
||||
1. Transcribir la clase (audio a texto) usando Whisper o similar
|
||||
2. Tener el material bibliográfico en formato digital (PDF escaneado con OCR o texto)
|
||||
3. Copiar el prompt de abajo y completar los campos entre `[corchetes]`
|
||||
|
||||
---
|
||||
|
||||
## Prompt Template
|
||||
|
||||
```
|
||||
Sos un asistente académico experto en [MATERIA]. Tu tarea es crear un resumen extenso y detallado en LaTeX basado en la transcripción de clase y el material bibliográfico que te proporciono.
|
||||
|
||||
## Material de entrada
|
||||
|
||||
### Transcripción de clase:
|
||||
[PEGAR TRANSCRIPCIÓN AQUÍ]
|
||||
|
||||
### Material bibliográfico de apoyo:
|
||||
[PEGAR TEXTO DEL LIBRO/APUNTE O INDICAR QUE LO SUBISTE COMO ARCHIVO]
|
||||
|
||||
## Requisitos del resumen
|
||||
|
||||
### Extensión y profundidad:
|
||||
- Mínimo 10 páginas
|
||||
- Cubrir TODOS los temas mencionados en clase
|
||||
- Expandir cada concepto con definiciones formales del material bibliográfico
|
||||
- No resumir demasiado: preferir explicaciones completas
|
||||
|
||||
### Estructura obligatoria:
|
||||
1. Portada con título, materia, fecha y tema
|
||||
2. Índice (table of contents)
|
||||
3. Introducción contextualizando el tema
|
||||
4. Desarrollo organizado en secciones y subsecciones
|
||||
5. Tablas comparativas cuando haya clasificaciones o tipos
|
||||
6. Diagramas con TikZ cuando haya procesos, flujos o relaciones
|
||||
7. Cajas destacadas para definiciones, ejemplos y conceptos importantes
|
||||
8. Fórmulas matemáticas cuando corresponda
|
||||
9. Glosario de términos técnicos al final
|
||||
10. Referencias al material bibliográfico
|
||||
|
||||
### Formato LaTeX requerido:
|
||||
|
||||
```latex
|
||||
\documentclass[11pt,a4paper]{article}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[spanish,provide=*]{babel}
|
||||
\usepackage{amsmath,amssymb}
|
||||
\usepackage{geometry}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{tikz}
|
||||
\usetikzlibrary{arrows.meta,positioning,shapes.geometric,calc}
|
||||
\usepackage{booktabs}
|
||||
\usepackage{enumitem}
|
||||
\usepackage{fancyhdr}
|
||||
\usepackage{titlesec}
|
||||
\usepackage{tcolorbox}
|
||||
\usepackage{array}
|
||||
\usepackage{multirow}
|
||||
|
||||
\geometry{margin=2.5cm}
|
||||
\pagestyle{fancy}
|
||||
\fancyhf{}
|
||||
\fancyhead[L]{[MATERIA] - CBC}
|
||||
\fancyhead[R]{Clase [N]}
|
||||
\fancyfoot[C]{\thepage}
|
||||
|
||||
% Cajas para destacar contenido
|
||||
\newtcolorbox{definicion}[1][]{
|
||||
colback=blue!5!white,
|
||||
colframe=blue!75!black,
|
||||
fonttitle=\bfseries,
|
||||
title=#1
|
||||
}
|
||||
|
||||
\newtcolorbox{importante}[1][]{
|
||||
colback=red!5!white,
|
||||
colframe=red!75!black,
|
||||
fonttitle=\bfseries,
|
||||
title=#1
|
||||
}
|
||||
|
||||
\newtcolorbox{ejemplo}[1][]{
|
||||
colback=green!5!white,
|
||||
colframe=green!50!black,
|
||||
fonttitle=\bfseries,
|
||||
title=#1
|
||||
}
|
||||
```
|
||||
|
||||
### Estilo de contenido:
|
||||
- Usar \textbf{} para términos clave en su primera aparición
|
||||
- Usar \textit{} para énfasis y palabras en otros idiomas
|
||||
- Incluir ejemplos concretos mencionados en clase
|
||||
- Relacionar teoría con casos prácticos
|
||||
- Mantener el tono académico pero accesible
|
||||
- Si el profesor hizo énfasis en algo ("esto es importante", "esto entra en el parcial"), destacarlo en caja roja
|
||||
|
||||
### Elementos visuales:
|
||||
- Tablas con booktabs para comparaciones (usar \toprule, \midrule, \bottomrule)
|
||||
- Diagramas TikZ para flujos, ciclos o relaciones entre conceptos
|
||||
- Listas itemize/enumerate para secuencias o características
|
||||
- Fórmulas centradas con equation o align para expresiones matemáticas
|
||||
|
||||
## Ejemplo de calidad esperada
|
||||
|
||||
Para cada concepto principal:
|
||||
1. Definición formal (del libro)
|
||||
2. Explicación en palabras simples (como lo explicó el profesor)
|
||||
3. Ejemplo concreto
|
||||
4. Relación con otros conceptos
|
||||
5. Por qué es importante / para qué sirve
|
||||
|
||||
## Output
|
||||
|
||||
Generá el archivo .tex completo, listo para compilar con pdflatex (dos pasadas para el índice).
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Comandos para compilar
|
||||
|
||||
```bash
|
||||
# Compilar (dos veces para índice)
|
||||
pdflatex resumen_clase_X.tex
|
||||
pdflatex resumen_clase_X.tex
|
||||
|
||||
# Abrir PDF
|
||||
xdg-open resumen_clase_X.pdf # Linux
|
||||
open resumen_clase_X.pdf # macOS
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Pipeline completo
|
||||
|
||||
### 1. Transcripción de audio (con Whisper)
|
||||
|
||||
```bash
|
||||
# Instalar whisper
|
||||
pip install openai-whisper
|
||||
|
||||
# Transcribir audio de clase
|
||||
whisper "clase_X.mp3" --language Spanish --output_format txt
|
||||
```
|
||||
|
||||
### 2. OCR de PDFs escaneados (con marker-pdf)
|
||||
|
||||
```bash
|
||||
# Crear entorno virtual
|
||||
python -m venv .venv
|
||||
source .venv/bin/activate
|
||||
|
||||
# Instalar marker
|
||||
pip install marker-pdf
|
||||
|
||||
# Procesar PDF (usa GPU si está disponible)
|
||||
marker_single "libro_capitulo_X.pdf" --output_dir output/
|
||||
```
|
||||
|
||||
### 3. Generar resumen
|
||||
|
||||
Usar el prompt de arriba con:
|
||||
- Claude (Anthropic)
|
||||
- GPT-4 (OpenAI)
|
||||
- Gemini (Google)
|
||||
|
||||
### 4. Compilar LaTeX
|
||||
|
||||
```bash
|
||||
pdflatex resumen.tex && pdflatex resumen.tex
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Tips para mejores resultados
|
||||
|
||||
1. **Transcripción completa**: No cortar la transcripción, la IA necesita todo el contexto
|
||||
2. **Material bibliográfico**: Incluir los capítulos específicos, no todo el libro
|
||||
3. **Ser específico**: Indicar la materia, el nivel (CBC, carrera, posgrado) y el enfoque del profesor
|
||||
4. **Iterar**: Si el primer resultado es corto, pedir "expandí la sección X con más detalle"
|
||||
5. **Diagramas**: Si hay un diagrama importante, describirlo y pedir que lo haga en TikZ
|
||||
6. **Revisar**: La IA puede cometer errores conceptuales, siempre verificar con el material
|
||||
|
||||
---
|
||||
|
||||
## Materias donde funciona bien
|
||||
|
||||
- Economía (micro/macro)
|
||||
- Física
|
||||
- Química
|
||||
- Matemática (álgebra, análisis)
|
||||
- Biología
|
||||
- Sociología
|
||||
- Historia
|
||||
- Derecho (con adaptaciones)
|
||||
- Cualquier materia con contenido teórico estructurado
|
||||
|
||||
---
|
||||
|
||||
## Ejemplo de uso rápido
|
||||
|
||||
```
|
||||
Sos un asistente académico experto en Física. Creá un resumen extenso en LaTeX sobre "Cinemática" basado en esta transcripción de clase del CBC:
|
||||
|
||||
[pegar transcripción]
|
||||
|
||||
Material de apoyo: Capítulo 2 de Serway "Movimiento en una dimensión":
|
||||
|
||||
[pegar texto del capítulo]
|
||||
|
||||
Incluí:
|
||||
- Definiciones de posición, velocidad, aceleración
|
||||
- Fórmulas del MRU y MRUV
|
||||
- Diagramas de movimiento con TikZ
|
||||
- Gráficos posición-tiempo y velocidad-tiempo
|
||||
- Ejemplos resueltos paso a paso
|
||||
- Glosario de términos
|
||||
```
|
||||
Reference in New Issue
Block a user