Construyendo un Asistente RAG para explorar mi Portfolio
10 nov 2025 (hace 3 meses)
3 min de lectura
En este proyecto desarrollé un Asistente RAG (Retrieval-Augmented Generation) cuyo objetivo es permitir que una IA entienda, explore y responda preguntas sobre mi portfolio de proyectos de software y data como si fuera un revisor técnico humano.
La motivación principal fue simple:
si un reclutador puede preguntarle a una IA “¿cómo implementaste la ingesta de datos?” o “¿qué hace este proyecto?”, entonces mi portfolio deja de ser estático y pasa a ser interactivo.
En este post explico cómo lo diseñé, qué decisiones tomé y qué aprendí durante el proceso.
¿Qué problema quería resolver?
Un portfolio técnico tradicional tiene varias limitaciones:
- Requiere que el lector navegue manualmente entre repositorios, README y notebooks.
- No escala bien cuando se acumulan muchos proyectos.
- No permite preguntas abiertas en lenguaje natural.
Mi objetivo fue crear un sistema que indexe mis proyectos, comprenda tanto documentación como código y permita consultas naturales de forma flexible.
Enfoque general: RAG sobre mi portfolio
El sistema sigue el patrón clásico de Retrieval-Augmented Generation, dividido en tres etapas:
- Ingesta de documentos
- Recuperación semántica
- Generación de respuestas con un LLM
Todo el conocimiento vive en un vector store local, y el modelo solo recibe el contexto estrictamente necesario para responder cada pregunta.
Ingesta: cómo convierto mis proyectos en conocimiento
La ingesta fue la parte más crítica del proyecto.
Mi portfolio incluye múltiples formatos: Markdown, Python, PDF, DOCX, texto plano y notebooks Jupyter.
Decisiones clave:
- Uso loaders dedicados por tipo de archivo.
- Los notebooks se cargan a nivel de celda, incluyendo Markdown y código.
- Se ignoran carpetas irrelevantes como
.gito__pycache__. - Se normalizan metadatos para rastrear el origen de cada fragmento.
Segmentación inteligente: prosa ≠ código
No todo el contenido se trata igual:
- Prosa y documentación usan chunks más grandes para preservar coherencia.
- Código Python se divide en fragmentos más pequeños usando segmentación consciente del lenguaje.
Esto mejora significativamente la calidad de la recuperación y las respuestas.
Embeddings y Vector Store
- Embeddings: BAAI/bge-m3 (multilingüe y normalizado).
- Vector store: ChromaDB, persistente y local.
Cada cambio en los proyectos se refleja simplemente reejecutando el proceso de ingesta.
Recuperación: Maximal Marginal Relevance
Para evitar fragmentos redundantes, el sistema usa MMR, lo que permite recuperar contexto diverso y complementario dentro de un mismo proyecto.
Generación y privacidad
La generación se realiza con un modelo DeepSeek.
El modelo solo recibe:
- La pregunta del usuario.
- Los fragmentos recuperados.
No tiene acceso directo a los archivos ni al vector store completo, manteniendo el control y la privacidad de los datos.
Interfaces: CLI y Web App
El sistema puede usarse desde:
- Una interfaz de línea de comandos.
- Una aplicación web desarrollada con Dash y Bootstrap.
Ambas comparten exactamente el mismo pipeline RAG.
Validación inicial
Para probar el sistema, indexé inicialmente un único repositorio real de mi portfolio: evalcards, una librería Python para generar reportes de evaluación de modelos.
Esto permitió validar que el asistente entiende métricas, documentación y código real.
Qué demuestra este proyecto
- Diseño de pipelines RAG reales.
- Criterio técnico en chunking y retrieval.
- Integración de IA con UX.
- Pensamiento orientado a producto y escalabilidad.
Conclusión
Este proyecto transforma mi portfolio en una base de conocimiento consultable mediante IA, permitiendo explicar decisiones técnicas y arquitectura de forma interactiva.
No es solo un demo de IA, es una nueva forma de presentar experiencia técnica.