Skip to content

Construyendo un Asistente RAG para explorar mi Portfolio

10 nov 2025 (hace 3 meses)

3 min de lectura

RAG Assistant

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:

  1. Ingesta de documentos
  2. Recuperación semántica
  3. 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 .git o __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.