Repository navigation
feat(assistant): RAG with pgvector, incremental reindex and LLM fallback (PR 2) - #8
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Qué
PR 2 del plan (
docs/plan-assistant-genai.md): RAG con pgvector. El asistente responde a partir del catálogo real.make reindexejecutapython -m contexts.assistant.ui.cli.reindex, que llama al caso de usoIndexCatalog.content_hashsobre modelo + contenido), en lotes.catalogque el producto ya no existe.POST /assistant/askcalcula el embedding de la pregunta, recupera los top-k (pgvector, HNSW, distancia coseno), los pone en el prompt y los devuelve comosources.fallback_used=trueyusage=null. Sustituye al 503 del PR 1.paraphrase-multilingual-MiniLM-L12-v2(384 dimensiones).local_files_only) y se calienta en el lifespan.catalogno cambia.assistantsolo lo toca a través de su capa de aplicación (ListProducts,GetProducty DTOs) y del cableado de dependencias.Especificación completa (objetivo, alcance, fuera de alcance, 12 criterios y evidencia):
docs/step-16-assistant-rag.md.Cambios de contrato
AnswerResponseganasources[](product_id,content,score) yfallback_used.usagepasa a ser nullable. El 503 deja de documentarse porque el fallback lo sustituye; los errores de configuración siguen dando 500.Code review
/code-review mediumdio 10 hallazgos, cada uno comprobado contra el código: 6 corregidos (R1–R6), más R7, que añadió el usuario. 2 repiten decisiones ya documentadas y 2 eran falsos positivos. Cada corrección empieza por un test que fallaba con el código anterior:GetProductantes de borrardeleted=1sobre un producto existente → se conservaindexed=0al cambiar de modelo →indexed=3[2, 2, 1]RAG_TOP_K≤ 40 (ef_searchpor defecto de HNSW)ValidationErrorValueErrorsin descarga si no está en cachéVerificación
make lint: ruff OK, pylint 10.00/10, mypy strict sin errores (72 ficheros).make test: 137 passed, antes 99.make reindexsobre datos reales:indexed=3 unchanged=0 deleted=0y despuésindexed=0 unchanged=3 deleted=0.--network none: calcula embeddings y la app arranca tras cargar el modelo.Al desplegar
dbydb-testpasan apgvector/pgvector:pg16. Se aplica la migración4aa1b2bf2668, que crea la extensiónvectory la tablaproduct_documents.REINDEX TABLE productspor el cambio de musl a glibc. Los datos se conservan.make reindexpara poblar el índice.Revisar
alembic/env.pyañade un import solo para registrar los modelos deassistant, con# noqa: F401, igual que la línea que ya existe paracatalog.Pendiente (fuera de alcance)
ANTHROPIC_API_KEYen el entorno local.🤖 Generated with Claude Code