Lineamientos arquitectónicos para el desarrollo del sistema Knowledge RAG
- Propósito
- Principios de Diseño
- Estructura de Capas
- Contratos de API
- Flujo de Responsabilidades
- Convenciones de Código
- Integración con SDD
Este documento define la arquitectura en capas del sistema Knowledge RAG, un sistema de Retrieval-Augmented Generation construido con:
- Spring Boot 3.4 + Java 21
- Spring AI para integración con LLMs
- PgVector como vector store
- Ollama para modelos locales
- Separación de responsabilidades clara entre capas
- Facilitar el testing unitario e integración
- Permitir evolución independiente de cada componente
- Favorecer el desarrollo asistido por IA mediante estructura predecible
- Mantener contratos estables mientras la implementación evoluciona
- Las capas superiores dependen de abstracciones, no de implementaciones
- Los servicios definen interfaces que los controladores consumen
- La capa de dominio no conoce detalles de persistencia o presentación
- Cada clase tiene un propósito claro y acotado
- Los controladores solo coordinan, no contienen lógica de negocio
- Los servicios encapsulan toda la lógica de dominio
- DTOs implementados como
recordcuando sea posible - Mappers sin estado
- Servicios sin efectos colaterales innecesarios
- Validaciones tempranas en el controller
- Excepciones especÃficas del dominio
- Manejo centralizado de errores con
@ControllerAdvice
com.devknowledge.rag/
+-- controller/ # Capa de presentación
¦ +-- IngestController.java # Interface
¦ +-- QueryController.java # Interface
¦ +-- impl/ # Implementaciones
¦ +-- IngestControllerImpl.java
¦ +-- QueryControllerImpl.java
+-- service/ # Capa de negocio
¦ +-- IngestService.java # Interface
¦ +-- QueryService.java # Interface
¦ +-- impl/ # Implementaciones
¦ +-- IngestServiceImpl.java # Pipeline completo
¦ +-- QueryServiceImpl.java # RAG engine
+-- dto/ # Data Transfer Objects
¦ +-- request/
¦ ¦ +-- IngestRequest.java
¦ ¦ +-- QueryRequest.java
¦ ¦ +-- DocumentFilterRequest.java
¦ +-- response/
¦ +-- IngestResponse.java
¦ +-- QueryResponse.java
¦ +-- DocumentResponse.java
+-- mapper/ # Transformaciones DTO ? Domain
¦ +-- DocumentMapper.java
¦ +-- QueryMapper.java
+-- domain/ # Modelos de dominio
¦ +-- Document.java
¦ +-- Chunk.java
¦ +-- Embedding.java
¦ +-- QueryResult.java
+-- repository/ # Capa de persistencia
¦ +-- DocumentRepository.java
¦ +-- VectorStoreRepository.java
+-- config/ # Configuración
+-- SpringAIConfig.java
+-- OllamaConfig.java
+-- OpenAPIConfig.java
Componentes verificados:
- Database (PostgreSQL)
- Vector Store (PgVector)
- LLM (Ollama)
- Spring AI Client
┌─────────────────────────────────────────────────────────────�
│ REQUEST FLOW │
└─────────────────────────────────────────────────────────────┘
HTTP Request
│
├─► 1) Controller Interface
│ ├─ Define contrato del endpoint
│ ├─ Anotaciones Swagger/OpenAPI
│ └─ Sin implementación
│
├─► 2) Controller Implementation
│ ├─ @RestController
│ ├─ Validación básica (@Valid, @NotNull)
│ ├─ Logging de entrada
│ ├─ Llamada al Service
│ ├─ Mapeo de excepciones
│ └─ Return ResponseEntity<DTO>
│
├─► 3) Service Interface
│ ├─ Define operaciones de negocio
│ ├─ Sin implementación
│ └─ Documentación JavaDoc
│
├─► 4) Service Implementation
│ ├─ @Service
│ ├─ @Transactional (si aplica)
│ ├─ Pipeline completo de procesamiento
│ ├─ Lógica de negocio compleja
│ ├─ Interacción con Spring AI
│ ├─ Llamadas a repositories
│ └─ Manejo de errores especÃficos
│
├─► 5) Mapper (bidireccional)
│ ├─ @Mapper(componentModel = "spring")
│ ├─ DTO → Domain (entrada)
│ ├─ Domain → DTO (salida)
│ └─ Sin lógica de negocio
│
└─► 6) Repository / External Services
├─ Spring Data JPA
├─ PgVector queries
├─ Spring AI clients
└─ Ollama integration
HTTP Response
- para hacer el documento de spec, plan o task, hay que usar los prompts excpecificos de cada uno.
┌──────────────────────────────────────────────────────────�
│ ANTES DE ESCRIBIR CÓDIGO → COMPLETAR CICLO SDD │
└──────────────────────────────────────────────────────────┘
1. SPEC (Especificación)
└─► Archivo: specs/[feature]-spec.md
└─► Define: Qué, Por qué, Alcance, Restricciones
2. PLAN (Diseño Técnico)
└─► Archivo: plans/[feature]-plan.md
└─► Define: Cómo, Arquitectura, Decisiones, Dependencias
3. TASKS (Lista de Tareas)
└─► Archivo: tasks/[feature]-tasks.md
└─► Define: Pasos atómicos, Orden, Criterios de éxito
4. GENERATION (Desarrollo Asistido)
└─► Usar prompts en: prompts/
└─► Generar: Código, Tests, Documentación
5. REVIEW (Validación)
└─► Testing: Unitario + Integración
└─► Code review: Arquitectura + Estándares
└─► Documentación: Actualizar si es necesario
Antes de considerar una feature completa, verificar:
- Separación clara de responsabilidades
- Interfaces definidas antes de implementaciones
- Dependencias inyectadas vÃa constructor
- Sin lógica de negocio en controllers
- Mappers sin estado ni lógica compleja
- Nombres descriptivos (clases, métodos, variables)
- Métodos cortos (< 30 lÃneas idealmente)
- Clases cohesivas (< 300 lÃneas idealmente)
- Logging apropiado (INFO, ERROR, DEBUG)
- Tests unitarios para service layer (> 80% coverage)
- Tests de integración para controllers
- Tests de mappers (edge cases)
- Manejo de errores testeado
- JavaDoc en interfaces públicas
- OpenAPI completo en controllers
- README actualizado si hay cambios en API
- Ejemplos de uso disponibles
- Spec creada y revisada
- Plan técnico documentado
- Tasks completadas y marcadas
- Decisiones técnicas justificadas
- Spring Boot Best Practices
- Spring AI Documentation
- MapStruct Documentation
- OpenAPI Specification
- Clean Architecture
Este documento debe evolucionar con el proyecto:
- Agregar nuevos patrones conforme aparezcan
- Documentar decisiones arquitectónicas importantes
- Actualizar ejemplos con casos reales del proyecto
- Incorporar aprendizajes del proceso SDD
Última actualización: [Fecha]
Versión: 1.0
Mantenedores: [Equipo de desarrollo]## Convenciones de nombres (IA)
- Seguir los nombres de
constitution.md: clases y records enPascalCase, metodos/variables enlowerCamelCase, constantes enUPPER_SNAKE_CASE, paquetes en minusculas, DTOs/mappers con sufijos coherentes, tests con sufijoTesty metodos descriptivos.
- Ejecutar
mvn test(o subset relevante) y revisar fallos. - Pasar linters/formatters configurados si existen.
- Verificar contratos de API y OpenAPI alineados tras los cambios.
- Revisar nombres y convenciones segun este documento y
constitution.md. - Actualizar artefactos SDD (spec/plan/tasks) si cambio el alcance o el comportamiento.
- Resumir cambios y riesgos pendientes en la respuesta de salida.