De embeddings genéricos a comprensión del código en tiempo real impulsada por grafos. Mira el video de la demo en YouTube
Prueba gratuita de Qoder Qoder Free trial
Introducción
Las herramientas de programación con IA prometen entender el codebase de un equipo y ofrecer sugerencias realmente útiles. En la práctica, la mayoría se apoyan en APIs de embeddings genéricos para indexar fragmentos de código y documentos. El resultado suele ser una experiencia desconectada: los embeddings capturan la similitud textual pero ignoran relaciones estructurales; los índices se actualizan cada varios minutos, dejando al desarrollador sin contexto vigente; y la privacidad se compromete cuando los embeddings se envían a servicios de terceros.
Este artículo presenta nuestro sistema de indexación consciente del repositorio. Combina una base de datos vectorial en el servidor con un grafo de código y un conocimiento de codebase preindexado (Repo Wiki) para ofrecer contexto preciso, seguro y en tiempo real en flujos de trabajo de IA para desarrollo. A continuación se describen los retos de la recuperación genérica, nuestra arquitectura híbrida y cómo escalamos, personalizamos y aseguramos el sistema.
Retos de la búsqueda genérica de código
Latencia y contexto obsoleto
Los pipelines de recuperación convencionales llaman a APIs externas para calcular embeddings y usan vectores remotos para buscar similitudes. Estos procesos sufren intervalos de actualización de minutos; cuando un desarrollador cambia de rama o renombra una función, el índice queda desfasado y devuelve contexto irrelevante. Incluso cuando se actualiza, los repositorios grandes generan tantos embeddings que transferirlos y consultarlos añade latencia perceptible.
Falta de conciencia estructural
Los embeddings genéricos miden similitud textual, pero las consultas sobre código suelen requerir comprender relaciones estructurales. Por ejemplo, un call site y la definición de su función pueden compartir poca superposición léxica; la documentación puede usar términos que no aparecen en el código; implementaciones en distintos lenguajes de un mismo algoritmo pueden verse totalmente distintas. Con embeddings por sí solos se pierden estas relaciones, lo que provoca resultados irrelevantes y malgasta espacio en el prompt.
Arquitectura híbrida de recuperación
Búsqueda vectorial en el servidor
Desplegamos en nuestro backend una base de datos vectorial de alto rendimiento que almacena embeddings de fragmentos de código, documentación y artefactos del repositorio. Con modelos de IA propios entrenados en código y conocimiento de dominio, generamos embeddings que capturan mejor relaciones semánticas y priorizan la utilidad sobre la similitud superficial. El servidor procesa solicitudes de indexación de forma continua, ingiriendo archivos nuevos o modificados en segundos.
Grafo de código y preindexado de conocimiento del repositorio
En el cliente construimos un grafo de código que representa funciones, clases, módulos y sus relaciones (por ejemplo, grafos de llamadas, herencia, vínculos entre lenguajes). También preindexamos conocimiento del codebase como documentos de diseño, diagramas de arquitectura y páginas internas del wiki. Este preindexado permite realizar recorridos del grafo y búsquedas por concepto con latencia ultrabaja.
Combinando búsqueda vectorial con recuperación basada en grafos
Cuando el usuario realiza una consulta (por chat, autocompletado o búsqueda de código), el sistema: calcula el embedding de la consulta con el mismo modelo personalizado; ejecuta una búsqueda vectorial en el servidor para recuperar los N fragmentos más similares; usa el grafo de código para ampliar o refinar candidatos según relaciones estructurales (por ejemplo, incluir la función que llama al fragmento recuperado o la documentación que lo referencia); y clasifica los resultados finales combinando la similitud con señales de relevancia del grafo. Este enfoque híbrido garantiza que afloren fragmentos relevantes aunque sean poco similares en texto (como la definición de una función referenciada por un call site) junto a los más cercanos semánticamente. Además, permite alinear la recuperación con la rama actual del desarrollador y sus cambios locales.
Actualizaciones en tiempo real y personalización
Cada desarrollador dispone de un índice personal ligado a su estado de trabajo. Al cambiar de rama, editar archivos o realizar reemplazos masivos, el cliente notifica los cambios al servidor y este actualiza los embeddings correspondientes en segundos. El grafo se sincroniza simultáneamente. Esta actualización en tiempo real garantiza que las sugerencias reflejen siempre el estado más reciente del código.
Escalabilidad y rendimiento
Nuestro backend está preparado para el alto caudal del desarrollo de software. Procesa miles de archivos por segundo y escala horizontalmente para acomodar repositorios grandes. El cliente cachea grafos para evitar cómputo redundante y las actualizaciones por lotes previenen congestión de red.
Seguridad y privacidad desde el diseño
No enviamos código en crudo a servicios de terceros; todo el cómputo de embeddings y la búsqueda vectorial ocurren dentro de nuestra propia infraestructura. Antes de recuperar cualquier fragmento, el cliente debe probar la posesión del contenido del archivo enviando un hash criptográfico, garantizando que solo usuarios autorizados accedan al código. Los embeddings se cifran en tránsito y en reposo.
Casos de uso y ejemplos
Navegación en codebases complejos
Al trabajar en un monorepo grande, Qoder puede necesitar entender cómo un servicio interactúa con componentes aguas abajo. Qoder Agent consulta todo el repositorio: no solo definiciones con nombres parecidos, sino también la cadena de llamadas, archivos de configuración y documentos de diseño relacionados gracias al recorrido del grafo y al preindexado de conocimiento.
Respuesta a incidentes y depuración
Durante un incidente, necesitas identificar con rapidez todas las rutas de código afectadas por un componente que falla. Nuestra recuperación híbrida saca a la superficie módulos relacionados, pruebas y runbooks, permitiendo un triage más veloz que con búsquedas genéricas.